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