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