25b62ce799d50b8664ee97bbc467ecb92d15583f
[claws.git] / src / prefs_account.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2002 Hiroyuki Yamamoto
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23
24 #include "defs.h"
25
26 #include <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 "foldersel.h"
44 #include "inc.h"
45 #include "menu.h"
46 #include "gtkutils.h"
47 #include "utils.h"
48 #include "alertpanel.h"
49 #include "colorlabel.h"
50
51 static gboolean cancelled;
52
53 static PrefsAccount tmp_ac_prefs;
54
55 static PrefsDialog dialog;
56
57 static struct Basic {
58         GtkWidget *acname_entry;
59         GtkWidget *default_chkbtn;
60
61         GtkWidget *name_entry;
62         GtkWidget *addr_entry;
63         GtkWidget *org_entry;
64
65         GtkWidget *serv_frame;
66         GtkWidget *serv_table;
67         GtkWidget *protocol_optmenu;
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 *leave_time_entry;
90         GtkWidget *getall_chkbtn;
91         GtkWidget *size_limit_chkbtn;
92         GtkWidget *size_limit_entry;
93         GtkWidget *filter_on_recv_chkbtn;
94         GtkWidget *inbox_label;
95         GtkWidget *inbox_entry;
96         GtkWidget *inbox_btn;
97
98         GtkWidget *imap_frame;
99         GtkWidget *imapdir_entry;
100
101         GtkWidget *recvatgetall_chkbtn;
102 } receive;
103
104 static struct Send {
105         GtkWidget *date_chkbtn;
106         GtkWidget *msgid_chkbtn;
107
108         GtkWidget *customhdr_chkbtn;
109
110         GtkWidget *smtp_auth_chkbtn;
111         GtkWidget *smtp_uid_entry;
112         GtkWidget *smtp_pass_entry;
113         GtkWidget *pop_bfr_smtp_chkbtn;
114 } send;
115
116 static struct Compose {
117         GtkWidget *sigpath_entry;
118
119         GtkWidget *autocc_chkbtn;
120         GtkWidget *autocc_entry;
121         GtkWidget *autobcc_chkbtn;
122         GtkWidget *autobcc_entry;
123         GtkWidget *autoreplyto_chkbtn;
124         GtkWidget *autoreplyto_entry;
125 } compose;
126
127 #if USE_GPGME
128 static struct Privacy {
129         GtkWidget *checkbtn_default_encrypt;
130         GtkWidget *checkbtn_ascii_armored;
131         GtkWidget *checkbtn_default_sign;
132         GtkWidget *defaultkey_radiobtn;
133         GtkWidget *emailkey_radiobtn;
134         GtkWidget *customkey_radiobtn;
135         GtkWidget *customkey_entry;
136 } privacy;
137 #endif /* USE_GPGME */
138
139 #if USE_SSL
140 static struct SSLPrefs {
141         GtkWidget *receive_frame;
142         GtkWidget *pop_chkbtn;
143         GtkWidget *imap_chkbtn;
144
145         GtkWidget *send_frame;
146         GtkWidget *smtp_nossl_radiobtn;
147         GtkWidget *smtp_ssltunnel_radiobtn;
148         GtkWidget *smtp_sslstarttls_radiobtn;
149 } ssl;
150 #endif /* USE_SSL */
151
152 static struct Advanced {
153         GtkWidget *smtpport_chkbtn;
154         GtkWidget *smtpport_entry;
155         GtkWidget *popport_hbox;
156         GtkWidget *popport_chkbtn;
157         GtkWidget *popport_entry;
158         GtkWidget *imapport_hbox;
159         GtkWidget *imapport_chkbtn;
160         GtkWidget *imapport_entry;
161         GtkWidget *nntpport_hbox;
162         GtkWidget *nntpport_chkbtn;
163         GtkWidget *nntpport_entry;
164         GtkWidget *domain_chkbtn;
165         GtkWidget *domain_entry;
166         GtkWidget *tunnelcmd_chkbtn;
167         GtkWidget *tunnelcmd_entry;
168         GtkWidget *crosspost_chkbtn;
169         GtkWidget *crosspost_colormenu;
170
171 } advanced;
172
173 static void prefs_account_fix_size                      (void);
174
175 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
176 static void prefs_account_protocol_set_optmenu          (PrefParam *pparam);
177 static void prefs_account_protocol_activated            (GtkMenuItem *menuitem);
178 #if USE_GPGME || USE_SSL
179 static void prefs_account_enum_set_data_from_radiobtn   (PrefParam *pparam);
180 static void prefs_account_enum_set_radiobtn             (PrefParam *pparam);
181 static void prefs_account_ascii_armored_warning(GtkWidget* widget, 
182                                                gpointer unused);
183 #endif /* USE_GPGME || USE_SSL */
184 static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam);
185 static void prefs_account_crosspost_set_colormenu(PrefParam *pparam);
186
187 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
188                                            gpointer user_data);
189 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
190                                           gpointer user_data);
191 static void prefs_account_smtp_userid_cb(GtkEditable *editable,
192                                          gpointer smtp_passwd);
193
194 static PrefParam param[] = {
195         /* Basic */
196         {"account_name", NULL, &tmp_ac_prefs.account_name, P_STRING,
197          &basic.acname_entry, prefs_set_data_from_entry, prefs_set_entry},
198
199         {"is_default", "FALSE", &tmp_ac_prefs.is_default, P_BOOL,
200          &basic.default_chkbtn,
201          prefs_set_data_from_toggle, prefs_set_toggle},
202
203         {"name", NULL, &tmp_ac_prefs.name, P_STRING,
204          &basic.name_entry, prefs_set_data_from_entry, prefs_set_entry},
205
206         {"address", NULL, &tmp_ac_prefs.address, P_STRING,
207          &basic.addr_entry, prefs_set_data_from_entry, prefs_set_entry},
208
209         {"organization", NULL, &tmp_ac_prefs.organization, P_STRING,
210          &basic.org_entry, prefs_set_data_from_entry, prefs_set_entry},
211
212         {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
213          &basic.protocol_optmenu,
214          prefs_account_protocol_set_data_from_optmenu,
215          prefs_account_protocol_set_optmenu},
216
217         {"receive_server", NULL, &tmp_ac_prefs.recv_server, P_STRING,
218          &basic.recvserv_entry, prefs_set_data_from_entry, prefs_set_entry},
219
220         {"smtp_server", NULL, &tmp_ac_prefs.smtp_server, P_STRING,
221          &basic.smtpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
222
223         {"nntp_server", NULL, &tmp_ac_prefs.nntp_server, P_STRING,
224          &basic.nntpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
225
226         {"local_mbox", NULL, &tmp_ac_prefs.local_mbox, P_STRING,
227          &basic.localmbox_entry, prefs_set_data_from_entry, prefs_set_entry},
228
229         {"use_mail_command", "FALSE", &tmp_ac_prefs.use_mail_command, P_BOOL,
230          &basic.mailcmd_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
231
232         {"mail_command", "/usr/sbin/sendmail -t", &tmp_ac_prefs.mail_command, P_STRING,
233          &basic.mailcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
234
235         {"use_nntp_auth", "FALSE", &tmp_ac_prefs.use_nntp_auth, P_BOOL,
236          &basic.nntpauth_chkbtn,
237          prefs_set_data_from_toggle, prefs_set_toggle},
238
239         {"user_id", "ENV_USER", &tmp_ac_prefs.userid, P_STRING,
240          &basic.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
241
242         {"password", NULL, &tmp_ac_prefs.passwd, P_STRING,
243          &basic.pass_entry, prefs_set_data_from_entry, prefs_set_entry},
244
245         {"inbox", "inbox", &tmp_ac_prefs.inbox, P_STRING,
246          &receive.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
247
248         /* Receive */
249         {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
250          &receive.rmmail_chkbtn,
251          prefs_set_data_from_toggle, prefs_set_toggle},
252         
253         {"leave_mail_time", "0", &tmp_ac_prefs.leave_time, P_STRING,
254          &receive.leave_time_entry,
255          prefs_set_data_from_entry, prefs_set_entry},
256
257         {"get_all_mail", "FALSE", &tmp_ac_prefs.getall, P_BOOL,
258          &receive.getall_chkbtn,
259          prefs_set_data_from_toggle, prefs_set_toggle},
260
261         {"enable_size_limit", "FALSE", &tmp_ac_prefs.enable_size_limit, P_BOOL,
262          &receive.size_limit_chkbtn,
263          prefs_set_data_from_toggle, prefs_set_toggle},
264         {"size_limit", "1024", &tmp_ac_prefs.size_limit, P_INT,
265          &receive.size_limit_entry,
266          prefs_set_data_from_entry, prefs_set_entry},
267
268         {"filter_on_receive", "TRUE", &tmp_ac_prefs.filter_on_recv, P_BOOL,
269          &receive.filter_on_recv_chkbtn,
270          prefs_set_data_from_toggle, prefs_set_toggle},
271
272         {"imap_directory", NULL, &tmp_ac_prefs.imap_dir, P_STRING,
273          &receive.imapdir_entry, prefs_set_data_from_entry, prefs_set_entry},
274
275         {"receive_at_get_all", "TRUE", &tmp_ac_prefs.recv_at_getall, P_BOOL,
276          &receive.recvatgetall_chkbtn,
277          prefs_set_data_from_toggle, prefs_set_toggle},
278
279         /* Send */
280         {"add_date", "TRUE", &tmp_ac_prefs.add_date, P_BOOL,
281          &send.date_chkbtn,
282          prefs_set_data_from_toggle, prefs_set_toggle},
283
284         {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
285          &send.msgid_chkbtn,
286          prefs_set_data_from_toggle, prefs_set_toggle},
287
288         {"add_custom_header", "FALSE", &tmp_ac_prefs.add_customhdr, P_BOOL,
289          &send.customhdr_chkbtn,
290          prefs_set_data_from_toggle, prefs_set_toggle},
291
292         {"use_smtp_auth", "FALSE", &tmp_ac_prefs.use_smtp_auth, P_BOOL,
293          &send.smtp_auth_chkbtn,
294          prefs_set_data_from_toggle, prefs_set_toggle},
295
296         {"smtp_user_id", NULL, &tmp_ac_prefs.smtp_userid, P_STRING,
297          &send.smtp_uid_entry, prefs_set_data_from_entry, prefs_set_entry},
298         {"smtp_password", NULL, &tmp_ac_prefs.smtp_passwd, P_STRING,
299          &send.smtp_pass_entry, prefs_set_data_from_entry, prefs_set_entry},
300
301         {"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
302          &send.pop_bfr_smtp_chkbtn,
303          prefs_set_data_from_toggle, prefs_set_toggle},
304
305         /* Compose */
306         {"signature_path", "~/"DEFAULT_SIGNATURE, &tmp_ac_prefs.sig_path, P_STRING,
307          &compose.sigpath_entry,
308          prefs_set_data_from_entry, prefs_set_entry},
309
310         {"set_autocc", "FALSE", &tmp_ac_prefs.set_autocc, P_BOOL,
311          &compose.autocc_chkbtn,
312          prefs_set_data_from_toggle, prefs_set_toggle},
313
314         {"auto_cc", NULL, &tmp_ac_prefs.auto_cc, P_STRING,
315          &compose.autocc_entry,
316          prefs_set_data_from_entry, prefs_set_entry},
317
318         {"set_autobcc", "FALSE", &tmp_ac_prefs.set_autobcc, P_BOOL,
319          &compose.autobcc_chkbtn,
320          prefs_set_data_from_toggle, prefs_set_toggle},
321
322         {"auto_bcc", NULL, &tmp_ac_prefs.auto_bcc, P_STRING,
323          &compose.autobcc_entry,
324          prefs_set_data_from_entry, prefs_set_entry},
325
326         {"set_autoreplyto", "FALSE", &tmp_ac_prefs.set_autoreplyto, P_BOOL,
327          &compose.autoreplyto_chkbtn,
328          prefs_set_data_from_toggle, prefs_set_toggle},
329
330         {"auto_replyto", NULL, &tmp_ac_prefs.auto_replyto, P_STRING,
331          &compose.autoreplyto_entry,
332
333          prefs_set_data_from_entry, prefs_set_entry},
334
335 #if USE_GPGME
336         /* Privacy */
337         {"default_encrypt", "FALSE", &tmp_ac_prefs.default_encrypt, P_BOOL,
338          &privacy.checkbtn_default_encrypt,
339          prefs_set_data_from_toggle, prefs_set_toggle},
340         {"ascii_armored", "FALSE", &tmp_ac_prefs.ascii_armored, P_BOOL,
341          &privacy.checkbtn_ascii_armored,
342          prefs_set_data_from_toggle, prefs_set_toggle},
343         {"default_sign", "FALSE", &tmp_ac_prefs.default_sign, P_BOOL,
344          &privacy.checkbtn_default_sign,
345          prefs_set_data_from_toggle, prefs_set_toggle},
346         {"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
347          &privacy.defaultkey_radiobtn,
348          prefs_account_enum_set_data_from_radiobtn,
349          prefs_account_enum_set_radiobtn},
350         {"sign_key_id", NULL, &tmp_ac_prefs.sign_key_id, P_STRING,
351          &privacy.customkey_entry,
352          prefs_set_data_from_entry, prefs_set_entry},
353 #endif /* USE_GPGME */
354
355 #if USE_SSL
356         /* SSL */
357         {"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM,
358          &ssl.smtp_nossl_radiobtn,
359          prefs_account_enum_set_data_from_radiobtn,
360          prefs_account_enum_set_radiobtn},
361         {"ssl_pop", "FALSE", &tmp_ac_prefs.ssl_pop, P_BOOL,
362          &ssl.pop_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
363         {"ssl_imap", "FALSE", &tmp_ac_prefs.ssl_imap, P_BOOL,
364          &ssl.imap_chkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
365 #endif /* USE_SSL */
366
367         /* Advanced */
368         {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
369          &advanced.smtpport_chkbtn,
370          prefs_set_data_from_toggle, prefs_set_toggle},
371
372         {"smtp_port", "25", &tmp_ac_prefs.smtpport, P_USHORT,
373          &advanced.smtpport_entry,
374          prefs_set_data_from_entry, prefs_set_entry},
375
376         {"set_popport", "FALSE", &tmp_ac_prefs.set_popport, P_BOOL,
377          &advanced.popport_chkbtn,
378          prefs_set_data_from_toggle, prefs_set_toggle},
379
380         {"pop_port", "110", &tmp_ac_prefs.popport, P_USHORT,
381          &advanced.popport_entry,
382          prefs_set_data_from_entry, prefs_set_entry},
383
384         {"set_imapport", "FALSE", &tmp_ac_prefs.set_imapport, P_BOOL,
385          &advanced.imapport_chkbtn,
386          prefs_set_data_from_toggle, prefs_set_toggle},
387
388         {"imap_port", "143", &tmp_ac_prefs.imapport, P_USHORT,
389          &advanced.imapport_entry,
390          prefs_set_data_from_entry, prefs_set_entry},
391
392         {"set_nntpport", "FALSE", &tmp_ac_prefs.set_nntpport, P_BOOL,
393          &advanced.nntpport_chkbtn,
394          prefs_set_data_from_toggle, prefs_set_toggle},
395
396         {"nntp_port", "119", &tmp_ac_prefs.nntpport, P_USHORT,
397          &advanced.nntpport_entry,
398          prefs_set_data_from_entry, prefs_set_entry},
399
400         {"set_domain", "FALSE", &tmp_ac_prefs.set_domain, P_BOOL,
401          &advanced.domain_chkbtn,
402          prefs_set_data_from_toggle, prefs_set_toggle},
403
404         {"domain", NULL, &tmp_ac_prefs.domain, P_STRING,
405          &advanced.domain_entry,
406          prefs_set_data_from_entry, prefs_set_entry},
407
408         {"set_tunnelcmd", "FALSE", &tmp_ac_prefs.set_tunnelcmd, P_BOOL,
409          &advanced.tunnelcmd_chkbtn,
410          prefs_set_data_from_toggle, prefs_set_toggle},
411
412         {"tunnelcmd", NULL, &tmp_ac_prefs.tunnelcmd, P_STRING,
413          &advanced.tunnelcmd_entry,
414          prefs_set_data_from_entry, prefs_set_entry},
415
416         {"mark_crosspost_read", "FALSE", &tmp_ac_prefs.mark_crosspost_read, P_BOOL,
417          &advanced.crosspost_chkbtn,
418          prefs_set_data_from_toggle, prefs_set_toggle},
419
420         {"crosspost_color", NULL, &tmp_ac_prefs.crosspost_col, P_ENUM,
421          &advanced.crosspost_colormenu,
422          prefs_account_crosspost_set_data_from_colormenu,
423          prefs_account_crosspost_set_colormenu},
424
425
426         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
427 };
428
429 static void prefs_account_create                (void);
430 static void prefs_account_basic_create          (void);
431 static void prefs_account_receive_create        (void);
432 static void prefs_account_send_create           (void);
433 static void prefs_account_compose_create        (void);
434 #if USE_GPGME
435 static void prefs_account_privacy_create        (void);
436 #endif /* USE_GPGME */
437 #if USE_SSL
438 static void prefs_account_ssl_create            (void);
439 #endif /* USE_SSL */
440 static void prefs_account_advanced_create       (void);
441
442 static void prefs_account_select_inbox_cb       (void);
443 static void prefs_account_edit_custom_header    (void);
444
445 static gint prefs_account_deleted               (GtkWidget      *widget,
446                                                  GdkEventAny    *event,
447                                                  gpointer        data);
448 static void prefs_account_key_pressed           (GtkWidget      *widget,
449                                                  GdkEventKey    *event,
450                                                  gpointer        data);
451 static void prefs_account_ok                    (void);
452 static gint prefs_account_apply                 (void);
453 static void prefs_account_cancel                (void);
454
455 void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
456 {
457         const gchar *p = label;
458         gint id;
459
460         g_return_if_fail(ac_prefs != NULL);
461         g_return_if_fail(label != NULL);
462
463         memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
464         prefs_read_config(param, label, ACCOUNT_RC);
465         *ac_prefs = tmp_ac_prefs;
466         while (*p && !isdigit(*p)) p++;
467         id = atoi(p);
468         if (id < 0) g_warning("wrong account id: %d\n", id);
469         ac_prefs->account_id = id;
470
471         prefs_custom_header_read_config(ac_prefs);
472 }
473
474 void prefs_account_save_config(PrefsAccount *ac_prefs)
475 {
476         gchar *buf;
477
478         g_return_if_fail(ac_prefs != NULL);
479
480         tmp_ac_prefs = *ac_prefs;
481         buf = g_strdup_printf("Account: %d", ac_prefs->account_id);
482         prefs_save_config(param, buf, ACCOUNT_RC);
483 }
484
485 void prefs_account_save_config_all(GList *account_list)
486 {
487         GList *cur;
488         gchar *rcpath;
489         PrefFile *pfile;
490
491         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
492         if ((pfile = prefs_write_open(rcpath)) == NULL) {
493                 g_free(rcpath);
494                 return;
495         }
496         g_free(rcpath);
497
498         for (cur = account_list; cur != NULL; cur = cur->next) {
499                 tmp_ac_prefs = *(PrefsAccount *)cur->data;
500                 if (fprintf(pfile->fp, "[Account: %d]\n",
501                             tmp_ac_prefs.account_id) <= 0 ||
502                     prefs_write_param(param, pfile->fp) < 0) {
503                         g_warning(_("failed to write configuration to file\n"));
504                         prefs_write_close_revert(pfile);
505                         return;
506                 }
507                 if (cur->next) {
508                         if (fputc('\n', pfile->fp) == EOF) {
509                                 FILE_OP_ERROR(rcpath, "fputc");
510                                 prefs_write_close_revert(pfile);
511                                 return;
512                         }
513                 }
514         }
515
516         if (prefs_write_close(pfile) < 0)
517                 g_warning(_("failed to write configuration to file\n"));
518 }
519
520 void prefs_account_free(PrefsAccount *ac_prefs)
521 {
522         if (!ac_prefs) return;
523
524         tmp_ac_prefs = *ac_prefs;
525         prefs_free(param);
526 }
527
528 static gint prefs_account_get_new_id(void)
529 {
530         GList *ac_list;
531         PrefsAccount *ac;
532         static gint last_id = 0;
533
534         for (ac_list = account_get_list(); ac_list != NULL;
535              ac_list = ac_list->next) {
536                 ac = (PrefsAccount *)ac_list->data;
537                 if (last_id < ac->account_id)
538                         last_id = ac->account_id;
539         }
540
541         return last_id + 1;
542 }
543
544 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
545 {
546         gboolean new_account = FALSE;
547
548         if (prefs_rc_is_readonly(ACCOUNT_RC))
549                 return ac_prefs;
550
551         debug_print(_("Opening account preferences window...\n"));
552
553         inc_lock();
554
555         cancelled = FALSE;
556
557         if (!ac_prefs) {
558                 ac_prefs = g_new0(PrefsAccount, 1);
559                 memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
560                 prefs_set_default(param);
561                 *ac_prefs = tmp_ac_prefs;
562                 ac_prefs->account_id = prefs_account_get_new_id();
563                 new_account = TRUE;
564         }
565
566         if (!dialog.window) {
567                 prefs_account_create();
568         }
569
570         manage_window_set_transient(GTK_WINDOW(dialog.window));
571         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
572         gtk_widget_grab_focus(dialog.ok_btn);
573
574         tmp_ac_prefs = *ac_prefs;
575
576         if (new_account) {
577                 PrefsAccount *def_ac;
578                 gchar *buf;
579
580                 prefs_set_dialog_to_default(param);
581                 buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
582                 gtk_entry_set_text(GTK_ENTRY(basic.acname_entry), buf);
583                 g_free(buf);
584                 def_ac = account_get_default();
585                 if (def_ac) {
586                         gtk_entry_set_text(GTK_ENTRY(basic.name_entry),
587                                            def_ac->name ? def_ac->name : "");
588                         gtk_entry_set_text(GTK_ENTRY(basic.addr_entry),
589                                            def_ac->address ? def_ac->address : "");
590                         gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
591                                            def_ac->organization ? def_ac->organization : "");
592                 }
593                 menu_set_sensitive_all
594                         (GTK_MENU_SHELL
595                                 (gtk_option_menu_get_menu
596                                         (GTK_OPTION_MENU
597                                                 (basic.protocol_optmenu))),
598                          TRUE);
599                 gtk_window_set_title(GTK_WINDOW(dialog.window),
600                                      _("Preferences for new account"));
601                 gtk_widget_hide(dialog.apply_btn);
602         } else {
603                 prefs_set_dialog(param);
604                 gtk_window_set_title(GTK_WINDOW(dialog.window),
605                                      _("Account preferences"));
606                 gtk_widget_show(dialog.apply_btn);
607         }
608
609         if (ac_prefs->protocol != A_LOCAL) {
610                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
611                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
612         }
613
614         gtk_widget_show(dialog.window);
615         gtk_main();
616         gtk_widget_hide(dialog.window);
617
618         inc_unlock();
619
620         if (cancelled && new_account) {
621                 g_free(ac_prefs);
622                 return NULL;
623         } else {
624                 *ac_prefs = tmp_ac_prefs;
625                 return ac_prefs;
626         }
627 }
628
629 static void prefs_account_create(void)
630 {
631         gint page = 0;
632
633         debug_print(_("Creating account preferences window...\n"));
634
635         /* create dialog */
636         prefs_dialog_create(&dialog);
637         gtk_signal_connect(GTK_OBJECT(dialog.window), "delete_event",
638                            GTK_SIGNAL_FUNC(prefs_account_deleted), NULL);
639         gtk_signal_connect(GTK_OBJECT(dialog.window), "key_press_event",
640                            GTK_SIGNAL_FUNC(prefs_account_key_pressed), NULL);
641         MANAGE_WINDOW_SIGNALS_CONNECT(dialog.window);
642
643         gtk_signal_connect(GTK_OBJECT(dialog.ok_btn), "clicked",
644                            GTK_SIGNAL_FUNC(prefs_account_ok), NULL);
645         gtk_signal_connect(GTK_OBJECT(dialog.apply_btn), "clicked",
646                            GTK_SIGNAL_FUNC(prefs_account_apply), NULL);
647         gtk_signal_connect(GTK_OBJECT(dialog.cancel_btn), "clicked",
648                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
649
650         prefs_account_basic_create();
651         SET_NOTEBOOK_LABEL(dialog.notebook, _("Basic"), page++);
652         prefs_account_receive_create();
653         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"), page++);
654         prefs_account_send_create();
655         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"), page++);
656         prefs_account_compose_create();
657         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"), page++);
658 #if USE_GPGME
659         prefs_account_privacy_create();
660         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
661 #endif /* USE_GPGME */
662 #if USE_SSL
663         prefs_account_ssl_create();
664         SET_NOTEBOOK_LABEL(dialog.notebook, _("SSL"), page++);
665 #endif /* USE_SSL */
666         prefs_account_advanced_create();
667         SET_NOTEBOOK_LABEL(dialog.notebook, _("Advanced"), page++);
668
669         prefs_account_fix_size();
670 }
671
672 /**
673  * prefs_account_fix_size:
674  * 
675  * Fix the window size after creating widgets by selecting "Local"
676  * protocol (currently it has the largest size of parameter widgets).
677  * Without this the window gets too large.
678  **/
679 static void prefs_account_fix_size(void)
680 {
681         GtkOptionMenu *optmenu = GTK_OPTION_MENU (basic.protocol_optmenu);
682         GtkWidget *menu;
683         GtkWidget *menuitem;
684
685         gtk_option_menu_set_history (optmenu, 4); /* local */
686         menu = gtk_option_menu_get_menu (optmenu);
687         menuitem = gtk_menu_get_active (GTK_MENU (menu));
688         gtk_menu_item_activate (GTK_MENU_ITEM (menuitem));
689 }
690
691 #define SET_ACTIVATE(menuitem) \
692 { \
693         gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \
694                            GTK_SIGNAL_FUNC(prefs_account_protocol_activated), \
695                            NULL); \
696 }
697
698 #define TABLE_YPAD 2
699
700 static void prefs_account_basic_create(void)
701 {
702         GtkWidget *vbox1;
703         GtkWidget *hbox;
704         GtkWidget *label;
705         GtkWidget *acname_entry;
706         GtkWidget *default_chkbtn;
707         GtkWidget *frame1;
708         GtkWidget *table1;
709         GtkWidget *name_entry;
710         GtkWidget *addr_entry;
711         GtkWidget *org_entry;
712
713         GtkWidget *serv_frame;
714         GtkWidget *vbox2;
715         GtkWidget *optmenu;
716         GtkWidget *optmenu_menu;
717         GtkWidget *menuitem;
718         GtkWidget *serv_table;
719         GtkWidget *recvserv_label;
720         GtkWidget *smtpserv_label;
721         GtkWidget *nntpserv_label;
722         GtkWidget *localmbox_label;
723         GtkWidget *mailcmd_label;
724         GtkWidget *recvserv_entry;
725         GtkWidget *smtpserv_entry;
726         GtkWidget *nntpserv_entry;
727         GtkWidget *nntpauth_chkbtn;
728         GtkWidget *localmbox_entry;
729         GtkWidget *mailcmd_chkbtn;
730         GtkWidget *mailcmd_entry;
731         GtkWidget *uid_label;
732         GtkWidget *pass_label;
733         GtkWidget *uid_entry;
734         GtkWidget *pass_entry;
735
736         vbox1 = gtk_vbox_new (FALSE, VSPACING);
737         gtk_widget_show (vbox1);
738         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
739         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
740
741         hbox = gtk_hbox_new (FALSE, 8);
742         gtk_widget_show (hbox);
743         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
744
745         label = gtk_label_new (_("Name of this account"));
746         gtk_widget_show (label);
747         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
748
749         acname_entry = gtk_entry_new ();
750         gtk_widget_show (acname_entry);
751         gtk_widget_set_usize (acname_entry, DEFAULT_ENTRY_WIDTH, -1);
752         gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
753
754         default_chkbtn = gtk_check_button_new_with_label (_("Set as default"));
755         gtk_widget_show (default_chkbtn);
756         gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, FALSE, FALSE, 0);
757
758         PACK_FRAME (vbox1, frame1, _("Personal information"));
759
760         table1 = gtk_table_new (3, 2, FALSE);
761         gtk_widget_show (table1);
762         gtk_container_add (GTK_CONTAINER (frame1), table1);
763         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
764         gtk_table_set_row_spacings (GTK_TABLE (table1), VSPACING_NARROW);
765         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
766
767         label = gtk_label_new (_("Full name"));
768         gtk_widget_show (label);
769         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 0, 1,
770                           GTK_FILL, 0, 0, 0);
771         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
772
773         label = gtk_label_new (_("Mail address"));
774         gtk_widget_show (label);
775         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 1, 2,
776                           GTK_FILL, 0, 0, 0);
777         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
778
779         label = gtk_label_new (_("Organization"));
780         gtk_widget_show (label);
781         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 2, 3,
782                           GTK_FILL, 0, 0, 0);
783         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
784
785         name_entry = gtk_entry_new ();
786         gtk_widget_show (name_entry);
787         gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
788                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
789                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
790
791         addr_entry = gtk_entry_new ();
792         gtk_widget_show (addr_entry);
793         gtk_table_attach (GTK_TABLE (table1), addr_entry, 1, 2, 1, 2,
794                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
795                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
796
797         org_entry = gtk_entry_new ();
798         gtk_widget_show (org_entry);
799         gtk_table_attach (GTK_TABLE (table1), org_entry, 1, 2, 2, 3,
800                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
801                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
802
803         PACK_FRAME (vbox1, serv_frame, _("Server information"));
804
805         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
806         gtk_widget_show (vbox2);
807         gtk_container_add (GTK_CONTAINER (serv_frame), vbox2);
808         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
809
810         hbox = gtk_hbox_new (FALSE, 8);
811         gtk_widget_show (hbox);
812         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
813
814         label = gtk_label_new (_("Protocol"));
815         gtk_widget_show (label);
816         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
817
818         optmenu = gtk_option_menu_new ();
819         gtk_widget_show (optmenu);
820         gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
821
822         optmenu_menu = gtk_menu_new ();
823
824         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (normal)"),  A_POP3);
825         SET_ACTIVATE (menuitem);
826         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (APOP auth)"),  A_APOP);
827         SET_ACTIVATE (menuitem);
828         MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
829         SET_ACTIVATE (menuitem);
830         MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
831         SET_ACTIVATE (menuitem);
832         MENUITEM_ADD (optmenu_menu, menuitem, _("None (local)"), A_LOCAL);
833         SET_ACTIVATE (menuitem);
834
835         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
836
837         serv_table = gtk_table_new (6, 4, FALSE);
838         gtk_widget_show (serv_table);
839         gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
840         gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
841         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 3, 0);
842         gtk_table_set_col_spacings (GTK_TABLE (serv_table), 8);
843
844         nntpserv_entry = gtk_entry_new ();
845         gtk_widget_show (nntpserv_entry);
846         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_entry, 1, 4, 0, 1,
847                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
848                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
849 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 0, 0); */
850
851         nntpauth_chkbtn = gtk_check_button_new_with_label
852                 (_("This server requires authentication"));
853         gtk_widget_show (nntpauth_chkbtn);
854         gtk_table_attach (GTK_TABLE (serv_table), nntpauth_chkbtn, 0, 4, 1, 2,
855                           GTK_FILL, 0, 0, 0);
856
857         recvserv_entry = gtk_entry_new ();
858         gtk_widget_show (recvserv_entry);
859         gtk_table_attach (GTK_TABLE (serv_table), recvserv_entry, 1, 4, 2, 3,
860                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
861                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
862
863         localmbox_entry = gtk_entry_new ();
864         gtk_widget_show (localmbox_entry);
865         gtk_table_attach (GTK_TABLE (serv_table), localmbox_entry, 1, 4, 3, 4,
866                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
867                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
868
869         smtpserv_entry = gtk_entry_new ();
870         gtk_widget_show (smtpserv_entry);
871         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_entry, 1, 4, 4, 5,
872                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
873                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
874
875         mailcmd_entry = gtk_entry_new ();
876         gtk_widget_show (mailcmd_entry);
877         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_entry, 1, 4, 6, 7,
878                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
879                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
880
881         uid_entry = gtk_entry_new ();
882         gtk_widget_show (uid_entry);
883         gtk_widget_set_usize (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
884         gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 7, 8,
885                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
886                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
887
888         pass_entry = gtk_entry_new ();
889         gtk_widget_show (pass_entry);
890         gtk_widget_set_usize (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
891         gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 3, 4, 7, 8,
892                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
893                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
894         gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
895
896         nntpserv_label = gtk_label_new (_("News server"));
897         gtk_widget_show (nntpserv_label);
898         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_label, 0, 1, 0, 1,
899                           GTK_FILL, 0, 0, 0);
900         gtk_misc_set_alignment (GTK_MISC (nntpserv_label), 1, 0.5);
901
902         recvserv_label = gtk_label_new (_("Server for receiving"));
903         gtk_widget_show (recvserv_label);
904         gtk_table_attach (GTK_TABLE (serv_table), recvserv_label, 0, 1, 2, 3,
905                           GTK_FILL, 0, 0, 0);
906         gtk_misc_set_alignment (GTK_MISC (recvserv_label), 1, 0.5);
907
908         localmbox_label = gtk_label_new (_("Local mailbox file"));
909         gtk_widget_show (localmbox_label);
910         gtk_table_attach (GTK_TABLE (serv_table), localmbox_label, 0, 1, 3, 4,
911                           GTK_FILL, 0, 0, 0);
912         gtk_misc_set_alignment (GTK_MISC (localmbox_label), 1, 0.5);
913 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
914
915         smtpserv_label = gtk_label_new (_("SMTP server (send)"));
916         gtk_widget_show (smtpserv_label);
917         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_label, 0, 1, 4, 5,
918                           GTK_FILL, 0, 0, 0);
919         gtk_misc_set_alignment (GTK_MISC (smtpserv_label), 1, 0.5);
920 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
921
922         mailcmd_chkbtn = gtk_check_button_new_with_label
923                 (_("Use mail command rather than SMTP server"));
924         gtk_widget_show (mailcmd_chkbtn);
925         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_chkbtn, 0, 4, 5, 6,
926                           GTK_EXPAND | GTK_FILL,
927                           0, 0, TABLE_YPAD);
928         gtk_signal_connect(GTK_OBJECT(mailcmd_chkbtn), "toggled",
929                            GTK_SIGNAL_FUNC(prefs_account_mailcmd_toggled),
930                            NULL);
931
932         mailcmd_label = gtk_label_new (_("command to send mails"));
933         gtk_widget_show (mailcmd_label);
934         gtk_table_attach (GTK_TABLE (serv_table), mailcmd_label, 0, 1, 6, 7,
935                           GTK_FILL, 0, 0, 0);
936         gtk_misc_set_alignment (GTK_MISC (mailcmd_label), 1, 0.5);
937 /*      gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
938
939         uid_label = gtk_label_new (_("User ID"));
940         gtk_widget_show (uid_label);
941         gtk_table_attach (GTK_TABLE (serv_table), uid_label, 0, 1, 7, 8,
942                           GTK_FILL, 0, 0, 0);
943         gtk_misc_set_alignment (GTK_MISC (uid_label), 1, 0.5);
944
945         pass_label = gtk_label_new (_("Password"));
946         gtk_widget_show (pass_label);
947         gtk_table_attach (GTK_TABLE (serv_table), pass_label, 2, 3, 7, 8,
948                           0, 0, 0, 0);
949
950         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, uid_label);
951         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, pass_label);
952         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, uid_entry);
953         SET_TOGGLE_SENSITIVITY (nntpauth_chkbtn, pass_entry);
954
955         basic.acname_entry   = acname_entry;
956         basic.default_chkbtn = default_chkbtn;
957
958         basic.name_entry = name_entry;
959         basic.addr_entry = addr_entry;
960         basic.org_entry  = org_entry;
961
962         basic.serv_frame       = serv_frame;
963         basic.serv_table       = serv_table;
964         basic.protocol_optmenu = optmenu;
965         basic.recvserv_label   = recvserv_label;
966         basic.recvserv_entry   = recvserv_entry;
967         basic.smtpserv_label   = smtpserv_label;
968         basic.smtpserv_entry   = smtpserv_entry;
969         basic.nntpserv_label   = nntpserv_label;
970         basic.nntpserv_entry   = nntpserv_entry;
971         basic.nntpauth_chkbtn  = nntpauth_chkbtn;
972         basic.localmbox_label   = localmbox_label;
973         basic.localmbox_entry   = localmbox_entry;
974         basic.mailcmd_chkbtn   = mailcmd_chkbtn;
975         basic.mailcmd_label   = mailcmd_label;
976         basic.mailcmd_entry   = mailcmd_entry;
977         basic.uid_label        = uid_label;
978         basic.pass_label       = pass_label;
979         basic.uid_entry        = uid_entry;
980         basic.pass_entry       = pass_entry;
981 }
982
983 static void prefs_account_receive_create(void)
984 {
985         GtkWidget *vbox1;
986         GtkWidget *frame1;
987         GtkWidget *vbox2;
988         GtkWidget *rmmail_chkbtn;
989         GtkWidget *getall_chkbtn;
990         GtkWidget *hbox1;
991         GtkWidget *size_limit_chkbtn;
992         GtkWidget *size_limit_entry;
993         GtkWidget *label;
994         GtkWidget *filter_on_recv_chkbtn;
995         GtkWidget *vbox3;
996         GtkWidget *hbox2;
997         GtkWidget *inbox_label;
998         GtkWidget *inbox_entry;
999         GtkWidget *leave_time_entry;
1000         GtkWidget *leave_time_label;
1001         GtkWidget *leave_time_hint;     
1002         GtkWidget *inbox_btn;
1003         GtkWidget *frame2;
1004         GtkWidget *imapdir_label;
1005         GtkWidget *imapdir_entry;
1006         GtkWidget *recvatgetall_chkbtn;
1007
1008         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1009         gtk_widget_show (vbox1);
1010         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1011         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1012
1013         PACK_FRAME (vbox1, frame1, _("POP3"));
1014
1015         vbox2 = gtk_vbox_new (FALSE, 0);
1016         gtk_widget_show (vbox2);
1017         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
1018         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1019
1020         hbox2 = gtk_hbox_new (FALSE, 0);
1021         gtk_widget_show (hbox2);
1022         gtk_container_add (GTK_CONTAINER (vbox2), hbox2);
1023         gtk_container_set_border_width (GTK_CONTAINER (hbox2), 0);
1024
1025         PACK_CHECK_BUTTON (hbox2, rmmail_chkbtn,
1026                            _("Remove messages on server when received for "));
1027         leave_time_entry = gtk_entry_new ();
1028         gtk_widget_show (leave_time_entry);
1029         gtk_widget_set_usize (leave_time_entry, DEFAULT_ENTRY_WIDTH, -1);
1030         gtk_box_pack_start (GTK_BOX (hbox2), leave_time_entry, TRUE, TRUE, 0);
1031         
1032         leave_time_label = gtk_label_new (_(" days"));
1033         gtk_widget_show (leave_time_label);
1034         gtk_box_pack_start (GTK_BOX (hbox2), leave_time_label, FALSE, FALSE, 0);
1035         
1036         leave_time_hint=gtk_label_new (_("(Setting to 0 days will delete messages immediately)"));
1037         gtk_widget_show(leave_time_hint);
1038         gtk_box_pack_start (GTK_BOX (vbox2), leave_time_hint, FALSE, FALSE, 0);
1039                 
1040         PACK_CHECK_BUTTON (vbox2, getall_chkbtn,
1041                            _("Download all messages on server"));
1042
1043         hbox1 = gtk_hbox_new (FALSE, 8);
1044         gtk_widget_show (hbox1);
1045         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1046
1047         PACK_CHECK_BUTTON (hbox1, size_limit_chkbtn, _("Receive size limit"));
1048
1049         size_limit_entry = gtk_entry_new ();
1050         gtk_widget_show (size_limit_entry);
1051         gtk_widget_set_usize (size_limit_entry, 64, -1);
1052         gtk_box_pack_start (GTK_BOX (hbox1), size_limit_entry, FALSE, FALSE, 0);
1053
1054         label = gtk_label_new ("KB");
1055         gtk_widget_show (label);
1056         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1057
1058         SET_TOGGLE_SENSITIVITY (size_limit_chkbtn, size_limit_entry);
1059
1060         PACK_CHECK_BUTTON (vbox2, filter_on_recv_chkbtn,
1061                            _("Filter messages on receiving"));
1062
1063         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1064
1065         hbox1 = gtk_hbox_new (FALSE, 8);
1066         gtk_widget_show (hbox1);
1067         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1068
1069         inbox_label = gtk_label_new (_("Default inbox"));
1070         gtk_widget_show (inbox_label);
1071         gtk_box_pack_start (GTK_BOX (hbox1), inbox_label, FALSE, FALSE, 0);
1072
1073         inbox_entry = gtk_entry_new ();
1074         gtk_widget_show (inbox_entry);
1075         gtk_widget_set_usize (inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
1076         gtk_box_pack_start (GTK_BOX (hbox1), inbox_entry, TRUE, TRUE, 0);
1077
1078         inbox_btn = gtk_button_new_with_label (_(" Select... "));
1079         gtk_widget_show (inbox_btn);
1080         gtk_box_pack_start (GTK_BOX (hbox1), inbox_btn, FALSE, FALSE, 0);
1081         gtk_signal_connect (GTK_OBJECT (inbox_btn), "clicked",
1082                             GTK_SIGNAL_FUNC (prefs_account_select_inbox_cb),
1083                             NULL);
1084
1085         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1086
1087         hbox1 = gtk_hbox_new (FALSE, 8);
1088         gtk_widget_show (hbox1);
1089         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1090
1091         label = gtk_label_new
1092                 (_("(Unfiltered messages will be stored in this folder)"));
1093         gtk_widget_show (label);
1094         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1095         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1096
1097         PACK_FRAME (vbox1, frame2, _("IMAP4"));
1098
1099         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1100         gtk_widget_show (vbox2);
1101         gtk_container_add (GTK_CONTAINER (frame2), vbox2);
1102         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1103
1104         hbox1 = gtk_hbox_new (FALSE, 8);
1105         gtk_widget_show (hbox1);
1106         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1107
1108         imapdir_label = gtk_label_new (_("IMAP server directory"));
1109         gtk_widget_show (imapdir_label);
1110         gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
1111
1112         imapdir_entry = gtk_entry_new();
1113         gtk_widget_show (imapdir_entry);
1114         gtk_box_pack_start (GTK_BOX (hbox1), imapdir_entry, TRUE, TRUE, 0);
1115
1116         PACK_CHECK_BUTTON
1117                 (vbox1, recvatgetall_chkbtn,
1118                  _("`Get all' checks for new messages on this account"));
1119
1120         receive.pop3_frame            = frame1;
1121         receive.rmmail_chkbtn         = rmmail_chkbtn;
1122         receive.leave_time_entry      = leave_time_entry;
1123         receive.getall_chkbtn         = getall_chkbtn;
1124         receive.size_limit_chkbtn     = size_limit_chkbtn;
1125         receive.size_limit_entry      = size_limit_entry;
1126         receive.filter_on_recv_chkbtn = filter_on_recv_chkbtn;
1127         receive.inbox_label           = inbox_label;
1128         receive.inbox_entry           = inbox_entry;
1129         receive.inbox_btn             = inbox_btn;
1130
1131         receive.imap_frame    = frame2;
1132         receive.imapdir_entry = imapdir_entry;
1133
1134         receive.recvatgetall_chkbtn   = recvatgetall_chkbtn;
1135 }
1136
1137 static void prefs_account_send_create(void)
1138 {
1139         GtkWidget *vbox1;
1140         GtkWidget *vbox2;
1141         GtkWidget *frame;
1142         GtkWidget *date_chkbtn;
1143         GtkWidget *msgid_chkbtn;
1144         GtkWidget *hbox;
1145         GtkWidget *customhdr_chkbtn;
1146         GtkWidget *customhdr_edit_btn;
1147         GtkWidget *frame3;
1148         GtkWidget *vbox3;
1149         GtkWidget *smtp_auth_chkbtn;
1150         GtkWidget *vbox4;
1151         GtkWidget *hbox_spc;
1152         GtkWidget *label;
1153         GtkWidget *smtp_uid_entry;
1154         GtkWidget *smtp_pass_entry;
1155         GtkWidget *vbox_spc;
1156         GtkWidget *pop_bfr_smtp_chkbtn;
1157
1158         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1159         gtk_widget_show (vbox1);
1160         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1161         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1162
1163         PACK_FRAME (vbox1, frame, _("Header"));
1164
1165         vbox2 = gtk_vbox_new (FALSE, 0);
1166         gtk_widget_show (vbox2);
1167         gtk_container_add (GTK_CONTAINER (frame), vbox2);
1168         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1169
1170         PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date header field"));
1171         PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
1172
1173         hbox = gtk_hbox_new (FALSE, 12);
1174         gtk_widget_show (hbox);
1175         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1176
1177         PACK_CHECK_BUTTON (hbox, customhdr_chkbtn,
1178                            _("Add user-defined header"));
1179
1180         customhdr_edit_btn = gtk_button_new_with_label (_(" Edit... "));
1181         gtk_widget_show (customhdr_edit_btn);
1182         gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
1183                             FALSE, FALSE, 0);
1184         gtk_signal_connect (GTK_OBJECT (customhdr_edit_btn), "clicked",
1185                             GTK_SIGNAL_FUNC (prefs_account_edit_custom_header),
1186                             NULL);
1187
1188         SET_TOGGLE_SENSITIVITY (customhdr_chkbtn, customhdr_edit_btn);
1189
1190         PACK_FRAME (vbox1, frame3, _("Authentication"));
1191
1192         vbox3 = gtk_vbox_new (FALSE, 0);
1193         gtk_widget_show (vbox3);
1194         gtk_container_add (GTK_CONTAINER (frame3), vbox3);
1195         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
1196
1197         PACK_CHECK_BUTTON (vbox3, smtp_auth_chkbtn,
1198                 _("SMTP Authentication (SMTP AUTH)"));
1199
1200         vbox4 = gtk_vbox_new (FALSE, 0);
1201         gtk_widget_show (vbox4);
1202         gtk_box_pack_start (GTK_BOX (vbox3), vbox4, FALSE, FALSE, 0);
1203
1204         hbox = gtk_hbox_new (FALSE, 8);
1205         gtk_widget_show (hbox);
1206         gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
1207
1208         hbox_spc = gtk_hbox_new (FALSE, 0);
1209         gtk_widget_show (hbox_spc);
1210         gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1211         gtk_widget_set_usize (hbox_spc, 16, -1);
1212
1213         label = gtk_label_new (_("User ID"));
1214         gtk_widget_show (label);
1215         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1216
1217         smtp_uid_entry = gtk_entry_new ();
1218         gtk_widget_show (smtp_uid_entry);
1219         gtk_widget_set_usize (smtp_uid_entry, DEFAULT_ENTRY_WIDTH, -1);
1220         gtk_box_pack_start (GTK_BOX (hbox), smtp_uid_entry, TRUE, TRUE, 0);
1221
1222         label = gtk_label_new (_("Password"));
1223         gtk_widget_show (label);
1224         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1225
1226         smtp_pass_entry = gtk_entry_new ();
1227         gtk_widget_show (smtp_pass_entry);
1228         gtk_widget_set_usize (smtp_pass_entry, DEFAULT_ENTRY_WIDTH, -1);
1229         gtk_box_pack_start (GTK_BOX (hbox), smtp_pass_entry, TRUE, TRUE, 0);
1230         gtk_entry_set_visibility (GTK_ENTRY (smtp_pass_entry), FALSE);
1231
1232         PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
1233
1234         hbox = gtk_hbox_new (FALSE, 8);
1235         gtk_widget_show (hbox);
1236         gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
1237
1238         hbox_spc = gtk_hbox_new (FALSE, 0);
1239         gtk_widget_show (hbox_spc);
1240         gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
1241         gtk_widget_set_usize (hbox_spc, 16, -1);
1242
1243         label = gtk_label_new
1244                 (_("If you leave these entries empty, the same\n"
1245                    "user ID and password as receiving will be used."));
1246         gtk_widget_show (label);
1247         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1248         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1249
1250         SET_TOGGLE_SENSITIVITY (smtp_auth_chkbtn, vbox4);
1251
1252         PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_chkbtn,
1253                 _("Authenticate with POP3 before sending"));
1254         gtk_widget_set_sensitive(pop_bfr_smtp_chkbtn, FALSE);
1255
1256         send.date_chkbtn      = date_chkbtn;
1257         send.msgid_chkbtn     = msgid_chkbtn;
1258         send.customhdr_chkbtn = customhdr_chkbtn;
1259
1260         send.smtp_auth_chkbtn    = smtp_auth_chkbtn;
1261         send.smtp_uid_entry      = smtp_uid_entry;
1262         send.smtp_pass_entry     = smtp_pass_entry;
1263         send.pop_bfr_smtp_chkbtn = pop_bfr_smtp_chkbtn;
1264 }
1265
1266 static void prefs_account_compose_create(void)
1267 {
1268         GtkWidget *vbox1;
1269         GtkWidget *hbox;
1270         GtkWidget *label;
1271         GtkWidget *sigpath_entry;
1272         GtkWidget *frame;
1273         GtkWidget *table;
1274         GtkWidget *autocc_chkbtn;
1275         GtkWidget *autocc_entry;
1276         GtkWidget *autobcc_chkbtn;
1277         GtkWidget *autobcc_entry;
1278         GtkWidget *autoreplyto_chkbtn;
1279         GtkWidget *autoreplyto_entry;
1280
1281         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1282         gtk_widget_show (vbox1);
1283         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1284         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1285
1286         hbox = gtk_hbox_new (FALSE, 8);
1287         gtk_widget_show (hbox);
1288         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
1289
1290         label = gtk_label_new (_("Signature file"));
1291         gtk_widget_show (label);
1292         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1293
1294         sigpath_entry = gtk_entry_new ();
1295         gtk_widget_show (sigpath_entry);
1296         gtk_box_pack_start (GTK_BOX (hbox), sigpath_entry, TRUE, TRUE, 0);
1297
1298         PACK_FRAME (vbox1, frame, _("Automatically set the following addresses"));
1299
1300         table =  gtk_table_new (3, 2, FALSE);
1301         gtk_widget_show (table);
1302         gtk_container_add (GTK_CONTAINER (frame), table);
1303         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1304         gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW_2);
1305         gtk_table_set_col_spacings (GTK_TABLE (table), 8);
1306
1307         autocc_chkbtn = gtk_check_button_new_with_label (_("Cc"));
1308         gtk_widget_show (autocc_chkbtn);
1309         gtk_table_attach (GTK_TABLE (table), autocc_chkbtn, 0, 1, 0, 1,
1310                           GTK_FILL, 0, 0, 0);
1311
1312         autocc_entry = gtk_entry_new ();
1313         gtk_widget_show (autocc_entry);
1314         gtk_table_attach (GTK_TABLE (table), autocc_entry, 1, 2, 0, 1,
1315                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1316                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1317
1318         SET_TOGGLE_SENSITIVITY (autocc_chkbtn, autocc_entry);
1319
1320         autobcc_chkbtn = gtk_check_button_new_with_label (_("Bcc"));
1321         gtk_widget_show (autobcc_chkbtn);
1322         gtk_table_attach (GTK_TABLE (table), autobcc_chkbtn, 0, 1, 1, 2,
1323                           GTK_FILL, 0, 0, 0);
1324
1325         autobcc_entry = gtk_entry_new ();
1326         gtk_widget_show (autobcc_entry);
1327         gtk_table_attach (GTK_TABLE (table), autobcc_entry, 1, 2, 1, 2,
1328                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1329                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1330
1331         SET_TOGGLE_SENSITIVITY (autobcc_chkbtn, autobcc_entry);
1332
1333         autoreplyto_chkbtn = gtk_check_button_new_with_label (_("Reply-To"));
1334         gtk_widget_show (autoreplyto_chkbtn);
1335         gtk_table_attach (GTK_TABLE (table), autoreplyto_chkbtn, 0, 1, 2, 3,
1336                           GTK_FILL, 0, 0, 0);
1337
1338         autoreplyto_entry = gtk_entry_new ();
1339         gtk_widget_show (autoreplyto_entry);
1340         gtk_table_attach (GTK_TABLE (table), autoreplyto_entry, 1, 2, 2, 3,
1341                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
1342                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
1343
1344         SET_TOGGLE_SENSITIVITY (autoreplyto_chkbtn, autoreplyto_entry);
1345
1346         compose.sigpath_entry = sigpath_entry;
1347
1348         compose.autocc_chkbtn      = autocc_chkbtn;
1349         compose.autocc_entry       = autocc_entry;
1350         compose.autobcc_chkbtn     = autobcc_chkbtn;
1351         compose.autobcc_entry      = autobcc_entry;
1352         compose.autoreplyto_chkbtn = autoreplyto_chkbtn;
1353         compose.autoreplyto_entry  = autoreplyto_entry;
1354 }
1355
1356 #if USE_GPGME
1357 static void prefs_account_privacy_create(void)
1358 {
1359         GtkWidget *vbox1;
1360         GtkWidget *frame1;
1361         GtkWidget *vbox2;
1362         GtkWidget *frame2;
1363         GtkWidget *vbox3;
1364         GtkWidget *hbox1;
1365         GtkWidget *label;
1366         GtkWidget *checkbtn_default_encrypt;
1367         GtkWidget *checkbtn_ascii_armored;
1368         GtkWidget *checkbtn_default_sign;
1369         GtkWidget *defaultkey_radiobtn;
1370         GtkWidget *emailkey_radiobtn;
1371         GtkWidget *customkey_radiobtn;
1372         GtkWidget *customkey_entry;
1373
1374         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1375         gtk_widget_show (vbox1);
1376         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1377         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1378
1379         PACK_FRAME (vbox1, frame1, _("Default Actions"));
1380
1381         vbox2 = gtk_vbox_new (FALSE, 0);
1382         gtk_widget_show (vbox2);
1383         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
1384         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1385
1386         PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
1387                            _("Encrypt message by default"));
1388
1389         PACK_CHECK_BUTTON (vbox2, checkbtn_ascii_armored,
1390                            _("Plain ASCII-armored"));
1391         gtk_signal_connect(GTK_OBJECT(checkbtn_ascii_armored), "toggled",
1392                                 prefs_account_ascii_armored_warning, (gpointer)0);
1393
1394         PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
1395                            _("Sign message by default"));
1396
1397         PACK_FRAME (vbox1, frame2, _("Sign key"));
1398
1399         vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1400         gtk_widget_show (vbox3);
1401         gtk_container_add (GTK_CONTAINER (frame2), vbox3);
1402         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
1403
1404         defaultkey_radiobtn = gtk_radio_button_new_with_label
1405                 (NULL, _("Use default GnuPG key"));
1406         gtk_widget_show (defaultkey_radiobtn);
1407         gtk_box_pack_start (GTK_BOX (vbox3), defaultkey_radiobtn,
1408                             FALSE, FALSE, 0);
1409         gtk_object_set_user_data (GTK_OBJECT (defaultkey_radiobtn),
1410                                   GINT_TO_POINTER (SIGN_KEY_DEFAULT));
1411
1412         emailkey_radiobtn = gtk_radio_button_new_with_label_from_widget
1413                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
1414                  _("Select key by your email address"));
1415         gtk_widget_show (emailkey_radiobtn);
1416         gtk_box_pack_start (GTK_BOX (vbox3), emailkey_radiobtn,
1417                             FALSE, FALSE, 0);
1418         gtk_object_set_user_data (GTK_OBJECT (emailkey_radiobtn),
1419                                   GINT_TO_POINTER (SIGN_KEY_BY_FROM));
1420
1421         customkey_radiobtn = gtk_radio_button_new_with_label_from_widget
1422                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
1423                  _("Specify key manually"));
1424         gtk_widget_show (customkey_radiobtn);
1425         gtk_box_pack_start (GTK_BOX (vbox3), customkey_radiobtn,
1426                             FALSE, FALSE, 0);
1427         gtk_object_set_user_data (GTK_OBJECT (customkey_radiobtn),
1428                                   GINT_TO_POINTER (SIGN_KEY_CUSTOM));
1429
1430         hbox1 = gtk_hbox_new (FALSE, 8);
1431         gtk_widget_show (hbox1);
1432         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1433
1434         label = gtk_label_new ("");
1435         gtk_widget_show (label);
1436         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1437         gtk_widget_set_usize (label, 16, -1);
1438
1439         label = gtk_label_new (_("User or key ID:"));
1440         gtk_widget_show (label);
1441         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1442
1443         customkey_entry = gtk_entry_new ();
1444         gtk_widget_show (customkey_entry);
1445         gtk_box_pack_start (GTK_BOX (hbox1), customkey_entry,
1446                             TRUE, TRUE, 0);
1447
1448         SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
1449
1450         privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
1451         privacy.checkbtn_ascii_armored   = checkbtn_ascii_armored;
1452         privacy.checkbtn_default_sign    = checkbtn_default_sign;
1453         privacy.defaultkey_radiobtn = defaultkey_radiobtn;
1454         privacy.emailkey_radiobtn = emailkey_radiobtn;
1455         privacy.customkey_radiobtn = customkey_radiobtn;
1456         privacy.customkey_entry = customkey_entry;
1457 }
1458
1459 static void prefs_account_ascii_armored_warning(GtkWidget* widget,
1460                                                gpointer unused)
1461 {
1462         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))
1463                 && gtk_notebook_get_current_page(GTK_NOTEBOOK(dialog.notebook))) {
1464                 alertpanel_message(_("Warning - Privacy/Plain ASCII-armored"),
1465                         _("Its not recommend to use the old style plain ASCII-\n"
1466                         "armored mode for encrypted messages. It doesn't comply\n"
1467                         "with the RFC 3156 - MIME security with OpenPGP."));
1468         }
1469 }
1470 #endif /* USE_GPGME */
1471
1472 #if USE_SSL
1473 static void prefs_account_ssl_create(void)
1474 {
1475         GtkWidget *vbox1;
1476
1477         GtkWidget *receive_frame;
1478         GtkWidget *vbox2;
1479         GtkWidget *pop_chkbtn;
1480         GtkWidget *imap_chkbtn;
1481
1482         GtkWidget *send_frame;
1483         GtkWidget *vbox3;
1484         GtkWidget *smtp_nossl_radiobtn;
1485         GtkWidget *smtp_ssltunnel_radiobtn;
1486         GtkWidget *smtp_sslstarttls_radiobtn;
1487
1488         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1489         gtk_widget_show (vbox1);
1490         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1491         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1492
1493         PACK_FRAME (vbox1, receive_frame, _("Receive"));
1494
1495         vbox2 = gtk_vbox_new (FALSE, 0);
1496         gtk_widget_show (vbox2);
1497         gtk_container_add (GTK_CONTAINER (receive_frame), vbox2);
1498         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1499
1500         PACK_CHECK_BUTTON (vbox2, pop_chkbtn,
1501                            _("Use SSL for POP3 connection"));
1502         PACK_CHECK_BUTTON (vbox2, imap_chkbtn,
1503                            _("Use SSL for IMAP4 connection"));
1504
1505         PACK_FRAME (vbox1, send_frame, _("Send (SMTP)"));
1506
1507         vbox3 = gtk_vbox_new (FALSE, 0);
1508         gtk_widget_show (vbox3);
1509         gtk_container_add (GTK_CONTAINER (send_frame), vbox3);
1510         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
1511
1512         smtp_nossl_radiobtn =
1513                 gtk_radio_button_new_with_label(NULL, _("Don't use SSL"));
1514         gtk_widget_show (smtp_nossl_radiobtn);
1515         gtk_box_pack_start (GTK_BOX (vbox3), smtp_nossl_radiobtn,
1516                             FALSE, FALSE, 0);
1517         gtk_object_set_user_data (GTK_OBJECT (smtp_nossl_radiobtn),
1518                                   GINT_TO_POINTER (SSL_SMTP_NONE));
1519
1520         smtp_ssltunnel_radiobtn = gtk_radio_button_new_with_label_from_widget
1521                 (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
1522                  _("Use SSL for SMTP connection"));
1523         gtk_widget_show (smtp_ssltunnel_radiobtn);
1524         gtk_box_pack_start (GTK_BOX (vbox3), smtp_ssltunnel_radiobtn,
1525                             FALSE, FALSE, 0);
1526         gtk_object_set_user_data (GTK_OBJECT (smtp_ssltunnel_radiobtn),
1527                                   GINT_TO_POINTER (SSL_SMTP_TUNNEL));
1528
1529         smtp_sslstarttls_radiobtn = gtk_radio_button_new_with_label_from_widget
1530                 (GTK_RADIO_BUTTON (smtp_nossl_radiobtn),
1531                  _("Use STARTTLS command to start SSL session"));
1532         gtk_widget_show (smtp_sslstarttls_radiobtn);
1533         gtk_box_pack_start (GTK_BOX (vbox3), smtp_sslstarttls_radiobtn,
1534                             FALSE, FALSE, 0);
1535         gtk_object_set_user_data (GTK_OBJECT (smtp_sslstarttls_radiobtn),
1536                                   GINT_TO_POINTER (SSL_SMTP_STARTTLS));
1537
1538         ssl.receive_frame = receive_frame;
1539         ssl.pop_chkbtn    = pop_chkbtn;
1540         ssl.imap_chkbtn   = imap_chkbtn;
1541
1542         ssl.send_frame                = send_frame;
1543         ssl.smtp_nossl_radiobtn       = smtp_nossl_radiobtn;
1544         ssl.smtp_ssltunnel_radiobtn   = smtp_ssltunnel_radiobtn;
1545         ssl.smtp_sslstarttls_radiobtn = smtp_sslstarttls_radiobtn;
1546 }
1547 #endif /* USE_SSL */
1548
1549 static void crosspost_color_toggled(void)
1550 {
1551         gboolean is_active;
1552
1553         is_active = gtk_toggle_button_get_active
1554                 (GTK_TOGGLE_BUTTON(advanced.crosspost_chkbtn));
1555         gtk_widget_set_sensitive(advanced.crosspost_colormenu, is_active);
1556 }
1557
1558 static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam)
1559 {
1560         GtkWidget *menu;
1561         GtkWidget *menuitem;
1562
1563         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(advanced.crosspost_colormenu));
1564         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1565         *((gint *)pparam->data) = GPOINTER_TO_INT
1566                 (gtk_object_get_data(GTK_OBJECT(menuitem), "color"));
1567 }
1568
1569 static void prefs_account_crosspost_set_colormenu(PrefParam *pparam)
1570 {
1571         gint colorlabel = *((gint *)pparam->data);
1572         GtkOptionMenu *colormenu = GTK_OPTION_MENU(*pparam->widget);
1573         GtkWidget *menu;
1574         GtkWidget *menuitem;
1575
1576         gtk_option_menu_set_history(colormenu, colorlabel);
1577         menu = gtk_option_menu_get_menu(colormenu);
1578         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1579         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
1580 }
1581
1582
1583 static void prefs_account_advanced_create(void)
1584 {
1585         GtkWidget *vbox1;
1586         GtkWidget *vbox2;
1587         GtkWidget *hbox1;
1588         GtkWidget *checkbtn_smtpport;
1589         GtkWidget *entry_smtpport;
1590         GtkWidget *hbox_popport;
1591         GtkWidget *checkbtn_popport;
1592         GtkWidget *entry_popport;
1593         GtkWidget *hbox_imapport;
1594         GtkWidget *checkbtn_imapport;
1595         GtkWidget *entry_imapport;
1596         GtkWidget *hbox_nntpport;
1597         GtkWidget *checkbtn_nntpport;
1598         GtkWidget *entry_nntpport;
1599         GtkWidget *checkbtn_domain;
1600         GtkWidget *entry_domain;
1601         GtkWidget *checkbtn_tunnelcmd;
1602         GtkWidget *entry_tunnelcmd;
1603         GtkWidget *checkbtn_crosspost;
1604         GtkWidget *colormenu_crosspost;
1605         GtkWidget *menu;
1606         GtkWidget *menuitem;
1607         GtkWidget *item;
1608         gint i;
1609
1610 #define PACK_HBOX(hbox) \
1611         { \
1612         hbox = gtk_hbox_new (FALSE, 8); \
1613         gtk_widget_show (hbox); \
1614         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); \
1615         }
1616
1617 #define PACK_PORT_ENTRY(box, entry) \
1618         { \
1619         entry = gtk_entry_new_with_max_length (5); \
1620         gtk_widget_show (entry); \
1621         gtk_box_pack_start (GTK_BOX (box), entry, FALSE, FALSE, 0); \
1622         gtk_widget_set_usize (entry, 64, -1); \
1623         }
1624
1625         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1626         gtk_widget_show (vbox1);
1627         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1628         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1629
1630         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW_2);
1631         gtk_widget_show (vbox2);
1632         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1633
1634         PACK_HBOX (hbox1);
1635         PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("Specify SMTP port"));
1636         PACK_PORT_ENTRY (hbox1, entry_smtpport);
1637         SET_TOGGLE_SENSITIVITY (checkbtn_smtpport, entry_smtpport);
1638
1639         PACK_HBOX (hbox_popport);
1640         PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
1641                            _("Specify POP3 port"));
1642         PACK_PORT_ENTRY (hbox_popport, entry_popport);
1643         SET_TOGGLE_SENSITIVITY (checkbtn_popport, entry_popport);
1644
1645         PACK_HBOX (hbox_imapport);
1646         PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
1647                            _("Specify IMAP4 port"));
1648         PACK_PORT_ENTRY (hbox_imapport, entry_imapport);
1649         SET_TOGGLE_SENSITIVITY (checkbtn_imapport, entry_imapport);
1650
1651         PACK_HBOX (hbox_nntpport);
1652         PACK_CHECK_BUTTON (hbox_nntpport, checkbtn_nntpport,
1653                            _("Specify NNTP port"));
1654         PACK_PORT_ENTRY (hbox_nntpport, entry_nntpport);
1655         SET_TOGGLE_SENSITIVITY (checkbtn_nntpport, entry_nntpport);
1656
1657         PACK_HBOX (hbox1);
1658         PACK_CHECK_BUTTON (hbox1, checkbtn_domain, _("Specify domain name"));
1659
1660         entry_domain = gtk_entry_new ();
1661         gtk_widget_show (entry_domain);
1662         gtk_box_pack_start (GTK_BOX (hbox1), entry_domain, TRUE, TRUE, 0);
1663         SET_TOGGLE_SENSITIVITY (checkbtn_domain, entry_domain);
1664
1665         
1666         PACK_HBOX (hbox1);
1667         PACK_CHECK_BUTTON (hbox1, checkbtn_tunnelcmd,
1668                            _("Tunnel command to open connection"));
1669         entry_tunnelcmd = gtk_entry_new ();
1670         gtk_widget_show (entry_tunnelcmd);
1671         gtk_box_pack_start (GTK_BOX (hbox1), entry_tunnelcmd, TRUE, TRUE, 0);
1672         SET_TOGGLE_SENSITIVITY (checkbtn_tunnelcmd, entry_tunnelcmd);
1673
1674         PACK_HBOX (hbox1);
1675         PACK_CHECK_BUTTON (hbox1, checkbtn_crosspost, 
1676                            _("Mark cross-posted messages as read and color:"));
1677         gtk_signal_connect (GTK_OBJECT (checkbtn_crosspost), "toggled",
1678                                         GTK_SIGNAL_FUNC (crosspost_color_toggled),
1679                                         NULL);
1680
1681         colormenu_crosspost = gtk_option_menu_new();
1682         gtk_widget_show (colormenu_crosspost);
1683         gtk_box_pack_start (GTK_BOX (hbox1), colormenu_crosspost, FALSE, FALSE, 0);
1684
1685         menu = colorlabel_create_color_menu();
1686         gtk_option_menu_set_menu (GTK_OPTION_MENU(colormenu_crosspost), menu);
1687         SET_TOGGLE_SENSITIVITY(checkbtn_crosspost, colormenu_crosspost);
1688
1689 #undef PACK_HBOX
1690 #undef PACK_PORT_ENTRY
1691
1692         advanced.smtpport_chkbtn        = checkbtn_smtpport;
1693         advanced.smtpport_entry         = entry_smtpport;
1694         advanced.popport_hbox           = hbox_popport;
1695         advanced.popport_chkbtn         = checkbtn_popport;
1696         advanced.popport_entry          = entry_popport;
1697         advanced.imapport_hbox          = hbox_imapport;
1698         advanced.imapport_chkbtn        = checkbtn_imapport;
1699         advanced.imapport_entry         = entry_imapport;
1700         advanced.nntpport_hbox          = hbox_nntpport;
1701         advanced.nntpport_chkbtn        = checkbtn_nntpport;
1702         advanced.nntpport_entry         = entry_nntpport;
1703         advanced.domain_chkbtn          = checkbtn_domain;
1704         advanced.domain_entry           = entry_domain;
1705         advanced.tunnelcmd_chkbtn       = checkbtn_tunnelcmd;
1706         advanced.tunnelcmd_entry        = entry_tunnelcmd;
1707         advanced.crosspost_chkbtn       = checkbtn_crosspost;
1708         advanced.crosspost_colormenu    = colormenu_crosspost;
1709 }
1710
1711 static gint prefs_account_deleted(GtkWidget *widget, GdkEventAny *event,
1712                                   gpointer data)
1713 {
1714         prefs_account_cancel();
1715         return TRUE;
1716 }
1717
1718 static void prefs_account_key_pressed(GtkWidget *widget, GdkEventKey *event,
1719                                       gpointer data)
1720 {
1721         if (event && event->keyval == GDK_Escape)
1722                 prefs_account_cancel();
1723 }
1724
1725 static void prefs_account_ok(void)
1726 {
1727         if (prefs_account_apply() == 0)
1728                 gtk_main_quit();
1729 }
1730
1731 static gint prefs_account_apply(void)
1732 {
1733         RecvProtocol protocol;
1734         GtkWidget *menu;
1735         GtkWidget *menuitem;
1736
1737         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
1738         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1739         protocol = GPOINTER_TO_INT
1740                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1741
1742         if (*gtk_entry_get_text(GTK_ENTRY(basic.addr_entry)) == '\0') {
1743                 alertpanel_error(_("Mail address is not entered."));
1744                 return -1;
1745         }
1746         if ((protocol == A_POP3 || protocol == A_APOP || (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn)))) &&
1747            *gtk_entry_get_text(GTK_ENTRY(basic.smtpserv_entry)) == '\0') {
1748                 alertpanel_error(_("SMTP server is not entered."));
1749                 return -1;
1750         }
1751         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_IMAP4) &&
1752             *gtk_entry_get_text(GTK_ENTRY(basic.uid_entry)) == '\0') {
1753                 alertpanel_error(_("User ID is not entered."));
1754                 return -1;
1755         }
1756         if ((protocol == A_POP3 || protocol == A_APOP) &&
1757             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1758                 alertpanel_error(_("POP3 server is not entered."));
1759                 return -1;
1760         }
1761         if (protocol == A_IMAP4 &&
1762             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1763                 alertpanel_error(_("IMAP4 server is not entered."));
1764                 return -1;
1765         }
1766         if (protocol == A_NNTP &&
1767             *gtk_entry_get_text(GTK_ENTRY(basic.nntpserv_entry)) == '\0') {
1768                 alertpanel_error(_("NNTP server is not entered."));
1769                 return -1;
1770         }
1771
1772         if (protocol == A_LOCAL &&
1773             *gtk_entry_get_text(GTK_ENTRY(basic.localmbox_entry)) == '\0') {
1774                 alertpanel_error(_("local mailbox filename is not entered."));
1775                 return -1;
1776         }
1777
1778         if (protocol == A_LOCAL &&
1779             gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn)) && *gtk_entry_get_text(GTK_ENTRY(basic.mailcmd_entry)) == '\0') {
1780                 alertpanel_error(_("mail command is not entered."));
1781                 return -1;
1782         }
1783
1784         prefs_set_data_from_dialog(param);
1785         return 0;
1786 }
1787
1788 static void prefs_account_cancel(void)
1789 {
1790         cancelled = TRUE;
1791         gtk_main_quit();
1792 }
1793
1794 static void prefs_account_select_inbox_cb(void)
1795 {
1796         FolderItem *item;
1797         gchar      *path;
1798
1799         item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL);
1800         if (item) {
1801                 path = folder_item_get_identifier(item);
1802                 gtk_entry_set_text(GTK_ENTRY(receive.inbox_entry), path);
1803                 g_free(path);
1804         }       
1805 }
1806
1807 static void prefs_account_edit_custom_header(void)
1808 {
1809         prefs_custom_header_open(&tmp_ac_prefs);
1810 }
1811
1812 #if USE_GPGME || USE_SSL
1813 static void prefs_account_enum_set_data_from_radiobtn(PrefParam *pparam)
1814 {
1815         GtkRadioButton *radiobtn;
1816         GSList *group;
1817
1818         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1819         group = gtk_radio_button_group (radiobtn);
1820         while (group != NULL) {
1821                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1822                 if (gtk_toggle_button_get_active (btn)) {
1823                         *((gint *)pparam->data) = GPOINTER_TO_INT
1824                                 (gtk_object_get_user_data (GTK_OBJECT (btn)));
1825                         break;
1826                 }
1827                 group = group->next;
1828         }
1829 }
1830
1831 static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
1832 {
1833         GtkRadioButton *radiobtn;
1834         GSList *group;
1835         gpointer data;
1836
1837         data = GINT_TO_POINTER (*((gint *)pparam->data));
1838         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1839         group = gtk_radio_button_group (radiobtn);
1840         while (group != NULL) {
1841                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1842                 gpointer data1 = gtk_object_get_user_data (GTK_OBJECT (btn));
1843                 if (data1 == data) {
1844                         gtk_toggle_button_set_active (btn, TRUE);
1845                         break;
1846                 }
1847                 group = group->next;
1848         }
1849 }
1850
1851 #endif /* USE_GPGME */
1852
1853 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
1854 {
1855         GtkWidget *menu;
1856         GtkWidget *menuitem;
1857
1858         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1859         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1860         *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
1861                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1862 }
1863
1864 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
1865 {
1866         RecvProtocol protocol;
1867         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1868         GtkWidget *menu;
1869         GtkWidget *menuitem;
1870         GList *children;
1871         gint list_order[] = {
1872                 0,  /* A_POP3  */
1873                 1,  /* A_APOP  */
1874                 -1, /* A_RPOP  */
1875                 2,  /* A_IMAP4 */
1876                 3,  /* A_NNTP  */
1877                 4   /* A_LOCAL */
1878         };
1879
1880         protocol = *((RecvProtocol *)pparam->data);
1881         if (protocol < 0 || protocol > A_LOCAL) return;
1882         if (list_order[protocol] < 0) return;
1883         gtk_option_menu_set_history(optmenu, list_order[protocol]);
1884
1885         menu = gtk_option_menu_get_menu(optmenu);
1886         menu_set_insensitive_all(GTK_MENU_SHELL(menu));
1887
1888 #define SET_NTH_SENSITIVE(proto) \
1889 { \
1890         menuitem = g_list_nth_data(children, list_order[proto]); \
1891         if (menuitem) \
1892                 gtk_widget_set_sensitive(menuitem, TRUE); \
1893 }
1894
1895         children = GTK_MENU_SHELL(menu)->children;
1896         SET_NTH_SENSITIVE(protocol);
1897         if (protocol == A_POP3) {
1898                 SET_NTH_SENSITIVE(A_APOP);
1899         } else if (protocol == A_APOP) {
1900                 SET_NTH_SENSITIVE(A_POP3);
1901         }
1902
1903 #undef SET_NTH_SENSITIVE
1904
1905         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1906         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
1907 }
1908
1909 static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
1910 {
1911         RecvProtocol protocol;
1912         gboolean active;
1913         gint auth;
1914
1915         protocol = GPOINTER_TO_INT
1916                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1917
1918         switch(protocol) {
1919         case A_NNTP:
1920                 gtk_widget_show(basic.nntpserv_label);
1921                 gtk_widget_show(basic.nntpserv_entry);
1922                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1923                                            0, VSPACING_NARROW);
1924                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, TRUE);
1925                 gtk_widget_show(basic.nntpauth_chkbtn);
1926                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1927                                            1, VSPACING_NARROW);
1928                 gtk_widget_hide(basic.recvserv_label);
1929                 gtk_widget_hide(basic.recvserv_entry);
1930                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1931                                            2, 0);
1932                 gtk_widget_show(basic.smtpserv_label);
1933                 gtk_widget_show(basic.smtpserv_entry);
1934                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1935                                            4, VSPACING_NARROW);
1936                 gtk_widget_hide(basic.localmbox_label);
1937                 gtk_widget_hide(basic.localmbox_entry);
1938                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1939                                            3, 0);
1940                 gtk_widget_hide(basic.mailcmd_label);
1941                 gtk_widget_hide(basic.mailcmd_entry);
1942                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1943                                            6, 0);
1944                 gtk_widget_hide(basic.mailcmd_chkbtn);
1945                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1946                                            5, 0);
1947                 gtk_widget_show(basic.uid_label);
1948                 gtk_widget_show(basic.pass_label);
1949                 gtk_widget_show(basic.uid_entry);
1950                 gtk_widget_show(basic.pass_entry);
1951                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1952                                            7, VSPACING_NARROW);
1953
1954                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1955                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1956                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1957                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1958
1959                 /* update userid/passwd sensitive state */
1960                 prefs_account_nntpauth_toggled
1961                         (GTK_TOGGLE_BUTTON(basic.nntpauth_chkbtn), NULL);
1962                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1963                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
1964                 gtk_widget_set_sensitive(receive.recvatgetall_chkbtn, TRUE);
1965 #if USE_SSL
1966                 gtk_widget_set_sensitive(ssl.receive_frame, FALSE);
1967                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
1968                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
1969                 gtk_widget_set_sensitive(ssl.send_frame, FALSE);
1970 #endif
1971                 gtk_widget_hide(advanced.popport_hbox);
1972                 gtk_widget_hide(advanced.imapport_hbox);
1973                 gtk_widget_show(advanced.nntpport_hbox);
1974                 gtk_widget_show(advanced.crosspost_chkbtn);
1975                 gtk_widget_show(advanced.crosspost_colormenu);
1976                 break;
1977         case A_LOCAL:
1978                 gtk_widget_hide(basic.nntpserv_label);
1979                 gtk_widget_hide(basic.nntpserv_entry);
1980                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1981                                            0, 0);
1982                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
1983                 gtk_widget_hide(basic.nntpauth_chkbtn);
1984                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1985                                            1, 0);
1986                 gtk_widget_hide(basic.recvserv_label);
1987                 gtk_widget_hide(basic.recvserv_entry);
1988                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1989                                            2, 0);
1990                 gtk_widget_show(basic.smtpserv_label);
1991                 gtk_widget_show(basic.smtpserv_entry);
1992                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1993                                            4, VSPACING_NARROW);
1994                 gtk_widget_show(basic.localmbox_label);
1995                 gtk_widget_show(basic.localmbox_entry);
1996                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
1997                                            3, VSPACING_NARROW);
1998                 gtk_widget_show(basic.mailcmd_label);
1999                 gtk_widget_show(basic.mailcmd_entry);
2000                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2001                                            6, VSPACING_NARROW);
2002                 gtk_widget_show(basic.mailcmd_chkbtn);
2003                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2004                                            5, VSPACING_NARROW);
2005                 gtk_widget_hide(basic.uid_label);
2006                 gtk_widget_hide(basic.pass_label);
2007                 gtk_widget_hide(basic.uid_entry);
2008                 gtk_widget_hide(basic.pass_entry);
2009                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2010                                            7, 0);
2011
2012                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
2013                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
2014                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
2015                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
2016                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
2017                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
2018                 gtk_widget_set_sensitive(receive.recvatgetall_chkbtn, FALSE);
2019                 prefs_account_mailcmd_toggled
2020                         (GTK_TOGGLE_BUTTON(basic.mailcmd_chkbtn), NULL);
2021
2022 #if USE_SSL
2023                 gtk_widget_set_sensitive(ssl.receive_frame, FALSE);
2024                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
2025                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
2026                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
2027 #endif
2028                 gtk_widget_hide(advanced.popport_hbox);
2029                 gtk_widget_hide(advanced.imapport_hbox);
2030                 gtk_widget_hide(advanced.nntpport_hbox);
2031                 gtk_widget_hide(advanced.crosspost_chkbtn);
2032                 gtk_widget_hide(advanced.crosspost_colormenu);
2033                 break;
2034         case A_IMAP4:
2035                 gtk_widget_hide(basic.nntpserv_label);
2036                 gtk_widget_hide(basic.nntpserv_entry);
2037                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2038                                            0, 0);
2039                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
2040                 gtk_widget_hide(basic.nntpauth_chkbtn);
2041                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2042                                            1, 0);
2043                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
2044                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
2045                 gtk_widget_show(basic.recvserv_label);
2046                 gtk_widget_show(basic.recvserv_entry);
2047                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2048                                            2, VSPACING_NARROW);
2049                 gtk_widget_show(basic.smtpserv_label);
2050                 gtk_widget_show(basic.smtpserv_entry);
2051                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2052                                            4, VSPACING_NARROW);
2053                 gtk_widget_hide(basic.localmbox_label);
2054                 gtk_widget_hide(basic.localmbox_entry);
2055                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2056                                            3, 0);
2057                 gtk_widget_hide(basic.mailcmd_label);
2058                 gtk_widget_hide(basic.mailcmd_entry);
2059                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2060                                            6, 0);
2061                 gtk_widget_hide(basic.mailcmd_chkbtn);
2062                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2063                                            5, 0);
2064                 gtk_widget_show(basic.uid_label);
2065                 gtk_widget_show(basic.pass_label);
2066                 gtk_widget_show(basic.uid_entry);
2067                 gtk_widget_show(basic.pass_entry);
2068                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2069                                            7, VSPACING_NARROW);
2070
2071                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
2072                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
2073                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
2074                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
2075                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
2076                 gtk_widget_set_sensitive(receive.imap_frame, TRUE);
2077                 gtk_widget_set_sensitive(receive.recvatgetall_chkbtn, TRUE);
2078                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
2079                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
2080
2081 #if USE_SSL
2082                 gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
2083                 gtk_widget_set_sensitive(ssl.pop_chkbtn, FALSE);
2084                 gtk_widget_set_sensitive(ssl.imap_chkbtn, TRUE);
2085                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
2086 #endif
2087                 gtk_widget_hide(advanced.popport_hbox);
2088                 gtk_widget_show(advanced.imapport_hbox);
2089                 gtk_widget_hide(advanced.nntpport_hbox);
2090                 gtk_widget_hide(advanced.crosspost_chkbtn);
2091                 gtk_widget_hide(advanced.crosspost_colormenu);
2092                 break;
2093         case A_POP3:
2094         default:
2095                 gtk_widget_hide(basic.nntpserv_label);
2096                 gtk_widget_hide(basic.nntpserv_entry);
2097                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2098                                            0, 0);
2099                 gtk_widget_set_sensitive(basic.nntpauth_chkbtn, FALSE);
2100                 gtk_widget_hide(basic.nntpauth_chkbtn);
2101                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2102                                            1, 0);
2103                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
2104                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
2105                 gtk_widget_show(basic.recvserv_label);
2106                 gtk_widget_show(basic.recvserv_entry);
2107                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2108                                            2, VSPACING_NARROW);
2109                 gtk_widget_show(basic.smtpserv_label);
2110                 gtk_widget_show(basic.smtpserv_entry);
2111                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2112                                            4, VSPACING_NARROW);
2113                 gtk_widget_hide(basic.localmbox_label);
2114                 gtk_widget_hide(basic.localmbox_entry);
2115                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2116                                            3, 0);
2117                 gtk_widget_hide(basic.mailcmd_label);
2118                 gtk_widget_hide(basic.mailcmd_entry);
2119                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2120                                            6, 0);
2121                 gtk_widget_hide(basic.mailcmd_chkbtn);
2122                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2123                                            5, 0);
2124                 gtk_widget_show(basic.uid_label);
2125                 gtk_widget_show(basic.pass_label);
2126                 gtk_widget_show(basic.uid_entry);
2127                 gtk_widget_show(basic.pass_entry);
2128                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table),
2129                                            7, VSPACING_NARROW);
2130
2131                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
2132                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
2133                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
2134                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
2135                 gtk_widget_set_sensitive(receive.pop3_frame, TRUE);
2136                 gtk_widget_set_sensitive(receive.imap_frame, FALSE);
2137                 gtk_widget_set_sensitive(receive.recvatgetall_chkbtn, TRUE);
2138                 gtk_widget_set_sensitive(basic.smtpserv_entry, TRUE);
2139                 gtk_widget_set_sensitive(basic.smtpserv_label, TRUE);
2140
2141 #if USE_SSL
2142                 gtk_widget_set_sensitive(ssl.receive_frame, TRUE);
2143                 gtk_widget_set_sensitive(ssl.pop_chkbtn, TRUE);
2144                 gtk_widget_set_sensitive(ssl.imap_chkbtn, FALSE);
2145                 gtk_widget_set_sensitive(ssl.send_frame, TRUE);
2146 #endif
2147                 gtk_widget_show(advanced.popport_hbox);
2148                 gtk_widget_hide(advanced.imapport_hbox);
2149                 gtk_widget_hide(advanced.nntpport_hbox);
2150                 gtk_widget_hide(advanced.crosspost_chkbtn);
2151                 gtk_widget_hide(advanced.crosspost_colormenu);
2152                 break;
2153         }
2154
2155         gtk_widget_queue_resize(basic.serv_frame);
2156 }
2157
2158 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
2159                                            gpointer user_data)
2160 {
2161         gboolean auth;
2162
2163         if (!GTK_WIDGET_SENSITIVE (GTK_WIDGET (button)))
2164                 return;
2165         auth = gtk_toggle_button_get_active (button);
2166         gtk_widget_set_sensitive(basic.uid_label,  auth);
2167         gtk_widget_set_sensitive(basic.pass_label, auth);
2168         gtk_widget_set_sensitive(basic.uid_entry,  auth);
2169         gtk_widget_set_sensitive(basic.pass_entry, auth);
2170 }
2171
2172 static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
2173                                           gpointer user_data)
2174 {
2175         gboolean use_mailcmd;
2176
2177         use_mailcmd = gtk_toggle_button_get_active (button);
2178
2179         gtk_widget_set_sensitive(basic.mailcmd_entry,  use_mailcmd);
2180         gtk_widget_set_sensitive(basic.mailcmd_label, use_mailcmd);
2181         gtk_widget_set_sensitive(basic.smtpserv_entry, !use_mailcmd);
2182         gtk_widget_set_sensitive(basic.smtpserv_label, !use_mailcmd);
2183         gtk_widget_set_sensitive(basic.uid_entry,  !use_mailcmd);
2184         gtk_widget_set_sensitive(basic.pass_entry, !use_mailcmd);
2185 }
2186
2187 static void prefs_account_smtp_userid_cb(GtkEditable *editable,
2188                                          gpointer smtp_passwd)
2189 {
2190         gchar *buf;
2191         gboolean use_smtp_userid;
2192         
2193         buf = gtk_editable_get_chars(editable, 0, -1);
2194         if(buf[0] == '\0') {
2195                 use_smtp_userid = FALSE;
2196         } else {
2197                 use_smtp_userid = TRUE;
2198         }
2199         gtk_widget_set_sensitive(GTK_WIDGET(smtp_passwd), use_smtp_userid);
2200         g_free(buf);
2201 }