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