Enhanced GnuPG key selection support.
[claws.git] / src / prefs_account.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999,2000 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 "account.h"
40 #include "mainwindow.h"
41 #include "manage_window.h"
42 #include "menu.h"
43 #include "gtkutils.h"
44 #include "utils.h"
45 #include "alertpanel.h"
46
47 static gboolean cancelled;
48
49 static PrefsAccount tmp_ac_prefs;
50
51 static PrefsDialog dialog;
52
53 static struct Basic {
54         GtkWidget *acname_entry;
55         GtkWidget *default_chkbtn;
56
57         GtkWidget *name_entry;
58         GtkWidget *addr_entry;
59         GtkWidget *org_entry;
60
61         GtkWidget *serv_frame;
62         GtkWidget *serv_table;
63         GtkWidget *protocol_optmenu;
64         GtkWidget *inbox_label;
65         GtkWidget *inbox_entry;
66         GtkWidget *recvserv_label;
67         GtkWidget *smtpserv_label;
68         GtkWidget *nntpserv_label;
69         GtkWidget *recvserv_entry;
70         GtkWidget *smtpserv_entry;
71         GtkWidget *nntpserv_entry;
72         GtkWidget *uid_label;
73         GtkWidget *pass_label;
74         GtkWidget *uid_entry;
75         GtkWidget *pass_entry;
76 } basic;
77
78 static struct Receive {
79         GtkWidget *pop3_frame;
80         GtkWidget *rmmail_chkbtn;
81         GtkWidget *getall_chkbtn;
82         GtkWidget *recvatgetall_chkbtn;
83         GtkWidget *filter_on_recv_chkbtn;
84 } receive;
85
86 static struct Send {
87         GtkWidget *date_chkbtn;
88         GtkWidget *msgid_chkbtn;
89
90         GtkWidget *customhdr_chkbtn;
91
92         GtkWidget *autocc_chkbtn;
93         GtkWidget *autocc_entry;
94         GtkWidget *autobcc_chkbtn;
95         GtkWidget *autobcc_entry;
96         GtkWidget *autoreplyto_chkbtn;
97         GtkWidget *autoreplyto_entry;
98
99         GtkWidget *smtp_auth_chkbtn;
100         GtkWidget *pop_bfr_smtp_chkbtn;
101 } send;
102
103 static struct Compose {
104         GtkWidget *sigpath_entry;
105 } compose;
106
107 #if USE_GPGME
108 static struct Privacy {
109         GtkWidget *defaultkey_radiobtn;
110         GtkWidget *emailkey_radiobtn;
111         GtkWidget *customkey_radiobtn;
112         GtkWidget *customkey_entry;
113 } privacy;
114 #endif /* USE_GPGME */
115
116 static struct Advanced {
117         GtkWidget *smtpport_chkbtn;
118         GtkWidget *smtpport_entry;
119         GtkWidget *popport_chkbtn;
120         GtkWidget *popport_entry;
121         GtkWidget *domain_chkbtn;
122         GtkWidget *domain_entry;
123 } advanced;
124
125 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
126 static void prefs_account_protocol_set_optmenu          (PrefParam *pparam);
127 static void prefs_account_protocol_activated            (GtkMenuItem *menuitem);
128 #if USE_GPGME
129 static void prefs_account_sign_key_set_data_from_radiobtn (PrefParam *pparam);
130 static void prefs_account_sign_key_set_radiobtn           (PrefParam *pparam);
131 #endif /* USE_GPGME */
132
133 static PrefParam param[] = {
134         /* Basic */
135         {"account_name", NULL, &tmp_ac_prefs.account_name, P_STRING,
136          &basic.acname_entry, prefs_set_data_from_entry, prefs_set_entry},
137
138         {"is_default", "FALSE", &tmp_ac_prefs.is_default, P_BOOL,
139          &basic.default_chkbtn,
140          prefs_set_data_from_toggle, prefs_set_toggle},
141
142         {"name", NULL, &tmp_ac_prefs.name, P_STRING,
143          &basic.name_entry, prefs_set_data_from_entry, prefs_set_entry},
144
145         {"address", NULL, &tmp_ac_prefs.address, P_STRING,
146          &basic.addr_entry, prefs_set_data_from_entry, prefs_set_entry},
147
148         {"organization", NULL, &tmp_ac_prefs.organization, P_STRING,
149          &basic.org_entry, prefs_set_data_from_entry, prefs_set_entry},
150
151         {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
152          &basic.protocol_optmenu,
153          prefs_account_protocol_set_data_from_optmenu,
154          prefs_account_protocol_set_optmenu},
155
156         {"receive_server", NULL, &tmp_ac_prefs.recv_server, P_STRING,
157          &basic.recvserv_entry, prefs_set_data_from_entry, prefs_set_entry},
158
159         {"smtp_server", NULL, &tmp_ac_prefs.smtp_server, P_STRING,
160          &basic.smtpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
161
162         {"nntp_server", NULL, &tmp_ac_prefs.nntp_server, P_STRING,
163          &basic.nntpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
164
165         {"use_nntp_auth", "FALSE", &tmp_ac_prefs.use_nntp_auth, P_BOOL,
166          NULL, NULL, NULL},
167
168         {"user_id", "ENV_USER", &tmp_ac_prefs.userid, P_STRING,
169          &basic.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
170
171         {"password", NULL, &tmp_ac_prefs.passwd, P_STRING,
172          &basic.pass_entry, prefs_set_data_from_entry, prefs_set_entry},
173
174         {"inbox", "inbox", &tmp_ac_prefs.inbox, P_STRING,
175          &basic.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
176
177         /* Receive */
178         {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
179          &receive.rmmail_chkbtn,
180          prefs_set_data_from_toggle, prefs_set_toggle},
181
182         {"get_all_mail", "FALSE", &tmp_ac_prefs.getall, P_BOOL,
183          &receive.getall_chkbtn,
184          prefs_set_data_from_toggle, prefs_set_toggle},
185
186         {"receive_at_get_all", "TRUE", &tmp_ac_prefs.recv_at_getall, P_BOOL,
187          &receive.recvatgetall_chkbtn,
188          prefs_set_data_from_toggle, prefs_set_toggle},
189
190         {"filter_on_receive", "TRUE", &tmp_ac_prefs.filter_on_recv, P_BOOL,
191          &receive.filter_on_recv_chkbtn,
192          prefs_set_data_from_toggle, prefs_set_toggle},
193
194         /* Send */
195         {"add_date", "TRUE", &tmp_ac_prefs.add_date, P_BOOL,
196          &send.date_chkbtn,
197          prefs_set_data_from_toggle, prefs_set_toggle},
198
199         {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
200          &send.msgid_chkbtn,
201          prefs_set_data_from_toggle, prefs_set_toggle},
202
203         {"add_custom_header", "FALSE", &tmp_ac_prefs.add_customhdr, P_BOOL,
204          &send.customhdr_chkbtn,
205          prefs_set_data_from_toggle, prefs_set_toggle},
206
207         {"set_autocc", "FALSE", &tmp_ac_prefs.set_autocc, P_BOOL,
208          &send.autocc_chkbtn,
209          prefs_set_data_from_toggle, prefs_set_toggle},
210
211         {"auto_cc", NULL, &tmp_ac_prefs.auto_cc, P_STRING,
212          &send.autocc_entry,
213          prefs_set_data_from_entry, prefs_set_entry},
214
215         {"set_autobcc", "FALSE", &tmp_ac_prefs.set_autobcc, P_BOOL,
216          &send.autobcc_chkbtn,
217          prefs_set_data_from_toggle, prefs_set_toggle},
218
219         {"auto_bcc", NULL, &tmp_ac_prefs.auto_bcc, P_STRING,
220          &send.autobcc_entry,
221          prefs_set_data_from_entry, prefs_set_entry},
222
223         {"set_autoreplyto", "FALSE", &tmp_ac_prefs.set_autoreplyto, P_BOOL,
224          &send.autoreplyto_chkbtn,
225          prefs_set_data_from_toggle, prefs_set_toggle},
226
227         {"auto_replyto", NULL, &tmp_ac_prefs.auto_replyto, P_STRING,
228          &send.autoreplyto_entry,
229          prefs_set_data_from_entry, prefs_set_entry},
230
231         {"use_smtp_auth", "FALSE", &tmp_ac_prefs.use_smtp_auth, P_BOOL,
232          &send.smtp_auth_chkbtn,
233          prefs_set_data_from_toggle, prefs_set_toggle},
234
235         {"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
236          &send.pop_bfr_smtp_chkbtn,
237          prefs_set_data_from_toggle, prefs_set_toggle},
238
239         /* Compose */
240         {"signature_path", "~/"DEFAULT_SIGNATURE, &tmp_ac_prefs.sig_path, P_STRING,
241          &compose.sigpath_entry,
242          prefs_set_data_from_entry, prefs_set_entry},
243
244 #if USE_GPGME
245         /* Privacy */
246         {"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
247          &privacy.defaultkey_radiobtn,
248          prefs_account_sign_key_set_data_from_radiobtn,
249          prefs_account_sign_key_set_radiobtn},
250         {"sign_key_id", "", &tmp_ac_prefs.sign_key_id, P_STRING,
251          &privacy.customkey_entry,
252          prefs_set_data_from_entry, prefs_set_entry},
253 #endif /* USE_GPGME */
254
255         /* Advanced */
256         {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
257          &advanced.smtpport_chkbtn,
258          prefs_set_data_from_toggle, prefs_set_toggle},
259
260         {"smtp_port", "25", &tmp_ac_prefs.smtpport, P_USHORT,
261          &advanced.smtpport_entry,
262          prefs_set_data_from_entry, prefs_set_entry},
263
264         {"set_popport", "FALSE", &tmp_ac_prefs.set_popport, P_BOOL,
265          &advanced.popport_chkbtn,
266          prefs_set_data_from_toggle, prefs_set_toggle},
267
268         {"pop_port", "110", &tmp_ac_prefs.popport, P_USHORT,
269          &advanced.popport_entry,
270          prefs_set_data_from_entry, prefs_set_entry},
271
272         {"set_domain", "FALSE", &tmp_ac_prefs.set_domain, P_BOOL,
273          &advanced.domain_chkbtn,
274          prefs_set_data_from_toggle, prefs_set_toggle},
275
276         {"domain", NULL, &tmp_ac_prefs.domain, P_STRING,
277          &advanced.domain_entry,
278          prefs_set_data_from_entry, prefs_set_entry},
279
280         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
281 };
282
283 static void prefs_account_create                (void);
284 static void prefs_account_basic_create          (void);
285 static void prefs_account_receive_create        (void);
286 static void prefs_account_send_create           (void);
287 static void prefs_account_compose_create        (void);
288 #if USE_GPGME
289 static void prefs_account_privacy_create        (void);
290 #endif /* USE_GPGME */
291 static void prefs_account_advanced_create       (void);
292
293 static void prefs_account_key_pressed           (GtkWidget      *widget,
294                                                  GdkEventKey    *event,
295                                                  gpointer        data);
296 static void prefs_account_ok                    (void);
297 static gint prefs_account_apply                 (void);
298 static void prefs_account_cancel                (void);
299
300 #define VSPACING                12
301 #define VSPACING_NARROW         4
302 #define BOX_BORDER              16
303 #define DEFAULT_ENTRY_WIDTH     80
304
305 void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
306 {
307         const gchar *p = label;
308         gint id;
309
310         g_return_if_fail(ac_prefs != NULL);
311         g_return_if_fail(label != NULL);
312
313         memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
314         prefs_read_config(param, label, ACCOUNT_RC);
315         *ac_prefs = tmp_ac_prefs;
316         while (*p && !isdigit(*p)) p++;
317         id = atoi(p);
318         if (id < 0) g_warning("wrong account id: %d\n", id);
319         ac_prefs->account_id = id;
320 }
321
322 void prefs_account_save_config(PrefsAccount *ac_prefs)
323 {
324         gchar *buf;
325
326         g_return_if_fail(ac_prefs != NULL);
327
328         tmp_ac_prefs = *ac_prefs;
329         buf = g_strdup_printf("Account: %d", ac_prefs->account_id);
330         prefs_save_config(param, buf, ACCOUNT_RC);
331 }
332
333 void prefs_account_save_config_all(GList *account_list)
334 {
335         GList *cur;
336         gchar *rcpath;
337         PrefFile *pfile;
338
339         if (!account_list) return;
340
341         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
342         if ((pfile = prefs_write_open(rcpath)) == NULL) {
343                 g_free(rcpath);
344                 return;
345         }
346         g_free(rcpath);
347
348         for (cur = account_list; cur != NULL; cur = cur->next) {
349                 tmp_ac_prefs = *(PrefsAccount *)cur->data;
350                 if (fprintf(pfile->fp, "[Account: %d]\n",
351                             tmp_ac_prefs.account_id) <= 0 ||
352                     prefs_write_param(param, pfile->fp) < 0) {
353                         g_warning(_("failed to write configuration to file\n"));
354                         prefs_write_close_revert(pfile);
355                         return;
356                 }
357                 if (cur->next) {
358                         if (fputc('\n', pfile->fp) == EOF) {
359                                 FILE_OP_ERROR(rcpath, "fputc");
360                                 prefs_write_close_revert(pfile);
361                                 return;
362                         }
363                 }
364         }
365
366         if (prefs_write_close(pfile) < 0)
367                 g_warning(_("failed to write configuration to file\n"));
368 }
369
370 void prefs_account_free(PrefsAccount *ac_prefs)
371 {
372         if (!ac_prefs) return;
373
374         tmp_ac_prefs = *ac_prefs;
375         prefs_free(param);
376 }
377
378 static gint prefs_account_get_new_id(void)
379 {
380         GList *ac_list;
381         PrefsAccount *ac;
382         static gint last_id = 0;
383
384         for (ac_list = account_get_list(); ac_list != NULL;
385              ac_list = ac_list->next) {
386                 ac = (PrefsAccount *)ac_list->data;
387                 if (last_id < ac->account_id)
388                         last_id = ac->account_id;
389         }
390
391         return last_id + 1;
392 }
393
394 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
395 {
396         gboolean new_account = FALSE;
397
398         debug_print(_("Opening account preferences window...\n"));
399
400         cancelled = FALSE;
401
402         if (!ac_prefs) {
403                 ac_prefs = g_new0(PrefsAccount, 1);
404                 ac_prefs->account_id = prefs_account_get_new_id();
405                 new_account = TRUE;
406         }
407
408         if (!dialog.window) {
409                 prefs_account_create();
410         }
411
412         manage_window_set_transient(GTK_WINDOW(dialog.window));
413         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
414         gtk_widget_grab_focus(dialog.ok_btn);
415
416         tmp_ac_prefs = *ac_prefs;
417
418         if (new_account) {
419                 PrefsAccount *def_ac;
420                 gchar *buf;
421
422                 prefs_set_dialog_to_default(param);
423                 buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
424                 gtk_entry_set_text(GTK_ENTRY(basic.acname_entry), buf);
425                 g_free(buf);
426                 def_ac = account_get_default();
427                 if (def_ac) {
428                         gtk_entry_set_text(GTK_ENTRY(basic.name_entry),
429                                            def_ac->name ? def_ac->name : "");
430                         gtk_entry_set_text(GTK_ENTRY(basic.addr_entry),
431                                            def_ac->address ? def_ac->address : "");
432                         gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
433                                            def_ac->organization ? def_ac->organization : "");
434                 }
435                 gtk_window_set_title(GTK_WINDOW(dialog.window),
436                                      _("Preferences for new account"));
437                 gtk_widget_hide(dialog.apply_btn);
438         } else {
439                 prefs_set_dialog(param);
440                 gtk_window_set_title(GTK_WINDOW(dialog.window),
441                                      _("Preferences for each account"));
442                 gtk_widget_show(dialog.apply_btn);
443         }
444
445         gtk_widget_show(dialog.window);
446         gtk_main();
447         gtk_widget_hide(dialog.window);
448
449         if (cancelled && new_account) {
450                 g_free(ac_prefs);
451                 return NULL;
452         } else {
453                 *ac_prefs = tmp_ac_prefs;
454                 return ac_prefs;
455         }
456 }
457
458 static void prefs_account_create(void)
459 {
460         gint page = 0;
461
462         debug_print(_("Creating account preferences window...\n"));
463
464         /* create dialog */
465         prefs_dialog_create(&dialog);
466         gtk_signal_connect(GTK_OBJECT(dialog.window), "delete_event",
467                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
468         gtk_signal_connect(GTK_OBJECT(dialog.window), "key_press_event",
469                            GTK_SIGNAL_FUNC(prefs_account_key_pressed), NULL);
470         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_in_event",
471                            GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
472         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_out_event",
473                            GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
474         gtk_signal_connect(GTK_OBJECT(dialog.ok_btn), "clicked",
475                            GTK_SIGNAL_FUNC(prefs_account_ok), NULL);
476         gtk_signal_connect(GTK_OBJECT(dialog.apply_btn), "clicked",
477                            GTK_SIGNAL_FUNC(prefs_account_apply), NULL);
478         gtk_signal_connect(GTK_OBJECT(dialog.cancel_btn), "clicked",
479                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
480
481         prefs_account_basic_create();
482         SET_NOTEBOOK_LABEL(dialog.notebook, _("Basic"), page++);
483         prefs_account_receive_create();
484         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"), page++);
485         prefs_account_send_create();
486         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"), page++);
487         prefs_account_compose_create();
488         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"), page++);
489 #if USE_GPGME
490         prefs_account_privacy_create();
491         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
492 #endif /* USE_GPGME */
493         prefs_account_advanced_create();
494         SET_NOTEBOOK_LABEL(dialog.notebook, _("Advanced"), page++);
495
496         gtk_widget_show_all(dialog.window);
497 }
498
499 #define SET_ACTIVATE(menuitem) \
500 { \
501         gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \
502                            GTK_SIGNAL_FUNC(prefs_account_protocol_activated), \
503                            NULL); \
504 }
505
506 static void prefs_account_basic_create(void)
507 {
508         GtkWidget *vbox1;
509         GtkWidget *hbox;
510         GtkWidget *label;
511         GtkWidget *acname_entry;
512         GtkWidget *default_chkbtn;
513         GtkWidget *frame1;
514         GtkWidget *table1;
515         GtkWidget *name_entry;
516         GtkWidget *addr_entry;
517         GtkWidget *org_entry;
518
519         GtkWidget *serv_frame;
520         GtkWidget *vbox2;
521         GtkWidget *optmenu;
522         GtkWidget *optmenu_menu;
523         GtkWidget *menuitem;
524         GtkWidget *inbox_label;
525         GtkWidget *inbox_entry;
526         GtkWidget *serv_table;
527         GtkWidget *recvserv_label;
528         GtkWidget *smtpserv_label;
529         GtkWidget *nntpserv_label;
530         GtkWidget *recvserv_entry;
531         GtkWidget *smtpserv_entry;
532         GtkWidget *nntpserv_entry;
533         GtkWidget *uid_label;
534         GtkWidget *pass_label;
535         GtkWidget *uid_entry;
536         GtkWidget *pass_entry;
537
538         vbox1 = gtk_vbox_new (FALSE, VSPACING);
539         gtk_widget_show (vbox1);
540         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
541         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
542
543         hbox = gtk_hbox_new (FALSE, 8);
544         gtk_widget_show (hbox);
545         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
546
547         label = gtk_label_new (_("Name of this account"));
548         gtk_widget_show (label);
549         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
550
551         acname_entry = gtk_entry_new ();
552         gtk_widget_show (acname_entry);
553         gtk_widget_set_usize (acname_entry, DEFAULT_ENTRY_WIDTH, -1);
554         gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
555
556         default_chkbtn = gtk_check_button_new_with_label (_("Usually used"));
557         gtk_widget_show (default_chkbtn);
558         gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, FALSE, FALSE, 0);
559
560         PACK_FRAME (vbox1, frame1, _("Personal information"));
561
562         table1 = gtk_table_new (3, 2, FALSE);
563         gtk_widget_show (table1);
564         gtk_container_add (GTK_CONTAINER (frame1), table1);
565         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
566         gtk_table_set_row_spacings (GTK_TABLE (table1), VSPACING_NARROW);
567         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
568
569         label = gtk_label_new (_("Full name"));
570         gtk_widget_show (label);
571         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 0, 1,
572                           GTK_FILL, 0, 0, 0);
573         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
574
575         label = gtk_label_new (_("Mail address"));
576         gtk_widget_show (label);
577         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 1, 2,
578                           GTK_FILL, 0, 0, 0);
579         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
580
581         label = gtk_label_new (_("Organization"));
582         gtk_widget_show (label);
583         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 2, 3,
584                           GTK_FILL, 0, 0, 0);
585         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
586
587         name_entry = gtk_entry_new ();
588         gtk_widget_show (name_entry);
589         gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
590                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
591                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
592
593         addr_entry = gtk_entry_new ();
594         gtk_widget_show (addr_entry);
595         gtk_table_attach (GTK_TABLE (table1), addr_entry, 1, 2, 1, 2,
596                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
597                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
598
599         org_entry = gtk_entry_new ();
600         gtk_widget_show (org_entry);
601         gtk_table_attach (GTK_TABLE (table1), org_entry, 1, 2, 2, 3,
602                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
603                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
604
605         PACK_FRAME (vbox1, serv_frame, _("Server information"));
606
607         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
608         gtk_widget_show (vbox2);
609         gtk_container_add (GTK_CONTAINER (serv_frame), vbox2);
610         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
611
612         hbox = gtk_hbox_new (FALSE, 8);
613         gtk_widget_show (hbox);
614         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
615
616         label = gtk_label_new (_("Protocol"));
617         gtk_widget_show (label);
618         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
619
620         optmenu = gtk_option_menu_new ();
621         gtk_widget_show (optmenu);
622         gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
623
624         optmenu_menu = gtk_menu_new ();
625
626         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (normal)"),  A_POP3);
627         SET_ACTIVATE (menuitem);
628         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (APOP auth)"),  A_APOP);
629         SET_ACTIVATE (menuitem);
630         MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
631         SET_ACTIVATE (menuitem);
632         MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
633         SET_ACTIVATE (menuitem);
634         MENUITEM_ADD (optmenu_menu, menuitem, _("None (local)"), A_LOCAL);
635         SET_ACTIVATE (menuitem);
636
637         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
638
639         inbox_label = gtk_label_new (_("Inbox"));
640         gtk_widget_show (inbox_label);
641         gtk_box_pack_start (GTK_BOX (hbox), inbox_label, FALSE, FALSE, 0);
642
643         inbox_entry = gtk_entry_new ();
644         gtk_widget_show (inbox_entry);
645         gtk_widget_set_usize (inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
646         gtk_box_pack_start (GTK_BOX (hbox), inbox_entry, TRUE, TRUE, 0);
647
648         serv_table = gtk_table_new (5, 4, FALSE);
649         gtk_widget_show (serv_table);
650         gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
651         gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
652         gtk_table_set_col_spacings (GTK_TABLE (serv_table), 8);
653
654         nntpserv_entry = gtk_entry_new ();
655         gtk_widget_show (nntpserv_entry);
656         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_entry, 1, 4, 0, 1,
657                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
658                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
659         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 0, 0);
660
661         recvserv_entry = gtk_entry_new ();
662         gtk_widget_show (recvserv_entry);
663         gtk_table_attach (GTK_TABLE (serv_table), recvserv_entry, 1, 4, 1, 2,
664                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
665                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
666
667         smtpserv_entry = gtk_entry_new ();
668         gtk_widget_show (smtpserv_entry);
669         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_entry, 1, 4, 2, 3,
670                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
671                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
672
673         uid_entry = gtk_entry_new ();
674         gtk_widget_show (uid_entry);
675         gtk_widget_set_usize (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
676         gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 4, 5,
677                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
678                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
679
680         pass_entry = gtk_entry_new ();
681         gtk_widget_show (pass_entry);
682         gtk_widget_set_usize (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
683         gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 3, 4, 4, 5,
684                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
685                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
686         gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
687
688         nntpserv_label = gtk_label_new (_("News server"));
689         gtk_widget_show (nntpserv_label);
690         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_label, 0, 1, 0, 1,
691                           GTK_FILL, 0, 0, 0);
692         gtk_misc_set_alignment (GTK_MISC (nntpserv_label), 1, 0.5);
693
694         recvserv_label = gtk_label_new (_("Server for receiving"));
695         gtk_widget_show (recvserv_label);
696         gtk_table_attach (GTK_TABLE (serv_table), recvserv_label, 0, 1, 1, 2,
697                           GTK_FILL, 0, 0, 0);
698         gtk_misc_set_alignment (GTK_MISC (recvserv_label), 1, 0.5);
699
700         smtpserv_label = gtk_label_new (_("SMTP server (send)"));
701         gtk_widget_show (smtpserv_label);
702         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_label, 0, 1, 2, 3,
703                           GTK_FILL, 0, 0, 0);
704         gtk_misc_set_alignment (GTK_MISC (smtpserv_label), 1, 0.5);
705         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0);
706
707         uid_label = gtk_label_new (_("User ID"));
708         gtk_widget_show (uid_label);
709         gtk_table_attach (GTK_TABLE (serv_table), uid_label, 0, 1, 4, 5,
710                           GTK_FILL, 0, 0, 0);
711         gtk_misc_set_alignment (GTK_MISC (uid_label), 1, 0.5);
712
713         pass_label = gtk_label_new (_("Password"));
714         gtk_widget_show (pass_label);
715         gtk_table_attach (GTK_TABLE (serv_table), pass_label, 2, 3, 4, 5,
716                           0, 0, 0, 0);
717
718         basic.acname_entry   = acname_entry;
719         basic.default_chkbtn = default_chkbtn;
720
721         basic.name_entry = name_entry;
722         basic.addr_entry = addr_entry;
723         basic.org_entry  = org_entry;
724
725         basic.serv_frame       = serv_frame;
726         basic.serv_table       = serv_table;
727         basic.protocol_optmenu = optmenu;
728         basic.inbox_label      = inbox_label;
729         basic.inbox_entry      = inbox_entry;
730         basic.recvserv_label   = recvserv_label;
731         basic.recvserv_entry   = recvserv_entry;
732         basic.smtpserv_label   = smtpserv_label;
733         basic.smtpserv_entry   = smtpserv_entry;
734         basic.nntpserv_label   = nntpserv_label;
735         basic.nntpserv_entry   = nntpserv_entry;
736         basic.uid_label        = uid_label;
737         basic.pass_label       = pass_label;
738         basic.uid_entry        = uid_entry;
739         basic.pass_entry       = pass_entry;
740 }
741
742 static void prefs_account_receive_create(void)
743 {
744         GtkWidget *vbox1;
745         GtkWidget *frame1;
746         GtkWidget *vbox2;
747         GtkWidget *rmmail_chkbtn;
748         GtkWidget *getall_chkbtn;
749         GtkWidget *recvatgetall_chkbtn;
750         GtkWidget *filter_on_recv_chkbtn;
751
752         vbox1 = gtk_vbox_new (FALSE, VSPACING);
753         gtk_widget_show (vbox1);
754         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
755         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
756
757         PACK_FRAME (vbox1, frame1, _("POP3"));
758
759         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
760         gtk_widget_show (vbox2);
761         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
762         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
763
764         PACK_CHECK_BUTTON (vbox2, rmmail_chkbtn,
765                            _("Remove messages on server when received"));
766         PACK_CHECK_BUTTON (vbox2, getall_chkbtn,
767                            _("Receive all messages on server"));
768         PACK_CHECK_BUTTON (vbox2, recvatgetall_chkbtn,
769                            _("Receive at getting from all accounts"));
770         PACK_CHECK_BUTTON (vbox2, filter_on_recv_chkbtn,
771                            _("Filter messages on receiving"));
772
773         receive.pop3_frame            = frame1;
774         receive.rmmail_chkbtn         = rmmail_chkbtn;
775         receive.getall_chkbtn         = getall_chkbtn;
776         receive.recvatgetall_chkbtn   = recvatgetall_chkbtn;
777         receive.filter_on_recv_chkbtn = filter_on_recv_chkbtn;
778 }
779
780 static void prefs_account_send_create(void)
781 {
782         GtkWidget *vbox1;
783         GtkWidget *vbox2;
784         GtkWidget *frame;
785         GtkWidget *date_chkbtn;
786         GtkWidget *msgid_chkbtn;
787         GtkWidget *hbox;
788         GtkWidget *customhdr_chkbtn;
789         GtkWidget *customhdr_edit_btn;
790         GtkWidget *frame2;
791         GtkWidget *table;
792         GtkWidget *autocc_chkbtn;
793         GtkWidget *autocc_entry;
794         GtkWidget *autobcc_chkbtn;
795         GtkWidget *autobcc_entry;
796         GtkWidget *autoreplyto_chkbtn;
797         GtkWidget *autoreplyto_entry;
798         GtkWidget *frame3;
799         GtkWidget *vbox3;
800         GtkWidget *smtp_auth_chkbtn;
801         GtkWidget *pop_bfr_smtp_chkbtn;
802
803         vbox1 = gtk_vbox_new (FALSE, VSPACING);
804         gtk_widget_show (vbox1);
805         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
806         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
807
808         PACK_FRAME (vbox1, frame, _("Header"));
809
810         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
811         gtk_widget_show (vbox2);
812         gtk_container_add (GTK_CONTAINER (frame), vbox2);
813         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
814
815         PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date header field"));
816         PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
817
818         hbox = gtk_hbox_new (FALSE, 12);
819         gtk_widget_show (hbox);
820         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
821
822         gtk_widget_set_sensitive(hbox, FALSE);
823
824         PACK_CHECK_BUTTON (hbox, customhdr_chkbtn,
825                            _("Add user-defined header"));
826
827         customhdr_edit_btn = gtk_button_new_with_label (_(" Edit... "));
828         gtk_widget_show (customhdr_edit_btn);
829         gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
830                             FALSE, FALSE, 0);
831
832         SET_TOGGLE_SENSITIVITY (customhdr_chkbtn, customhdr_edit_btn);
833
834         PACK_FRAME (vbox1, frame2, _("Automatically set following addresses"));
835
836         table =  gtk_table_new (3, 2, FALSE);
837         gtk_widget_show (table);
838         gtk_container_add (GTK_CONTAINER (frame2), table);
839         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
840         gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW);
841         gtk_table_set_col_spacings (GTK_TABLE (table), 8);
842
843         autocc_chkbtn = gtk_check_button_new_with_label (_("Cc"));
844         gtk_widget_show (autocc_chkbtn);
845         gtk_table_attach (GTK_TABLE (table), autocc_chkbtn, 0, 1, 0, 1,
846                           GTK_FILL, 0, 0, 0);
847
848         autocc_entry = gtk_entry_new ();
849         gtk_widget_show (autocc_entry);
850         gtk_table_attach (GTK_TABLE (table), autocc_entry, 1, 2, 0, 1,
851                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
852                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
853
854         SET_TOGGLE_SENSITIVITY (autocc_chkbtn, autocc_entry);
855
856         autobcc_chkbtn = gtk_check_button_new_with_label (_("Bcc"));
857         gtk_widget_show (autobcc_chkbtn);
858         gtk_table_attach (GTK_TABLE (table), autobcc_chkbtn, 0, 1, 1, 2,
859                           GTK_FILL, 0, 0, 0);
860
861         autobcc_entry = gtk_entry_new ();
862         gtk_widget_show (autobcc_entry);
863         gtk_table_attach (GTK_TABLE (table), autobcc_entry, 1, 2, 1, 2,
864                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
865                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
866
867         SET_TOGGLE_SENSITIVITY (autobcc_chkbtn, autobcc_entry);
868
869         autoreplyto_chkbtn = gtk_check_button_new_with_label (_("Reply-To"));
870         gtk_widget_show (autoreplyto_chkbtn);
871         gtk_table_attach (GTK_TABLE (table), autoreplyto_chkbtn, 0, 1, 2, 3,
872                           GTK_FILL, 0, 0, 0);
873
874         autoreplyto_entry = gtk_entry_new ();
875         gtk_widget_show (autoreplyto_entry);
876         gtk_table_attach (GTK_TABLE (table), autoreplyto_entry, 1, 2, 2, 3,
877                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
878                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
879
880         SET_TOGGLE_SENSITIVITY (autoreplyto_chkbtn, autoreplyto_entry);
881
882         PACK_FRAME (vbox1, frame3, _("Authentication"));
883
884         vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
885         gtk_widget_show (vbox3);
886         gtk_container_add (GTK_CONTAINER (frame3), vbox3);
887         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
888
889         PACK_CHECK_BUTTON (vbox3, smtp_auth_chkbtn,
890                 _("SMTP Authentication (SMTP AUTH)"));
891         PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_chkbtn,
892                 _("Authenticate with POP3 before sending"));
893         gtk_widget_set_sensitive(pop_bfr_smtp_chkbtn, FALSE);
894
895         send.date_chkbtn      = date_chkbtn;
896         send.msgid_chkbtn     = msgid_chkbtn;
897         send.customhdr_chkbtn = customhdr_chkbtn;
898
899         send.autocc_chkbtn      = autocc_chkbtn;
900         send.autocc_entry       = autocc_entry;
901         send.autobcc_chkbtn     = autobcc_chkbtn;
902         send.autobcc_entry      = autobcc_entry;
903         send.autoreplyto_chkbtn = autoreplyto_chkbtn;
904         send.autoreplyto_entry  = autoreplyto_entry;
905
906         send.smtp_auth_chkbtn    = smtp_auth_chkbtn;
907         send.pop_bfr_smtp_chkbtn = pop_bfr_smtp_chkbtn;
908 }
909
910 static void prefs_account_compose_create(void)
911 {
912         GtkWidget *vbox1;
913         GtkWidget *hbox;
914         GtkWidget *label;
915         GtkWidget *sigpath_entry;
916
917         vbox1 = gtk_vbox_new (FALSE, VSPACING);
918         gtk_widget_show (vbox1);
919         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
920         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
921
922         hbox = gtk_hbox_new (FALSE, 8);
923         gtk_widget_show (hbox);
924         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
925
926         label = gtk_label_new (_("Signature file"));
927         gtk_widget_show (label);
928         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
929
930         sigpath_entry = gtk_entry_new ();
931         gtk_widget_show (sigpath_entry);
932         gtk_box_pack_start (GTK_BOX (hbox), sigpath_entry, TRUE, TRUE, 0);
933
934         compose.sigpath_entry = sigpath_entry;
935 }
936
937 #if USE_GPGME
938 static void prefs_account_privacy_create(void)
939 {
940         GtkWidget *vbox1;
941         GtkWidget *frame1;
942         GtkWidget *vbox2;
943         GtkWidget *hbox1;
944         GtkWidget *label;
945         GtkWidget *defaultkey_radiobtn;
946         GtkWidget *emailkey_radiobtn;
947         GtkWidget *customkey_radiobtn;
948         GtkWidget *customkey_entry;
949
950         vbox1 = gtk_vbox_new (FALSE, VSPACING);
951         gtk_widget_show (vbox1);
952         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
953         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
954
955         PACK_FRAME (vbox1, frame1, _("Sign key"));
956
957         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
958         gtk_widget_show (vbox2);
959         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
960         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
961
962         defaultkey_radiobtn = gtk_radio_button_new_with_label
963                 (NULL, _("Use default GnuPG key"));
964         gtk_widget_show (defaultkey_radiobtn);
965         gtk_box_pack_start (GTK_BOX (vbox2), defaultkey_radiobtn,
966                             FALSE, FALSE, 0);
967         gtk_object_set_user_data (GTK_OBJECT (defaultkey_radiobtn),
968                                   GINT_TO_POINTER (SIGN_KEY_DEFAULT));
969
970         emailkey_radiobtn = gtk_radio_button_new_with_label_from_widget
971                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
972                  _("Select key by your email address"));
973         gtk_widget_show (emailkey_radiobtn);
974         gtk_box_pack_start (GTK_BOX (vbox2), emailkey_radiobtn,
975                             FALSE, FALSE, 0);
976         gtk_object_set_user_data (GTK_OBJECT (emailkey_radiobtn),
977                                   GINT_TO_POINTER (SIGN_KEY_BY_FROM));
978
979         customkey_radiobtn = gtk_radio_button_new_with_label_from_widget
980                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
981                  _("Specify key manually"));
982         gtk_widget_show (customkey_radiobtn);
983         gtk_box_pack_start (GTK_BOX (vbox2), customkey_radiobtn,
984                             FALSE, FALSE, 0);
985         gtk_object_set_user_data (GTK_OBJECT (customkey_radiobtn),
986                                   GINT_TO_POINTER (SIGN_KEY_CUSTOM));
987
988         hbox1 = gtk_hbox_new (FALSE, 8);
989         gtk_widget_show (hbox1);
990         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
991
992         label = gtk_label_new ("");
993         gtk_widget_show (label);
994         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
995         gtk_widget_set_usize (label, 16, -1);
996
997         label = gtk_label_new (_("User or key ID:"));
998         gtk_widget_show (label);
999         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1000
1001         customkey_entry = gtk_entry_new ();
1002         gtk_widget_show (customkey_entry);
1003         gtk_box_pack_start (GTK_BOX (hbox1), customkey_entry,
1004                             TRUE, TRUE, 0);
1005
1006         SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
1007
1008         privacy.defaultkey_radiobtn = defaultkey_radiobtn;
1009         privacy.emailkey_radiobtn = emailkey_radiobtn;
1010         privacy.customkey_radiobtn = customkey_radiobtn;
1011         privacy.customkey_entry = customkey_entry;
1012 }
1013 #endif /* USE_GPGME */
1014
1015 static void prefs_account_advanced_create(void)
1016 {
1017         GtkWidget *vbox1;
1018         GtkWidget *vbox2;
1019         GtkWidget *hbox1;
1020         GtkWidget *checkbtn_smtpport;
1021         GtkWidget *entry_smtpport;
1022         GtkWidget *hbox2;
1023         GtkWidget *checkbtn_popport;
1024         GtkWidget *entry_popport;
1025         GtkWidget *hbox3;
1026         GtkWidget *checkbtn_domain;
1027         GtkWidget *entry_domain;
1028
1029         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1030         gtk_widget_show (vbox1);
1031         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1032         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1033
1034         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1035         gtk_widget_show (vbox2);
1036         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1037
1038         hbox1 = gtk_hbox_new (FALSE, 8);
1039         gtk_widget_show (hbox1);
1040         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1041
1042         PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("Specify SMTP port"));
1043
1044         entry_smtpport = gtk_entry_new_with_max_length (5);
1045         gtk_widget_show (entry_smtpport);
1046         gtk_box_pack_start (GTK_BOX (hbox1), entry_smtpport, FALSE, FALSE, 0);
1047         gtk_widget_set_usize (entry_smtpport, 64, -1);
1048         SET_TOGGLE_SENSITIVITY(checkbtn_smtpport, entry_smtpport);
1049
1050         hbox2 = gtk_hbox_new (FALSE, 8);
1051         gtk_widget_show (hbox2);
1052         gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
1053
1054         PACK_CHECK_BUTTON (hbox2, checkbtn_popport, _("Specify POP3 port"));
1055
1056         entry_popport = gtk_entry_new_with_max_length (5);
1057         gtk_widget_show (entry_popport);
1058         gtk_box_pack_start (GTK_BOX (hbox2), entry_popport, FALSE, FALSE, 0);
1059         gtk_widget_set_usize (entry_popport, 64, -1);
1060         SET_TOGGLE_SENSITIVITY(checkbtn_popport, entry_popport);
1061
1062         hbox3 = gtk_hbox_new (FALSE, 8);
1063         gtk_widget_show (hbox3);
1064         gtk_box_pack_start (GTK_BOX (vbox2), hbox3, FALSE, FALSE, 0);
1065
1066         PACK_CHECK_BUTTON (hbox3, checkbtn_domain, _("Specify domain name"));
1067
1068         entry_domain = gtk_entry_new ();
1069         gtk_widget_show (entry_domain);
1070         gtk_box_pack_start (GTK_BOX (hbox3), entry_domain, TRUE, TRUE, 0);
1071         SET_TOGGLE_SENSITIVITY(checkbtn_domain, entry_domain);
1072
1073         advanced.smtpport_chkbtn        = checkbtn_smtpport;
1074         advanced.smtpport_entry         = entry_smtpport;
1075         advanced.popport_chkbtn         = checkbtn_popport;
1076         advanced.popport_entry          = entry_popport;
1077         advanced.domain_chkbtn          = checkbtn_domain;
1078         advanced.domain_entry           = entry_domain;
1079 }
1080
1081 static void prefs_account_key_pressed(GtkWidget *widget, GdkEventKey *event,
1082                                       gpointer data)
1083 {
1084         if (event && event->keyval == GDK_Escape)
1085                 prefs_account_cancel();
1086 }
1087
1088 static void prefs_account_ok(void)
1089 {
1090         if (prefs_account_apply() == 0)
1091                 gtk_main_quit();
1092 }
1093
1094 static gint prefs_account_apply(void)
1095 {
1096         RecvProtocol protocol;
1097         GtkWidget *menu;
1098         GtkWidget *menuitem;
1099
1100         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
1101         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1102         protocol = GPOINTER_TO_INT
1103                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1104
1105         if (*gtk_entry_get_text(GTK_ENTRY(basic.addr_entry)) == '\0') {
1106                 alertpanel_error(_("Mail address is not entered."));
1107                 return -1;
1108         }
1109         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_LOCAL) &&
1110             *gtk_entry_get_text(GTK_ENTRY(basic.smtpserv_entry)) == '\0') {
1111                 alertpanel_error(_("SMTP server is not entered."));
1112                 return -1;
1113         }
1114         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_LOCAL) &&
1115             *gtk_entry_get_text(GTK_ENTRY(basic.uid_entry)) == '\0') {
1116                 alertpanel_error(_("User ID is not entered."));
1117                 return -1;
1118         }
1119         if ((protocol == A_POP3 || protocol == A_APOP) &&
1120             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1121                 alertpanel_error(_("POP3 server is not entered."));
1122                 return -1;
1123         }
1124         if (protocol == A_IMAP4 &&
1125             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1126                 alertpanel_error(_("IMAP4 server is not entered."));
1127                 return -1;
1128         }
1129         if (protocol == A_NNTP &&
1130             *gtk_entry_get_text(GTK_ENTRY(basic.nntpserv_entry)) == '\0') {
1131                 alertpanel_error(_("NNTP server is not entered."));
1132                 return -1;
1133         }
1134
1135         prefs_set_data_from_dialog(param);
1136         return 0;
1137 }
1138
1139 static void prefs_account_cancel(void)
1140 {
1141         cancelled = TRUE;
1142         gtk_main_quit();
1143 }
1144
1145 #if USE_GPGME
1146
1147 static void prefs_account_sign_key_set_data_from_radiobtn(PrefParam *pparam)
1148 {
1149         GtkRadioButton *radiobtn;
1150         GSList *group;
1151
1152         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1153         group = gtk_radio_button_group (radiobtn);
1154         while (group != NULL) {
1155                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1156                 if (gtk_toggle_button_get_active (btn)) {
1157                         *((SignKeyType *)pparam->data) = GPOINTER_TO_INT
1158                                 (gtk_object_get_user_data (GTK_OBJECT (btn)));
1159                         break;
1160                 }
1161                 group = group->next;
1162         }
1163 }
1164
1165 static void prefs_account_sign_key_set_radiobtn(PrefParam *pparam)
1166 {
1167         GtkRadioButton *radiobtn;
1168         GSList *group;
1169         gpointer data;
1170
1171         data = GINT_TO_POINTER (*((RecvProtocol *)pparam->data));
1172         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1173         group = gtk_radio_button_group (radiobtn);
1174         while (group != NULL) {
1175                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1176                 gpointer data1 = gtk_object_get_user_data (GTK_OBJECT (btn));
1177                 if (data1 == data) {
1178                         gtk_toggle_button_set_active (btn, TRUE);
1179                         break;
1180                 }
1181                 group = group->next;
1182         }
1183 }
1184
1185 #endif /* USE_GPGME */
1186
1187 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
1188 {
1189         GtkWidget *menu;
1190         GtkWidget *menuitem;
1191
1192         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1193         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1194         *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
1195                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1196 }
1197
1198 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
1199 {
1200         RecvProtocol protocol;
1201         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1202         GtkWidget *menu;
1203         GtkWidget *menuitem;
1204
1205         protocol = *((RecvProtocol *)pparam->data);
1206
1207         switch (protocol) {
1208         case A_POP3:
1209                 gtk_option_menu_set_history(optmenu, 0);
1210                 break;
1211         case A_APOP:
1212                 gtk_option_menu_set_history(optmenu, 1);
1213                 break;
1214         case A_IMAP4:
1215                 gtk_option_menu_set_history(optmenu, 2);
1216                 break;
1217         case A_NNTP:
1218                 gtk_option_menu_set_history(optmenu, 3);
1219                 break;
1220         case A_LOCAL:
1221                 gtk_option_menu_set_history(optmenu, 4);
1222                 break;
1223         default:
1224         }
1225
1226         menu = gtk_option_menu_get_menu(optmenu);
1227         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1228         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
1229 }
1230
1231 static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
1232 {
1233         RecvProtocol protocol;
1234
1235         protocol = GPOINTER_TO_INT
1236                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1237
1238         switch(protocol) {
1239         case A_NNTP:
1240                 gtk_widget_set_sensitive(basic.inbox_label, FALSE);
1241                 gtk_widget_set_sensitive(basic.inbox_entry, FALSE);
1242                 gtk_widget_show(basic.nntpserv_label);
1243                 gtk_widget_show(basic.nntpserv_entry);
1244                 gtk_widget_hide(basic.recvserv_label);
1245                 gtk_widget_hide(basic.recvserv_entry);
1246                 gtk_widget_hide(basic.smtpserv_label);
1247                 gtk_widget_hide(basic.smtpserv_entry);
1248                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table), 3, 0);
1249                 gtk_widget_set_sensitive(basic.uid_label,  FALSE);
1250                 gtk_widget_set_sensitive(basic.pass_label, FALSE);
1251                 gtk_widget_set_sensitive(basic.uid_entry,  FALSE);
1252                 gtk_widget_set_sensitive(basic.pass_entry, FALSE);
1253                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1254                 break;
1255         case A_LOCAL:
1256                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1257                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1258                 gtk_widget_hide(basic.nntpserv_label);
1259                 gtk_widget_hide(basic.nntpserv_entry);
1260                 gtk_widget_set_sensitive(basic.recvserv_label, FALSE);
1261                 gtk_widget_set_sensitive(basic.recvserv_entry, FALSE);
1262                 gtk_widget_show(basic.recvserv_label);
1263                 gtk_widget_show(basic.recvserv_entry);
1264                 gtk_widget_show(basic.smtpserv_label);
1265                 gtk_widget_show(basic.smtpserv_entry);
1266                 gtk_table_set_row_spacing
1267                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1268                 gtk_widget_set_sensitive(basic.uid_label,  FALSE);
1269                 gtk_widget_set_sensitive(basic.pass_label, FALSE);
1270                 gtk_widget_set_sensitive(basic.uid_entry,  FALSE);
1271                 gtk_widget_set_sensitive(basic.pass_entry, FALSE);
1272                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1273                 break;
1274         case A_IMAP4:
1275                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1276                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1277                 gtk_widget_hide(basic.nntpserv_label);
1278                 gtk_widget_hide(basic.nntpserv_entry);
1279                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1280                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1281                 gtk_widget_show(basic.recvserv_label);
1282                 gtk_widget_show(basic.recvserv_entry);
1283                 gtk_widget_show(basic.smtpserv_label);
1284                 gtk_widget_show(basic.smtpserv_entry);
1285                 gtk_table_set_row_spacing
1286                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1287                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1288                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1289                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1290                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1291                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1292                 break;
1293         default:
1294                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1295                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1296                 gtk_widget_hide(basic.nntpserv_label);
1297                 gtk_widget_hide(basic.nntpserv_entry);
1298                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1299                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1300                 gtk_widget_show(basic.recvserv_label);
1301                 gtk_widget_show(basic.recvserv_entry);
1302                 gtk_widget_show(basic.smtpserv_label);
1303                 gtk_widget_show(basic.smtpserv_entry);
1304                 gtk_table_set_row_spacing
1305                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1306                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1307                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1308                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1309                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1310                 gtk_widget_set_sensitive(receive.pop3_frame, TRUE);
1311                 break;
1312         }
1313
1314         gtk_widget_queue_resize(basic.serv_frame);
1315 }