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