This commit was manufactured by cvs2svn to create branch 'gtk2'.
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2004 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 #include <errno.h>
36
37 #include "intl.h"
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "mainwindow.h"
44 #include "summaryview.h"
45 #include "messageview.h"
46 #include "manage_window.h"
47 #include "inc.h"
48 #include "menu.h"
49 #include "codeconv.h"
50 #include "utils.h"
51 #include "gtkutils.h"
52 #include "alertpanel.h"
53 #include "folder.h"
54 #include "socket.h"
55 #include "filesel.h"
56 #include "folderview.h"
57 #include "stock_pixmap.h"
58 #include "quote_fmt.h"
59
60 PrefsCommon prefs_common;
61
62 static PrefsDialog dialog;
63
64 static struct Receive {
65         GtkWidget *checkbtn_incext;
66         GtkWidget *entry_incext;
67         GtkWidget *button_incext;
68
69         GtkWidget *checkbtn_autochk;
70         GtkWidget *spinbtn_autochk;
71         GtkObject *spinbtn_autochk_adj;
72
73         GtkWidget *checkbtn_chkonstartup;
74         GtkWidget *checkbtn_scan_after_inc;
75
76
77         GtkWidget *checkbtn_newmail_auto;
78         GtkWidget *checkbtn_newmail_manu;
79         GtkWidget *entry_newmail_notify_cmd;
80         GtkWidget *hbox_newmail_notify;
81         GtkWidget *optmenu_recvdialog;
82         GtkWidget *checkbtn_no_recv_err_panel;
83         GtkWidget *checkbtn_close_recv_dialog;
84 } receive;
85
86 static struct Send {
87         GtkWidget *checkbtn_savemsg;
88         GtkWidget *checkbtn_queuemsg;
89         GtkWidget *optmenu_senddialog;
90
91         GtkWidget *optmenu_charset;
92         GtkWidget *optmenu_encoding_method;
93 } p_send;
94
95 static struct Compose {
96         GtkWidget *entry_fw_quotemark;
97         GtkWidget *text_fw_quotefmt;
98
99         GtkWidget *checkbtn_autoextedit;
100         GtkWidget *spinbtn_undolevel;
101         GtkObject *spinbtn_undolevel_adj;
102         GtkWidget *spinbtn_linewrap;
103         GtkObject *spinbtn_linewrap_adj;
104         GtkWidget *checkbtn_wrapquote;
105         GtkWidget *checkbtn_autowrap;
106         GtkWidget *checkbtn_wrapatsend;
107
108         GtkWidget *checkbtn_reply_account_autosel;
109         GtkWidget *checkbtn_forward_account_autosel;
110         GtkWidget *checkbtn_reedit_account_autosel;
111         GtkWidget *checkbtn_quote;
112         GtkWidget *checkbtn_default_reply_list;
113         GtkWidget *checkbtn_forward_as_attachment;
114         GtkWidget *checkbtn_redirect_keep_from;
115         GtkWidget *checkbtn_smart_wrapping;
116         GtkWidget *checkbtn_block_cursor;
117         GtkWidget *checkbtn_reply_with_quote;
118         
119         GtkWidget *checkbtn_autosave;
120         GtkWidget *entry_autosave_length;
121 } compose;
122
123 static struct Quote {
124         GtkWidget *entry_quotemark;
125         GtkWidget *text_quotefmt;
126
127         GtkWidget *entry_fw_quotemark;
128         GtkWidget *text_fw_quotefmt;
129         
130         GtkWidget *entry_quote_chars;
131 } quote;
132
133 static struct Display {
134         GtkWidget *chkbtn_folder_unread;
135         GtkWidget *entry_ng_abbrev_len;
136         GtkWidget *spinbtn_ng_abbrev_len;
137         GtkObject *spinbtn_ng_abbrev_len_adj;
138
139         GtkWidget *chkbtn_transhdr;
140
141         GtkWidget *chkbtn_swapfrom;
142         GtkWidget *chkbtn_useaddrbook;
143         GtkWidget *chkbtn_threadsubj;
144         GtkWidget *entry_datefmt;
145 } display;
146
147 static struct Message {
148         GtkWidget *chkbtn_enablecol;
149         GtkWidget *button_edit_col;
150         GtkWidget *chkbtn_mbalnum;
151         GtkWidget *chkbtn_disphdrpane;
152         GtkWidget *chkbtn_disphdr;
153         GtkWidget *spinbtn_linespc;
154         GtkObject *spinbtn_linespc_adj;
155         GtkWidget *chkbtn_headspc;
156
157         GtkWidget *chkbtn_smoothscroll;
158         GtkWidget *spinbtn_scrollstep;
159         GtkObject *spinbtn_scrollstep_adj;
160         GtkWidget *chkbtn_halfpage;
161
162         GtkWidget *chkbtn_attach_desc;
163 } message;
164
165 #if USE_GPGME
166 static struct Privacy {
167         GtkWidget *checkbtn_auto_check_signatures;
168         GtkWidget *checkbtn_store_passphrase;
169         GtkWidget *spinbtn_store_passphrase;
170         GtkObject *spinbtn_store_passphrase_adj;
171         GtkWidget *checkbtn_passphrase_grab;
172         GtkWidget *checkbtn_gpg_warning;
173 } privacy;
174 #endif
175
176 static struct Interface {
177         /* GtkWidget *checkbtn_emacs; */
178         GtkWidget *checkbtn_always_show_msg;
179         GtkWidget *checkbtn_openunread;
180         GtkWidget *checkbtn_mark_as_read_on_newwin;
181         GtkWidget *checkbtn_openinbox;
182         GtkWidget *checkbtn_immedexec;
183         GtkWidget *optmenu_nextunreadmsgdialog;
184 } interface;
185
186 static struct Other {
187         GtkWidget *checkbtn_addaddrbyclick;
188         GtkWidget *checkbtn_confonexit;
189         GtkWidget *checkbtn_cleanonexit;
190         GtkWidget *checkbtn_askonclean;
191         GtkWidget *checkbtn_warnqueued;
192         GtkWidget *checkbtn_cliplog;
193         GtkWidget *loglength_entry;
194 #if 0
195 #ifdef USE_OPENSSL
196         GtkWidget *checkbtn_ssl_ask_unknown_valid;
197 #endif
198 #endif
199
200         GtkWidget *spinbtn_iotimeout;
201         GtkObject *spinbtn_iotimeout_adj;
202 } other;
203
204 static struct MessageColorButtons {
205         GtkWidget *quote_level1_btn;
206         GtkWidget *quote_level2_btn;
207         GtkWidget *quote_level3_btn;
208         GtkWidget *uri_btn;
209         GtkWidget *tgt_folder_btn;
210         GtkWidget *signature_btn;
211 } color_buttons;
212
213 static struct KeybindDialog {
214         GtkWidget *window;
215         GtkWidget *combo;
216 } keybind;
217
218 static GtkWidget *quote_color_win;
219 static GtkWidget *color_dialog;
220
221 static void prefs_common_charset_set_data_from_optmenu     (PrefParam *pparam);
222 static void prefs_common_charset_set_optmenu               (PrefParam *pparam);
223 static void prefs_common_encoding_set_data_from_optmenu    (PrefParam *pparam);
224 static void prefs_common_encoding_set_optmenu              (PrefParam *pparam);
225 static void prefs_common_recv_dialog_set_data_from_optmenu (PrefParam *pparam);
226 static void prefs_common_recv_dialog_set_optmenu           (PrefParam *pparam);
227 static void prefs_common_recv_dialog_newmail_notify_toggle_cb   (GtkWidget *w,
228                                                                  gpointer data);
229 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam);
230 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam);
231 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam);
232 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam);
233 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam);
234 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam);
235
236 /*
237    parameter name, default value, pointer to the prefs variable, data type,
238    pointer to the widget pointer,
239    pointer to the function for data setting,
240    pointer to the function for widget setting
241  */
242
243 static PrefParam param[] = {
244         /* Receive */
245         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
246          &receive.checkbtn_incext,
247          prefs_set_data_from_toggle, prefs_set_toggle},
248         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_cmd, P_STRING,
249          &receive.entry_incext,
250          prefs_set_data_from_entry, prefs_set_entry},
251
252         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
253          &receive.checkbtn_autochk,
254          prefs_set_data_from_toggle, prefs_set_toggle},
255         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
256          &receive.spinbtn_autochk,
257          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
258         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
259          &receive.checkbtn_chkonstartup,
260          prefs_set_data_from_toggle, prefs_set_toggle},
261         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
262          P_BOOL, &receive.checkbtn_scan_after_inc,
263          prefs_set_data_from_toggle, prefs_set_toggle},
264         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
265          P_BOOL, &receive.checkbtn_newmail_manu,
266          prefs_set_data_from_toggle, prefs_set_toggle},
267         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
268         P_BOOL, &receive.checkbtn_newmail_auto,
269          prefs_set_data_from_toggle, prefs_set_toggle},
270         {"newmail_notify_cmd", "", &prefs_common.newmail_notify_cmd, P_STRING,
271          &receive.entry_newmail_notify_cmd,
272          prefs_set_data_from_entry, prefs_set_entry},
273         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
274          &receive.optmenu_recvdialog,
275          prefs_common_recv_dialog_set_data_from_optmenu,
276          prefs_common_recv_dialog_set_optmenu},
277         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
278          P_BOOL, &receive.checkbtn_no_recv_err_panel,
279          prefs_set_data_from_toggle, prefs_set_toggle},
280         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
281          P_BOOL, &receive.checkbtn_close_recv_dialog,
282          prefs_set_data_from_toggle, prefs_set_toggle},
283  
284         /* Send */
285         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
286          &p_send.checkbtn_savemsg,
287          prefs_set_data_from_toggle, prefs_set_toggle},
288         {"queue_message", "FALSE", &prefs_common.queue_msg, P_BOOL,
289          &p_send.checkbtn_queuemsg,
290          prefs_set_data_from_toggle, prefs_set_toggle},
291         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
292          &p_send.optmenu_senddialog,
293          prefs_common_send_dialog_set_data_from_optmenu,
294          prefs_common_send_dialog_set_optmenu},
295
296         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
297          &p_send.optmenu_charset,
298          prefs_common_charset_set_data_from_optmenu,
299          prefs_common_charset_set_optmenu},
300         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
301          &p_send.optmenu_encoding_method,
302          prefs_common_encoding_set_data_from_optmenu,
303          prefs_common_encoding_set_optmenu},
304
305         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
306          P_BOOL, NULL, NULL, NULL},
307
308         /* Compose */
309         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
310          &compose.checkbtn_autoextedit,
311          prefs_set_data_from_toggle, prefs_set_toggle},
312         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
313          P_BOOL, &compose.checkbtn_forward_as_attachment,
314          prefs_set_data_from_toggle, prefs_set_toggle},
315         {"redirect_keep_from", "FALSE",
316          &prefs_common.redirect_keep_from, P_BOOL,
317          &compose.checkbtn_redirect_keep_from,
318          prefs_set_data_from_toggle, prefs_set_toggle},
319         {"undo_level", "50", &prefs_common.undolevels, P_INT,
320          &compose.spinbtn_undolevel,
321          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
322         {"block_cursor", "FALSE", &prefs_common.block_cursor,
323          P_BOOL, &compose.checkbtn_block_cursor,
324          prefs_set_data_from_toggle, prefs_set_toggle},
325
326         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
327          &compose.spinbtn_linewrap,
328          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
329         {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
330          &compose.checkbtn_wrapquote,
331          prefs_set_data_from_toggle, prefs_set_toggle},
332         {"linewrap_auto", "FALSE", &prefs_common.autowrap, P_BOOL,
333          &compose.checkbtn_autowrap,
334          prefs_set_data_from_toggle, prefs_set_toggle},
335         {"linewrap_before_sending", "FALSE",
336          &prefs_common.linewrap_at_send, P_BOOL,
337          &compose.checkbtn_wrapatsend,
338          prefs_set_data_from_toggle, prefs_set_toggle},
339         {"smart_wrapping", "TRUE", &prefs_common.smart_wrapping,
340          P_BOOL, &compose.checkbtn_smart_wrapping,
341          prefs_set_data_from_toggle, prefs_set_toggle},
342         {"autosave", "FALSE", &prefs_common.autosave,
343          P_BOOL, &compose.checkbtn_autosave,
344          prefs_set_data_from_toggle, prefs_set_toggle},
345         {"autosave_length", "50", &prefs_common.autosave_length,
346          P_INT, &compose.entry_autosave_length,
347          prefs_set_data_from_entry, prefs_set_entry},
348 #if USE_ASPELL
349         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
350          NULL, NULL, NULL},
351         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
352          NULL, NULL, NULL},
353         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
354          NULL, NULL, NULL},
355         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
356          NULL, NULL, NULL},
357         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
358          NULL, NULL, NULL},
359         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
360          NULL, NULL, NULL},
361         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
362          NULL, NULL, NULL},
363 #endif
364         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
365          &compose.checkbtn_reply_with_quote, prefs_set_data_from_toggle, prefs_set_toggle},
366
367         /* Account autoselection */
368         {"reply_account_autoselect", "TRUE",
369          &prefs_common.reply_account_autosel, P_BOOL,
370          &compose.checkbtn_reply_account_autosel,
371          prefs_set_data_from_toggle, prefs_set_toggle},
372         {"forward_account_autoselect", "TRUE",
373          &prefs_common.forward_account_autosel, P_BOOL,
374          &compose.checkbtn_forward_account_autosel,
375          prefs_set_data_from_toggle, prefs_set_toggle},
376         {"reedit_account_autoselect", "TRUE",
377          &prefs_common.reedit_account_autosel, P_BOOL,
378          &compose.checkbtn_reedit_account_autosel,
379          prefs_set_data_from_toggle, prefs_set_toggle},
380
381         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
382          &compose.checkbtn_default_reply_list,
383          prefs_set_data_from_toggle, prefs_set_toggle},
384
385         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
386          NULL, NULL, NULL},
387
388         /* Quote */
389         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
390          &quote.entry_quotemark, prefs_set_data_from_entry, prefs_set_entry},
391         {"reply_quote_format", "On %d\\n%f wrote:\\n\\n%Q",
392          &prefs_common.quotefmt, P_STRING, &quote.text_quotefmt,
393          prefs_set_data_from_text, prefs_set_text},
394
395         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
396          &quote.entry_fw_quotemark,
397          prefs_set_data_from_entry, prefs_set_entry},
398         {"forward_quote_format",
399          "\\n\\nBegin forwarded message:\\n\\n"
400          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
401          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
402          &prefs_common.fw_quotefmt, P_STRING, &quote.text_fw_quotefmt,
403          prefs_set_data_from_text, prefs_set_text},
404         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
405          &quote.entry_quote_chars, prefs_set_data_from_entry, prefs_set_entry},
406
407         /* Display */
408         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
409         {"widget_font",         NULL,
410           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
411         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
412          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
413         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
414           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
415         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
416           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
417         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
418           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
419
420         /* new fonts */
421         {"widget_font_gtk2",    NULL,
422           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
423         {"message_font_gtk2",   "fixed 9",
424          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
425         {"small_font_gtk2",     "Sans 9",
426           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
427         {"bold_font_gtk2",      "Sans Bold 9",
428           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
429         {"normal_font_gtk2",    "Sans 9", 
430           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
431
432         {"display_folder_unread_num", "TRUE",
433          &prefs_common.display_folder_unread, P_BOOL,
434          &display.chkbtn_folder_unread,
435          prefs_set_data_from_toggle, prefs_set_toggle},
436         {"newsgroup_abbrev_len", "16",
437          &prefs_common.ng_abbrev_len, P_INT,
438          &display.spinbtn_ng_abbrev_len,
439          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
440
441         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
442          &display.chkbtn_transhdr,
443          prefs_set_data_from_toggle, prefs_set_toggle},
444
445         /* Display: Summary View */
446         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
447          &display.chkbtn_swapfrom,
448          prefs_set_data_from_toggle, prefs_set_toggle},
449         {"use_address_book", "TRUE", &prefs_common.use_addr_book, P_BOOL,
450          &display.chkbtn_useaddrbook,
451          prefs_set_data_from_toggle, prefs_set_toggle},
452         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
453          &display.chkbtn_threadsubj,
454          prefs_set_data_from_toggle, prefs_set_toggle},
455         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
456          P_STRING, &display.entry_datefmt,
457          prefs_set_data_from_entry, prefs_set_entry},
458
459         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
460          NULL, NULL, NULL},
461         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
462          NULL, NULL, NULL},
463         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
464         P_INT, NULL, NULL, NULL },
465
466         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
467          NULL, NULL, NULL},
468         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
469          NULL, NULL, NULL},
470         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
471          NULL, NULL, NULL},
472         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
473          NULL, NULL, NULL},
474
475         {"folderview_vscrollbar_policy", "0",
476          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
477          NULL, NULL, NULL},
478
479         {"summary_col_show_mark", "TRUE",
480          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
481         {"summary_col_show_unread", "TRUE",
482          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
483         {"summary_col_show_mime", "TRUE",
484          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_subject", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_from", "TRUE",
488          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_date", "TRUE",
490          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_size", "TRUE",
492          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_number", "FALSE",
494          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
495         {"summary_col_show_score", "FALSE",
496          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
497         {"summary_col_show_locked", "FALSE",
498          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
499
500         {"summary_col_pos_mark", "0",
501           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
502         {"summary_col_pos_unread", "1",
503           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
504         {"summary_col_pos_mime", "2",
505           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
506         {"summary_col_pos_subject", "3",
507           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
508         {"summary_col_pos_from", "4",
509           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_date", "5",
511           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_size", "6",
513           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_number", "7",
515           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_score", "8",
517          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_locked", "9",
519          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
520
521         {"summary_col_size_mark", "10",
522          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
523         {"summary_col_size_unread", "13",
524          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
525         {"summary_col_size_mime", "10",
526          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
527         {"summary_col_size_subject", "200",
528          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
529         {"summary_col_size_from", "120",
530          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
531         {"summary_col_size_date", "118",
532          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
533         {"summary_col_size_size", "45",
534          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
535         {"summary_col_size_number", "40",
536          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
537         {"summary_col_size_score", "40",
538          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
539         {"summary_col_size_locked", "13",
540          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
541
542         /* Widget size */
543         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
544          NULL, NULL, NULL},
545         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
546          NULL, NULL, NULL},
547         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
548          NULL, NULL, NULL},
549         {"folderview_height", "600", &prefs_common.folderview_height, P_INT,
550          NULL, NULL, NULL},
551         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
552          NULL, NULL, NULL},
553
554         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
555          NULL, NULL, NULL},
556         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
557          NULL, NULL, NULL},
558         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
559          NULL, NULL, NULL},
560         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
561          NULL, NULL, NULL},
562
563         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
564          NULL, NULL, NULL},
565         {"summaryview_height", "173", &prefs_common.summaryview_height, P_INT,
566          NULL, NULL, NULL},
567
568         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
569          NULL, NULL, NULL},
570         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
571          NULL, NULL, NULL},
572         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
573          NULL, NULL, NULL},
574         {"messageview_height", "540", &prefs_common.msgview_height, P_INT,
575          NULL, NULL, NULL},
576         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
577          NULL, NULL, NULL},
578
579         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
580          NULL, NULL, NULL},
581         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
582          NULL, NULL, NULL},
583         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
584          NULL, NULL, NULL},
585         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
586          NULL, NULL, NULL},
587         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
588          NULL, NULL, NULL},
589         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
590          NULL, NULL, NULL},
591         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
592          NULL, NULL, NULL},
593         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
594          NULL, NULL, NULL},
595         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
596          NULL, NULL, NULL},
597         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
598          NULL, NULL, NULL},
599         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
600          NULL, NULL, NULL},
601         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
602          NULL, NULL, NULL},
603         {"compose_width", "600", &prefs_common.compose_width, P_INT,
604          NULL, NULL, NULL},
605         {"compose_height", "560", &prefs_common.compose_height, P_INT,
606          NULL, NULL, NULL},
607         {"compose_x", "0", &prefs_common.compose_x, P_INT,
608          NULL, NULL, NULL},
609         {"compose_y", "0", &prefs_common.compose_y, P_INT,
610          NULL, NULL, NULL},
611         /* Message */
612         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
613          &message.chkbtn_enablecol,
614          prefs_set_data_from_toggle, prefs_set_toggle},
615
616         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
617          NULL, NULL, NULL},
618         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
619          NULL, NULL, NULL},
620         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
621          NULL, NULL, NULL},
622         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
623          NULL, NULL, NULL},
624         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
625          NULL, NULL, NULL},
626         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
627          NULL, NULL, NULL},
628         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
629          P_BOOL, NULL, NULL, NULL},
630
631         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
632          &message.chkbtn_mbalnum,
633          prefs_set_data_from_toggle, prefs_set_toggle},
634         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
635          P_BOOL, &message.chkbtn_disphdrpane,
636          prefs_set_data_from_toggle, prefs_set_toggle},
637         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
638          &message.chkbtn_disphdr,
639          prefs_set_data_from_toggle, prefs_set_toggle},
640         {"line_space", "2", &prefs_common.line_space, P_INT,
641          &message.spinbtn_linespc,
642          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
643         {"enable_head_space", "FALSE", &prefs_common.head_space, P_BOOL,
644          &message.chkbtn_headspc,
645          prefs_set_data_from_toggle, prefs_set_toggle},
646
647         {"enable_smooth_scroll", "FALSE",
648          &prefs_common.enable_smooth_scroll, P_BOOL,
649          &message.chkbtn_smoothscroll,
650          prefs_set_data_from_toggle, prefs_set_toggle},
651         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
652          &message.spinbtn_scrollstep,
653          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
654         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
655          &message.chkbtn_halfpage,
656          prefs_set_data_from_toggle, prefs_set_toggle},
657
658         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
659          NULL, NULL, NULL},
660
661         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
662          &message.chkbtn_attach_desc,
663          prefs_set_data_from_toggle, prefs_set_toggle},
664
665         /* MIME viewer */
666         {"mime_image_viewer", "display '%s'",
667          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
668         {"mime_audio_player", "play '%s'",
669          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
670         {"mime_open_command", "gedit '%s'",
671          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
672
673 #if USE_GPGME
674         /* Privacy */
675         {"auto_check_signatures", "TRUE",
676          &prefs_common.auto_check_signatures, P_BOOL,
677          &privacy.checkbtn_auto_check_signatures,
678          prefs_set_data_from_toggle, prefs_set_toggle},
679         {"store_passphrase", "FALSE", &prefs_common.store_passphrase, P_BOOL,
680          &privacy.checkbtn_store_passphrase,
681          prefs_set_data_from_toggle, prefs_set_toggle},
682         {"store_passphrase_timeout", "0",
683          &prefs_common.store_passphrase_timeout, P_INT,
684          &privacy.spinbtn_store_passphrase,
685          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
686 #ifndef __MINGW32__
687         {"passphrase_grab", "FALSE", &prefs_common.passphrase_grab, P_BOOL,
688          &privacy.checkbtn_passphrase_grab,
689          prefs_set_data_from_toggle, prefs_set_toggle},
690 #endif /* __MINGW32__ */
691         {"gpg_warning", "TRUE", &prefs_common.gpg_warning, P_BOOL,
692          &privacy.checkbtn_gpg_warning,
693          prefs_set_data_from_toggle, prefs_set_toggle},
694 #endif /* USE_GPGME */
695
696         /* Interface */
697         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
698          NULL, NULL, NULL},
699         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
700          NULL, NULL, NULL},
701
702         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
703          NULL, NULL, NULL}, */
704         {"always_show_message_when_selected", "FALSE",
705          &prefs_common.always_show_msg,
706          P_BOOL, &interface.checkbtn_always_show_msg,
707          prefs_set_data_from_toggle, prefs_set_toggle},
708         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
709          P_BOOL, &interface.checkbtn_openunread,
710          prefs_set_data_from_toggle, prefs_set_toggle},
711         {"mark_as_read_on_new_window", "FALSE",
712          &prefs_common.mark_as_read_on_new_window,
713          P_BOOL, &interface.checkbtn_mark_as_read_on_newwin,
714          prefs_set_data_from_toggle, prefs_set_toggle},
715         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
716          P_BOOL, &interface.checkbtn_openinbox,
717          prefs_set_data_from_toggle, prefs_set_toggle},
718         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
719          &interface.checkbtn_immedexec,
720          prefs_set_data_from_toggle, prefs_set_toggle},
721         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
722          &interface.optmenu_nextunreadmsgdialog,
723          prefs_nextunreadmsgdialog_set_data_from_optmenu,
724          prefs_nextunreadmsgdialog_set_optmenu},
725
726         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
727          &prefs_common.pixmap_theme_path, P_STRING,
728          NULL, NULL, NULL},
729
730         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
731          NULL, NULL, NULL},
732         
733         /* Other */
734         {"uri_open_command", DEFAULT_BROWSER_CMD,
735          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
736         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
737          NULL, NULL, NULL},
738         {"ext_editor_command", "gedit %s",
739          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
740
741         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
742          P_BOOL, &other.checkbtn_addaddrbyclick,
743          prefs_set_data_from_toggle, prefs_set_toggle},
744
745         {"confirm_on_exit", "TRUE", &prefs_common.confirm_on_exit, P_BOOL,
746          &other.checkbtn_confonexit,
747          prefs_set_data_from_toggle, prefs_set_toggle},
748         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
749          &other.checkbtn_cleanonexit,
750          prefs_set_data_from_toggle, prefs_set_toggle},
751         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
752          &other.checkbtn_askonclean,
753          prefs_set_data_from_toggle, prefs_set_toggle},
754         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
755          P_BOOL, &other.checkbtn_warnqueued,
756          prefs_set_data_from_toggle, prefs_set_toggle},
757 #if 0
758 #ifdef USE_OPENSSL
759         {"ssl_ask_unknown_valid", "TRUE", &prefs_common.ssl_ask_unknown_valid,
760          P_BOOL, &other.checkbtn_ssl_ask_unknown_valid,
761          prefs_set_data_from_toggle, prefs_set_toggle},
762 #endif
763 #endif
764         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
765          NULL, NULL, NULL},
766         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
767          NULL, NULL, NULL},
768
769         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
770          P_INT, &other.spinbtn_iotimeout,
771          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
772         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
773          NULL, NULL, NULL},
774         {"important_score", "1", &prefs_common.important_score, P_INT,
775          NULL, NULL, NULL},
776         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
777          &other.checkbtn_cliplog,
778          prefs_set_data_from_toggle, prefs_set_toggle},
779         {"log_length", "500", &prefs_common.loglength, P_INT,
780          &other.loglength_entry,
781          prefs_set_data_from_entry, prefs_set_entry},
782
783         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
784          NULL, NULL, NULL},
785         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
786          NULL, NULL, NULL},
787
788         {"color_new", "179", &prefs_common.color_new, P_COLOR,
789          NULL, NULL, NULL},
790
791         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
792 };
793
794 /* widget creating functions */
795 static void prefs_common_create         (void);
796 static void prefs_receive_create        (void);
797 static void prefs_send_create           (void);
798 static void prefs_compose_create        (void);
799 static void prefs_quote_create          (void);
800 static void prefs_display_create        (void);
801 static void prefs_message_create        (void);
802 #if USE_GPGME
803 static void prefs_privacy_create        (void);
804 #endif
805 static void prefs_interface_create      (void);
806 static void prefs_other_create          (void);
807
808 static void date_format_ok_btn_clicked          (GtkButton      *button,
809                                                  GtkWidget     **widget);
810 static void date_format_cancel_btn_clicked      (GtkButton      *button,
811                                                  GtkWidget     **widget);
812 static gboolean date_format_key_pressed         (GtkWidget      *keywidget,
813                                                  GdkEventKey    *event,
814                                                  GtkWidget     **widget);
815 static gboolean date_format_on_delete           (GtkWidget      *dialogwidget,
816                                                  GdkEventAny    *event,
817                                                  GtkWidget     **widget);
818 static void date_format_entry_on_change         (GtkEditable    *editable,
819                                                  GtkLabel       *example);
820 static void date_format_select_row              (GtkWidget      *date_format_list,
821                                                  gint            row,
822                                                  gint            column,
823                                                  GdkEventButton *event,
824                                                  GtkWidget      *date_format);
825 static GtkWidget *date_format_create            (GtkButton      *button,
826                                                  void           *data);
827
828 static void prefs_quote_colors_dialog           (void);
829 static void prefs_quote_colors_dialog_create    (void);
830 static gboolean prefs_quote_colors_key_pressed  (GtkWidget      *widget,
831                                                  GdkEventKey    *event,
832                                                  gpointer        data);
833 static void quote_color_set_dialog              (GtkWidget      *widget,
834                                                  gpointer        data);
835 static void quote_colors_set_dialog_ok          (GtkWidget      *widget,
836                                                  gpointer        data);
837 static void quote_colors_set_dialog_cancel      (GtkWidget      *widget,
838                                                  gpointer        data);
839 static gboolean quote_colors_set_dialog_key_pressed     (GtkWidget      *widget,
840                                                          GdkEventKey    *event,
841                                                          gpointer        data);
842 static void set_button_bg_color                 (GtkWidget      *widget,
843                                                  gint            color);
844 static void prefs_enable_message_color_toggled  (void);
845 static void prefs_recycle_colors_toggled        (GtkWidget      *widget);
846
847 static void prefs_keybind_select                (void);
848 static gint prefs_keybind_deleted               (GtkWidget      *widget,
849                                                  GdkEventAny    *event,
850                                                  gpointer        data);
851 static gboolean prefs_keybind_key_pressed       (GtkWidget      *widget,
852                                                  GdkEventKey    *event,
853                                                  gpointer        data);
854 static void prefs_keybind_cancel                (void);
855 static void prefs_keybind_apply_clicked         (GtkWidget      *widget);
856
857 static gint prefs_common_deleted        (GtkWidget      *widget,
858                                          GdkEventAny    *event,
859                                          gpointer        data);
860 static gboolean prefs_common_key_pressed(GtkWidget      *widget,
861                                          GdkEventKey    *event,
862                                          gpointer        data);
863 static void prefs_common_ok             (void);
864 static void prefs_common_apply          (void);
865 static void prefs_common_cancel         (void);
866
867 void prefs_common_init(void) 
868 {
869         prefs_common.disphdr_list = NULL;
870 }
871
872 PrefsCommon *prefs_common_get(void)
873 {
874         return &prefs_common;
875 }
876
877 void prefs_common_read_config(void)
878 {
879         FILE *fp;
880         gchar *path;
881         gchar buf[PREFSBUFSIZE];
882
883         prefs_read_config(param, "Common", COMMON_RC);
884
885         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMAND_HISTORY,
886                            NULL);
887         if ((fp = fopen(path, "rb")) == NULL) {
888                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
889                 g_free(path);
890                 return;
891         }
892         g_free(path);
893         while (fgets(buf, sizeof(buf), fp) != NULL) {
894                 g_strstrip(buf);
895                 if (buf[0] == '\0') continue;
896                 prefs_common.mime_open_cmd_history =
897                         add_history(prefs_common.mime_open_cmd_history, buf);
898         }
899         fclose(fp);
900
901         prefs_common.mime_open_cmd_history =
902                 g_list_reverse(prefs_common.mime_open_cmd_history);
903 }
904
905 void prefs_common_save_config(void)
906 {
907         GList *cur;
908         FILE *fp;
909         gchar *path;
910
911         prefs_save_config(param, "Common", COMMON_RC);
912
913         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMAND_HISTORY,
914                            NULL);
915         if ((fp = fopen(path, "wb")) == NULL) {
916                 FILE_OP_ERROR(path, "fopen");
917                 g_free(path);
918                 return;
919         }
920
921         for (cur = prefs_common.mime_open_cmd_history;
922              cur != NULL; cur = cur->next) {
923                 fputs((gchar *)cur->data, fp);
924                 fputc('\n', fp);
925         }
926
927         fclose(fp);
928         g_free(path);
929 }
930
931 void prefs_common_open(void)
932 {
933         if (prefs_rc_is_readonly(COMMON_RC))
934                 return;
935
936         inc_lock();
937
938         if (!dialog.window) {
939                 prefs_common_create();
940         }
941
942         manage_window_set_transient(GTK_WINDOW(dialog.window));
943         gtk_notebook_set_current_page(GTK_NOTEBOOK(dialog.notebook), 0);
944         gtk_widget_grab_focus(dialog.ok_btn);
945
946         prefs_set_dialog(param);
947
948         gtk_widget_show(dialog.window);
949 }
950
951 static void prefs_common_create(void)
952 {
953         gint page = 0;
954
955         debug_print("Creating common preferences window...\n");
956
957         prefs_dialog_create(&dialog);
958         gtk_window_set_title (GTK_WINDOW(dialog.window),
959                               _("Common Preferences"));
960         g_signal_connect (G_OBJECT(dialog.window), "delete_event",
961                           G_CALLBACK(prefs_common_deleted), NULL);
962         g_signal_connect (G_OBJECT(dialog.window), "key_press_event",
963                           G_CALLBACK(prefs_common_key_pressed), NULL);
964         MANAGE_WINDOW_SIGNALS_CONNECT(dialog.window);
965
966         g_signal_connect (G_OBJECT(dialog.ok_btn), "clicked",
967                           G_CALLBACK(prefs_common_ok), NULL);
968         g_signal_connect (G_OBJECT(dialog.apply_btn), "clicked",
969                           G_CALLBACK(prefs_common_apply), NULL);
970         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
971                                    GTK_SIGNAL_FUNC(prefs_common_cancel),
972                                    GTK_OBJECT(dialog.window));
973
974         /* create all widgets on notebook */
975         prefs_receive_create();
976         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
977         prefs_send_create();
978         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
979         prefs_compose_create();
980         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
981         prefs_quote_create();
982         SET_NOTEBOOK_LABEL(dialog.notebook, _("Quote"),   page++);
983         prefs_display_create();
984         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
985         prefs_message_create();
986         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
987 #if USE_GPGME
988         prefs_privacy_create();
989         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
990 #endif
991         prefs_interface_create();
992         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
993         prefs_other_create();
994         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
995
996         gtk_widget_show_all(dialog.window);
997 }
998
999 static void prefs_receive_create(void)
1000 {
1001         GtkWidget *vbox1;
1002         GtkWidget *vbox2;
1003         GtkWidget *frame_incext;
1004         GtkWidget *checkbtn_incext;
1005         GtkWidget *hbox;
1006         GtkWidget *label_incext;
1007         GtkWidget *entry_incext;
1008         /* GtkWidget *button_incext; */
1009
1010         GtkWidget *hbox_autochk;
1011         GtkWidget *checkbtn_autochk;
1012         GtkWidget *label_autochk1;
1013         GtkObject *spinbtn_autochk_adj;
1014         GtkWidget *spinbtn_autochk;
1015         GtkWidget *label_autochk2;
1016         GtkWidget *checkbtn_chkonstartup;
1017         GtkWidget *checkbtn_scan_after_inc;
1018
1019
1020         GtkWidget *frame_newmail;
1021         GtkWidget *hbox_newmail_notify;
1022         GtkWidget *checkbtn_newmail_auto;
1023         GtkWidget *checkbtn_newmail_manu;
1024         GtkWidget *entry_newmail_notify_cmd;
1025         GtkWidget *label_newmail_notify_cmd;
1026
1027         GtkWidget *hbox_recvdialog;
1028         GtkWidget *label_recvdialog;
1029         GtkWidget *menu;
1030         GtkWidget *menuitem;
1031         GtkWidget *optmenu_recvdialog;
1032         GtkWidget *checkbtn_no_recv_err_panel;
1033         GtkWidget *checkbtn_close_recv_dialog;
1034
1035         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1036         gtk_widget_show (vbox1);
1037         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1038         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1039
1040         PACK_FRAME(vbox1, frame_incext, _("External program"));
1041
1042         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1043         gtk_widget_show (vbox2);
1044         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
1045         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1046
1047         /* Use of external incorporation program */
1048         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
1049                            _("Use external program for incorporation"));
1050
1051         hbox = gtk_hbox_new (FALSE, 8);
1052         gtk_widget_show (hbox);
1053         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1054         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
1055
1056         label_incext = gtk_label_new (_("Command"));
1057         gtk_widget_show (label_incext);
1058         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
1059
1060         entry_incext = gtk_entry_new ();
1061         gtk_widget_show (entry_incext);
1062         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
1063
1064 #if 0
1065         button_incext = gtk_button_new_with_label ("... ");
1066         gtk_widget_show (button_incext);
1067         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
1068 #endif
1069
1070         vbox2 = gtk_vbox_new (FALSE, 0);
1071         gtk_widget_show (vbox2);
1072         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1073
1074         /* Auto-checking */
1075         hbox_autochk = gtk_hbox_new (FALSE, 8);
1076         gtk_widget_show (hbox_autochk);
1077         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
1078
1079         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
1080                            _("Auto-check new mail"));
1081
1082         label_autochk1 = gtk_label_new (_("every"));
1083         gtk_widget_show (label_autochk1);
1084         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
1085
1086         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
1087         spinbtn_autochk = gtk_spin_button_new
1088                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
1089         gtk_widget_show (spinbtn_autochk);
1090         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
1091         gtk_widget_set_size_request (spinbtn_autochk, 64, -1);
1092         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
1093
1094         label_autochk2 = gtk_label_new (_("minute(s)"));
1095         gtk_widget_show (label_autochk2);
1096         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
1097
1098         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
1099         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
1100         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
1101
1102         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
1103                            _("Check new mail on startup"));
1104         PACK_CHECK_BUTTON (vbox2, checkbtn_scan_after_inc,
1105                            _("Update all local folders after incorporation"));
1106
1107
1108         /* receive dialog */
1109         hbox_recvdialog = gtk_hbox_new (FALSE, 8);
1110         gtk_widget_show (hbox_recvdialog);
1111         gtk_box_pack_start (GTK_BOX (vbox2), hbox_recvdialog, FALSE, FALSE, 0);
1112
1113         label_recvdialog = gtk_label_new (_("Show receive dialog"));
1114         gtk_misc_set_alignment(GTK_MISC(label_recvdialog), 0, 0.5);
1115         gtk_widget_show (label_recvdialog);
1116         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), label_recvdialog, FALSE, FALSE, 0);
1117
1118         optmenu_recvdialog = gtk_option_menu_new ();
1119         gtk_widget_show (optmenu_recvdialog);
1120         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), optmenu_recvdialog, FALSE, FALSE, 0);
1121
1122         menu = gtk_menu_new ();
1123         MENUITEM_ADD (menu, menuitem, _("Always"), RECV_DIALOG_ALWAYS);
1124         MENUITEM_ADD (menu, menuitem, _("Only on manual receiving"),
1125                       RECV_DIALOG_MANUAL);
1126         MENUITEM_ADD (menu, menuitem, _("Never"), RECV_DIALOG_NEVER);
1127
1128         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_recvdialog), menu);
1129
1130         PACK_CHECK_BUTTON (vbox2, checkbtn_no_recv_err_panel,
1131                            _("Don't popup error dialog on receive error"));
1132
1133         PACK_CHECK_BUTTON (vbox2, checkbtn_close_recv_dialog,
1134                            _("Close receive dialog when finished"));
1135         
1136         PACK_FRAME(vbox1, frame_newmail, _("Run command when new mail "
1137                                            "arrives"));
1138         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1139         gtk_widget_show (vbox2);
1140         gtk_container_add (GTK_CONTAINER (frame_newmail), vbox2);
1141         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1142
1143         hbox = gtk_hbox_new (TRUE, 8);
1144         gtk_widget_show (hbox);
1145         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_auto,
1146                            _("after autochecking"));
1147         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_manu,
1148                            _("after manual checking"));
1149         gtk_box_pack_start (GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1150         g_signal_connect(G_OBJECT(checkbtn_newmail_auto), "toggled",
1151                          G_CALLBACK(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1152                          NULL);
1153         g_signal_connect(G_OBJECT(checkbtn_newmail_manu), "toggled",
1154                          G_CALLBACK(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1155                          NULL);
1156
1157         hbox_newmail_notify = gtk_hbox_new (FALSE, 8);
1158         gtk_widget_show (hbox);
1159         gtk_box_pack_start (GTK_BOX (vbox2), hbox_newmail_notify, FALSE, 
1160                             FALSE, 0);
1161
1162         label_newmail_notify_cmd = gtk_label_new (_("Command to execute:\n"
1163                                                     "(use %d as number of new "
1164                                                     "mails)"));
1165         gtk_label_set_justify(GTK_LABEL(label_newmail_notify_cmd), 
1166                               GTK_JUSTIFY_RIGHT);
1167         gtk_widget_show (label_newmail_notify_cmd);
1168         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1169                             label_newmail_notify_cmd, FALSE, FALSE, 0);
1170
1171         entry_newmail_notify_cmd = gtk_entry_new ();
1172         gtk_widget_show (entry_newmail_notify_cmd);
1173         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1174                             entry_newmail_notify_cmd, TRUE, TRUE, 0);
1175
1176         gtk_widget_set_sensitive(hbox_newmail_notify, 
1177                                  prefs_common.newmail_notify_auto || 
1178                                  prefs_common.newmail_notify_manu);
1179
1180         receive.checkbtn_incext = checkbtn_incext;
1181         receive.entry_incext    = entry_incext;
1182         /* receive.button_incext   = button_incext; */
1183
1184         receive.checkbtn_autochk    = checkbtn_autochk;
1185         receive.spinbtn_autochk     = spinbtn_autochk;
1186         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
1187
1188         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
1189         receive.checkbtn_scan_after_inc = checkbtn_scan_after_inc;
1190
1191
1192         receive.checkbtn_newmail_auto  = checkbtn_newmail_auto;
1193         receive.checkbtn_newmail_manu  = checkbtn_newmail_manu;
1194         receive.hbox_newmail_notify    = hbox_newmail_notify;
1195         receive.entry_newmail_notify_cmd = entry_newmail_notify_cmd;
1196         receive.optmenu_recvdialog          = optmenu_recvdialog;
1197         receive.checkbtn_no_recv_err_panel  = checkbtn_no_recv_err_panel;
1198         receive.checkbtn_close_recv_dialog  = checkbtn_close_recv_dialog;
1199 }
1200
1201 static void prefs_send_create(void)
1202 {
1203         GtkWidget *vbox1;
1204         GtkWidget *vbox2;
1205         GtkWidget *hbox1;
1206         GtkWidget *checkbtn_savemsg;
1207         GtkWidget *checkbtn_queuemsg;
1208         GtkWidget *label_outcharset;
1209         GtkWidget *optmenu_charset;
1210         GtkWidget *optmenu_menu;
1211         GtkWidget *menuitem;
1212         GtkTooltips *charset_tooltip;
1213         GtkWidget *optmenu_encoding;
1214         GtkWidget *label_encoding;
1215         GtkTooltips *encoding_tooltip;
1216         GtkWidget *label_senddialog;
1217         GtkWidget *menu;
1218         GtkWidget *optmenu_senddialog;
1219         GtkWidget *hbox_senddialog;
1220
1221         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1222         gtk_widget_show (vbox1);
1223         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1224         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1225
1226         vbox2 = gtk_vbox_new (FALSE, 0);
1227         gtk_widget_show (vbox2);
1228         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1229
1230         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
1231                            _("Save sent messages to Sent folder"));
1232         PACK_CHECK_BUTTON (vbox2, checkbtn_queuemsg,
1233                            _("Queue messages that fail to send"));
1234
1235         hbox_senddialog = gtk_hbox_new (FALSE, 8);
1236         gtk_box_pack_start (GTK_BOX (vbox1), hbox_senddialog, FALSE, FALSE, 0);
1237
1238         label_senddialog = gtk_label_new (_("Show send dialog"));
1239         gtk_widget_show (label_senddialog);
1240         gtk_box_pack_start (GTK_BOX (hbox_senddialog), label_senddialog, FALSE, FALSE, 0);
1241
1242         optmenu_senddialog = gtk_option_menu_new ();
1243         gtk_widget_show (optmenu_senddialog);
1244         gtk_box_pack_start (GTK_BOX (hbox_senddialog), optmenu_senddialog, FALSE, FALSE, 0);
1245         
1246         menu = gtk_menu_new ();
1247         MENUITEM_ADD (menu, menuitem, _("Always"), SEND_DIALOG_ALWAYS);
1248         MENUITEM_ADD (menu, menuitem, _("Never"), SEND_DIALOG_NEVER);
1249
1250         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_senddialog), menu);
1251
1252         hbox1 = gtk_hbox_new (FALSE, 8);
1253         gtk_widget_show (hbox1);
1254         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1255
1256         label_outcharset = gtk_label_new (_("Outgoing codeset"));
1257         gtk_widget_show (label_outcharset);
1258         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
1259
1260         charset_tooltip = gtk_tooltips_new();
1261
1262         optmenu_charset = gtk_option_menu_new ();
1263         gtk_widget_show (optmenu_charset);
1264         gtk_tooltips_set_tip(GTK_TOOLTIPS(charset_tooltip), optmenu_charset,
1265                              _("If `Automatic' is selected, the optimal encoding"
1266                                " for the current locale will be used"),
1267                              NULL);
1268         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_charset, FALSE, FALSE, 0);
1269
1270         optmenu_menu = gtk_menu_new ();
1271
1272 #define SET_MENUITEM(str, data) \
1273 { \
1274         MENUITEM_ADD(optmenu_menu, menuitem, str, data); \
1275 }
1276
1277         SET_MENUITEM(_("Automatic (Recommended)"),       CS_AUTO);
1278         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
1279 #if HAVE_ICONV
1280         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
1281 #endif
1282         SET_MENUITEM(_("Western European (ISO-8859-1)"),  CS_ISO_8859_1);
1283         SET_MENUITEM(_("Western European (ISO-8859-15)"), CS_ISO_8859_15);
1284         SET_MENUITEM(_("Central European (ISO-8859-2)"),  CS_ISO_8859_2);
1285         SET_MENUITEM(_("Baltic (ISO-8859-13)"),           CS_ISO_8859_13);
1286         SET_MENUITEM(_("Baltic (ISO-8859-4)"),            CS_ISO_8859_4);
1287         SET_MENUITEM(_("Greek (ISO-8859-7)"),             CS_ISO_8859_7);
1288         SET_MENUITEM(_("Turkish (ISO-8859-9)"),           CS_ISO_8859_9);
1289 #if HAVE_ICONV
1290         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),          CS_ISO_8859_5);
1291 #endif
1292         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
1293 #if HAVE_ICONV
1294         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_WINDOWS_1251);
1295         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
1296 #endif
1297         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
1298 #if 0
1299         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
1300         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
1301 #endif /* 0 */
1302         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
1303         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
1304 #if 0
1305         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
1306         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
1307 #endif /* 0 */
1308         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
1309         SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
1310         SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
1311
1312         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_charset),
1313                                   optmenu_menu);
1314
1315         hbox1 = gtk_hbox_new (FALSE, 8);
1316         gtk_widget_show (hbox1);
1317         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1318
1319         hbox1 = gtk_hbox_new (FALSE, 8);
1320         gtk_widget_show (hbox1);
1321         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1322
1323         label_encoding = gtk_label_new (_("Transfer encoding"));
1324         gtk_widget_show (label_encoding);
1325         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding, FALSE, FALSE, 0);
1326
1327         encoding_tooltip = gtk_tooltips_new();
1328
1329         optmenu_encoding = gtk_option_menu_new ();
1330         gtk_widget_show (optmenu_encoding);
1331         gtk_tooltips_set_tip(GTK_TOOLTIPS(encoding_tooltip), optmenu_encoding,
1332                              _("Specify Content-Transfer-Encoding used when"
1333                                " message body contains non-ASCII characters"),
1334                              NULL);
1335         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_encoding, FALSE, FALSE, 0);
1336
1337         optmenu_menu = gtk_menu_new ();
1338
1339         SET_MENUITEM(_("Automatic"),     CTE_AUTO);
1340         SET_MENUITEM("base64",           CTE_BASE64);
1341         SET_MENUITEM("quoted-printable", CTE_QUOTED_PRINTABLE);
1342         SET_MENUITEM("8bit",             CTE_8BIT);
1343
1344         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_encoding),
1345                                   optmenu_menu);
1346
1347         hbox1 = gtk_hbox_new (FALSE, 8);
1348         gtk_widget_show (hbox1);
1349         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1350
1351         p_send.checkbtn_savemsg  = checkbtn_savemsg;
1352         p_send.checkbtn_queuemsg = checkbtn_queuemsg;
1353         p_send.optmenu_senddialog = optmenu_senddialog;
1354
1355         p_send.optmenu_charset = optmenu_charset;
1356         p_send.optmenu_encoding_method = optmenu_encoding;
1357 }
1358
1359 static void prefs_common_recv_dialog_newmail_notify_toggle_cb(GtkWidget *w, gpointer data)
1360 {
1361         gboolean toggled;
1362
1363         toggled = gtk_toggle_button_get_active
1364                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_manu)) ||
1365                   gtk_toggle_button_get_active
1366                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_auto));
1367         gtk_widget_set_sensitive(receive.hbox_newmail_notify, toggled);
1368 }
1369
1370 static void prefs_compose_create(void)
1371 {
1372         GtkWidget *vbox1;
1373         GtkWidget *vbox2;
1374
1375         GtkWidget *checkbtn_autoextedit;
1376
1377         GtkWidget *frame_autosel;
1378         GtkWidget *hbox_autosel;
1379         GtkWidget *checkbtn_reply_account_autosel;
1380         GtkWidget *checkbtn_forward_account_autosel;
1381         GtkWidget *checkbtn_reedit_account_autosel;
1382
1383         GtkWidget *hbox_undolevel;
1384         GtkWidget *label_undolevel;
1385         GtkObject *spinbtn_undolevel_adj;
1386         GtkWidget *spinbtn_undolevel;
1387
1388         GtkWidget *vbox_linewrap;
1389
1390         GtkWidget *hbox3;
1391         GtkWidget *hbox4;
1392         GtkWidget *hbox5;
1393         GtkWidget *label_linewrap;
1394         GtkObject *spinbtn_linewrap_adj;
1395         GtkWidget *spinbtn_linewrap;
1396         GtkWidget *checkbtn_wrapquote;
1397         GtkWidget *checkbtn_autowrap;
1398         GtkWidget *checkbtn_wrapatsend;
1399
1400         GtkWidget *checkbtn_default_reply_list;
1401
1402         GtkWidget *checkbtn_forward_as_attachment;
1403         GtkWidget *checkbtn_redirect_keep_from;
1404         GtkWidget *checkbtn_smart_wrapping;
1405         GtkWidget *checkbtn_block_cursor;
1406         GtkWidget *frame_msgwrap;
1407
1408         GtkWidget *hbox_autosave;
1409         GtkWidget *checkbtn_autosave;
1410         GtkWidget *entry_autosave_length;
1411         GtkWidget *label_autosave_length;
1412         
1413         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1414         gtk_widget_show (vbox1);
1415         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1416         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1417
1418         /* Account autoselection */
1419         PACK_FRAME(vbox1, frame_autosel, _("Automatic account selection"));
1420
1421         hbox_autosel = gtk_hbox_new (FALSE, VSPACING_NARROW);
1422         gtk_widget_show (hbox_autosel);
1423         gtk_container_add (GTK_CONTAINER (frame_autosel), hbox_autosel);
1424         gtk_container_set_border_width (GTK_CONTAINER (hbox_autosel), 8);
1425
1426         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reply_account_autosel,
1427                            _("when replying"));
1428         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_forward_account_autosel,
1429                            _("when forwarding"));
1430         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reedit_account_autosel,
1431                            _("when re-editing"));
1432
1433         vbox2 = gtk_vbox_new (FALSE, 0);
1434         gtk_widget_show (vbox2);
1435         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1436
1437         PACK_CHECK_BUTTON (vbox2, checkbtn_default_reply_list,
1438                            _("Reply button invokes mailing list reply"));
1439
1440         PACK_CHECK_BUTTON (vbox2, checkbtn_autoextedit,
1441                            _("Automatically launch the external editor"));
1442
1443         hbox5 = gtk_hbox_new (FALSE, 8);
1444         gtk_widget_show (hbox5);
1445         gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1446
1447         PACK_CHECK_BUTTON (hbox5, checkbtn_forward_as_attachment,
1448                            _("Forward as attachment"));
1449
1450         PACK_CHECK_BUTTON (hbox5, checkbtn_block_cursor,
1451                           _("Block cursor"));
1452
1453         PACK_CHECK_BUTTON (vbox2, checkbtn_redirect_keep_from,
1454                            _("Keep the original 'From' header when redirecting"));
1455
1456         
1457         hbox_autosave = gtk_hbox_new (FALSE, 8);
1458         gtk_widget_show (hbox_autosave);
1459         gtk_box_pack_start (GTK_BOX (vbox1), hbox_autosave, FALSE, FALSE, 0);
1460         
1461         PACK_CHECK_BUTTON (hbox_autosave, checkbtn_autosave,
1462                            _("Autosave to Drafts folder every "));
1463
1464         entry_autosave_length = gtk_entry_new();
1465         gtk_widget_set_size_request (entry_autosave_length, 64, -1);    
1466         gtk_widget_show (entry_autosave_length);
1467         gtk_box_pack_start (GTK_BOX (hbox_autosave), entry_autosave_length, FALSE, FALSE, 0);
1468         
1469         label_autosave_length = gtk_label_new(_("characters"));
1470         gtk_widget_show (label_autosave_length);
1471         gtk_box_pack_start (GTK_BOX (hbox_autosave), label_autosave_length, FALSE, FALSE, 0);
1472         
1473         hbox_undolevel = gtk_hbox_new (FALSE, 8);
1474         gtk_widget_show (hbox_undolevel);
1475         gtk_box_pack_start (GTK_BOX (vbox1), hbox_undolevel, FALSE, FALSE, 0);
1476
1477         label_undolevel = gtk_label_new (_("Undo level"));
1478         gtk_widget_show (label_undolevel);
1479         gtk_box_pack_start (GTK_BOX (hbox_undolevel), label_undolevel, FALSE, FALSE, 0);
1480
1481         spinbtn_undolevel_adj = gtk_adjustment_new (50, 0, 100, 1, 10, 10);
1482         spinbtn_undolevel = gtk_spin_button_new
1483                 (GTK_ADJUSTMENT (spinbtn_undolevel_adj), 1, 0);
1484         gtk_widget_show (spinbtn_undolevel);
1485         gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0);
1486         gtk_widget_set_size_request (spinbtn_undolevel, 64, -1);
1487         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE);
1488
1489         /* line-wrapping */
1490         PACK_FRAME(vbox1, frame_msgwrap, _("Message wrapping"));
1491
1492         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1493         gtk_widget_show (vbox_linewrap);
1494         gtk_container_add (GTK_CONTAINER (frame_msgwrap), vbox_linewrap);
1495         gtk_container_set_border_width (GTK_CONTAINER (vbox_linewrap), 8);
1496
1497         hbox3 = gtk_hbox_new (FALSE, 8);
1498         gtk_widget_show (hbox3);
1499         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1500
1501
1502         label_linewrap = gtk_label_new (_("Wrap messages at"));
1503         gtk_widget_show (label_linewrap);
1504         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1505
1506         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1507         spinbtn_linewrap = gtk_spin_button_new
1508                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1509         gtk_widget_show (spinbtn_linewrap);
1510         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1511         gtk_widget_set_size_request (spinbtn_linewrap, 64, -1);
1512         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1513
1514         label_linewrap = gtk_label_new (_("characters"));
1515         gtk_widget_show (label_linewrap);
1516         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1517
1518         hbox4 = gtk_hbox_new (FALSE, VSPACING);
1519         gtk_widget_show (hbox4);
1520         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1521
1522         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1523
1524         PACK_CHECK_BUTTON (hbox4, checkbtn_autowrap, _("Wrap on input"));
1525
1526         PACK_CHECK_BUTTON
1527                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1528
1529         PACK_CHECK_BUTTON (vbox_linewrap, checkbtn_smart_wrapping,
1530                            _("Smart wrapping (EXPERIMENTAL)"));
1531         
1532        /*
1533         compose.checkbtn_quote   = checkbtn_quote;
1534         compose.entry_quotemark  = entry_quotemark;
1535         compose.text_quotefmt    = text_quotefmt;
1536         */
1537
1538         compose.checkbtn_autoextedit = checkbtn_autoextedit;
1539
1540         compose.checkbtn_reply_account_autosel   = checkbtn_reply_account_autosel;
1541         compose.checkbtn_forward_account_autosel = checkbtn_forward_account_autosel;
1542         compose.checkbtn_reedit_account_autosel  = checkbtn_reedit_account_autosel;
1543
1544         compose.spinbtn_undolevel     = spinbtn_undolevel;
1545         compose.spinbtn_undolevel_adj = spinbtn_undolevel_adj;
1546
1547         compose.spinbtn_linewrap      = spinbtn_linewrap;
1548         compose.spinbtn_linewrap_adj  = spinbtn_linewrap_adj;
1549         compose.checkbtn_wrapquote    = checkbtn_wrapquote;
1550         compose.checkbtn_autowrap     = checkbtn_autowrap;
1551         compose.checkbtn_wrapatsend   = checkbtn_wrapatsend;
1552
1553         compose.checkbtn_autosave     = checkbtn_autosave;
1554         compose.entry_autosave_length = entry_autosave_length;
1555         
1556         compose.checkbtn_forward_as_attachment =
1557                 checkbtn_forward_as_attachment;
1558         compose.checkbtn_redirect_keep_from =
1559                 checkbtn_redirect_keep_from;
1560         compose.checkbtn_smart_wrapping = 
1561                 checkbtn_smart_wrapping;
1562         compose.checkbtn_block_cursor   =
1563                 checkbtn_block_cursor;
1564         compose.checkbtn_default_reply_list = checkbtn_default_reply_list;
1565 }
1566
1567 static void prefs_quote_create(void)
1568 {
1569         GtkWidget *vbox1;
1570         GtkWidget *frame_quote;
1571         GtkWidget *vbox_quote;
1572         GtkWidget *hbox1;
1573         GtkWidget *hbox2;
1574         GtkWidget *label_quotemark;
1575         GtkWidget *entry_quotemark;
1576         GtkWidget *scrolledwin_quotefmt;
1577         GtkWidget *text_quotefmt;
1578
1579         GtkWidget *entry_fw_quotemark;
1580         GtkWidget *text_fw_quotefmt;
1581
1582         GtkWidget *entry_quote_chars;
1583         GtkWidget *label_quote_chars;
1584         
1585         GtkWidget *btn_quotedesc;
1586
1587         GtkWidget *checkbtn_reply_with_quote;
1588
1589         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1590         gtk_widget_show (vbox1);
1591         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1592         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1593
1594         /* reply */
1595
1596         PACK_CHECK_BUTTON (vbox1, checkbtn_reply_with_quote, _("Reply will quote by default"));
1597
1598         PACK_FRAME (vbox1, frame_quote, _("Reply format"));
1599
1600         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1601         gtk_widget_show (vbox_quote);
1602         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1603         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1604
1605         hbox1 = gtk_hbox_new (FALSE, 32);
1606         gtk_widget_show (hbox1);
1607         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1608
1609         hbox2 = gtk_hbox_new (FALSE, 8);
1610         gtk_widget_show (hbox2);
1611         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1612
1613         label_quotemark = gtk_label_new (_("Quotation mark"));
1614         gtk_widget_show (label_quotemark);
1615         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1616
1617         entry_quotemark = gtk_entry_new ();
1618         gtk_widget_show (entry_quotemark);
1619         gtk_box_pack_start (GTK_BOX (hbox2), entry_quotemark, FALSE, FALSE, 0);
1620         gtk_widget_set_size_request (entry_quotemark, 64, -1);
1621
1622         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1623         gtk_widget_show (scrolledwin_quotefmt);
1624         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1625         gtk_scrolled_window_set_policy
1626                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1627                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1628
1629         text_quotefmt = gtk_text_view_new ();
1630         gtk_widget_show (text_quotefmt);
1631         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1632         gtk_text_view_set_editable (GTK_TEXT_VIEW(text_quotefmt), TRUE);
1633         gtk_widget_set_size_request(text_quotefmt, -1, 60);
1634
1635         /* forward */
1636
1637         PACK_FRAME (vbox1, frame_quote, _("Forward format"));
1638
1639         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1640         gtk_widget_show (vbox_quote);
1641         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1642         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1643
1644         hbox1 = gtk_hbox_new (FALSE, 32);
1645         gtk_widget_show (hbox1);
1646         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1647
1648         hbox2 = gtk_hbox_new (FALSE, 8);
1649         gtk_widget_show (hbox2);
1650         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1651
1652         label_quotemark = gtk_label_new (_("Quotation mark"));
1653         gtk_widget_show (label_quotemark);
1654         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1655
1656         entry_fw_quotemark = gtk_entry_new ();
1657         gtk_widget_show (entry_fw_quotemark);
1658         gtk_box_pack_start (GTK_BOX (hbox2), entry_fw_quotemark,
1659                             FALSE, FALSE, 0);
1660         gtk_widget_set_size_request (entry_fw_quotemark, 64, -1);
1661
1662         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1663         gtk_widget_show (scrolledwin_quotefmt);
1664         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1665         gtk_scrolled_window_set_policy
1666                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1667                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1668
1669         text_fw_quotefmt = gtk_text_view_new ();
1670         gtk_widget_show (text_fw_quotefmt);
1671         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt),
1672                           text_fw_quotefmt);
1673         gtk_text_view_set_editable (GTK_TEXT_VIEW (text_fw_quotefmt), TRUE);
1674         gtk_widget_set_size_request(text_fw_quotefmt, -1, 60);
1675
1676         hbox1 = gtk_hbox_new (FALSE, 32);
1677         gtk_widget_show (hbox1);
1678         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1679
1680         btn_quotedesc =
1681                 gtk_button_new_with_label (_(" Description of symbols "));
1682         gtk_widget_show (btn_quotedesc);
1683         gtk_box_pack_start (GTK_BOX (hbox1), btn_quotedesc, FALSE, FALSE, 0);
1684         g_signal_connect(G_OBJECT(btn_quotedesc), "clicked",
1685                          G_CALLBACK(quote_fmt_quote_description), NULL);
1686
1687         /* quote chars */
1688
1689         PACK_FRAME (vbox1, frame_quote, _("Quotation characters"));
1690
1691         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1692         gtk_widget_show (vbox_quote);
1693         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1694         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1695
1696         hbox1 = gtk_hbox_new (FALSE, 32);
1697         gtk_widget_show (hbox1);
1698         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1699
1700         hbox2 = gtk_hbox_new (FALSE, 8);
1701         gtk_widget_show (hbox2);
1702         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1703
1704         label_quote_chars = gtk_label_new (_("Treat these characters as quotation marks: "));
1705         gtk_widget_show (label_quote_chars);
1706         gtk_box_pack_start (GTK_BOX (hbox2), label_quote_chars, FALSE, FALSE, 0);
1707
1708         entry_quote_chars = gtk_entry_new ();
1709         gtk_widget_show (entry_quote_chars);
1710         gtk_box_pack_start (GTK_BOX (hbox2), entry_quote_chars,
1711                             FALSE, FALSE, 0);
1712         gtk_widget_set_size_request (entry_quote_chars, 64, -1);
1713
1714
1715         compose.checkbtn_reply_with_quote= checkbtn_reply_with_quote;
1716         quote.entry_quotemark    = entry_quotemark;
1717         quote.text_quotefmt      = text_quotefmt;
1718         quote.entry_fw_quotemark = entry_fw_quotemark;
1719         quote.text_fw_quotefmt   = text_fw_quotefmt;
1720         quote.entry_quote_chars  = entry_quote_chars;
1721 }
1722
1723 static void prefs_display_create(void)
1724 {
1725         GtkWidget *vbox1;
1726         GtkWidget *chkbtn_transhdr;
1727         GtkWidget *chkbtn_folder_unread;
1728         GtkWidget *hbox1;
1729         GtkWidget *label_ng_abbrev;
1730         GtkWidget *spinbtn_ng_abbrev_len;
1731         GtkObject *spinbtn_ng_abbrev_len_adj;
1732         GtkWidget *frame_summary;
1733         GtkWidget *vbox2;
1734         GtkWidget *chkbtn_swapfrom;
1735         GtkWidget *chkbtn_useaddrbook;
1736         GtkWidget *chkbtn_threadsubj;
1737         GtkWidget *vbox3;
1738         GtkWidget *label_datefmt;
1739         GtkWidget *button_datefmt;
1740         GtkWidget *entry_datefmt;
1741         GtkWidget *button_dispitem;
1742
1743         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1744         gtk_widget_show (vbox1);
1745         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1746         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1747
1748         vbox2 = gtk_vbox_new (FALSE, 0);
1749         gtk_widget_show (vbox2);
1750         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1751
1752         PACK_CHECK_BUTTON
1753                 (vbox2, chkbtn_transhdr,
1754                  _("Translate header name (such as `From:', `Subject:')"));
1755
1756         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1757                            _("Display unread number next to folder name"));
1758
1759         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1760
1761         hbox1 = gtk_hbox_new (FALSE, 8);
1762         gtk_widget_show (hbox1);
1763         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1764
1765         label_ng_abbrev = gtk_label_new
1766                 (_("Abbreviate newsgroup names longer than"));
1767         gtk_widget_show (label_ng_abbrev);
1768         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1769
1770         spinbtn_ng_abbrev_len_adj = gtk_adjustment_new (16, 0, 999, 1, 10, 10);
1771         spinbtn_ng_abbrev_len = gtk_spin_button_new
1772                 (GTK_ADJUSTMENT (spinbtn_ng_abbrev_len_adj), 1, 0);
1773         gtk_widget_show (spinbtn_ng_abbrev_len);
1774         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_ng_abbrev_len,
1775                             FALSE, FALSE, 0);
1776         gtk_widget_set_size_request (spinbtn_ng_abbrev_len, 56, -1);
1777         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_ng_abbrev_len),
1778                                      TRUE);
1779
1780         label_ng_abbrev = gtk_label_new
1781                 (_("letters"));
1782         gtk_widget_show (label_ng_abbrev);
1783         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1784
1785         /* ---- Summary ---- */
1786
1787         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1788
1789         vbox2 = gtk_vbox_new (FALSE, 0);
1790         gtk_widget_show (vbox2);
1791         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1792         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1793
1794         PACK_CHECK_BUTTON
1795                 (vbox2, chkbtn_swapfrom,
1796                  _("Display recipient in `From' column if sender is yourself"));
1797         PACK_CHECK_BUTTON
1798                 (vbox2, chkbtn_useaddrbook,
1799                  _("Display sender using address book"));
1800         PACK_CHECK_BUTTON
1801                 (vbox2, chkbtn_threadsubj,
1802                  _("Thread using subject in addition to standard headers"));
1803
1804         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1805
1806         hbox1 = gtk_hbox_new (FALSE, 8);
1807         gtk_widget_show (hbox1);
1808         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1809
1810         label_datefmt = gtk_label_new (_("Date format"));
1811         gtk_widget_show (label_datefmt);
1812         gtk_box_pack_start (GTK_BOX (hbox1), label_datefmt, FALSE, FALSE, 0);
1813
1814         entry_datefmt = gtk_entry_new ();
1815         gtk_widget_show (entry_datefmt);
1816         gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
1817
1818         button_datefmt = gtk_button_new_with_label (" ... ");
1819
1820         gtk_widget_show (button_datefmt);
1821         gtk_box_pack_start (GTK_BOX (hbox1), button_datefmt, FALSE, FALSE, 0);
1822         g_signal_connect (G_OBJECT (button_datefmt), "clicked",
1823                           G_CALLBACK (date_format_create), NULL);
1824
1825         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW);
1826
1827         hbox1 = gtk_hbox_new (FALSE, 8);
1828         gtk_widget_show (hbox1);
1829         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1830
1831         button_dispitem = gtk_button_new_with_label
1832                 (_(" Set displayed items in summary... "));
1833         gtk_widget_show (button_dispitem);
1834         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1835         g_signal_connect (G_OBJECT (button_dispitem), "clicked",
1836                           G_CALLBACK (prefs_summary_column_open),
1837                           NULL);
1838
1839         display.chkbtn_transhdr           = chkbtn_transhdr;
1840         display.chkbtn_folder_unread      = chkbtn_folder_unread;
1841         display.spinbtn_ng_abbrev_len     = spinbtn_ng_abbrev_len;
1842         display.spinbtn_ng_abbrev_len_adj = spinbtn_ng_abbrev_len_adj;
1843
1844         display.chkbtn_swapfrom      = chkbtn_swapfrom;
1845         display.chkbtn_useaddrbook   = chkbtn_useaddrbook;
1846         display.chkbtn_threadsubj    = chkbtn_threadsubj;
1847         display.entry_datefmt        = entry_datefmt;
1848 }
1849
1850 static void prefs_message_create(void)
1851 {
1852         GtkWidget *vbox1;
1853         GtkWidget *vbox2;
1854         GtkWidget *vbox3;
1855         GtkWidget *hbox1;
1856         GtkWidget *chkbtn_enablecol;
1857         GtkWidget *button_edit_col;
1858         GtkWidget *chkbtn_mbalnum;
1859         GtkWidget *chkbtn_disphdrpane;
1860         GtkWidget *chkbtn_disphdr;
1861         GtkWidget *button_edit_disphdr;
1862         GtkWidget *hbox_linespc;
1863         GtkWidget *label_linespc;
1864         GtkObject *spinbtn_linespc_adj;
1865         GtkWidget *spinbtn_linespc;
1866         GtkWidget *chkbtn_headspc;
1867
1868         GtkWidget *frame_scr;
1869         GtkWidget *vbox_scr;
1870         GtkWidget *chkbtn_smoothscroll;
1871         GtkWidget *hbox_scr;
1872         GtkWidget *label_scr;
1873         GtkObject *spinbtn_scrollstep_adj;
1874         GtkWidget *spinbtn_scrollstep;
1875         GtkWidget *chkbtn_halfpage;
1876
1877         GtkWidget *chkbtn_attach_desc;
1878
1879         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1880         gtk_widget_show (vbox1);
1881         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1882         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1883
1884         vbox2 = gtk_vbox_new (FALSE, 0);
1885         gtk_widget_show (vbox2);
1886         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1887
1888         hbox1 = gtk_hbox_new (FALSE, 8);
1889         gtk_widget_show (hbox1);
1890         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1891
1892         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
1893                            _("Enable coloration of message"));
1894         g_signal_connect(G_OBJECT(chkbtn_enablecol), "toggled",
1895                          G_CALLBACK(prefs_enable_message_color_toggled),
1896                          NULL);
1897
1898         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
1899         gtk_widget_show (button_edit_col);
1900         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
1901         g_signal_connect (G_OBJECT (button_edit_col), "clicked",
1902                           G_CALLBACK(prefs_quote_colors_dialog), NULL);
1903
1904         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
1905
1906         PACK_CHECK_BUTTON
1907                 (vbox2, chkbtn_mbalnum,
1908                  _("Display multi-byte alphanumeric as\n"
1909                    "ASCII character (Japanese only)"));
1910         gtk_label_set_justify (GTK_LABEL (GTK_BIN(chkbtn_mbalnum)->child),
1911                                GTK_JUSTIFY_LEFT);
1912
1913         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1914                           _("Display header pane above message view"));
1915
1916         hbox1 = gtk_hbox_new (FALSE, 8);
1917         gtk_widget_show (hbox1);
1918         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1919
1920         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
1921                           _("Display short headers on message view"));
1922
1923         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
1924         gtk_widget_show (button_edit_disphdr);
1925         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
1926                           FALSE, TRUE, 0);
1927         g_signal_connect (G_OBJECT (button_edit_disphdr), "clicked",
1928                           G_CALLBACK (prefs_display_header_open),
1929                           NULL);
1930
1931         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
1932
1933         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1934
1935         hbox1 = gtk_hbox_new (FALSE, 32);
1936         gtk_widget_show (hbox1);
1937         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1938
1939         hbox_linespc = gtk_hbox_new (FALSE, 8);
1940         gtk_widget_show (hbox1);
1941         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1942
1943         label_linespc = gtk_label_new (_("Line space"));
1944         gtk_widget_show (label_linespc);
1945         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1946                             FALSE, FALSE, 0);
1947
1948         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1949         spinbtn_linespc = gtk_spin_button_new
1950                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1951         gtk_widget_show (spinbtn_linespc);
1952         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1953                             FALSE, FALSE, 0);
1954         gtk_widget_set_size_request (spinbtn_linespc, 64, -1);
1955         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1956
1957         label_linespc = gtk_label_new (_("pixel(s)"));
1958         gtk_widget_show (label_linespc);
1959         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1960                             FALSE, FALSE, 0);
1961
1962         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Leave space on head"));
1963
1964         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1965
1966         vbox_scr = gtk_vbox_new (FALSE, 0);
1967         gtk_widget_show (vbox_scr);
1968         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1969         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1970
1971         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1972
1973         hbox1 = gtk_hbox_new (FALSE, 32);
1974         gtk_widget_show (hbox1);
1975         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1976
1977         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1978
1979         hbox_scr = gtk_hbox_new (FALSE, 8);
1980         gtk_widget_show (hbox_scr);
1981         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1982
1983         label_scr = gtk_label_new (_("Step"));
1984         gtk_widget_show (label_scr);
1985         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1986
1987         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1988         spinbtn_scrollstep = gtk_spin_button_new
1989                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1990         gtk_widget_show (spinbtn_scrollstep);
1991         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1992                             FALSE, FALSE, 0);
1993         gtk_widget_set_size_request (spinbtn_scrollstep, 64, -1);
1994         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1995                                      TRUE);
1996
1997         label_scr = gtk_label_new (_("pixel(s)"));
1998         gtk_widget_show (label_scr);
1999         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
2000
2001         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
2002
2003         vbox3 = gtk_vbox_new (FALSE, 0);
2004         gtk_widget_show (vbox3);
2005         gtk_box_pack_start (GTK_BOX (vbox1), vbox3, FALSE, FALSE, 0);
2006
2007         PACK_CHECK_BUTTON(vbox3, chkbtn_attach_desc,
2008                           _("Show attachment descriptions (rather than names)"));
2009
2010
2011         message.chkbtn_enablecol   = chkbtn_enablecol;
2012         message.button_edit_col    = button_edit_col;
2013         message.chkbtn_mbalnum     = chkbtn_mbalnum;
2014         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
2015         message.chkbtn_disphdr     = chkbtn_disphdr;
2016         message.spinbtn_linespc    = spinbtn_linespc;
2017         message.chkbtn_headspc     = chkbtn_headspc;
2018
2019         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
2020         message.spinbtn_scrollstep     = spinbtn_scrollstep;
2021         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
2022         message.chkbtn_halfpage        = chkbtn_halfpage;
2023
2024         message.chkbtn_attach_desc  = chkbtn_attach_desc;
2025 }
2026
2027 #if USE_GPGME
2028 static void prefs_privacy_create(void)
2029 {
2030         GtkWidget *vbox1;
2031         GtkWidget *vbox2;
2032         GtkWidget *vbox3;
2033         GtkWidget *hbox1;
2034         GtkWidget *hbox_spc;
2035         GtkWidget *label;
2036         GtkWidget *checkbtn_auto_check_signatures;
2037         GtkWidget *checkbtn_store_passphrase;
2038         GtkObject *spinbtn_store_passphrase_adj;
2039         GtkWidget *spinbtn_store_passphrase;
2040         GtkTooltips *store_tooltip;
2041         GtkWidget *checkbtn_passphrase_grab;
2042         GtkWidget *checkbtn_gpg_warning;
2043
2044         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2045         gtk_widget_show (vbox1);
2046         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2047         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2048
2049         vbox2 = gtk_vbox_new (FALSE, 0);
2050         gtk_widget_show (vbox2);
2051         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2052
2053         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
2054                            _("Automatically check signatures"));
2055
2056         PACK_CHECK_BUTTON (vbox2, checkbtn_store_passphrase,
2057                            _("Store passphrase in memory temporarily"));
2058
2059         vbox3 = gtk_vbox_new (FALSE, 0);
2060         gtk_widget_show (vbox3);
2061         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2062
2063         hbox1 = gtk_hbox_new (FALSE, 8);
2064         gtk_widget_show (hbox1);
2065         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2066
2067         hbox_spc = gtk_hbox_new (FALSE, 0);
2068         gtk_widget_show (hbox_spc);
2069         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2070         gtk_widget_set_size_request (hbox_spc, 12, -1);
2071
2072         label = gtk_label_new (_("Expire after"));
2073         gtk_widget_show (label);
2074         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2075
2076         store_tooltip = gtk_tooltips_new();
2077
2078         spinbtn_store_passphrase_adj = gtk_adjustment_new (0, 0, 1440, 1, 5, 5);
2079         spinbtn_store_passphrase = gtk_spin_button_new
2080                 (GTK_ADJUSTMENT (spinbtn_store_passphrase_adj), 1, 0);
2081         gtk_widget_show (spinbtn_store_passphrase);
2082         gtk_tooltips_set_tip(GTK_TOOLTIPS(store_tooltip), spinbtn_store_passphrase,
2083                              _("Setting to '0' will store the passphrase"
2084                                " for the whole session"),
2085                              NULL);
2086         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_store_passphrase, FALSE, FALSE, 0);
2087         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_store_passphrase),
2088                                      TRUE);
2089         gtk_widget_set_size_request (spinbtn_store_passphrase, 64, -1);
2090
2091         label = gtk_label_new (_("minute(s) "));
2092         gtk_widget_show (label);
2093         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2094
2095         hbox1 = gtk_hbox_new (FALSE, 8);
2096         gtk_widget_show (hbox1);
2097         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2098
2099         hbox_spc = gtk_hbox_new (FALSE, 0);
2100         gtk_widget_show (hbox_spc);
2101         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2102         gtk_widget_set_size_request (hbox_spc, 12, -1);
2103
2104         SET_TOGGLE_SENSITIVITY (checkbtn_store_passphrase, vbox3);
2105
2106 #ifndef __MINGW32__
2107         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
2108                            _("Grab input while entering a passphrase"));
2109 #endif
2110
2111         PACK_CHECK_BUTTON
2112                 (vbox2, checkbtn_gpg_warning,
2113                  _("Display warning on startup if GnuPG doesn't work"));
2114
2115         hbox1 = gtk_hbox_new (FALSE, 8);
2116         gtk_widget_show (hbox1);
2117         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2118
2119         privacy.checkbtn_auto_check_signatures
2120                                              = checkbtn_auto_check_signatures;
2121         privacy.checkbtn_store_passphrase    = checkbtn_store_passphrase;
2122         privacy.spinbtn_store_passphrase     = spinbtn_store_passphrase;
2123         privacy.spinbtn_store_passphrase_adj = spinbtn_store_passphrase_adj;
2124         privacy.checkbtn_passphrase_grab     = checkbtn_passphrase_grab;
2125         privacy.checkbtn_gpg_warning         = checkbtn_gpg_warning;
2126 }
2127 #endif /* USE_GPGME */
2128
2129 static void prefs_interface_create(void)
2130 {
2131         GtkWidget *vbox1;
2132         GtkWidget *vbox2;
2133         GtkWidget *vbox3;
2134         /* GtkWidget *checkbtn_emacs; */
2135         GtkWidget *checkbtn_always_show_msg;
2136         GtkWidget *checkbtn_openunread;
2137         GtkWidget *checkbtn_mark_as_read_on_newwin;
2138         GtkWidget *checkbtn_openinbox;
2139         GtkWidget *checkbtn_immedexec;
2140         GtkTooltips *immedexec_tooltip;
2141         GtkWidget *hbox1;
2142         GtkWidget *label;
2143         GtkWidget *menu;
2144         GtkWidget *menuitem;
2145
2146         GtkWidget *button_keybind;
2147
2148         GtkWidget *hbox_nextunreadmsgdialog;
2149         GtkWidget *optmenu_nextunreadmsgdialog;
2150
2151         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2152         gtk_widget_show (vbox1);
2153         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2154         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2155
2156         vbox2 = gtk_vbox_new (FALSE, 0);
2157         gtk_widget_show (vbox2);
2158         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2159
2160         /* PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
2161                            _("Emulate the behavior of mouse operation of\n"
2162                              "Emacs-based mailer"));
2163         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
2164                                GTK_JUSTIFY_LEFT);   */
2165
2166         PACK_CHECK_BUTTON
2167                 (vbox2, checkbtn_always_show_msg,
2168                  _("Always open messages in summary when selected"));
2169
2170         PACK_CHECK_BUTTON
2171                 (vbox2, checkbtn_openunread,
2172                  _("Open first unread message when entering a folder"));
2173
2174         PACK_CHECK_BUTTON
2175                 (vbox2, checkbtn_mark_as_read_on_newwin,
2176                  _("Only mark message as read when opened in new window"));
2177
2178         PACK_CHECK_BUTTON
2179                 (vbox2, checkbtn_openinbox,
2180                  _("Go to inbox after receiving new mail"));
2181
2182         vbox3 = gtk_vbox_new (FALSE, 0);
2183         gtk_widget_show (vbox3);
2184         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2185
2186         immedexec_tooltip = gtk_tooltips_new();
2187
2188         PACK_CHECK_BUTTON
2189                 (vbox3, checkbtn_immedexec,
2190                  _("Execute immediately when moving or deleting messages"));
2191         gtk_tooltips_set_tip(GTK_TOOLTIPS(immedexec_tooltip), checkbtn_immedexec,
2192                              _("Messages will be marked until execution"
2193                                " if this is turned off"),
2194                              NULL);
2195
2196         hbox1 = gtk_hbox_new (FALSE, 0);
2197         gtk_widget_show (hbox1);
2198         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2199
2200         /* Next Unread Message Dialog */
2201         hbox_nextunreadmsgdialog = gtk_hbox_new (FALSE, 8);
2202         gtk_widget_show (hbox1);
2203         gtk_box_pack_start (GTK_BOX (vbox1), hbox_nextunreadmsgdialog, FALSE, FALSE, 0);
2204
2205         label = gtk_label_new (_("Show no-unread-message dialog"));
2206         gtk_widget_show (label);
2207         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), label, FALSE, FALSE, 8);
2208
2209         optmenu_nextunreadmsgdialog = gtk_option_menu_new ();
2210         gtk_widget_show (optmenu_nextunreadmsgdialog);
2211         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), optmenu_nextunreadmsgdialog, FALSE, FALSE, 8);
2212         
2213         menu = gtk_menu_new ();
2214         MENUITEM_ADD (menu, menuitem, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
2215         MENUITEM_ADD (menu, menuitem, _("Assume 'Yes'"), 
2216                       NEXTUNREADMSGDIALOG_ASSUME_YES);
2217         MENUITEM_ADD (menu, menuitem, _("Assume 'No'"), 
2218                       NEXTUNREADMSGDIALOG_ASSUME_NO);
2219
2220         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_nextunreadmsgdialog), menu);
2221
2222         hbox1 = gtk_hbox_new (FALSE, 8);
2223         gtk_widget_show (hbox1);
2224         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2225
2226         button_keybind = gtk_button_new_with_label (_(" Set key bindings... "));
2227         gtk_widget_show (button_keybind);
2228         gtk_box_pack_start (GTK_BOX (hbox1), button_keybind, FALSE, FALSE, 0);
2229         g_signal_connect (G_OBJECT (button_keybind), "clicked",
2230                           G_CALLBACK (prefs_keybind_select), NULL);
2231
2232         /* interface.checkbtn_emacs          = checkbtn_emacs; */
2233         interface.checkbtn_always_show_msg    = checkbtn_always_show_msg;
2234         interface.checkbtn_openunread         = checkbtn_openunread;
2235         interface.checkbtn_mark_as_read_on_newwin
2236                                               = checkbtn_mark_as_read_on_newwin;
2237         interface.checkbtn_openinbox          = checkbtn_openinbox;
2238         interface.checkbtn_immedexec          = checkbtn_immedexec;
2239         interface.optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
2240 }
2241
2242 static void prefs_other_create(void)
2243 {
2244         GtkWidget *vbox1;
2245         GtkWidget *hbox1;
2246
2247         GtkWidget *frame_addr;
2248         GtkWidget *vbox_addr;
2249         GtkWidget *checkbtn_addaddrbyclick;
2250         
2251         GtkWidget *frame_cliplog;
2252         GtkWidget *vbox_cliplog;
2253         GtkWidget *hbox_cliplog;
2254         GtkWidget *checkbtn_cliplog;
2255         GtkWidget *loglength_label;
2256         GtkWidget *loglength_entry;
2257         GtkTooltips *loglength_tooltip;
2258
2259         GtkWidget *frame_exit;
2260         GtkWidget *vbox_exit;
2261         GtkWidget *checkbtn_confonexit;
2262         GtkWidget *checkbtn_cleanonexit;
2263         GtkWidget *checkbtn_askonclean;
2264         GtkWidget *checkbtn_warnqueued;
2265
2266         GtkWidget *label_iotimeout;
2267         GtkWidget *spinbtn_iotimeout;
2268         GtkObject *spinbtn_iotimeout_adj;
2269
2270 #if 0
2271 #ifdef USE_OPENSSL
2272         GtkWidget *frame_ssl;
2273         GtkWidget *vbox_ssl;
2274         GtkWidget *hbox_ssl;
2275         GtkWidget *checkbtn_ssl_ask_unknown_valid;
2276 #endif
2277 #endif
2278         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2279         gtk_widget_show (vbox1);
2280         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2281         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2282
2283         PACK_FRAME (vbox1, frame_addr, _("Address book"));
2284
2285         vbox_addr = gtk_vbox_new (FALSE, 0);
2286         gtk_widget_show (vbox_addr);
2287         gtk_container_add (GTK_CONTAINER (frame_addr), vbox_addr);
2288         gtk_container_set_border_width (GTK_CONTAINER (vbox_addr), 8);
2289
2290         PACK_CHECK_BUTTON
2291                 (vbox_addr, checkbtn_addaddrbyclick,
2292                  _("Add address to destination when double-clicked"));
2293
2294         /* Clip Log */
2295         PACK_FRAME (vbox1, frame_cliplog, _("Log Size"));
2296
2297         vbox_cliplog = gtk_vbox_new (FALSE, 0);
2298         gtk_widget_show (vbox_cliplog);
2299         gtk_container_add (GTK_CONTAINER (frame_cliplog), vbox_cliplog);
2300         gtk_container_set_border_width (GTK_CONTAINER (vbox_cliplog), 8);
2301         PACK_CHECK_BUTTON (vbox_cliplog, checkbtn_cliplog,
2302                            _("Clip the log size"));
2303         hbox_cliplog = gtk_hbox_new (FALSE, 3);
2304         gtk_container_add (GTK_CONTAINER (vbox_cliplog), hbox_cliplog);
2305         gtk_widget_show (hbox_cliplog);
2306         
2307         loglength_label = gtk_label_new (_("Log window length"));
2308         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2309                             FALSE, TRUE, 0);
2310         gtk_widget_show (GTK_WIDGET (loglength_label));
2311         
2312         loglength_tooltip = gtk_tooltips_new();
2313         
2314         loglength_entry = gtk_entry_new ();
2315         gtk_widget_set_size_request (GTK_WIDGET (loglength_entry), 64, -1);
2316         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_entry,
2317                             FALSE, TRUE, 0);
2318         gtk_widget_show (GTK_WIDGET (loglength_entry));
2319         gtk_tooltips_set_tip(GTK_TOOLTIPS(loglength_tooltip), loglength_entry,
2320                              _("0 to stop logging in the log window"),
2321                              NULL);
2322         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2323                             FALSE, TRUE, 0);
2324         SET_TOGGLE_SENSITIVITY(checkbtn_cliplog, loglength_entry);
2325
2326 #if 0
2327 #ifdef USE_OPENSSL
2328         /* SSL */
2329         PACK_FRAME (vbox1, frame_ssl, _("Security"));
2330
2331         vbox_ssl = gtk_vbox_new (FALSE, 0);
2332         gtk_widget_show (vbox_ssl);
2333         gtk_container_add (GTK_CONTAINER (frame_ssl), vbox_ssl);
2334         gtk_container_set_border_width (GTK_CONTAINER (vbox_ssl), 8);
2335         PACK_CHECK_BUTTON (vbox_ssl, checkbtn_ssl_ask_unknown_valid, 
2336                            _("Ask before accepting SSL certificates"));
2337         hbox_ssl = gtk_hbox_new (FALSE, 3);
2338         gtk_container_add (GTK_CONTAINER (vbox_ssl), hbox_ssl);
2339         gtk_widget_show (hbox_ssl);
2340 #endif
2341 #endif
2342         
2343         /* On Exit */
2344         PACK_FRAME (vbox1, frame_exit, _("On exit"));
2345
2346         vbox_exit = gtk_vbox_new (FALSE, 0);
2347         gtk_widget_show (vbox_exit);
2348         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
2349         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
2350
2351         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
2352                            _("Confirm on exit"));
2353
2354         hbox1 = gtk_hbox_new (FALSE, 32);
2355         gtk_widget_show (hbox1);
2356         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
2357
2358         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
2359                            _("Empty trash on exit"));
2360         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
2361                            _("Ask before emptying"));
2362         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
2363
2364         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
2365                            _("Warn if there are queued messages"));
2366
2367         hbox1 = gtk_hbox_new (FALSE, 8);
2368         gtk_widget_show (hbox1);
2369         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2370
2371         label_iotimeout = gtk_label_new (_("Socket I/O timeout:"));
2372         gtk_widget_show (label_iotimeout);
2373         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2374
2375         spinbtn_iotimeout_adj = gtk_adjustment_new (60, 0, 1000, 1, 10, 10);
2376         spinbtn_iotimeout = gtk_spin_button_new
2377                 (GTK_ADJUSTMENT (spinbtn_iotimeout_adj), 1, 0);
2378         gtk_widget_show (spinbtn_iotimeout);
2379         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_iotimeout,
2380                             FALSE, FALSE, 0);
2381         gtk_widget_set_size_request (spinbtn_iotimeout, 64, -1);
2382         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_iotimeout), TRUE);
2383
2384         label_iotimeout = gtk_label_new (_("seconds"));
2385         gtk_widget_show (label_iotimeout);
2386         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2387
2388         other.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
2389         
2390         other.checkbtn_cliplog     = checkbtn_cliplog;
2391         other.loglength_entry      = loglength_entry;
2392
2393         other.checkbtn_confonexit  = checkbtn_confonexit;
2394         other.checkbtn_cleanonexit = checkbtn_cleanonexit;
2395         other.checkbtn_askonclean  = checkbtn_askonclean;
2396         other.checkbtn_warnqueued  = checkbtn_warnqueued;
2397
2398         other.spinbtn_iotimeout     = spinbtn_iotimeout;
2399         other.spinbtn_iotimeout_adj = spinbtn_iotimeout_adj;
2400         
2401 #if 0
2402 #ifdef USE_OPENSSL
2403         other.checkbtn_ssl_ask_unknown_valid = checkbtn_ssl_ask_unknown_valid;
2404 #endif
2405 #endif
2406 }
2407
2408 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
2409 {
2410         GtkWidget *datefmt_sample = NULL;
2411         gchar *text;
2412
2413         g_return_if_fail(widget != NULL);
2414         g_return_if_fail(*widget != NULL);
2415         g_return_if_fail(display.entry_datefmt != NULL);
2416
2417         datefmt_sample = GTK_WIDGET(g_object_get_data
2418                                     (G_OBJECT(*widget), "datefmt_sample"));
2419         g_return_if_fail(datefmt_sample != NULL);
2420
2421         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
2422         g_free(prefs_common.date_format);
2423         prefs_common.date_format = text;
2424         gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
2425
2426         gtk_widget_destroy(*widget);
2427         *widget = NULL;
2428 }
2429
2430 static void date_format_cancel_btn_clicked(GtkButton *button,
2431                                            GtkWidget **widget)
2432 {
2433         g_return_if_fail(widget != NULL);
2434         g_return_if_fail(*widget != NULL);
2435
2436         gtk_widget_destroy(*widget);
2437         *widget = NULL;
2438 }
2439
2440 static gboolean date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
2441                                         GtkWidget **widget)
2442 {
2443         if (event && event->keyval == GDK_Escape)
2444                 date_format_cancel_btn_clicked(NULL, widget);
2445         return FALSE;
2446 }
2447
2448 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
2449                                       GdkEventAny *event, GtkWidget **widget)
2450 {
2451         g_return_val_if_fail(widget != NULL, FALSE);
2452         g_return_val_if_fail(*widget != NULL, FALSE);
2453
2454         *widget = NULL;
2455         return FALSE;
2456 }
2457
2458 static void date_format_entry_on_change(GtkEditable *editable,
2459                                         GtkLabel *example)
2460 {
2461         time_t cur_time;
2462         struct tm *cal_time;
2463         gchar buffer[100];
2464         gchar *text;
2465
2466         cur_time = time(NULL);
2467         cal_time = localtime(&cur_time);
2468         buffer[0] = 0;
2469         text = gtk_editable_get_chars(editable, 0, -1);
2470         if (text)
2471                 strftime(buffer, sizeof buffer, text, cal_time); 
2472         g_free(text);
2473
2474         text = conv_codeset_strdup(buffer,
2475                                    conv_get_current_charset_str(),
2476                                    CS_UTF_8);
2477         if (!text)
2478                 text = g_strdup(buffer);
2479
2480         gtk_label_set_text(example, text);
2481
2482         g_free(text);
2483 }
2484
2485 static void date_format_select_row(GtkWidget *date_format_list, gint row,
2486                                    gint column, GdkEventButton *event,
2487                                    GtkWidget *date_format)
2488 {
2489         gint cur_pos;
2490         gchar *format;
2491         const gchar *old_format;
2492         gchar *new_format;
2493         GtkWidget *datefmt_sample;
2494
2495         /* only on double click */
2496         if (!event || event->type != GDK_2BUTTON_PRESS) return;
2497
2498
2499         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2500                                     (GTK_OBJECT(date_format), "datefmt_sample"));
2501
2502         g_return_if_fail(date_format_list != NULL);
2503         g_return_if_fail(date_format != NULL);
2504         g_return_if_fail(datefmt_sample != NULL);
2505
2506         /* get format from clist */
2507         gtk_clist_get_text(GTK_CLIST(date_format_list), row, 0, &format);
2508
2509         cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
2510         old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
2511
2512         /* insert the format into the text entry */
2513         new_format = g_malloc(strlen(old_format) + 3);
2514
2515         strncpy(new_format, old_format, cur_pos);
2516         new_format[cur_pos] = '\0';
2517         strcat(new_format, format);
2518         strcat(new_format, &old_format[cur_pos]);
2519
2520         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
2521         gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
2522
2523         g_free(new_format);
2524 }
2525
2526 static GtkWidget *date_format_create(GtkButton *button, void *data)
2527 {
2528         static GtkWidget *datefmt_win = NULL;
2529         GtkWidget *vbox1;
2530         GtkWidget *scrolledwindow1;
2531         GtkWidget *datefmt_clist;
2532         GtkWidget *table;
2533         GtkWidget *label1;
2534         GtkWidget *label2;
2535         GtkWidget *label3;
2536         GtkWidget *confirm_area;
2537         GtkWidget *ok_btn;
2538         GtkWidget *cancel_btn;
2539         GtkWidget *datefmt_entry;
2540
2541         struct {
2542                 gchar *fmt;
2543                 gchar *txt;
2544         } time_format[] = {
2545                 { "%a", NULL },
2546                 { "%A", NULL },
2547                 { "%b", NULL },
2548                 { "%B", NULL },
2549                 { "%c", NULL },
2550                 { "%C", NULL },
2551                 { "%d", NULL },
2552                 { "%H", NULL },
2553                 { "%I", NULL },
2554                 { "%j", NULL },
2555                 { "%m", NULL },
2556                 { "%M", NULL },
2557                 { "%p", NULL },
2558                 { "%S", NULL },
2559                 { "%w", NULL },
2560                 { "%x", NULL },
2561                 { "%y", NULL },
2562                 { "%Y", NULL },
2563                 { "%Z", NULL }
2564         };
2565
2566         gchar *titles[2];
2567         gint i;
2568         const gint TIME_FORMAT_ELEMS =
2569                 sizeof time_format / sizeof time_format[0];
2570
2571         time_format[0].txt  = _("the full abbreviated weekday name");
2572         time_format[1].txt  = _("the full weekday name");
2573         time_format[2].txt  = _("the abbreviated month name");
2574         time_format[3].txt  = _("the full month name");
2575         time_format[4].txt  = _("the preferred date and time for the current locale");
2576         time_format[5].txt  = _("the century number (year/100)");
2577         time_format[6].txt  = _("the day of the month as a decimal number");
2578         time_format[7].txt  = _("the hour as a decimal number using a 24-hour clock");
2579         time_format[8].txt  = _("the hour as a decimal number using a 12-hour clock");
2580         time_format[9].txt  = _("the day of the year as a decimal number");
2581         time_format[10].txt = _("the month as a decimal number");
2582         time_format[11].txt = _("the minute as a decimal number");
2583         time_format[12].txt = _("either AM or PM");
2584         time_format[13].txt = _("the second as a decimal number");
2585         time_format[14].txt = _("the day of the week as a decimal number");
2586         time_format[15].txt = _("the preferred date for the current locale");
2587         time_format[16].txt = _("the last two digits of a year");
2588         time_format[17].txt = _("the year as a decimal number");
2589         time_format[18].txt = _("the time zone or name or abbreviation");
2590
2591         if (datefmt_win) return datefmt_win;
2592
2593         datefmt_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2594         gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
2595         gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
2596         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2597         gtk_widget_set_size_request(datefmt_win, 440, 280);
2598
2599         vbox1 = gtk_vbox_new(FALSE, 10);
2600         gtk_widget_show(vbox1);
2601         gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
2602
2603         scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
2604         gtk_scrolled_window_set_policy
2605                 (GTK_SCROLLED_WINDOW(scrolledwindow1),
2606                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2607         gtk_widget_show(scrolledwindow1);
2608         gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
2609
2610         titles[0] = _("Specifier");
2611         titles[1] = _("Description");
2612         datefmt_clist = gtk_clist_new_with_titles(2, titles);
2613         gtk_widget_show(datefmt_clist);
2614         gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
2615         /* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
2616         gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
2617                                      GTK_SELECTION_BROWSE);
2618
2619         for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
2620                 gchar *text[2];
2621                 /* phoney casting necessary because of gtk... */
2622                 text[0] = (gchar *)time_format[i].fmt;
2623                 text[1] = (gchar *)time_format[i].txt;
2624                 gtk_clist_append(GTK_CLIST(datefmt_clist), text);
2625         }
2626
2627         table = gtk_table_new(2, 2, FALSE);
2628         gtk_widget_show(table);
2629         gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
2630         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
2631         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
2632
2633         label1 = gtk_label_new(_("Date format"));
2634         gtk_widget_show(label1);
2635         gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
2636                          GTK_FILL, 0, 0, 0);
2637         gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
2638         gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
2639
2640         datefmt_entry = gtk_entry_new();
2641         gtk_entry_set_max_length(GTK_ENTRY(datefmt_entry), 256);
2642         gtk_widget_show(datefmt_entry);
2643         gtk_table_attach(GTK_TABLE(table), datefmt_entry, 1, 2, 0, 1,
2644                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2645
2646         /* we need the "sample" entry box; add it as data so callbacks can
2647          * get the entry box */
2648         g_object_set_data(G_OBJECT(datefmt_win), "datefmt_sample",
2649                           datefmt_entry);
2650
2651         label2 = gtk_label_new(_("Example"));
2652         gtk_widget_show(label2);
2653         gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
2654                          GTK_FILL, 0, 0, 0);
2655         gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
2656         gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
2657
2658         label3 = gtk_label_new("");
2659         gtk_widget_show(label3);
2660         gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2,
2661                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2662         gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
2663         gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
2664
2665         gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
2666                                 &cancel_btn, _("Cancel"), NULL, NULL);
2667         gtk_widget_grab_default(ok_btn);
2668         gtk_widget_show(confirm_area);
2669
2670         gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
2671
2672         /* set the current format */
2673         gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
2674         date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
2675                                     GTK_LABEL(label3));
2676
2677         g_signal_connect(G_OBJECT(ok_btn), "clicked",
2678                          G_CALLBACK(date_format_ok_btn_clicked),
2679                          &datefmt_win);
2680         g_signal_connect(G_OBJECT(cancel_btn), "clicked",
2681                          G_CALLBACK(date_format_cancel_btn_clicked),
2682                          &datefmt_win);
2683         g_signal_connect(G_OBJECT(datefmt_win), "key_press_event",
2684                          G_CALLBACK(date_format_key_pressed),
2685                          &datefmt_win);
2686         g_signal_connect(G_OBJECT(datefmt_win), "delete_event",
2687                          G_CALLBACK(date_format_on_delete),
2688                          &datefmt_win);
2689         g_signal_connect(G_OBJECT(datefmt_entry), "changed",
2690                          G_CALLBACK(date_format_entry_on_change),
2691                          label3);
2692
2693         g_signal_connect(G_OBJECT(datefmt_clist), "select_row",
2694                          G_CALLBACK(date_format_select_row),
2695                          datefmt_win);
2696
2697         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2698         gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
2699
2700         gtk_widget_show(datefmt_win);
2701         manage_window_set_transient(GTK_WINDOW(datefmt_win));
2702
2703         gtk_widget_grab_focus(ok_btn);
2704
2705         return datefmt_win;
2706 }
2707
2708 void prefs_quote_colors_dialog(void)
2709 {
2710         if (!quote_color_win)
2711                 prefs_quote_colors_dialog_create();
2712         gtk_widget_show(quote_color_win);
2713         manage_window_set_transient(GTK_WINDOW(quote_color_win));
2714
2715         gtk_main();
2716         gtk_widget_hide(quote_color_win);
2717
2718         textview_update_message_colors();
2719         main_window_reflect_prefs_all();
2720 }
2721
2722 static void prefs_quote_colors_dialog_create(void)
2723 {
2724         GtkWidget *window;
2725         GtkWidget *vbox;
2726         GtkWidget *table;
2727         GtkWidget *quotelevel1_label;
2728         GtkWidget *quotelevel2_label;
2729         GtkWidget *quotelevel3_label;
2730         GtkWidget *uri_label;
2731         GtkWidget *signature_label;
2732         GtkWidget *tgt_folder_label;
2733         GtkWidget *hbbox;
2734         GtkWidget *ok_btn;
2735         GtkWidget *recycle_colors_btn;
2736         GtkWidget *frame_colors;
2737
2738         window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2739         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
2740         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
2741         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2742         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
2743         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
2744
2745         vbox = gtk_vbox_new (FALSE, VSPACING);
2746         gtk_container_add (GTK_CONTAINER (window), vbox);
2747         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
2748         PACK_FRAME(vbox, frame_colors, _("Colors"));
2749
2750         table = gtk_table_new (5, 2, FALSE);
2751         gtk_container_add (GTK_CONTAINER (frame_colors), table);
2752         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
2753         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
2754         gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2755
2756
2757         color_buttons.quote_level1_btn = gtk_button_new();
2758         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level1_btn,
2759                           0, 1, 0, 1, 0, 0, 0, 0);
2760         gtk_widget_set_size_request (color_buttons.quote_level1_btn, 40, 30);
2761         gtk_container_set_border_width
2762                 (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
2763
2764         color_buttons.quote_level2_btn = gtk_button_new();
2765         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level2_btn,
2766                           0, 1, 1, 2, 0, 0, 0, 0);
2767         gtk_widget_set_size_request (color_buttons.quote_level2_btn, 40, 30);
2768         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
2769
2770         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
2771         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level3_btn,
2772                           0, 1, 2, 3, 0, 0, 0, 0);
2773         gtk_widget_set_size_request (color_buttons.quote_level3_btn, 40, 30);
2774         gtk_container_set_border_width
2775                 (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
2776
2777         color_buttons.uri_btn = gtk_button_new_with_label ("");
2778         gtk_table_attach (GTK_TABLE (table), color_buttons.uri_btn,
2779                           0, 1, 3, 4, 0, 0, 0, 0);
2780         gtk_widget_set_size_request (color_buttons.uri_btn, 40, 30);
2781         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
2782
2783         color_buttons.tgt_folder_btn = gtk_button_new_with_label ("");
2784         gtk_table_attach (GTK_TABLE (table), color_buttons.tgt_folder_btn,
2785                           0, 1, 4, 5, 0, 0, 0, 0);
2786         gtk_widget_set_size_request (color_buttons.tgt_folder_btn, 40, 30);
2787         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.tgt_folder_btn), 5);
2788
2789         color_buttons.signature_btn = gtk_button_new_with_label ("");
2790         gtk_table_attach (GTK_TABLE (table), color_buttons.signature_btn,
2791                           0, 1, 5, 6, 0, 0, 0, 0);
2792         gtk_widget_set_size_request (color_buttons.signature_btn, 40, 30);
2793         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.signature_btn), 5);
2794
2795         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
2796         gtk_table_attach (GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
2797                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2798         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
2799         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
2800
2801         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
2802         gtk_table_attach (GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
2803                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2804         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
2805         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
2806
2807         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
2808         gtk_table_attach (GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
2809                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2810         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
2811         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
2812
2813         uri_label = gtk_label_new (_("URI link"));
2814         gtk_table_attach (GTK_TABLE (table), uri_label, 1, 2, 3, 4,
2815                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2816         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
2817         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
2818
2819         tgt_folder_label = gtk_label_new (_("Target folder"));
2820         gtk_table_attach (GTK_TABLE (table), tgt_folder_label, 1, 2, 4, 5,
2821                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2822         gtk_label_set_justify (GTK_LABEL (tgt_folder_label), GTK_JUSTIFY_LEFT);
2823         gtk_misc_set_alignment (GTK_MISC (tgt_folder_label), 0, 0.5);
2824
2825         signature_label = gtk_label_new (_("Signatures"));
2826         gtk_table_attach (GTK_TABLE (table), signature_label, 1, 2, 5, 6,
2827                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2828         gtk_label_set_justify (GTK_LABEL (signature_label), GTK_JUSTIFY_LEFT);
2829         gtk_misc_set_alignment (GTK_MISC (signature_label), 0, 0.5);
2830
2831         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
2832                            _("Recycle quote colors"));
2833
2834         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2835                                 NULL, NULL, NULL, NULL);
2836         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2837
2838         gtk_widget_grab_default(ok_btn);
2839         MANAGE_WINDOW_SIGNALS_CONNECT(window);
2840         g_signal_connect(G_OBJECT(window), "delete_event",
2841                          G_CALLBACK(gtk_main_quit), NULL);
2842         g_signal_connect(G_OBJECT(window), "key_press_event",
2843                          G_CALLBACK(prefs_quote_colors_key_pressed),
2844                          NULL);
2845
2846         g_signal_connect(G_OBJECT(color_buttons.quote_level1_btn), "clicked",
2847                          G_CALLBACK(quote_color_set_dialog), "LEVEL1");
2848         g_signal_connect(G_OBJECT(color_buttons.quote_level2_btn), "clicked",
2849                          G_CALLBACK(quote_color_set_dialog), "LEVEL2");
2850         g_signal_connect(G_OBJECT(color_buttons.quote_level3_btn), "clicked",
2851                          G_CALLBACK(quote_color_set_dialog), "LEVEL3");
2852         g_signal_connect(G_OBJECT(color_buttons.uri_btn), "clicked",
2853                          G_CALLBACK(quote_color_set_dialog), "URI");
2854         g_signal_connect(G_OBJECT(color_buttons.tgt_folder_btn), "clicked",
2855                          G_CALLBACK(quote_color_set_dialog), "TGTFLD");
2856         g_signal_connect(G_OBJECT(color_buttons.signature_btn), "clicked",
2857                          G_CALLBACK(quote_color_set_dialog), "SIGNATURE");
2858         g_signal_connect(G_OBJECT(recycle_colors_btn), "toggled",
2859                          G_CALLBACK(prefs_recycle_colors_toggled), NULL);
2860         g_signal_connect(G_OBJECT(ok_btn), "clicked",
2861                          G_CALLBACK(gtk_main_quit), NULL);
2862
2863         /* show message button colors and recycle options */
2864         set_button_bg_color(color_buttons.quote_level1_btn,
2865                             prefs_common.quote_level1_col);
2866         set_button_bg_color(color_buttons.quote_level2_btn,
2867                             prefs_common.quote_level2_col);
2868         set_button_bg_color(color_buttons.quote_level3_btn,
2869                             prefs_common.quote_level3_col);
2870         set_button_bg_color(color_buttons.uri_btn,
2871                             prefs_common.uri_col);
2872         set_button_bg_color(color_buttons.tgt_folder_btn,
2873                             prefs_common.tgt_folder_col);
2874         set_button_bg_color(color_buttons.signature_btn,
2875                             prefs_common.signature_col);
2876         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
2877                                      prefs_common.recycle_quote_colors);
2878
2879         gtk_widget_show_all(vbox);
2880         quote_color_win = window;
2881 }
2882
2883 static gboolean prefs_quote_colors_key_pressed(GtkWidget *widget,
2884                                                GdkEventKey *event, gpointer data)
2885 {
2886         if (event && event->keyval == GDK_Escape)
2887                 gtk_main_quit();
2888         return FALSE;
2889 }
2890
2891 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
2892 {
2893         gchar *type = (gchar *)data;
2894         gchar *title = NULL;
2895         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
2896         gint rgbvalue = 0;
2897         GtkColorSelectionDialog *dialog;
2898
2899         if(g_strcasecmp(type, "LEVEL1") == 0) {
2900                 title = _("Pick color for quotation level 1");
2901                 rgbvalue = prefs_common.quote_level1_col;
2902         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
2903                 title = _("Pick color for quotation level 2");
2904                 rgbvalue = prefs_common.quote_level2_col;
2905         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
2906                 title = _("Pick color for quotation level 3");
2907                 rgbvalue = prefs_common.quote_level3_col;
2908         } else if(g_strcasecmp(type, "URI") == 0) {
2909                 title = _("Pick color for URI");
2910                 rgbvalue = prefs_common.uri_col;
2911         } else if(g_strcasecmp(type, "TGTFLD") == 0) {
2912                 title = _("Pick color for target folder");
2913                 rgbvalue = prefs_common.tgt_folder_col;
2914         } else if(g_strcasecmp(type, "SIGNATURE") == 0) {
2915                 title = _("Pick color for signatures");
2916                 rgbvalue = prefs_common.signature_col;
2917         } else {   /* Should never be called */
2918                 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
2919                 return;
2920         }
2921
2922         color_dialog = gtk_color_selection_dialog_new(title);
2923         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
2924         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
2925         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
2926         manage_window_set_transient(GTK_WINDOW(color_dialog));
2927
2928         g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->ok_button),
2929                          "clicked", G_CALLBACK(quote_colors_set_dialog_ok), data);
2930         g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->cancel_button),
2931                          "clicked", G_CALLBACK(quote_colors_set_dialog_cancel), data);
2932         g_signal_connect(G_OBJECT(color_dialog), "key_press_event",
2933                          G_CALLBACK(quote_colors_set_dialog_key_pressed),
2934                          data);
2935
2936         /* preselect the previous color in the color selection dialog */
2937         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
2938         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
2939         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
2940         dialog = GTK_COLOR_SELECTION_DIALOG(color_dialog);
2941         gtk_color_selection_set_color
2942                 (GTK_COLOR_SELECTION(dialog->colorsel), color);
2943
2944         gtk_widget_show(color_dialog);
2945 }
2946
2947 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
2948 {
2949         GtkColorSelection *colorsel = (GtkColorSelection *)
2950                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
2951         gdouble color[4];
2952         gint red, green, blue, rgbvalue;
2953         gchar *type = (gchar *)data;
2954
2955         gtk_color_selection_get_color(colorsel, color);
2956
2957         red      = (gint) (color[0] * 255.0);
2958         green    = (gint) (color[1] * 255.0);
2959         blue     = (gint) (color[2] * 255.0);
2960         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
2961
2962 #if 0
2963         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
2964         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
2965         fprintf(stderr, "Color is %x\n", rgbvalue);
2966 #endif
2967
2968         if (g_strcasecmp(type, "LEVEL1") == 0) {
2969                 prefs_common.quote_level1_col = rgbvalue;
2970                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
2971         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
2972                 prefs_common.quote_level2_col = rgbvalue;
2973                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
2974         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
2975                 prefs_common.quote_level3_col = rgbvalue;
2976                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
2977         } else if (g_strcasecmp(type, "URI") == 0) {
2978                 prefs_common.uri_col = rgbvalue;
2979                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
2980         } else if (g_strcasecmp(type, "TGTFLD") == 0) {
2981                 prefs_common.tgt_folder_col = rgbvalue;
2982                 set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
2983                 folderview_set_target_folder_color(prefs_common.tgt_folder_col);
2984         } else if (g_strcasecmp(type, "SIGNATURE") == 0) {
2985                 prefs_common.signature_col = rgbvalue;
2986                 set_button_bg_color(color_buttons.signature_btn, rgbvalue);
2987         } else
2988                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
2989
2990         gtk_widget_destroy(color_dialog);
2991 }
2992
2993 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
2994 {
2995         gtk_widget_destroy(color_dialog);
2996 }
2997
2998 static gboolean quote_colors_set_dialog_key_pressed(GtkWidget *widget,
2999                                                     GdkEventKey *event,
3000                                                     gpointer data)
3001 {
3002         gtk_widget_destroy(color_dialog);
3003         return FALSE;
3004 }
3005
3006 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
3007 {
3008         GtkStyle *newstyle;
3009         GdkColor color;
3010
3011         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
3012         newstyle = gtk_style_copy(gtk_widget_get_default_style());
3013         newstyle->bg[GTK_STATE_NORMAL]   = color;
3014         newstyle->bg[GTK_STATE_PRELIGHT] = color;
3015         newstyle->bg[GTK_STATE_ACTIVE]   = color;
3016
3017         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
3018 }
3019
3020 static void prefs_enable_message_color_toggled(void)
3021 {
3022         gboolean is_active;
3023
3024         is_active = gtk_toggle_button_get_active
3025                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
3026         gtk_widget_set_sensitive(message.button_edit_col, is_active);
3027         prefs_common.enable_color = is_active;
3028 }
3029
3030 static void prefs_recycle_colors_toggled(GtkWidget *widget)
3031 {
3032         gboolean is_active;
3033
3034         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
3035         prefs_common.recycle_quote_colors = is_active;
3036 }
3037
3038 static void prefs_keybind_select(void)
3039 {
3040         GtkWidget *window;
3041         GtkWidget *vbox1;
3042         GtkWidget *hbox1;
3043         GtkWidget *label;
3044         GtkWidget *combo;
3045         GtkWidget *confirm_area;
3046         GtkWidget *ok_btn;
3047         GtkWidget *cancel_btn;
3048
3049         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3050         gtk_container_set_border_width (GTK_CONTAINER (window), 8);
3051         gtk_window_set_title (GTK_WINDOW (window), _("Key bindings"));
3052         gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
3053         gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3054         gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, FALSE);
3055         manage_window_set_transient (GTK_WINDOW (window));
3056
3057         vbox1 = gtk_vbox_new (FALSE, VSPACING);
3058         gtk_container_add (GTK_CONTAINER (window), vbox1);
3059         gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
3060
3061         hbox1 = gtk_hbox_new (FALSE, 8);
3062         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3063
3064         label = gtk_label_new
3065                 (_("Select preset:"));
3066         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3067         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3068
3069         hbox1 = gtk_hbox_new (FALSE, 8);
3070         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3071
3072         combo = gtk_combo_new ();
3073         gtk_box_pack_start (GTK_BOX (hbox1), combo, TRUE, TRUE, 0);
3074         gtkut_combo_set_items (GTK_COMBO (combo),
3075                                _("Default"),
3076                                "Mew / Wanderlust",
3077                                "Mutt",
3078                                _("Old Sylpheed"),
3079                                NULL);
3080         gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO (combo)->entry), FALSE);
3081
3082         hbox1 = gtk_hbox_new (FALSE, 8);
3083         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3084
3085         label = gtk_label_new
3086                 (_("You can also modify each menu shortcut by pressing\n"
3087                    "any key(s) when placing the mouse pointer on the item."));
3088         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3089         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3090
3091         hbox1 = gtk_hbox_new (FALSE, 8);
3092         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3093
3094         gtkut_button_set_create (&confirm_area, &ok_btn, _("OK"),
3095                                  &cancel_btn, _("Cancel"), NULL, NULL);
3096         gtk_box_pack_end (GTK_BOX (hbox1), confirm_area, FALSE, FALSE, 0);
3097         gtk_widget_grab_default (ok_btn);
3098
3099         MANAGE_WINDOW_SIGNALS_CONNECT(window);
3100         g_signal_connect (G_OBJECT (window), "delete_event",
3101                           G_CALLBACK (prefs_keybind_deleted), NULL);
3102         g_signal_connect (G_OBJECT (window), "key_press_event",
3103                           G_CALLBACK (prefs_keybind_key_pressed), NULL);
3104         g_signal_connect (G_OBJECT (ok_btn), "clicked",
3105                           G_CALLBACK (prefs_keybind_apply_clicked),
3106                           NULL);
3107         g_signal_connect (G_OBJECT (cancel_btn), "clicked",
3108                           G_CALLBACK (prefs_keybind_cancel),
3109                           NULL);
3110
3111         gtk_widget_show_all(window);
3112
3113         keybind.window = window;
3114         keybind.combo = combo;
3115 }
3116
3117 static gboolean prefs_keybind_key_pressed(GtkWidget *widget, GdkEventKey *event,
3118                                           gpointer data)
3119 {
3120         if (event && event->keyval == GDK_Escape)
3121                 prefs_keybind_cancel();
3122         return FALSE;
3123 }
3124
3125 static gint prefs_keybind_deleted(GtkWidget *widget, GdkEventAny *event,
3126                                   gpointer data)
3127 {
3128         prefs_keybind_cancel();
3129         return TRUE;
3130 }
3131
3132 static void prefs_keybind_cancel(void)
3133 {
3134         gtk_widget_destroy(keybind.window);
3135         keybind.window = NULL;
3136         keybind.combo = NULL;
3137 }
3138   
3139 struct KeyBind {
3140         const gchar *accel_path;
3141         const gchar *accel_key;
3142 };
3143
3144 static void prefs_keybind_apply(struct KeyBind keybind[], gint num)
3145 {
3146         gint i;
3147         guint key;
3148         GdkModifierType mods;
3149
3150         for (i = 0; i < num; i++) {
3151                 const gchar *accel_key
3152                         = keybind[i].accel_key ? keybind[i].accel_key : "";
3153                 gtk_accelerator_parse(accel_key, &key, &mods);
3154                 gtk_accel_map_change_entry(keybind[i].accel_path,
3155                                            key, mods, TRUE);
3156         }
3157 }
3158
3159 static void prefs_keybind_apply_clicked(GtkWidget *widget)
3160 {
3161         GtkEntry *entry = GTK_ENTRY(GTK_COMBO(keybind.combo)->entry);
3162         const gchar *text;
3163         struct KeyBind *menurc;
3164         gint n_menurc;
3165
3166         static struct KeyBind default_menurc[] = {
3167                 {"<Main>/File/Empty trash",                     ""},
3168                 {"<Main>/File/Save as...",                      "<control>S"},
3169                 {"<Main>/File/Print...",                        ""},
3170                 {"<Main>/File/Exit",                            "<control>Q"},
3171
3172                 {"<Main>/Edit/Copy",                            "<control>C"},
3173                 {"<Main>/Edit/Select all",                      "<control>A"},
3174                 {"<Main>/Edit/Find in current message...",      "<control>F"},
3175                 {"<Main>/Edit/Search folder...",                "<shift><control>F"},
3176
3177                 {"<Main>/View/Expand Summary View",             "V"},
3178                 {"<Main>/View/Expand Message View",             "<shift>V"},
3179                 {"<Main>/View/Thread view",                     "<control>T"},
3180                 {"<Main>/View/Go to/Prev message",              "P"},
3181                 {"<Main>/View/Go to/Next message",              "N"},
3182                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
3183                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
3184                 {"<Main>/View/Go to/Other folder...",           "G"},
3185                 {"<Main>/View/Open in new window",              "<control><alt>N"},
3186                 {"<Main>/View/View source",                     "<control>U"},
3187                 {"<Main>/View/Show all headers",                "<control>H"},
3188                 {"<Main>/View/Update",                          "<control><alt>U"},
3189
3190                 {"<Main>/Message/Receive/Get new mail",         "<control>I"},
3191                 {"<Main>/Message/Receive/Get from all accounts",        "<shift><control>I"},
3192                 {"<Main>/Message/Compose an email message",     "<control>M"},
3193                 {"<Main>/Message/Reply",                        "<control>R"},
3194                 {"<Main>/Message/Reply to/all",                 "<shift><control>R"},
3195                 {"<Main>/Message/Reply to/sender",              ""},
3196                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
3197                 {"<Main>/Message/Forward",                      "<control><alt>F"},
3198                 /* {"<Main>/Message/Forward as attachment",      ""}, */
3199                 {"<Main>/Message/Move...",                      "<control>O"},
3200                 {"<Main>/Message/Copy...",                      "<shift><control>O"},
3201                 {"<Main>/Message/Delete",                       "<control>D"},
3202                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
3203                 {"<Main>/Message/Mark/Unmark",                  "U"},
3204                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
3205                 {"<Main>/Message/Mark/Mark as read",            ""},
3206
3207                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
3208                 {"<Main>/Tools/Execute",                        "X"},
3209                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
3210
3211                 {"<Compose>/File/Close",                                "<control>W"},
3212                 {"<Compose>/Edit/Select all",                           "<control>A"},
3213                 {"<Compose>/Edit/Advanced/Move a word backward",        ""},
3214                 {"<Compose>/Edit/Advanced/Move a word forward",         ""},
3215                 {"<Compose>/Edit/Advanced/Move to beginning of line",   ""},
3216                 {"<Compose>/Edit/Advanced/Delete a word backward",      ""},
3217                 {"<Compose>/Edit/Advanced/Delete a word forward",       ""},
3218         };
3219
3220         static struct KeyBind mew_wl_menurc[] = {
3221                 {"<Main>/File/Empty trash",                     "<shift>D"},
3222                 {"<Main>/File/Save as...",                      "Y"},
3223                 {"<Main>/File/Print...",                        "<shift>numbersign"},
3224                 {"<Main>/File/Exit",                            "<shift>Q"},
3225
3226                 {"<Main>/Edit/Copy",                            "<control>C"},
3227                 {"<Main>/Edit/Select all",                      "<control>A"},
3228                 {"<Main>/Edit/Find in current message...",      "<control>F"},
3229                 {"<Main>/Edit/Search folder...",                "<control>S"},
3230
3231                 {"<Main>/View/Expand Summary View",             ""},
3232                 {"<Main>/View/Expand Message View",             ""},
3233                 {"<Main>/View/Thread view",                     "<shift>T"},
3234                 {"<Main>/View/Go to/Prev message",              "P"},
3235                 {"<Main>/View/Go to/Next message",              "N"},
3236                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
3237                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
3238                 {"<Main>/View/Go to/Other folder...",           "G"},
3239                 {"<Main>/View/Open in new window",              "<control><alt>N"},
3240                 {"<Main>/View/View source",                     "<control>U"},
3241                 {"<Main>/View/Show all headers",                "<shift>H"},
3242                 {"<Main>/View/Update",                          "<shift>S"},
3243
3244                 {"<Main>/Message/Receive/Get new mail",         "<control>I"},
3245                 {"<Main>/Message/Receive/Get from all accounts",        "<shift><control>I"},
3246                 {"<Main>/Message/Compose an email message",     "W"},
3247                 {"<Main>/Message/Reply",                        "<control>R"},
3248                 {"<Main>/Message/Reply to/all",                 "<shift>A"},
3249                 {"<Main>/Message/Reply to/sender",              ""},
3250                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
3251                 {"<Main>/Message/Forward",                      "F"},
3252                 /* {"<Main>/Message/Forward as attachment", "<shift>F"}, */
3253                 {"<Main>/Message/Move...",                      "O"},
3254                 {"<Main>/Message/Copy...",                      "<shift>O"},
3255                 {"<Main>/Message/Delete",                       "D"},
3256                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
3257                 {"<Main>/Message/Mark/Unmark",                  "U"},
3258                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
3259                 {"<Main>/Message/Mark/Mark as read",            "<shift>R"},
3260
3261                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
3262                 {"<Main>/Tools/Execute",                        "X"},
3263                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
3264
3265                 {"<Compose>/File/Close",                                "<alt>W"},
3266                 {"<Compose>/Edit/Select all",                           ""},
3267                 {"<Compose>/Edit/Advanced/Move a word backward,"        "<alt>B"},
3268                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
3269                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
3270                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
3271                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
3272         };
3273
3274         static struct KeyBind mutt_menurc[] = {
3275                 {"<Main>/File/Empty trash",                     ""},
3276                 {"<Main>/File/Save as...",                      "S"},
3277                 {"<Main>/File/Print...",                        "P"},
3278                 {"<Main>/File/Exit",                            "Q"},
3279
3280                 {"<Main>/Edit/Copy",                            "<control>C"},
3281                 {"<Main>/Edit/Select all",                      "<control>A"},
3282                 {"<Main>/Edit/Find in current message...",      "<control>F"},
3283                 {"<Main>/Edit/Search messages...",              "slash"},
3284
3285                 {"<Main>/View/Toggle summary view",             "V"},
3286                 {"<Main>/View/Thread view",                     "<control>T"},
3287                 {"<Main>/View/Go to/Prev message",              ""},
3288                 {"<Main>/View/Go to/Next message",              ""},
3289                 {"<Main>/View/Go to/Prev unread message",       ""},
3290                 {"<Main>/View/Go to/Next unread message",       ""},
3291                 {"<Main>/View/Go to/Other folder...",           "C"},
3292                 {"<Main>/View/Open in new window",              "<control><alt>N"},
3293                 {"<Main>/View/View source",                     "<control>U"},
3294                 {"<Main>/View/Show all headers",                "<control>H"},
3295                 {"<Main>/View/Update",                          "<control><alt>U"},
3296
3297                 {"<Main>/Message/Receive/Get new mail",                 "<control>I"},
3298                 {"<Main>/Message/Receive/Get from all accounts",        "<shift><control>I"},
3299                 {"<Main>/Message/Compose an email message",             "M"},
3300                 {"<Main>/Message/Reply",                        "R"},
3301                 {"<Main>/Message/Reply to/all",                 "G"},
3302                 {"<Main>/Message/Reply to/sender",              ""},
3303                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
3304                 {"<Main>/Message/Forward",                      "F"},
3305                 {"<Main>/Message/Forward as attachment",        ""},
3306                 {"<Main>/Message/Move...",                      "<control>O"},
3307                 {"<Main>/Message/Copy...",                      "<shift>C"},
3308                 {"<Main>/Message/Delete",                       "D"},
3309                 {"<Main>/Message/Mark/Mark",                    "<shift>F"},
3310                 {"<Main>/Message/Mark/Unmark",                  "U"},
3311                 {"<Main>/Message/Mark/Mark as unread",          "<shift>N"},
3312                 {"<Main>/Message/Mark/Mark as read",            ""},
3313
3314                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
3315                 {"<Main>/Tools/Execute",                        "X"},
3316                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
3317
3318                 {"<Compose>/File/Close",                                "<alt>W"},
3319                 {"<Compose>/Edit/Select all",                           ""},
3320                 {"<Compose>/Edit/Advanced/Move a word backward",        "<alt>B"},
3321                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
3322                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
3323                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
3324                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
3325         };
3326
3327         static struct KeyBind old_sylpheed_menurc[] = {
3328                 {"<Main>/File/Empty trash",                     ""},
3329                 {"<Main>/File/Save as...",                      ""},
3330                 {"<Main>/File/Print...",                        "<alt>P"},
3331                 {"<Main>/File/Exit",                            "<alt>Q"},
3332
3333                 {"<Main>/Edit/Copy",                            "<control>C"},
3334                 {"<Main>/Edit/Select all",                      "<control>A"},
3335                 {"<Main>/Edit/Find in current message...",      "<control>F"},
3336                 {"<Main>/Edit/Search folder...",                "<control>S"},
3337
3338                 {"<Main>/View/Expand Summary View",             ""},
3339                 {"<Main>/View/Expand Message View",             ""},
3340                 {"<Main>/View/Thread view",                     "<control>T"},
3341                 {"<Main>/View/Go to/Prev message",              "P"},
3342                 {"<Main>/View/Go to/Next message",              "N"},
3343                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
3344                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
3345                 {"<Main>/View/Go to/Other folder...",           "<alt>G"},
3346                 {"<Main>/View/Open in new window",              "<shift><control>N"},
3347                 {"<Main>/View/View source",                     "<control>U"},
3348                 {"<Main>/View/Show all headers",                "<control>H"},
3349                 {"<Main>/View/Update",                          "<alt>U"},
3350
3351                 {"<Main>/Message/Receive/Get new mail",                 "<alt>I"},
3352                 {"<Main>/Message/Receive/Get from all accounts",        "<shift><alt>I"},
3353                 {"<Main>/Message/Compose an email message",     "<alt>N"},
3354                 {"<Main>/Message/Reply",                        "<alt>R"},
3355                 {"<Main>/Message/Reply to/all",                 "<shift><alt>R"},
3356                 {"<Main>/Message/Reply to/sender",              "<control><alt>R"},
3357                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
3358                 {"<Main>/Message/Forward",                       "<shift><alt>F"},
3359                 /* "(menu-path \"<Main>/Message/Forward as attachment", "<shift><control>F"}, */
3360                 {"<Main>/Message/Move...",                      "<alt>O"},
3361                 {"<Main>/Message/Copy...",                      ""},
3362                 {"<Main>/Message/Delete",                       "<alt>D"},
3363                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
3364                 {"<Main>/Message/Mark/Unmark",                  "U"},
3365                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
3366                 {"<Main>/Message/Mark/Mark as read",            ""},
3367
3368                 {"<Main>/Tools/Address book",                   "<alt>A"},
3369                 {"<Main>/Tools/Execute",                        "<alt>X"},
3370                 {"<Main>/Tools/Log window",                     "<alt>L"},
3371
3372                 {"<Compose>/File/Close",                                "<alt>W"},
3373                 {"<Compose>/Edit/Select all",                           ""},
3374                 {"<Compose>/Edit/Advanced/Move a word backward",        "<alt>B"},
3375                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
3376                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
3377                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
3378                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
3379         };
3380   
3381         text = gtk_entry_get_text(entry);
3382   
3383         if (!strcmp(text, _("Default"))) {
3384                 menurc = default_menurc;
3385                 n_menurc = G_N_ELEMENTS(default_menurc);
3386         } else if (!strcmp(text, "Mew / Wanderlust")) {
3387                 menurc = mew_wl_menurc;
3388                 n_menurc = G_N_ELEMENTS(mew_wl_menurc);
3389         } else if (!strcmp(text, "Mutt")) {
3390                 menurc = mutt_menurc;
3391                 n_menurc = G_N_ELEMENTS(mutt_menurc);
3392         } else if (!strcmp(text, _("Old Sylpheed"))) {
3393                 menurc = old_sylpheed_menurc;
3394                 n_menurc = G_N_ELEMENTS(old_sylpheed_menurc);
3395         } else {
3396                 return;
3397         }
3398
3399         /* prefs_keybind_apply(empty_menurc, G_N_ELEMENTS(empty_menurc)); */
3400         prefs_keybind_apply(menurc, n_menurc);
3401
3402         gtk_widget_destroy(keybind.window);
3403         keybind.window = NULL;
3404         keybind.combo = NULL;
3405 }
3406
3407 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
3408 {
3409         GtkWidget *menu;
3410         GtkWidget *menuitem;
3411         gchar *charset;
3412
3413         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3414         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3415         charset = g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
3416         g_free(*((gchar **)pparam->data));
3417         *((gchar **)pparam->data) = g_strdup(charset);
3418 }
3419
3420 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
3421 {
3422         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3423         gint index;
3424
3425         g_return_if_fail(optmenu != NULL);
3426         g_return_if_fail(*((gchar **)pparam->data) != NULL);
3427
3428         index = menu_find_option_menu_index(optmenu, *((gchar **)pparam->data),
3429                                             (GCompareFunc)strcmp);
3430         if (index >= 0)
3431                 gtk_option_menu_set_history(optmenu, index);
3432         else {
3433                 gtk_option_menu_set_history(optmenu, 0);
3434                 prefs_common_charset_set_data_from_optmenu(pparam);
3435         }
3436 }
3437
3438 static void prefs_common_encoding_set_data_from_optmenu(PrefParam *pparam)
3439 {
3440         GtkWidget *menu;
3441         GtkWidget *menuitem;
3442
3443         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3444         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3445         *((TransferEncodingMethod *)pparam->data) = GPOINTER_TO_INT
3446                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
3447 }
3448
3449 static void prefs_common_encoding_set_optmenu(PrefParam *pparam)
3450 {
3451         TransferEncodingMethod method =
3452                 *((TransferEncodingMethod *)pparam->data);
3453         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3454         gint index;
3455
3456         g_return_if_fail(optmenu != NULL);
3457
3458         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(method),
3459                                             NULL);
3460         if (index >= 0)
3461                 gtk_option_menu_set_history(optmenu, index);
3462         else {
3463                 gtk_option_menu_set_history(optmenu, 0);
3464                 prefs_common_encoding_set_data_from_optmenu(pparam);
3465         }
3466 }
3467
3468 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam)
3469 {
3470         GtkWidget *menu;
3471         GtkWidget *menuitem;
3472
3473         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3474         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3475         *((RecvDialogMode *)pparam->data) = GPOINTER_TO_INT
3476                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
3477 }
3478
3479 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
3480 {
3481         RecvDialogMode mode = *((RecvDialogMode *)pparam->data);
3482         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3483         GtkWidget *menu;
3484         GtkWidget *menuitem;
3485         gint index;
3486
3487         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(mode),
3488                                             NULL);
3489         if (index >= 0)
3490                 gtk_option_menu_set_history(optmenu, index);
3491         else {
3492                 gtk_option_menu_set_history(optmenu, 0);
3493                 prefs_common_recv_dialog_set_data_from_optmenu(pparam);
3494         }
3495
3496         menu = gtk_option_menu_get_menu(optmenu);
3497         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3498         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3499 }
3500
3501 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam)
3502 {
3503         GtkWidget *menu;
3504         GtkWidget *menuitem;
3505
3506         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3507         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3508         *((SendDialogMode *)pparam->data) = GPOINTER_TO_INT
3509                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
3510 }
3511
3512 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam)
3513 {
3514         SendDialogMode mode = *((SendDialogMode *)pparam->data);
3515         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3516         GtkWidget *menu;
3517         GtkWidget *menuitem;
3518
3519         switch (mode) {
3520         case SEND_DIALOG_ALWAYS:
3521                 gtk_option_menu_set_history(optmenu, 0);
3522                 break;
3523         case SEND_DIALOG_NEVER:
3524                 gtk_option_menu_set_history(optmenu, 1);
3525                 break;
3526         default:
3527                 break;
3528         }
3529
3530         menu = gtk_option_menu_get_menu(optmenu);
3531         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3532         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3533 }
3534
3535 static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
3536                                  gpointer data)
3537 {
3538         prefs_common_cancel();
3539         return TRUE;
3540 }
3541
3542 static gboolean prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
3543                                          gpointer data)
3544 {
3545         if (event && event->keyval == GDK_Escape)
3546                 prefs_common_cancel();
3547         return FALSE;
3548 }
3549
3550 static void prefs_common_ok(void)
3551 {
3552         prefs_common_apply();
3553         gtk_widget_hide(dialog.window);
3554
3555         inc_unlock();
3556 }
3557
3558 static void prefs_common_apply(void)
3559 {
3560         MainWindow *mainwindow;
3561
3562         prefs_set_data_from_dialog(param);
3563         sock_set_io_timeout(prefs_common.io_timeout_secs);
3564         main_window_reflect_prefs_all_real(FALSE);
3565         prefs_common_save_config();
3566
3567         mainwindow = mainwindow_get_mainwindow();
3568         log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
3569                                 prefs_common.loglength);
3570         
3571         inc_autocheck_timer_remove();
3572         inc_autocheck_timer_set();
3573 }
3574
3575 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam)
3576 {
3577         GtkWidget *menu;
3578         GtkWidget *menuitem;
3579
3580         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3581         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3582         *((NextUnreadMsgDialogShow *)pparam->data) = GPOINTER_TO_INT
3583                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
3584 }
3585
3586 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam)
3587 {
3588         NextUnreadMsgDialogShow dialog_show;
3589         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3590         GtkWidget *menu;
3591         GtkWidget *menuitem;
3592
3593         dialog_show = *((NextUnreadMsgDialogShow *)pparam->data);
3594
3595         switch (dialog_show) {
3596         case NEXTUNREADMSGDIALOG_ALWAYS:
3597                 gtk_option_menu_set_history(optmenu, 0);
3598                 break;
3599         case NEXTUNREADMSGDIALOG_ASSUME_YES:
3600                 gtk_option_menu_set_history(optmenu, 1);
3601                 break;
3602         case NEXTUNREADMSGDIALOG_ASSUME_NO:
3603                 gtk_option_menu_set_history(optmenu, 2);
3604                 break;
3605         }
3606
3607         menu = gtk_option_menu_get_menu(optmenu);
3608         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3609         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3610 }
3611
3612 static void prefs_common_cancel(void)
3613 {
3614         gtk_widget_hide(dialog.window);
3615         inc_unlock();
3616 }
3617
3618
3619 /* static void prefs_recvdialog_set_data_from_optmenu(PrefParam *pparam)
3620 {
3621         GtkWidget *menu;
3622         GtkWidget *menuitem;
3623
3624         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3625         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3626         *((RecvDialogShow *)pparam->data) = GPOINTER_TO_INT
3627                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3628 }  */
3629
3630 /* static void prefs_recvdialog_set_optmenu(PrefParam *pparam)
3631 {
3632         RecvDialogShow dialog_show;
3633         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3634         GtkWidget *menu;
3635         GtkWidget *menuitem;
3636
3637         dialog_show = *((RecvDialogShow *)pparam->data);
3638
3639         switch (dialog_show) {
3640         case RECVDIALOG_ALWAYS:
3641                 gtk_option_menu_set_history(optmenu, 0);
3642                 break;
3643         case RECVDIALOG_WINDOW_ACTIVE:
3644                 gtk_option_menu_set_history(optmenu, 1);
3645                 break;
3646         case RECVDIALOG_NEVER:
3647                 gtk_option_menu_set_history(optmenu, 2);
3648                 break;
3649         default:
3650         }
3651
3652         menu = gtk_option_menu_get_menu(optmenu);
3653         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3654         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3655 }     */