sync with sylpheed 0.5.3cvs9
[claws.git] / src / prefs_account.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 <gtk/gtk.h>
27 #include <gdk/gdkkeysyms.h>
28 #include <stdio.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <string.h>
32 #include <stdlib.h>
33 #include <ctype.h>
34
35 #include "intl.h"
36 #include "main.h"
37 #include "prefs.h"
38 #include "prefs_account.h"
39 #include "prefs_customheader.h"
40 #include "account.h"
41 #include "mainwindow.h"
42 #include "manage_window.h"
43 #include "inc.h"
44 #include "menu.h"
45 #include "gtkutils.h"
46 #include "utils.h"
47 #include "alertpanel.h"
48
49 static gboolean cancelled;
50
51 static PrefsAccount tmp_ac_prefs;
52
53 static PrefsDialog dialog;
54
55 static struct Basic {
56         GtkWidget *acname_entry;
57         GtkWidget *default_chkbtn;
58
59         GtkWidget *name_entry;
60         GtkWidget *addr_entry;
61         GtkWidget *org_entry;
62
63         GtkWidget *serv_frame;
64         GtkWidget *serv_table;
65         GtkWidget *protocol_optmenu;
66         GtkWidget *inbox_label;
67         GtkWidget *inbox_entry;
68         GtkWidget *recvserv_label;
69         GtkWidget *smtpserv_label;
70         GtkWidget *nntpserv_label;
71         GtkWidget *localmbox_label;
72         GtkWidget *mailcmd_label;
73         GtkWidget *recvserv_entry;
74         GtkWidget *smtpserv_entry;
75         GtkWidget *nntpserv_entry;
76         GtkWidget *nntpauth_chkbtn;
77         GtkWidget *localmbox_entry;
78         GtkWidget *mailcmd_chkbtn;
79         GtkWidget *mailcmd_entry;
80         GtkWidget *uid_label;
81         GtkWidget *pass_label;
82         GtkWidget *uid_entry;
83         GtkWidget *pass_entry;
84 } basic;
85
86 static struct Receive {
87         GtkWidget *pop3_frame;
88         GtkWidget *rmmail_chkbtn;
89         GtkWidget *getall_chkbtn;
90         GtkWidget *recvatgetall_chkbtn;
91         GtkWidget *filter_on_recv_chkbtn;
92
93         GtkWidget *imap_frame;
94         GtkWidget *imapdir_entry;
95 } receive;
96
97 static struct Send {
98         GtkWidget *date_chkbtn;
99         GtkWidget *msgid_chkbtn;
100
101         GtkWidget *customhdr_chkbtn;
102
103         GtkWidget *autocc_chkbtn;
104         GtkWidget *autocc_entry;
105         GtkWidget *autobcc_chkbtn;
106         GtkWidget *autobcc_entry;
107         GtkWidget *autoreplyto_chkbtn;
108         GtkWidget *autoreplyto_entry;
109
110         GtkWidget *smtp_auth_chkbtn;
111         GtkWidget *pop_bfr_smtp_chkbtn;
112 } send;
113
114 static struct Compose {
115         GtkWidget *sigpath_entry;
116 } compose;
117
118 #if USE_GPGME
119 static struct Privacy {
120         GtkWidget *defaultkey_radiobtn;
121         GtkWidget *emailkey_radiobtn;
122         GtkWidget *customkey_radiobtn;
123         GtkWidget *customkey_entry;
124 } privacy;
125 #endif /* USE_GPGME */
126
127 #if USE_SSL
128 static struct SSLPrefs {
129         GtkWidget *receive_frame;
130         GtkWidget *pop_chkbtn;
131         GtkWidget *imap_chkbtn;
132
133         GtkWidget *send_frame;
134         GtkWidget *smtp_nossl_radiobtn;
135         GtkWidget *smtp_ssltunnel_radiobtn;
136         GtkWidget *smtp_sslstarttls_radiobtn;
137 } ssl;
138 #endif /* USE_SSL */
139
140 static struct Advanced {
141         GtkWidget *smtpport_chkbtn;
142         GtkWidget *smtpport_entry;
143         GtkWidget *popport_hbox;
144         GtkWidget *popport_chkbtn;
145         GtkWidget *popport_entry;
146         GtkWidget *imapport_hbox;
147         GtkWidget *imapport_chkbtn;
148         GtkWidget *imapport_entry;
149         GtkWidget *nntpport_hbox;
150         GtkWidget *nntpport_chkbtn;
151         GtkWidget *nntpport_entry;
152         GtkWidget *domain_chkbtn;
153         GtkWidget *domain_entry;
154 } advanced;
155
156 static void prefs_account_fix_size                      (void);
157
158 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
159 static void prefs_account_protocol_set_optmenu          (PrefParam *pparam);
160 static void prefs_account_protocol_activated            (GtkMenuItem *menuitem);
161 #if USE_GPGME || USE_SSL
162 static void prefs_account_enum_set_data_from_radiobtn (PrefParam *pparam);
163 static void prefs_account_enum_set_radiobtn               (PrefParam *pparam);
164 #endif /* USE_GPGME || USE_SSL */
165
166 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
167                                            gpointer user_data);
168 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
169                                           gpointer user_data);
170
171 static PrefParam param[] = {
172         /* Basic */
173         {"account_name", NULL, &tmp_ac_prefs.account_name, P_STRING,
174          &basic.acname_entry, prefs_set_data_from_entry, prefs_set_entry},
175
176         {"is_default", "FALSE", &tmp_ac_prefs.is_default, P_BOOL,
177          &basic.default_chkbtn,
178          prefs_set_data_from_toggle, prefs_set_toggle},
179
180         {"name", NULL, &tmp_ac_prefs.name, P_STRING,
181          &basic.name_entry, prefs_set_data_from_entry, prefs_set_entry},
182
183         {"address", NULL, &tmp_ac_prefs.address, P_STRING,
184          &basic.addr_entry, prefs_set_data_from_entry, prefs_set_entry},
185
186         {"organization", NULL, &tmp_ac_prefs.organization, P_STRING,
187          &basic.org_entry, prefs_set_data_from_entry, prefs_set_entry},
188
189         {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
190          &basic.protocol_optmenu,
191          prefs_account_protocol_set_data_from_optmenu,
192          prefs_account_protocol_set_optmenu},
193
194         {"receive_server", NULL, &tmp_ac_prefs.recv_server, P_STRING,
195          &basic.recvserv_entry, prefs_set_data_from_entry, prefs_set_entry},
196
197         {"smtp_server", NULL, &tmp_ac_prefs.smtp_server, P_STRING,
198          &basic.smtpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
199
200         {"nntp_server", NULL, &tmp_ac_prefs.nntp_server, P_STRING,
201          &basic.nntpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
202
203         {"local_mbox", NULL, &tmp_ac_prefs.local_mbox, P_STRING,
204          &basic.localmbox_entry, prefs_set_data_from_entry, prefs_set_entry},
205
206         {"use_mail_command", "FALSE", &tmp_ac_prefs.use_mail_command, P_BOOL,
207          &basic.mailcmd_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
208
209         {"mail_command", "/usr/sbin/sendmail", &tmp_ac_prefs.mail_command, P_STRING,
210          &basic.mailcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
211
212         {"use_nntp_auth", "FALSE", &tmp_ac_prefs.use_nntp_auth, P_BOOL,
213          &basic.nntpauth_chkbtn,
214          prefs_set_data_from_toggle, prefs_set_toggle},
215
216         {"user_id", "ENV_USER", &tmp_ac_prefs.userid, P_STRING,
217          &basic.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
218
219         {"password", NULL, &tmp_ac_prefs.passwd, P_STRING,
220          &basic.pass_entry, prefs_set_data_from_entry, prefs_set_entry},
221
222         {"inbox", "inbox", &tmp_ac_prefs.inbox, P_STRING,
223          &basic.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
224
225         /* Receive */
226         {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
227          &receive.rmmail_chkbtn,
228          prefs_set_data_from_toggle, prefs_set_toggle},
229
230         {"get_all_mail", "FALSE", &tmp_ac_prefs.getall, P_BOOL,
231          &receive.getall_chkbtn,
232          prefs_set_data_from_toggle, prefs_set_toggle},
233
234         {"receive_at_get_all", "TRUE", &tmp_ac_prefs.recv_at_getall, P_BOOL,
235          &receive.recvatgetall_chkbtn,
236          prefs_set_data_from_toggle, prefs_set_toggle},
237
238         {"filter_on_receive", "TRUE", &tmp_ac_prefs.filter_on_recv, P_BOOL,
239          &receive.filter_on_recv_chkbtn,
240          prefs_set_data_from_toggle, prefs_set_toggle},
241
242         {"imap_directory", NULL, &tmp_ac_prefs.imap_dir, P_STRING,
243          &receive.imapdir_entry, prefs_set_data_from_entry, prefs_set_entry},
244
245         /* Send */
246         {"add_date", "TRUE", &tmp_ac_prefs.add_date, P_BOOL,
247          &send.date_chkbtn,
248          prefs_set_data_from_toggle, prefs_set_toggle},
249
250         {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
251          &send.msgid_chkbtn,
252          prefs_set_data_from_toggle, prefs_set_toggle},
253
254         {"add_custom_header", "FALSE", &tmp_ac_prefs.add_customhdr, P_BOOL,
255          &send.customhdr_chkbtn,
256          prefs_set_data_from_toggle, prefs_set_toggle},
257
258         {"set_autocc", "FALSE", &tmp_ac_prefs.set_autocc, P_BOOL,
259          &send.autocc_chkbtn,
260          prefs_set_data_from_toggle, prefs_set_toggle},
261
262         {"auto_cc", NULL, &tmp_ac_prefs.auto_cc, P_STRING,
263          &send.autocc_entry,
264          prefs_set_data_from_entry, prefs_set_entry},
265
266         {"set_autobcc", "FALSE", &tmp_ac_prefs.set_autobcc, P_BOOL,
267          &send.autobcc_chkbtn,
268          prefs_set_data_from_toggle, prefs_set_toggle},
269
270         {"auto_bcc", NULL, &tmp_ac_prefs.auto_bcc, P_STRING,
271          &send.autobcc_entry,
272          prefs_set_data_from_entry, prefs_set_entry},
273
274         {"set_autoreplyto", "FALSE", &tmp_ac_prefs.set_autoreplyto, P_BOOL,
275          &send.autoreplyto_chkbtn,
276          prefs_set_data_from_toggle, prefs_set_toggle},
277
278         {"auto_replyto", NULL, &tmp_ac_prefs.auto_replyto, P_STRING,
279          &send.autoreplyto_entry,
280          prefs_set_data_from_entry, prefs_set_entry},
281
282         {"use_smtp_auth", "FALSE", &tmp_ac_prefs.use_smtp_auth, P_BOOL,
283          &send.smtp_auth_chkbtn,
284          prefs_set_data_from_toggle, prefs_set_toggle},
285
286         {"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
287          &send.pop_bfr_smtp_chkbtn,
288          prefs_set_data_from_toggle, prefs_set_toggle},
289
290         /* Compose */
291         {"signature_path", "~/"DEFAULT_SIGNATURE, &tmp_ac_prefs.sig_path, P_STRING,
292          &compose.sigpath_entry,
293          prefs_set_data_from_entry, prefs_set_entry},
294
295 #if USE_GPGME
296         /* Privacy */
297         {"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
298          &privacy.defaultkey_radiobtn,
299          prefs_account_enum_set_data_from_radiobtn,
300          prefs_account_enum_set_radiobtn},
301         {"sign_key_id", NULL, &tmp_ac_prefs.sign_key_id, P_STRING,
302          &privacy.customkey_entry,
303          prefs_set_data_from_entry, prefs_set_entry},
304 #endif /* USE_GPGME */
305
306 #if USE_SSL
307         /* SSL */
308         {"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM,
309          &ssl.smtp_nossl_radiobtn,
310          prefs_account_enum_set_data_from_radiobtn,
311          prefs_account_enum_set_radiobtn},
312         {"ssl_pop", "FALSE", &tmp_ac_prefs.ssl_pop, P_BOOL,
313          &ssl.pop_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
314         {"ssl_imap", "FALSE", &tmp_ac_prefs.ssl_imap, P_BOOL,
315          &ssl.imap_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
316 #endif /* USE_SSL */
317
318         /* Advanced */
319         {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
320          &advanced.smtpport_chkbtn,
321          prefs_set_data_from_toggle, prefs_set_toggle},
322
323         {"smtp_port", "25", &tmp_ac_prefs.smtpport, P_USHORT,
324          &advanced.smtpport_entry,
325          prefs_set_data_from_entry, prefs_set_entry},
326
327         {"set_popport", "FALSE", &tmp_ac_prefs.set_popport, P_BOOL,
328          &advanced.popport_chkbtn,
329          prefs_set_data_from_toggle, prefs_set_toggle},
330
331         {"pop_port", "110", &tmp_ac_prefs.popport, P_USHORT,
332          &advanced.popport_entry,
333          prefs_set_data_from_entry, prefs_set_entry},
334
335         {"set_imapport", "FALSE", &tmp_ac_prefs.set_imapport, P_BOOL,
336          &advanced.imapport_chkbtn,
337          prefs_set_data_from_toggle, prefs_set_toggle},
338
339         {"imap_port", "143", &tmp_ac_prefs.imapport, P_USHORT,
340          &advanced.imapport_entry,
341          prefs_set_data_from_entry, prefs_set_entry},
342
343         {"set_nntpport", "FALSE", &tmp_ac_prefs.set_nntpport, P_BOOL,
344          &advanced.nntpport_chkbtn,
345          prefs_set_data_from_toggle, prefs_set_toggle},
346
347         {"nntp_port", "119", &tmp_ac_prefs.nntpport, P_USHORT,
348          &advanced.nntpport_entry,
349          prefs_set_data_from_entry, prefs_set_entry},
350
351         {"set_domain", "FALSE", &tmp_ac_prefs.set_domain, P_BOOL,
352          &advanced.domain_chkbtn,
353          prefs_set_data_from_toggle, prefs_set_toggle},
354
355         {"domain", NULL, &tmp_ac_prefs.domain, P_STRING,
356          &advanced.domain_entry,
357          prefs_set_data_from_entry, prefs_set_entry},
358
359         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
360 };
361
362 static void prefs_account_create                (void);
363 static void prefs_account_basic_create          (void);
364 static void prefs_account_receive_create        (void);
365 static void prefs_account_send_create           (void);
366 static void prefs_account_compose_create        (void);
367 #if USE_GPGME
368 static void prefs_account_privacy_create        (void);
369 #endif /* USE_GPGME */
370 #if USE_SSL
371 static void prefs_account_ssl_create            (void);
372 #endif /* USE_SSL */
373 static void prefs_account_advanced_create       (void);
374
375 static void prefs_account_edit_custom_header    (void);
376
377 static gint prefs_account_deleted               (GtkWidget      *widget,
378                                                  GdkEventAny    *event,
379                                                  gpointer        data);
380 static void prefs_account_key_pressed           (GtkWidget      *widget,
381                                                  GdkEventKey    *event,
382                                                  gpointer        data);
383 static void prefs_account_ok                    (void);
384 static gint prefs_account_apply                 (void);
385 static void prefs_account_cancel                (void);
386
387 #define VSPACING                12
388 #define VSPACING_NARROW         3
389 #define BOX_BORDER              16
390 #define DEFAULT_ENTRY_WIDTH     80
391
392 void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
393 {
394         const gchar *p = label;
395         gint id;
396
397         g_return_if_fail(ac_prefs != NULL);
398         g_return_if_fail(label != NULL);
399
400         memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
401         prefs_read_config(param, label, ACCOUNT_RC);
402         *ac_prefs = tmp_ac_prefs;
403         while (*p && !isdigit(*p)) p++;
404         id = atoi(p);
405         if (id < 0) g_warning("wrong account id: %d\n", id);
406         ac_prefs->account_id = id;
407
408         prefs_custom_header_read_config(ac_prefs);
409 }
410
411 void prefs_account_save_config(PrefsAccount *ac_prefs)
412 {
413         gchar *buf;
414
415         g_return_if_fail(ac_prefs != NULL);
416
417         tmp_ac_prefs = *ac_prefs;
418         buf = g_strdup_printf("Account: %d", ac_prefs->account_id);
419         prefs_save_config(param, buf, ACCOUNT_RC);
420 }
421
422 void prefs_account_save_config_all(GList *account_list)
423 {
424         GList *cur;
425         gchar *rcpath;
426         PrefFile *pfile;
427
428         if (!account_list) return;
429
430         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
431         if ((pfile = prefs_write_open(rcpath)) == NULL) {
432                 g_free(rcpath);
433                 return;
434         }
435         g_free(rcpath);
436
437         for (cur = account_list; cur != NULL; cur = cur->next) {
438                 tmp_ac_prefs = *(PrefsAccount *)cur->data;
439                 if (fprintf(pfile->fp, "[Account: %d]\n",
440                             tmp_ac_prefs.account_id) <= 0 ||
441                     prefs_write_param(param, pfile->fp) < 0) {
442                         g_warning(_("failed to write configuration to file\n"));
443                         prefs_write_close_revert(pfile);
444                         return;
445                 }
446                 if (cur->next) {
447                         if (fputc('\n', pfile->fp) == EOF) {
448                                 FILE_OP_ERROR(rcpath, "fputc");
449                                 prefs_write_close_revert(pfile);
450                                 return;
451                         }
452                 }
453         }
454
455         if (prefs_write_close(pfile) < 0)
456                 g_warning(_("failed to write configuration to file\n"));
457 }
458
459 void prefs_account_free(PrefsAccount *ac_prefs)
460 {
461         if (!ac_prefs) return;
462
463         tmp_ac_prefs = *ac_prefs;
464         prefs_free(param);
465 }
466
467 static gint prefs_account_get_new_id(void)
468 {
469         GList *ac_list;
470         PrefsAccount *ac;
471         static gint last_id = 0;
472
473         for (ac_list = account_get_list(); ac_list != NULL;
474              ac_list = ac_list->next) {
475                 ac = (PrefsAccount *)ac_list->data;
476                 if (last_id < ac->account_id)
477                         last_id = ac->account_id;
478         }
479
480         return last_id + 1;
481 }
482
483 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
484 {
485         gboolean new_account = FALSE;
486
487         if (prefs_rc_is_readonly(ACCOUNT_RC))
488                 return ac_prefs;
489
490         debug_print(_("Opening account preferences window...\n"));
491
492         inc_autocheck_timer_remove();
493
494         cancelled = FALSE;
495
496         if (!ac_prefs) {
497                 ac_prefs = g_new0(PrefsAccount, 1);
498                 ac_prefs->account_id = prefs_account_get_new_id();
499                 new_account = TRUE;
500         }
501
502         if (!dialog.window) {
503                 prefs_account_create();
504         }
505
506         manage_window_set_transient(GTK_WINDOW(dialog.window));
507         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
508         gtk_widget_grab_focus(dialog.ok_btn);
509
510         tmp_ac_prefs = *ac_prefs;
511
512         if (new_account) {
513                 PrefsAccount *def_ac;
514                 gchar *buf;
515
516                 prefs_set_dialog_to_default(param);
517                 buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
518                 gtk_entry_set_text(GTK_ENTRY(basic.acname_entry), buf);
519                 g_free(buf);
520                 def_ac = account_get_default();
521                 if (def_ac) {
522                         gtk_entry_set_text(GTK_ENTRY(basic.name_entry),
523                                            def_ac->name ? def_ac->name : "");
524                         gtk_entry_set_text(GTK_ENTRY(basic.addr_entry),
525                                            def_ac->address ? def_ac->address : "");
526                         gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
527                                            def_ac->organization ? def_ac->organization : "");
528                 }
529                 gtk_window_set_title(GTK_WINDOW(dialog.window),
530                                      _("Preferences for new account"));
531                 gtk_widget_hide(dialog.apply_btn);
532         } else {
533                 prefs_set_dialog(param);
534                 gtk_window_set_title(GTK_WINDOW(dialog.window),
535                                      _("Preferences for each account"));
536                 gtk_widget_show(dialog.apply_btn);
537         }
538
539         if (ac_prefs->protocol != A_LOCAL) {
540                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
541                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
542         }
543
544         gtk_widget_show(dialog.window);
545         gtk_main();
546         gtk_widget_hide(dialog.window);
547
548         inc_autocheck_timer_set();
549
550         if (cancelled && new_account) {
551                 g_free(ac_prefs);
552                 return NULL;
553         } else {
554                 *ac_prefs = tmp_ac_prefs;
555                 return ac_prefs;
556         }
557 }
558
559 static void prefs_account_create(void)
560 {
561         gint page = 0;
562
563         debug_print(_("Creating account preferences window...\n"));
564
565         /* create dialog */
566         prefs_dialog_create(&dialog);
567         gtk_signal_connect(GTK_OBJECT(dialog.window), "delete_event",
568                            GTK_SIGNAL_FUNC(prefs_account_deleted), NULL);
569         gtk_signal_connect(GTK_OBJECT(dialog.window), "key_press_event",
570                            GTK_SIGNAL_FUNC(prefs_account_key_pressed), NULL);
571         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_in_event",
572                            GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
573         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_out_event",
574                            GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
575         gtk_signal_connect(GTK_OBJECT(dialog.ok_btn), "clicked",
576                            GTK_SIGNAL_FUNC(prefs_account_ok), NULL);
577         gtk_signal_connect(GTK_OBJECT(dialog.apply_btn), "clicked",
578                            GTK_SIGNAL_FUNC(prefs_account_apply), NULL);
579         gtk_signal_connect(GTK_OBJECT(dialog.cancel_btn), "clicked",
580                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
581
582         prefs_account_basic_create();
583         SET_NOTEBOOK_LABEL(dialog.notebook, _("Basic"), page++);
584         prefs_account_receive_create();
585         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"), page++);
586         prefs_account_send_create();
587         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"), page++);
588         prefs_account_compose_create();
589         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"), page++);
590 #if USE_GPGME
591         prefs_account_privacy_create();
592         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
593 #endif /* USE_GPGME */
594 #if USE_SSL
595         prefs_account_ssl_create();
596         SET_NOTEBOOK_LABEL(dialog.notebook, _("SSL"), page++);
597 #endif /* USE_SSL */
598         prefs_account_advanced_create();
599         SET_NOTEBOOK_LABEL(dialog.notebook, _("Advanced"), page++);
600
601         prefs_account_fix_size();
602         gtk_widget_show(dialog.window);
603 }
604
605 /**
606  * prefs_account_fix_size:
607  * 
608  * Fix the window size after creating widgets by selecting "Local"
609  * protocol (currently it has the largest size of parameter widgets).
610  * Without this the window gets too large.
611  **/
612 static void prefs_account_fix_size(void)
613 {
614         GtkOptionMenu *optmenu = GTK_OPTION_MENU (basic.protocol_optmenu);
615         GtkWidget *menu;
616         GtkWidget *menuitem;
617
618         gtk_option_menu_set_history (optmenu, 4); /* local */
619         menu = gtk_option_menu_get_menu (optmenu);
620         menuitem = gtk_menu_get_active (GTK_MENU (menu));
621         gtk_menu_item_activate (GTK_MENU_ITEM (menuitem));
622 }
623
624 #define SET_ACTIVATE(menuitem) \
625 { \
626         gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \
627                            GTK_SIGNAL_FUNC(prefs_account_protocol_activated), \
628                            NULL); \
629 }
630
631 #define TABLE_YPAD 2
632
633 static void prefs_account_basic_create(void)
634 {
635         GtkWidget *vbox1;
636         GtkWidget *hbox;
637         GtkWidget *label;
638         GtkWidget *acname_entry;
639         GtkWidget *default_chkbtn;
640         GtkWidget *frame1;
641         GtkWidget *table1;
642         GtkWidget *name_entry;
643         GtkWidget *addr_entry;
644         GtkWidget *org_entry;
645
646         GtkWidget *serv_frame;
647         GtkWidget *vbox2;
648         GtkWidget *optmenu;
649         GtkWidget *optmenu_menu;
650         GtkWidget *menuitem;
651         GtkWidget *inbox_label;
652         GtkWidget *inbox_entry;
653         GtkWidget *serv_table;
654         GtkWidget *recvserv_label;
655         GtkWidget *smtpserv_label;
656         GtkWidget *nntpserv_label;
657         GtkWidget *localmbox_label;
658         GtkWidget *mailcmd_label;
659         GtkWidget *recvserv_entry;
660         GtkWidget *smtpserv_entry;
661         GtkWidget *nntpserv_entry;
662         GtkWidget *nntpauth_chkbtn;
663         GtkWidget *localmbox_entry;
664         GtkWidget *mailcmd_chkbtn;
665         GtkWidget *mailcmd_entry;
666         GtkWidget *uid_label;
667         GtkWidget *pass_label;
668         GtkWidget *uid_entry;
669         GtkWidget *pass_entry;
670
671         vbox1 = gtk_vbox_new (FALSE, VSPACING);
672         gtk_widget_show (vbox1);
673         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
674         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
675
676         hbox = gtk_hbox_new (FALSE, 8);
677         gtk_widget_show (hbox);
678         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
679
680         label = gtk_label_new (_("Name of this account"));
681         gtk_widget_show (label);
682         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
683
684         acname_entry = gtk_entry_new ();
685         gtk_widget_show (acname_entry);
686         gtk_widget_set_usize (acname_entry, DEFAULT_ENTRY_WIDTH, -1);
687         gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
688
689         default_chkbtn = gtk_check_button_new_with_label (_("Usually used"));
690         gtk_widget_show (default_chkbtn);
691         gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, FALSE, FALSE, 0);
692
693         PACK_FRAME (vbox1, frame1, _("Personal information"));
694
695         table1 = gtk_table_new (3, 2, FALSE);
696         gtk_widget_show (table1);
697         gtk_container_add (GTK_CONTAINER (frame1), table1);
698         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
699         gtk_table_set_row_spacings (GTK_TABLE (table1), VSPACING_NARROW);
700         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
701
702         label = gtk_label_new (_("Full name"));
703         gtk_widget_show (label);
704         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 0, 1,
705                           GTK_FILL, 0, 0, 0);
706         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
707
708         label = gtk_label_new (_("Mail address"));
709         gtk_widget_show (label);
710         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 1, 2,
711                           GTK_FILL, 0, 0, 0);
712         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
713
714         label = gtk_label_new (_("Organization"));
715         gtk_widget_show (label);
716         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 2, 3,
717                           GTK_FILL, 0, 0, 0);
718         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
719
720         name_entry = gtk_entry_new ();
721         gtk_widget_show (name_entry);
722         gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
723                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
724                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
725
726         addr_entry = gtk_entry_new ();
727         gtk_widget_show (addr_entry);
728         gtk_table_attach (GTK_TABLE (table1), addr_entry, 1, 2, 1, 2,
729                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
730                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
731
732         org_entry = gtk_entry_new ();
733         gtk_widget_show (org_entry);
734         gtk_table_attach (GTK_TABLE (table1), org_entry, 1, 2, 2, 3,
735                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
736                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
737
738         PACK_FRAME (vbox1, serv_frame, _("Server information"));
739
740         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
741         gtk_widget_show (vbox2);
742         gtk_container_add (GTK_CONTAINER (serv_frame), vbox2);
743         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
744
745         hbox = gtk_hbox_new (FALSE, 8);
746         gtk_widget_show (hbox);
747         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
748
749         label = gtk_label_new (_("Protocol"));
750         gtk_widget_show (label);
751         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
752
753         optmenu = gtk_option_menu_new ();
754         gtk_widget_show (optmenu);
755         gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
756
757         optmenu_menu = gtk_menu_new ();
758
759         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (normal)"),  A_POP3);
760         SET_ACTIVATE (menuitem);
761         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (APOP auth)"),  A_APOP);
762         SET_ACTIVATE (menuitem);
763         MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
764         SET_ACTIVATE (menuitem);
765         MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
766         SET_ACTIVATE (menuitem);
767         MENUITEM_ADD (optmenu_menu, menuitem, _("None (local)"), A_LOCAL);
768         SET_ACTIVATE (menuitem);
769
770         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
771
772         inbox_label = gtk_label_new (_("Inbox"));
773         gtk_widget_show (inbox_label);
774         gtk_box_pack_start (GTK_BOX (hbox), inbox_label, FALSE, FALSE, 0);
775
776         inbox_entry = gtk_entry_new ();
777         gtk_widget_show (inbox_entry);
778         gtk_widget_set_usize (inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
779         gtk_box_pack_start (GTK_BOX (hbox), inbox_entry, TRUE, TRUE, 0);
780
781         serv_table = gtk_table_new (6, 4, FALSE);
782         gtk_widget_show (serv_table);
783         gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
784         gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
785         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 3, 0);
786         gtk_table_set_col_spacings (GTK_TABLE (serv_table), 8);
787
788         nntpserv_entry = gtk_entry_new ();
789         gtk_widget_show (nntpserv_entry);
790         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_entry, 1, 4, 0, 1,
791                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
792                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
793 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 0, 0); */
794
795         nntpauth_chkbtn = gtk_check_button_new_with_label
796                 (_("This server requires authentication"));
797         gtk_widget_show (nntpauth_chkbtn);
798         gtk_table_attach (GTK_TABLE (serv_table), nntpauth_chkbtn, 0, 4, 1, 2,
799                           GTK_FILL, 0, 0, 0);
800
801         recvserv_entry = gtk_entry_new ();
802         gtk_widget_show (recvserv_entry);
803         gtk_table_attach (GTK_TABLE (serv_table), recvserv_entry, 1, 4, 2, 3,
804                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
805                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
806
807         localmbox_entry = gtk_entry_new ();
808         gtk_widget_show (localmbox_entry);
809         gtk_table_attach (GTK_TABLE (serv_table), localmbox_entry, 1, 4, 3, 4,
810                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
811                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
812
813         smtpserv_entry = gtk_entry_new ();
814         gtk_widget_show (smtpserv_entry);
815         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_entry, 1, 4, 4, 5,
816                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
817                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
818
819         mailcmd_entry = gtk_entry_new ();
820         gtk_widget_show (mailcmd_entry);
821         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_entry, 1, 4, 6, 7,
822                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
823                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
824
825         uid_entry = gtk_entry_new ();
826         gtk_widget_show (uid_entry);
827         gtk_widget_set_usize (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
828         gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 7, 8,
829                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
830                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
831
832         pass_entry = gtk_entry_new ();
833         gtk_widget_show (pass_entry);
834         gtk_widget_set_usize (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
835         gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 3, 4, 7, 8,
836                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
837                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
838         gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
839
840         nntpserv_label = gtk_label_new (_("News server"));
841         gtk_widget_show (nntpserv_label);
842         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_label, 0, 1, 0, 1,
843                           GTK_FILL, 0, 0, 0);
844         gtk_misc_set_alignment (GTK_MISC (nntpserv_label), 1, 0.5);
845
846         recvserv_label = gtk_label_new (_("Server for receiving"));
847         gtk_widget_show (recvserv_label);
848         gtk_table_attach (GTK_TABLE (serv_table), recvserv_label, 0, 1, 2, 3,
849                           GTK_FILL, 0, 0, 0);
850         gtk_misc_set_alignment (GTK_MISC (recvserv_label), 1, 0.5);
851
852         localmbox_label = gtk_label_new (_("Local mailbox file"));
853         gtk_widget_show (localmbox_label);
854         gtk_table_attach (GTK_TABLE (serv_table), localmbox_label, 0, 1, 3, 4,
855                           GTK_FILL, 0, 0, 0);
856         gtk_misc_set_alignment (GTK_MISC (localmbox_label), 1, 0.5);
857 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
858
859         smtpserv_label = gtk_label_new (_("SMTP server (send)"));
860         gtk_widget_show (smtpserv_label);
861         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_label, 0, 1, 4, 5,
862                           GTK_FILL, 0, 0, 0);
863         gtk_misc_set_alignment (GTK_MISC (smtpserv_label), 1, 0.5);
864 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
865
866         mailcmd_chkbtn = gtk_check_button_new_with_label
867                 (_("Use mail command rather than SMTP server"));
868         gtk_widget_show (mailcmd_chkbtn);
869         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_chkbtn, 0, 4, 5, 6,
870                           GTK_EXPAND | GTK_FILL,
871                           0, 0, TABLE_YPAD);
872         gtk_signal_connect(GTK_OBJECT(mailcmd_chkbtn), "toggled",
873                            GTK_SIGNAL_FUNC(prefs_account_mailcmd_toggled),
874                            NULL);
875
876         mailcmd_label = gtk_label_new (_("command to send mails"));
877         gtk_widget_show (mailcmd_label);
878         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_label, 0, 1, 6, 7,
879                           GTK_FILL, 0, 0, 0);
880         gtk_misc_set_alignment (GTK_MISC (mailcmd_label), 1, 0.5);
881 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
882
883         uid_label = gtk_label_new (_("User ID"));
884         gtk_widget_show (uid_label);
885         gtk_table_attach (GTK_TABLE (serv_table), uid_label, 0, 1, 7, 8,
886                           GTK_FILL, 0, 0, 0);
887         gtk_misc_set_alignment (GTK_MISC (uid_label), 1, 0.5);
888
889         pass_label = gtk_label_new (_("Password"));
890         gtk_widget_show (pass_label);
891         gtk_table_attach (GTK_TABLE (serv_table), pass_label, 2, 3, 7, 8,
892                           0, 0, 0, 0);
893
894         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, uid_label);
895         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, pass_label);
896         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, uid_entry);
897         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, pass_entry);
898
899         basic.acname_entry   = acname_entry;
900         basic.default_chkbtn = default_chkbtn;
901
902         basic.name_entry = name_entry;
903         basic.addr_entry = addr_entry;
904         basic.org_entry  = org_entry;
905
906         basic.serv_frame       = serv_frame;
907         basic.serv_table       = serv_table;
908         basic.protocol_optmenu = optmenu;
909         basic.inbox_label      = inbox_label;
910         basic.inbox_entry      = inbox_entry;
911         basic.recvserv_label   = recvserv_label;
912         basic.recvserv_entry   = recvserv_entry;
913         basic.smtpserv_label   = smtpserv_label;
914         basic.smtpserv_entry   = smtpserv_entry;
915         basic.nntpserv_label   = nntpserv_label;
916         basic.nntpserv_entry   = nntpserv_entry;
917         basic.nntpauth_chkbtn  = nntpauth_chkbtn;
918         basic.localmbox_label   = localmbox_label;
919         basic.localmbox_entry   = localmbox_entry;
920         basic.mailcmd_chkbtn   = mailcmd_chkbtn;
921         basic.mailcmd_label   = mailcmd_label;
922         basic.mailcmd_entry   = mailcmd_entry;
923         basic.uid_label        = uid_label;
924         basic.pass_label       = pass_label;
925         basic.uid_entry        = uid_entry;
926         basic.pass_entry       = pass_entry;
927 }
928
929 static void prefs_account_receive_create(void)
930 {
931         GtkWidget *vbox1;
932         GtkWidget *frame1;
933         GtkWidget *vbox2;
934         GtkWidget *rmmail_chkbtn;
935         GtkWidget *getall_chkbtn;
936         GtkWidget *recvatgetall_chkbtn;
937         GtkWidget *filter_on_recv_chkbtn;
938         GtkWidget *frame2;
939         GtkWidget *hbox1;
940         GtkWidget *imapdir_label;
941         GtkWidget *imapdir_entry;
942
943         vbox1 = gtk_vbox_new (FALSE, VSPACING);
944         gtk_widget_show (vbox1);
945         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
946         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
947
948         PACK_FRAME (vbox1, frame1, _("POP3"));
949
950         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
951         gtk_widget_show (vbox2);
952         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
953         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
954
955         PACK_CHECK_BUTTON (vbox2, rmmail_chkbtn,
956                            _("Remove messages on server when received"));
957         PACK_CHECK_BUTTON (vbox2, getall_chkbtn,
958                            _("Download all messages on server"));
959         PACK_CHECK_BUTTON
960                 (vbox2, recvatgetall_chkbtn,
961                  _("`Get all' checks for new mail on this account"));
962         PACK_CHECK_BUTTON (vbox2, filter_on_recv_chkbtn,
963                            _("Filter messages on receiving"));
964
965         PACK_FRAME (vbox1, frame2, _("IMAP4"));
966
967         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
968         gtk_widget_show (vbox2);
969         gtk_container_add (GTK_CONTAINER (frame2), vbox2);
970         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
971
972         hbox1 = gtk_hbox_new (FALSE, 8);
973         gtk_widget_show (hbox1);
974         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
975
976         imapdir_label = gtk_label_new (_("IMAP server directory"));
977         gtk_widget_show (imapdir_label);
978         gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
979
980         imapdir_entry = gtk_entry_new();
981         gtk_widget_show (imapdir_entry);
982         gtk_box_pack_start (GTK_BOX (hbox1), imapdir_entry, TRUE, TRUE, 0);
983
984         receive.pop3_frame            = frame1;
985         receive.rmmail_chkbtn         = rmmail_chkbtn;
986         receive.getall_chkbtn         = getall_chkbtn;
987         receive.recvatgetall_chkbtn   = recvatgetall_chkbtn;
988         receive.filter_on_recv_chkbtn = filter_on_recv_chkbtn;
989
990         receive.imap_frame    = frame2;
991         receive.imapdir_entry = imapdir_entry;
992 }
993
994 static void prefs_account_send_create(void)
995 {
996         GtkWidget *vbox1;
997         GtkWidget *vbox2;
998         GtkWidget *frame;
999         GtkWidget *date_chkbtn;
1000         GtkWidget *msgid_chkbtn;
1001         GtkWidget *hbox;
1002         GtkWidget *customhdr_chkbtn;
1003         GtkWidget *customhdr_edit_btn;
1004         GtkWidget *frame2;
1005         GtkWidget *table;
1006         GtkWidget *autocc_chkbtn;
1007         GtkWidget *autocc_entry;
1008         GtkWidget *autobcc_chkbtn;
1009         GtkWidget *autobcc_entry;
1010         GtkWidget *autoreplyto_chkbtn;
1011         GtkWidget *autoreplyto_entry;
1012         GtkWidget *frame3;
1013         GtkWidget *vbox3;
1014         GtkWidget *smtp_auth_chkbtn;
1015         GtkWidget *pop_bfr_smtp_chkbtn;
1016
1017         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1018         gtk_widget_show (vbox1);
1019         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1020         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1021
1022         PACK_FRAME (vbox1, frame, _("Header"));
1023
1024         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1025         gtk_widget_show (vbox2);
1026         gtk_container_add (GTK_CONTAINER (frame), vbox2);
1027         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1028
1029         PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date header field"));
1030         PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
1031
1032         hbox = gtk_hbox_new (FALSE, 12);
1033         gtk_widget_show (hbox);
1034         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1035
1036         PACK_CHECK_BUTTON (hbox, customhdr_chkbtn,
1037                            _("Add user-defined header"));
1038
1039         customhdr_edit_btn = gtk_button_new_with_label (_(" Edit... "));
1040         gtk_widget_show (customhdr_edit_btn);
1041         gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
1042                             FALSE, FALSE, 0);
1043         gtk_signal_connect (GTK_OBJECT (customhdr_edit_btn), "clicked",
1044                             GTK_SIGNAL_FUNC (prefs_account_edit_custom_header),
1045                             NULL);
1046
1047         SET_TOGGLE_SENSITIVITY (customhdr_chkbtn, customhdr_edit_btn);
1048
1049         PACK_FRAME (vbox1, frame2, _("Automatically set following addresses"));
1050
1051         table =  gtk_table_new (3, 2, FALSE);
1052         gtk_widget_show (table);
1053         gtk_container_add (GTK_CONTAINER (frame2), table);
1054         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1055         gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW);
1056         gtk_table_set_col_spacings (GTK_TABLE (table), 8);
1057
1058         autocc_chkbtn = gtk_check_button_new_with_label (_("Cc"));
1059         gtk_widget_show (autocc_chkbtn);
1060         gtk_table_attach (GTK_TABLE (table), autocc_chkbtn, 0, 1, 0, 1,
1061                           GTK_FILL, 0, 0, 0);
1062
1063         autocc_entry = gtk_entry_new ();
1064         gtk_widget_show (autocc_entry);
1065         gtk_table_attach (GTK_TABLE (table), autocc_entry, 1, 2, 0, 1,
1066                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1067                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1068
1069         SET_TOGGLE_SENSITIVITY (autocc_chkbtn, autocc_entry);
1070
1071         autobcc_chkbtn = gtk_check_button_new_with_label (_("Bcc"));
1072         gtk_widget_show (autobcc_chkbtn);
1073         gtk_table_attach (GTK_TABLE (table), autobcc_chkbtn, 0, 1, 1, 2,
1074                           GTK_FILL, 0, 0, 0);
1075
1076         autobcc_entry = gtk_entry_new ();
1077         gtk_widget_show (autobcc_entry);
1078         gtk_table_attach (GTK_TABLE (table), autobcc_entry, 1, 2, 1, 2,
1079                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1080                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1081
1082         SET_TOGGLE_SENSITIVITY (autobcc_chkbtn, autobcc_entry);
1083
1084         autoreplyto_chkbtn = gtk_check_button_new_with_label (_("Reply-To"));
1085         gtk_widget_show (autoreplyto_chkbtn);
1086         gtk_table_attach (GTK_TABLE (table), autoreplyto_chkbtn, 0, 1, 2, 3,
1087                           GTK_FILL, 0, 0, 0);
1088
1089         autoreplyto_entry = gtk_entry_new ();
1090         gtk_widget_show (autoreplyto_entry);
1091         gtk_table_attach (GTK_TABLE (table), autoreplyto_entry, 1, 2, 2, 3,
1092                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1093                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1094
1095         SET_TOGGLE_SENSITIVITY (autoreplyto_chkbtn, autoreplyto_entry);
1096
1097         PACK_FRAME (vbox1, frame3, _("Authentication"));
1098
1099         vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1100         gtk_widget_show (vbox3);
1101         gtk_container_add (GTK_CONTAINER (frame3), vbox3);
1102         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
1103
1104         PACK_CHECK_BUTTON (vbox3, smtp_auth_chkbtn,
1105                 _("SMTP Authentication (SMTP AUTH)"));
1106         PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_chkbtn,
1107                 _("Authenticate with POP3 before sending"));
1108         gtk_widget_set_sensitive(pop_bfr_smtp_chkbtn, FALSE);
1109
1110         send.date_chkbtn      = date_chkbtn;
1111         send.msgid_chkbtn     = msgid_chkbtn;
1112         send.customhdr_chkbtn = customhdr_chkbtn;
1113
1114         send.autocc_chkbtn      = autocc_chkbtn;
1115         send.autocc_entry       = autocc_entry;
1116         send.autobcc_chkbtn     = autobcc_chkbtn;
1117         send.autobcc_entry      = autobcc_entry;
1118         send.autoreplyto_chkbtn = autoreplyto_chkbtn;
1119         send.autoreplyto_entry  = autoreplyto_entry;
1120
1121         send.smtp_auth_chkbtn    = smtp_auth_chkbtn;
1122         send.pop_bfr_smtp_chkbtn = pop_bfr_smtp_chkbtn;
1123 }
1124
1125 static void prefs_account_compose_create(void)
1126 {
1127         GtkWidget *vbox1;
1128         GtkWidget *hbox;
1129         GtkWidget *label;
1130         GtkWidget *sigpath_entry;
1131
1132         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1133         gtk_widget_show (vbox1);
1134         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1135         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1136
1137         hbox = gtk_hbox_new (FALSE, 8);
1138         gtk_widget_show (hbox);
1139         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
1140
1141         label = gtk_label_new (_("Signature file"));
1142         gtk_widget_show (label);
1143         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1144
1145         sigpath_entry = gtk_entry_new ();
1146         gtk_widget_show (sigpath_entry);
1147         gtk_box_pack_start (GTK_BOX (hbox), sigpath_entry, TRUE, TRUE, 0);
1148
1149         compose.sigpath_entry = sigpath_entry;
1150 }
1151
1152 #if USE_GPGME
1153 static void prefs_account_privacy_create(void)
1154 {
1155         GtkWidget *vbox1;
1156         GtkWidget *frame1;
1157         GtkWidget *vbox2;
1158         GtkWidget *hbox1;
1159         GtkWidget *label;
1160         GtkWidget *defaultkey_radiobtn;
1161         GtkWidget *emailkey_radiobtn;
1162         GtkWidget *customkey_radiobtn;
1163         GtkWidget *customkey_entry;
1164
1165         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1166         gtk_widget_show (vbox1);
1167         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1168         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1169
1170         PACK_FRAME (vbox1, frame1, _("Sign key"));
1171
1172         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1173         gtk_widget_show (vbox2);
1174         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
1175         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1176
1177         defaultkey_radiobtn = gtk_radio_button_new_with_label
1178                 (NULL, _("Use default GnuPG key"));
1179         gtk_widget_show (defaultkey_radiobtn);
1180         gtk_box_pack_start (GTK_BOX (vbox2), defaultkey_radiobtn,
1181                             FALSE, FALSE, 0);
1182         gtk_object_set_user_data (GTK_OBJECT (defaultkey_radiobtn),
1183                                   GINT_TO_POINTER (SIGN_KEY_DEFAULT));
1184
1185         emailkey_radiobtn = gtk_radio_button_new_with_label_from_widget
1186                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
1187                  _("Select key by your email address"));
1188         gtk_widget_show (emailkey_radiobtn);
1189         gtk_box_pack_start (GTK_BOX (vbox2), emailkey_radiobtn,
1190                             FALSE, FALSE, 0);
1191         gtk_object_set_user_data (GTK_OBJECT (emailkey_radiobtn),
1192                                   GINT_TO_POINTER (SIGN_KEY_BY_FROM));
1193
1194         customkey_radiobtn = gtk_radio_button_new_with_label_from_widget
1195                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
1196                  _("Specify key manually"));
1197         gtk_widget_show (customkey_radiobtn);
1198         gtk_box_pack_start (GTK_BOX (vbox2), customkey_radiobtn,
1199                             FALSE, FALSE, 0);
1200         gtk_object_set_user_data (GTK_OBJECT (customkey_radiobtn),
1201                                   GINT_TO_POINTER (SIGN_KEY_CUSTOM));
1202
1203         hbox1 = gtk_hbox_new (FALSE, 8);
1204         gtk_widget_show (hbox1);
1205         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1206
1207         label = gtk_label_new ("");
1208         gtk_widget_show (label);
1209         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1210         gtk_widget_set_usize (label, 16, -1);
1211
1212         label = gtk_label_new (_("User or key ID:"));
1213         gtk_widget_show (label);
1214         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1215
1216         customkey_entry = gtk_entry_new ();
1217         gtk_widget_show (customkey_entry);
1218         gtk_box_pack_start (GTK_BOX (hbox1), customkey_entry,
1219                             TRUE, TRUE, 0);
1220
1221         SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
1222
1223         privacy.defaultkey_radiobtn = defaultkey_radiobtn;
1224         privacy.emailkey_radiobtn = emailkey_radiobtn;
1225         privacy.customkey_radiobtn = customkey_radiobtn;
1226         privacy.customkey_entry = customkey_entry;
1227 }
1228 #endif /* USE_GPGME */
1229
1230 #if USE_SSL
1231 static void prefs_account_ssl_create(void)
1232 {
1233         GtkWidget *vbox1;
1234
1235         GtkWidget *receive_frame;
1236         GtkWidget *vbox2;
1237         GtkWidget *pop_chkbtn;
1238         GtkWidget *imap_chkbtn;
1239
1240         GtkWidget *send_frame;
1241         GtkWidget *vbox3;
1242         GtkWidget *smtp_nossl_radiobtn;
1243         GtkWidget *smtp_ssltunnel_radiobtn;
1244         GtkWidget *smtp_sslstarttls_radiobtn;
1245
1246         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1247         gtk_widget_show (vbox1);
1248         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1249         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1250
1251         PACK_FRAME (vbox1, receive_frame, _("Receive"));
1252
1253         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1254         gtk_widget_show (vbox2);
1255         gtk_container_add (GTK_CONTAINER (receive_frame), vbox2);
1256         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1257
1258         PACK_CHECK_BUTTON (vbox2, pop_chkbtn,
1259                            _("Use SSL for POP3 connection"));
1260         PACK_CHECK_BUTTON (vbox2, imap_chkbtn,
1261                            _("Use SSL for IMAP4 connection"));
1262
1263         PACK_FRAME (vbox1, send_frame, _("Send (SMTP)"));
1264
1265         vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1266         gtk_widget_show (vbox3);
1267         gtk_container_add (GTK_CONTAINER (send_frame), vbox3);
1268         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
1269
1270         smtp_nossl_radiobtn =
1271                 gtk_radio_button_new_with_label(NULL, _("Don't use SSL"));
1272         gtk_widget_show (smtp_nossl_radiobtn);
1273         gtk_box_pack_start (GTK_BOX (vbox3), smtp_nossl_radiobtn,
1274                             FALSE, FALSE, 0);
1275         gtk_object_set_user_data (GTK_OBJECT (smtp_nossl_radiobtn),
1276                                   GINT_TO_POINTER (SSL_SMTP_NONE));
1277
1278         smtp_ssltunnel_radiobtn = gtk_radio_button_new_with_label_from_widget
1279                 (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
1280                  _("Use SSL for SMTP connection"));
1281         gtk_widget_show (smtp_ssltunnel_radiobtn);
1282         gtk_box_pack_start (GTK_BOX (vbox3), smtp_ssltunnel_radiobtn,
1283                             FALSE, FALSE, 0);
1284         gtk_object_set_user_data (GTK_OBJECT (smtp_ssltunnel_radiobtn),
1285                                   GINT_TO_POINTER (SSL_SMTP_TUNNEL));
1286
1287         smtp_sslstarttls_radiobtn = gtk_radio_button_new_with_label_from_widget
1288                 (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
1289                  _("Use STARTTLS command to start SSL session"));
1290         gtk_widget_show (smtp_sslstarttls_radiobtn);
1291         gtk_box_pack_start (GTK_BOX (vbox3), smtp_sslstarttls_radiobtn,
1292                             FALSE, FALSE, 0);
1293         gtk_object_set_user_data (GTK_OBJECT (smtp_sslstarttls_radiobtn),
1294                                   GINT_TO_POINTER (SSL_SMTP_STARTTLS));
1295
1296         ssl.receive_frame = receive_frame;
1297         ssl.pop_chkbtn    = pop_chkbtn;
1298         ssl.imap_chkbtn   = imap_chkbtn;
1299
1300         ssl.send_frame                = send_frame;
1301         ssl.smtp_nossl_radiobtn       = smtp_nossl_radiobtn;
1302         ssl.smtp_ssltunnel_radiobtn   = smtp_ssltunnel_radiobtn;
1303         ssl.smtp_sslstarttls_radiobtn = smtp_sslstarttls_radiobtn;
1304 }
1305 #endif /* USE_SSL */
1306
1307 static void prefs_account_advanced_create(void)
1308 {
1309         GtkWidget *vbox1;
1310         GtkWidget *vbox2;
1311         GtkWidget *hbox1;
1312         GtkWidget *checkbtn_smtpport;
1313         GtkWidget *entry_smtpport;
1314         GtkWidget *hbox_popport;
1315         GtkWidget *checkbtn_popport;
1316         GtkWidget *entry_popport;
1317         GtkWidget *hbox_imapport;
1318         GtkWidget *checkbtn_imapport;
1319         GtkWidget *entry_imapport;
1320         GtkWidget *hbox_nntpport;
1321         GtkWidget *checkbtn_nntpport;
1322         GtkWidget *entry_nntpport;
1323         GtkWidget *checkbtn_domain;
1324         GtkWidget *entry_domain;
1325
1326 #define PACK_HBOX(hbox) \
1327 { \
1328         hbox = gtk_hbox_new (FALSE, 8); \
1329         gtk_widget_show (hbox); \
1330         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); \
1331 }
1332
1333 #define PACK_PORT_ENTRY(box, entry) \
1334 { \
1335         entry = gtk_entry_new_with_max_length (5); \
1336         gtk_widget_show (entry); \
1337         gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 0); \
1338         gtk_widget_set_usize (entry, 64, -1); \
1339 }
1340
1341         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1342         gtk_widget_show (vbox1);
1343         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1344         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1345
1346         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1347         gtk_widget_show (vbox2);
1348         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1349
1350         PACK_HBOX (hbox1);
1351         PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("Specify SMTP port"));
1352         PACK_PORT_ENTRY (hbox1, entry_smtpport);
1353         SET_TOGGLE_SENSITIVITY (checkbtn_smtpport, entry_smtpport);
1354
1355         PACK_HBOX (hbox_popport);
1356         PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
1357                            _("Specify POP3 port"));
1358         PACK_PORT_ENTRY (hbox_popport, entry_popport);
1359         SET_TOGGLE_SENSITIVITY (checkbtn_popport, entry_popport);
1360
1361         PACK_HBOX (hbox_imapport);
1362         PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
1363                            _("Specify IMAP4 port"));
1364         PACK_PORT_ENTRY (hbox_imapport, entry_imapport);
1365         SET_TOGGLE_SENSITIVITY (checkbtn_imapport, entry_imapport);
1366
1367         PACK_HBOX (hbox_nntpport);
1368         PACK_CHECK_BUTTON (hbox_nntpport, checkbtn_nntpport,
1369                            _("Specify NNTP port"));
1370         PACK_PORT_ENTRY (hbox_nntpport, entry_nntpport);
1371         SET_TOGGLE_SENSITIVITY (checkbtn_nntpport, entry_nntpport);
1372
1373         PACK_HBOX (hbox1);
1374         PACK_CHECK_BUTTON (hbox1, checkbtn_domain, _("Specify domain name"));
1375
1376         entry_domain = gtk_entry_new ();
1377         gtk_widget_show (entry_domain);
1378         gtk_box_pack_start (GTK_BOX (hbox1), entry_domain, TRUE, TRUE, 0);
1379         SET_TOGGLE_SENSITIVITY (checkbtn_domain, entry_domain);
1380
1381 #undef PACK_HBOX
1382 #undef PACK_PORT_ENTRY
1383
1384         advanced.smtpport_chkbtn        = checkbtn_smtpport;
1385         advanced.smtpport_entry         = entry_smtpport;
1386         advanced.popport_hbox           = hbox_popport;
1387         advanced.popport_chkbtn         = checkbtn_popport;
1388         advanced.popport_entry          = entry_popport;
1389         advanced.imapport_hbox          = hbox_imapport;
1390         advanced.imapport_chkbtn        = checkbtn_imapport;
1391         advanced.imapport_entry         = entry_imapport;
1392         advanced.nntpport_hbox          = hbox_nntpport;
1393         advanced.nntpport_chkbtn        = checkbtn_nntpport;
1394         advanced.nntpport_entry         = entry_nntpport;
1395         advanced.domain_chkbtn          = checkbtn_domain;
1396         advanced.domain_entry           = entry_domain;
1397 }
1398
1399 static gint prefs_account_deleted(GtkWidget *widget, GdkEventAny *event,
1400                                   gpointer data)
1401 {
1402         prefs_account_cancel();
1403         return TRUE;
1404 }
1405
1406 static void prefs_account_key_pressed(GtkWidget *widget, GdkEventKey *event,
1407                                       gpointer data)
1408 {
1409         if (event && event->keyval == GDK_Escape)
1410                 prefs_account_cancel();
1411 }
1412
1413 static void prefs_account_ok(void)
1414 {
1415         if (prefs_account_apply() == 0)
1416                 gtk_main_quit();
1417 }
1418
1419 static gint prefs_account_apply(void)
1420 {
1421         RecvProtocol protocol;
1422         GtkWidget *menu;
1423         GtkWidget *menuitem;
1424
1425         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
1426         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1427         protocol = GPOINTER_TO_INT
1428                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1429
1430         if (*gtk_entry_get_text(GTK_ENTRY(basic.addr_entry)) == '\0') {
1431                 alertpanel_error(_("Mail address is not entered."));
1432                 return -1;
1433         }
1434         if ((protocol == A_POP3 || protocol == A_APOP || (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn)))) &&
1435            *gtk_entry_get_text(GTK_ENTRY(basic.smtpserv_entry)) == '\0') {
1436                 alertpanel_error(_("SMTP server is not entered."));
1437                 return -1;
1438         }
1439         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_LOCAL) &&
1440             *gtk_entry_get_text(GTK_ENTRY(basic.uid_entry)) == '\0') {
1441                 alertpanel_error(_("User ID is not entered."));
1442                 return -1;
1443         }
1444         if ((protocol == A_POP3 || protocol == A_APOP) &&
1445             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1446                 alertpanel_error(_("POP3 server is not entered."));
1447                 return -1;
1448         }
1449         if (protocol == A_IMAP4 &&
1450             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1451                 alertpanel_error(_("IMAP4 server is not entered."));
1452                 return -1;
1453         }
1454         if (protocol == A_NNTP &&
1455             *gtk_entry_get_text(GTK_ENTRY(basic.nntpserv_entry)) == '\0') {
1456                 alertpanel_error(_("NNTP server is not entered."));
1457                 return -1;
1458         }
1459
1460         if (protocol == A_LOCAL &&
1461             *gtk_entry_get_text(GTK_ENTRY(basic.localmbox_entry)) == '\0') {
1462                 alertpanel_error(_("local mailbox filename is not entered."));
1463                 return -1;
1464         }
1465
1466         if (protocol == A_LOCAL &&
1467             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn)) && *gtk_entry_get_text(GTK_ENTRY(basic.mailcmd_entry)) == '\0') {
1468                 alertpanel_error(_("mail command is not entered."));
1469                 return -1;
1470         }
1471
1472         prefs_set_data_from_dialog(param);
1473         return 0;
1474 }
1475
1476 static void prefs_account_cancel(void)
1477 {
1478         cancelled = TRUE;
1479         gtk_main_quit();
1480 }
1481
1482 static void prefs_account_edit_custom_header(void)
1483 {
1484         prefs_custom_header_open(&tmp_ac_prefs);
1485 }
1486
1487 #if USE_GPGME || USE_SSL
1488 static void prefs_account_enum_set_data_from_radiobtn(PrefParam *pparam)
1489 {
1490         GtkRadioButton *radiobtn;
1491         GSList *group;
1492
1493         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1494         group = gtk_radio_button_group (radiobtn);
1495         while (group != NULL) {
1496                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1497                 if (gtk_toggle_button_get_active (btn)) {
1498                         *((gint *)pparam->data) = GPOINTER_TO_INT
1499                                 (gtk_object_get_user_data (GTK_OBJECT (btn)));
1500                         break;
1501                 }
1502                 group = group->next;
1503         }
1504 }
1505
1506 static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
1507 {
1508         GtkRadioButton *radiobtn;
1509         GSList *group;
1510         gpointer data;
1511
1512         data = GINT_TO_POINTER (*((gint *)pparam->data));
1513         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1514         group = gtk_radio_button_group (radiobtn);
1515         while (group != NULL) {
1516                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1517                 gpointer data1 = gtk_object_get_user_data (GTK_OBJECT (btn));
1518                 if (data1 == data) {
1519                         gtk_toggle_button_set_active (btn, TRUE);
1520                         break;
1521                 }
1522                 group = group->next;
1523         }
1524 }
1525
1526 #endif /* USE_GPGME */
1527
1528 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
1529 {
1530         GtkWidget *menu;
1531         GtkWidget *menuitem;
1532
1533         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1534         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1535         *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
1536                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1537 }
1538
1539 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
1540 {
1541         RecvProtocol protocol;
1542         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1543         GtkWidget *menu;
1544         GtkWidget *menuitem;
1545
1546         protocol = *((RecvProtocol *)pparam->data);
1547
1548         switch (protocol) {
1549         case A_POP3:
1550                 gtk_option_menu_set_history(optmenu, 0);
1551                 break;
1552         case A_APOP:
1553                 gtk_option_menu_set_history(optmenu, 1);
1554                 break;
1555         case A_IMAP4:
1556                 gtk_option_menu_set_history(optmenu, 2);
1557                 break;
1558         case A_NNTP:
1559                 gtk_option_menu_set_history(optmenu, 3);
1560                 break;
1561         case A_LOCAL:
1562                 gtk_option_menu_set_history(optmenu, 4);
1563                 break;
1564                 /*
1565         case A_LOCAL_CMD:
1566                 gtk_option_menu_set_history(optmenu, 5);
1567                 break;
1568                 */
1569         default:
1570                 break;
1571         }
1572
1573         menu = gtk_option_menu_get_menu(optmenu);
1574         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1575         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
1576 }
1577
1578 static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
1579 {
1580         RecvProtocol protocol;
1581         gboolean active;
1582         gint auth;
1583
1584         protocol = GPOINTER_TO_INT
1585                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1586
1587         switch(protocol) {
1588         case A_NNTP:
1589                 gtk_widget_set_sensitive(basic.inbox_label, FALSE);
1590                 gtk_widget_set_sensitive(basic.inbox_entry, FALSE);
1591                 gtk_widget_show(basic.nntpserv_label);
1592                 gtk_widget_show(basic.nntpserv_entry);
1593                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1594                                            0, VSPACING_NARROW);
1595                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, TRUE);
1596                 gtk_widget_show(basic.nntpauth_chkbtn);
1597                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1598                                            1, VSPACING_NARROW);
1599                 gtk_widget_hide(basic.recvserv_label);
1600                 gtk_widget_hide(basic.recvserv_entry);
1601                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1602                                            2, 0);
1603                 gtk_widget_show(basic.smtpserv_label);
1604                 gtk_widget_show(basic.smtpserv_entry);
1605                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1606                                            4, VSPACING_NARROW);
1607                 gtk_widget_hide(basic.localmbox_label);
1608                 gtk_widget_hide(basic.localmbox_entry);
1609                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1610                                            3, 0);
1611                 gtk_widget_hide(basic.mailcmd_label);
1612                 gtk_widget_hide(basic.mailcmd_entry);
1613                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1614                                            6, 0);
1615                 gtk_widget_hide(basic.mailcmd_chkbtn);
1616                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1617                                            5, 0);
1618                 gtk_widget_show(basic.uid_label);
1619                 gtk_widget_show(basic.pass_label);
1620                 gtk_widget_show(basic.uid_entry);
1621                 gtk_widget_show(basic.pass_entry);
1622                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1623                                            7, VSPACING_NARROW);
1624
1625                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1626                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1627                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1628                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1629
1630                 /* update userid/passwd sensitive state */
1631                 prefs_account_nntpauth_toggled
1632                         (GTK_TOGGLE_BUTTON(basic.nntpauth_chkbtn), NULL);
1633                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1634                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
1635 #if USE_SSL
1636                 gtk_widget_set_sensitive(ssl.receive_frame, FALSE);
1637                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
1638                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
1639                 gtk_widget_set_sensitive(ssl.send_frame, FALSE);
1640 #endif
1641                 gtk_widget_hide(advanced.popport_hbox);
1642                 gtk_widget_hide(advanced.imapport_hbox);
1643                 gtk_widget_show(advanced.nntpport_hbox);
1644                 break;
1645         case A_LOCAL:
1646                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1647                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1648                 gtk_widget_hide(basic.nntpserv_label);
1649                 gtk_widget_hide(basic.nntpserv_entry);
1650                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1651                                            0, 0);
1652                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
1653                 gtk_widget_hide(basic.nntpauth_chkbtn);
1654                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1655                                            1, 0);
1656                 gtk_widget_hide(basic.recvserv_label);
1657                 gtk_widget_hide(basic.recvserv_entry);
1658                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1659                                            2, 0);
1660                 gtk_widget_show(basic.smtpserv_label);
1661                 gtk_widget_show(basic.smtpserv_entry);
1662                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1663                                            4, VSPACING_NARROW);
1664                 gtk_widget_show(basic.localmbox_label);
1665                 gtk_widget_show(basic.localmbox_entry);
1666                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1667                                            3, VSPACING_NARROW);
1668                 gtk_widget_show(basic.mailcmd_label);
1669                 gtk_widget_show(basic.mailcmd_entry);
1670                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1671                                            6, VSPACING_NARROW);
1672                 gtk_widget_show(basic.mailcmd_chkbtn);
1673                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1674                                            5, VSPACING_NARROW);
1675                 gtk_widget_hide(basic.uid_label);
1676                 gtk_widget_hide(basic.pass_label);
1677                 gtk_widget_hide(basic.uid_entry);
1678                 gtk_widget_hide(basic.pass_entry);
1679                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1680                                            7, 0);
1681
1682                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1683                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1684                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1685                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1686                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1687                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
1688                 prefs_account_mailcmd_toggled
1689                         (GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn), NULL);
1690
1691 #if USE_SSL
1692                 gtk_widget_set_sensitive(ssl.receive_frame, FALSE);
1693                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
1694                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
1695                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
1696 #endif
1697                 gtk_widget_hide(advanced.popport_hbox);
1698                 gtk_widget_hide(advanced.imapport_hbox);
1699                 gtk_widget_hide(advanced.nntpport_hbox);
1700                 break;
1701         case A_IMAP4:
1702                 gtk_widget_set_sensitive(basic.inbox_label, FALSE);
1703                 gtk_widget_set_sensitive(basic.inbox_entry, FALSE);
1704                 gtk_widget_hide(basic.nntpserv_label);
1705                 gtk_widget_hide(basic.nntpserv_entry);
1706                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1707                                            0, 0);
1708                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
1709                 gtk_widget_hide(basic.nntpauth_chkbtn);
1710                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1711                                            1, 0);
1712                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1713                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1714                 gtk_widget_show(basic.recvserv_label);
1715                 gtk_widget_show(basic.recvserv_entry);
1716                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1717                                            2, VSPACING_NARROW);
1718                 gtk_widget_show(basic.smtpserv_label);
1719                 gtk_widget_show(basic.smtpserv_entry);
1720                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1721                                            4, VSPACING_NARROW);
1722                 gtk_widget_hide(basic.localmbox_label);
1723                 gtk_widget_hide(basic.localmbox_entry);
1724                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1725                                            3, 0);
1726                 gtk_widget_hide(basic.mailcmd_label);
1727                 gtk_widget_hide(basic.mailcmd_entry);
1728                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1729                                            6, 0);
1730                 gtk_widget_hide(basic.mailcmd_chkbtn);
1731                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1732                                            5, 0);
1733                 gtk_widget_show(basic.uid_label);
1734                 gtk_widget_show(basic.pass_label);
1735                 gtk_widget_show(basic.uid_entry);
1736                 gtk_widget_show(basic.pass_entry);
1737                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1738                                            7, VSPACING_NARROW);
1739
1740                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1741                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1742                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1743                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1744                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1745                 gtk_widget_set_sensitive(receive.imap_frame, TRUE);
1746                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
1747                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
1748
1749 #if USE_SSL
1750                 gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
1751                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
1752                 gtk_widget_set_sensitive(ssl.imap_chkbtn, TRUE);
1753                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
1754 #endif
1755                 gtk_widget_hide(advanced.popport_hbox);
1756                 gtk_widget_show(advanced.imapport_hbox);
1757                 gtk_widget_hide(advanced.nntpport_hbox);
1758                 break;
1759         case A_POP3:
1760         default:
1761                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1762                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1763                 gtk_widget_hide(basic.nntpserv_label);
1764                 gtk_widget_hide(basic.nntpserv_entry);
1765                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1766                                            0, 0);
1767                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
1768                 gtk_widget_hide(basic.nntpauth_chkbtn);
1769                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1770                                            1, 0);
1771                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1772                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1773                 gtk_widget_show(basic.recvserv_label);
1774                 gtk_widget_show(basic.recvserv_entry);
1775                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1776                                            2, VSPACING_NARROW);
1777                 gtk_widget_show(basic.smtpserv_label);
1778                 gtk_widget_show(basic.smtpserv_entry);
1779                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1780                                            4, VSPACING_NARROW);
1781                 gtk_widget_hide(basic.localmbox_label);
1782                 gtk_widget_hide(basic.localmbox_entry);
1783                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1784                                            3, 0);
1785                 gtk_widget_hide(basic.mailcmd_label);
1786                 gtk_widget_hide(basic.mailcmd_entry);
1787                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1788                                            6, 0);
1789                 gtk_widget_hide(basic.mailcmd_chkbtn);
1790                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1791                                            5, 0);
1792                 gtk_widget_show(basic.uid_label);
1793                 gtk_widget_show(basic.pass_label);
1794                 gtk_widget_show(basic.uid_entry);
1795                 gtk_widget_show(basic.pass_entry);
1796                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1797                                            7, VSPACING_NARROW);
1798
1799                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1800                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1801                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1802                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1803                 gtk_widget_set_sensitive(receive.pop3_frame, TRUE);
1804                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
1805                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
1806                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
1807
1808 #if USE_SSL
1809                 gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
1810                 gtk_widget_set_sensitive(ssl.pop_chkbtn, TRUE);
1811                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
1812                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
1813 #endif
1814                 gtk_widget_show(advanced.popport_hbox);
1815                 gtk_widget_hide(advanced.imapport_hbox);
1816                 gtk_widget_hide(advanced.nntpport_hbox);
1817                 break;
1818         }
1819
1820         gtk_widget_queue_resize(basic.serv_frame);
1821 }
1822
1823 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
1824                                            gpointer user_data)
1825 {
1826         gboolean auth;
1827
1828         if (!GTK_WIDGET_SENSITIVE (GTK_WIDGET (button)))
1829                 return;
1830         auth = gtk_toggle_button_get_active (button);
1831         gtk_widget_set_sensitive(basic.uid_label,  auth);
1832         gtk_widget_set_sensitive(basic.pass_label, auth);
1833         gtk_widget_set_sensitive(basic.uid_entry,  auth);
1834         gtk_widget_set_sensitive(basic.pass_entry, auth);
1835 }
1836
1837 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
1838                                           gpointer user_data)
1839 {
1840         gboolean use_mailcmd;
1841
1842         use_mailcmd = gtk_toggle_button_get_active (button);
1843
1844         gtk_widget_set_sensitive(basic.mailcmd_entry,  use_mailcmd);
1845         gtk_widget_set_sensitive(basic.mailcmd_label, use_mailcmd);
1846         gtk_widget_set_sensitive(basic.smtpserv_entry, !use_mailcmd);
1847         gtk_widget_set_sensitive(basic.smtpserv_label, !use_mailcmd);
1848         gtk_widget_set_sensitive(basic.uid_entry,  !use_mailcmd);
1849         gtk_widget_set_sensitive(basic.pass_entry, !use_mailcmd);
1850 }