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