Added TAGS to .cvsignore
[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 static void prefs_account_customhdr_edit        (void);
301
302 #define VSPACING                12
303 #define VSPACING_NARROW         4
304 #define BOX_BORDER              16
305 #define DEFAULT_ENTRY_WIDTH     80
306
307 void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
308 {
309         const gchar *p = label;
310         gint id;
311
312         g_return_if_fail(ac_prefs != NULL);
313         g_return_if_fail(label != NULL);
314
315         memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
316         prefs_read_config(param, label, ACCOUNT_RC);
317         *ac_prefs = tmp_ac_prefs;
318         while (*p && !isdigit(*p)) p++;
319         id = atoi(p);
320         if (id < 0) g_warning("wrong account id: %d\n", id);
321         ac_prefs->account_id = id;
322
323         prefs_headers_read_config(ac_prefs);
324 }
325
326 void prefs_account_save_config(PrefsAccount *ac_prefs)
327 {
328         gchar *buf;
329
330         g_return_if_fail(ac_prefs != NULL);
331
332         tmp_ac_prefs = *ac_prefs;
333         buf = g_strdup_printf("Account: %d", ac_prefs->account_id);
334         prefs_save_config(param, buf, ACCOUNT_RC);
335 }
336
337 void prefs_account_save_config_all(GList *account_list)
338 {
339         GList *cur;
340         gchar *rcpath;
341         PrefFile *pfile;
342
343         if (!account_list) return;
344
345         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
346         if ((pfile = prefs_write_open(rcpath)) == NULL) {
347                 g_free(rcpath);
348                 return;
349         }
350         g_free(rcpath);
351
352         for (cur = account_list; cur != NULL; cur = cur->next) {
353                 tmp_ac_prefs = *(PrefsAccount *)cur->data;
354                 if (fprintf(pfile->fp, "[Account: %d]\n",
355                             tmp_ac_prefs.account_id) <= 0 ||
356                     prefs_write_param(param, pfile->fp) < 0) {
357                         g_warning(_("failed to write configuration to file\n"));
358                         prefs_write_close_revert(pfile);
359                         return;
360                 }
361                 if (cur->next) {
362                         if (fputc('\n', pfile->fp) == EOF) {
363                                 FILE_OP_ERROR(rcpath, "fputc");
364                                 prefs_write_close_revert(pfile);
365                                 return;
366                         }
367                 }
368         }
369
370         if (prefs_write_close(pfile) < 0)
371                 g_warning(_("failed to write configuration to file\n"));
372 }
373
374 void prefs_account_free(PrefsAccount *ac_prefs)
375 {
376         if (!ac_prefs) return;
377
378         tmp_ac_prefs = *ac_prefs;
379         prefs_free(param);
380 }
381
382 static gint prefs_account_get_new_id(void)
383 {
384         GList *ac_list;
385         PrefsAccount *ac;
386         static gint last_id = 0;
387
388         for (ac_list = account_get_list(); ac_list != NULL;
389              ac_list = ac_list->next) {
390                 ac = (PrefsAccount *)ac_list->data;
391                 if (last_id < ac->account_id)
392                         last_id = ac->account_id;
393         }
394
395         return last_id + 1;
396 }
397
398 PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs)
399 {
400         gboolean new_account = FALSE;
401
402         debug_print(_("Opening account preferences window...\n"));
403
404         cancelled = FALSE;
405
406         if (!ac_prefs) {
407                 ac_prefs = g_new0(PrefsAccount, 1);
408                 ac_prefs->account_id = prefs_account_get_new_id();
409                 new_account = TRUE;
410         }
411
412         if (!dialog.window) {
413                 prefs_account_create();
414         }
415
416         manage_window_set_transient(GTK_WINDOW(dialog.window));
417         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
418         gtk_widget_grab_focus(dialog.ok_btn);
419
420         tmp_ac_prefs = *ac_prefs;
421
422         if (new_account) {
423                 PrefsAccount *def_ac;
424                 gchar *buf;
425
426                 prefs_set_dialog_to_default(param);
427                 buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
428                 gtk_entry_set_text(GTK_ENTRY(basic.acname_entry), buf);
429                 g_free(buf);
430                 def_ac = account_get_default();
431                 if (def_ac) {
432                         gtk_entry_set_text(GTK_ENTRY(basic.name_entry),
433                                            def_ac->name ? def_ac->name : "");
434                         gtk_entry_set_text(GTK_ENTRY(basic.addr_entry),
435                                            def_ac->address ? def_ac->address : "");
436                         gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
437                                            def_ac->organization ? def_ac->organization : "");
438                 }
439                 gtk_window_set_title(GTK_WINDOW(dialog.window),
440                                      _("Preferences for new account"));
441                 gtk_widget_hide(dialog.apply_btn);
442         } else {
443                 prefs_set_dialog(param);
444                 gtk_window_set_title(GTK_WINDOW(dialog.window),
445                                      _("Preferences for each account"));
446                 gtk_widget_show(dialog.apply_btn);
447         }
448
449         gtk_widget_show(dialog.window);
450         gtk_main();
451         gtk_widget_hide(dialog.window);
452
453         if (cancelled && new_account) {
454                 g_free(ac_prefs);
455                 return NULL;
456         } else {
457                 *ac_prefs = tmp_ac_prefs;
458                 return ac_prefs;
459         }
460 }
461
462 static void prefs_account_create(void)
463 {
464         gint page = 0;
465
466         debug_print(_("Creating account preferences window...\n"));
467
468         /* create dialog */
469         prefs_dialog_create(&dialog);
470         gtk_signal_connect(GTK_OBJECT(dialog.window), "delete_event",
471                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
472         gtk_signal_connect(GTK_OBJECT(dialog.window), "key_press_event",
473                            GTK_SIGNAL_FUNC(prefs_account_key_pressed), NULL);
474         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_in_event",
475                            GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
476         gtk_signal_connect(GTK_OBJECT(dialog.window), "focus_out_event",
477                            GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
478         gtk_signal_connect(GTK_OBJECT(dialog.ok_btn), "clicked",
479                            GTK_SIGNAL_FUNC(prefs_account_ok), NULL);
480         gtk_signal_connect(GTK_OBJECT(dialog.apply_btn), "clicked",
481                            GTK_SIGNAL_FUNC(prefs_account_apply), NULL);
482         gtk_signal_connect(GTK_OBJECT(dialog.cancel_btn), "clicked",
483                            GTK_SIGNAL_FUNC(prefs_account_cancel), NULL);
484
485         prefs_account_basic_create();
486         SET_NOTEBOOK_LABEL(dialog.notebook, _("Basic"), page++);
487         prefs_account_receive_create();
488         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"), page++);
489         prefs_account_send_create();
490         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"), page++);
491         prefs_account_compose_create();
492         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"), page++);
493 #if USE_GPGME
494         prefs_account_privacy_create();
495         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"), page++);
496 #endif /* USE_GPGME */
497         prefs_account_advanced_create();
498         SET_NOTEBOOK_LABEL(dialog.notebook, _("Advanced"), page++);
499
500         gtk_widget_show_all(dialog.window);
501 }
502
503 #define SET_ACTIVATE(menuitem) \
504 { \
505         gtk_signal_connect(GTK_OBJECT(menuitem), "activate", \
506                            GTK_SIGNAL_FUNC(prefs_account_protocol_activated), \
507                            NULL); \
508 }
509
510 static void prefs_account_basic_create(void)
511 {
512         GtkWidget *vbox1;
513         GtkWidget *hbox;
514         GtkWidget *label;
515         GtkWidget *acname_entry;
516         GtkWidget *default_chkbtn;
517         GtkWidget *frame1;
518         GtkWidget *table1;
519         GtkWidget *name_entry;
520         GtkWidget *addr_entry;
521         GtkWidget *org_entry;
522
523         GtkWidget *serv_frame;
524         GtkWidget *vbox2;
525         GtkWidget *optmenu;
526         GtkWidget *optmenu_menu;
527         GtkWidget *menuitem;
528         GtkWidget *inbox_label;
529         GtkWidget *inbox_entry;
530         GtkWidget *serv_table;
531         GtkWidget *recvserv_label;
532         GtkWidget *smtpserv_label;
533         GtkWidget *nntpserv_label;
534         GtkWidget *recvserv_entry;
535         GtkWidget *smtpserv_entry;
536         GtkWidget *nntpserv_entry;
537         GtkWidget *uid_label;
538         GtkWidget *pass_label;
539         GtkWidget *uid_entry;
540         GtkWidget *pass_entry;
541
542         vbox1 = gtk_vbox_new (FALSE, VSPACING);
543         gtk_widget_show (vbox1);
544         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
545         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
546
547         hbox = gtk_hbox_new (FALSE, 8);
548         gtk_widget_show (hbox);
549         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
550
551         label = gtk_label_new (_("Name of this account"));
552         gtk_widget_show (label);
553         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
554
555         acname_entry = gtk_entry_new ();
556         gtk_widget_show (acname_entry);
557         gtk_widget_set_usize (acname_entry, DEFAULT_ENTRY_WIDTH, -1);
558         gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
559
560         default_chkbtn = gtk_check_button_new_with_label (_("Usually used"));
561         gtk_widget_show (default_chkbtn);
562         gtk_box_pack_end (GTK_BOX (hbox), default_chkbtn, FALSE, FALSE, 0);
563
564         PACK_FRAME (vbox1, frame1, _("Personal information"));
565
566         table1 = gtk_table_new (3, 2, FALSE);
567         gtk_widget_show (table1);
568         gtk_container_add (GTK_CONTAINER (frame1), table1);
569         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
570         gtk_table_set_row_spacings (GTK_TABLE (table1), VSPACING_NARROW);
571         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
572
573         label = gtk_label_new (_("Full name"));
574         gtk_widget_show (label);
575         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 0, 1,
576                           GTK_FILL, 0, 0, 0);
577         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
578
579         label = gtk_label_new (_("Mail address"));
580         gtk_widget_show (label);
581         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 1, 2,
582                           GTK_FILL, 0, 0, 0);
583         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
584
585         label = gtk_label_new (_("Organization"));
586         gtk_widget_show (label);
587         gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 2, 3,
588                           GTK_FILL, 0, 0, 0);
589         gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
590
591         name_entry = gtk_entry_new ();
592         gtk_widget_show (name_entry);
593         gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
594                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
595                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
596
597         addr_entry = gtk_entry_new ();
598         gtk_widget_show (addr_entry);
599         gtk_table_attach (GTK_TABLE (table1), addr_entry, 1, 2, 1, 2,
600                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
601                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
602
603         org_entry = gtk_entry_new ();
604         gtk_widget_show (org_entry);
605         gtk_table_attach (GTK_TABLE (table1), org_entry, 1, 2, 2, 3,
606                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
607                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
608
609         PACK_FRAME (vbox1, serv_frame, _("Server information"));
610
611         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
612         gtk_widget_show (vbox2);
613         gtk_container_add (GTK_CONTAINER (serv_frame), vbox2);
614         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
615
616         hbox = gtk_hbox_new (FALSE, 8);
617         gtk_widget_show (hbox);
618         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
619
620         label = gtk_label_new (_("Protocol"));
621         gtk_widget_show (label);
622         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
623
624         optmenu = gtk_option_menu_new ();
625         gtk_widget_show (optmenu);
626         gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
627
628         optmenu_menu = gtk_menu_new ();
629
630         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (normal)"),  A_POP3);
631         SET_ACTIVATE (menuitem);
632         MENUITEM_ADD (optmenu_menu, menuitem, _("POP3 (APOP auth)"),  A_APOP);
633         SET_ACTIVATE (menuitem);
634         MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
635         SET_ACTIVATE (menuitem);
636         MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
637         SET_ACTIVATE (menuitem);
638         MENUITEM_ADD (optmenu_menu, menuitem, _("None (local)"), A_LOCAL);
639         SET_ACTIVATE (menuitem);
640
641         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
642
643         inbox_label = gtk_label_new (_("Inbox"));
644         gtk_widget_show (inbox_label);
645         gtk_box_pack_start (GTK_BOX (hbox), inbox_label, FALSE, FALSE, 0);
646
647         inbox_entry = gtk_entry_new ();
648         gtk_widget_show (inbox_entry);
649         gtk_widget_set_usize (inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
650         gtk_box_pack_start (GTK_BOX (hbox), inbox_entry, TRUE, TRUE, 0);
651
652         serv_table = gtk_table_new (5, 4, FALSE);
653         gtk_widget_show (serv_table);
654         gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
655         gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
656         gtk_table_set_col_spacings (GTK_TABLE (serv_table), 8);
657
658         nntpserv_entry = gtk_entry_new ();
659         gtk_widget_show (nntpserv_entry);
660         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_entry, 1, 4, 0, 1,
661                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
662                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
663         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 0, 0);
664
665         recvserv_entry = gtk_entry_new ();
666         gtk_widget_show (recvserv_entry);
667         gtk_table_attach (GTK_TABLE (serv_table), recvserv_entry, 1, 4, 1, 2,
668                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
669                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
670
671         smtpserv_entry = gtk_entry_new ();
672         gtk_widget_show (smtpserv_entry);
673         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_entry, 1, 4, 2, 3,
674                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
675                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
676
677         uid_entry = gtk_entry_new ();
678         gtk_widget_show (uid_entry);
679         gtk_widget_set_usize (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
680         gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 4, 5,
681                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
682                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
683
684         pass_entry = gtk_entry_new ();
685         gtk_widget_show (pass_entry);
686         gtk_widget_set_usize (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
687         gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 3, 4, 4, 5,
688                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
689                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
690         gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
691
692         nntpserv_label = gtk_label_new (_("News server"));
693         gtk_widget_show (nntpserv_label);
694         gtk_table_attach (GTK_TABLE (serv_table), nntpserv_label, 0, 1, 0, 1,
695                           GTK_FILL, 0, 0, 0);
696         gtk_misc_set_alignment (GTK_MISC (nntpserv_label), 1, 0.5);
697
698         recvserv_label = gtk_label_new (_("Server for receiving"));
699         gtk_widget_show (recvserv_label);
700         gtk_table_attach (GTK_TABLE (serv_table), recvserv_label, 0, 1, 1, 2,
701                           GTK_FILL, 0, 0, 0);
702         gtk_misc_set_alignment (GTK_MISC (recvserv_label), 1, 0.5);
703
704         smtpserv_label = gtk_label_new (_("SMTP server (send)"));
705         gtk_widget_show (smtpserv_label);
706         gtk_table_attach (GTK_TABLE (serv_table), smtpserv_label, 0, 1, 2, 3,
707                           GTK_FILL, 0, 0, 0);
708         gtk_misc_set_alignment (GTK_MISC (smtpserv_label), 1, 0.5);
709         gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0);
710
711         uid_label = gtk_label_new (_("User ID"));
712         gtk_widget_show (uid_label);
713         gtk_table_attach (GTK_TABLE (serv_table), uid_label, 0, 1, 4, 5,
714                           GTK_FILL, 0, 0, 0);
715         gtk_misc_set_alignment (GTK_MISC (uid_label), 1, 0.5);
716
717         pass_label = gtk_label_new (_("Password"));
718         gtk_widget_show (pass_label);
719         gtk_table_attach (GTK_TABLE (serv_table), pass_label, 2, 3, 4, 5,
720                           0, 0, 0, 0);
721
722         basic.acname_entry   = acname_entry;
723         basic.default_chkbtn = default_chkbtn;
724
725         basic.name_entry = name_entry;
726         basic.addr_entry = addr_entry;
727         basic.org_entry  = org_entry;
728
729         basic.serv_frame       = serv_frame;
730         basic.serv_table       = serv_table;
731         basic.protocol_optmenu = optmenu;
732         basic.inbox_label      = inbox_label;
733         basic.inbox_entry      = inbox_entry;
734         basic.recvserv_label   = recvserv_label;
735         basic.recvserv_entry   = recvserv_entry;
736         basic.smtpserv_label   = smtpserv_label;
737         basic.smtpserv_entry   = smtpserv_entry;
738         basic.nntpserv_label   = nntpserv_label;
739         basic.nntpserv_entry   = nntpserv_entry;
740         basic.uid_label        = uid_label;
741         basic.pass_label       = pass_label;
742         basic.uid_entry        = uid_entry;
743         basic.pass_entry       = pass_entry;
744 }
745
746 static void prefs_account_receive_create(void)
747 {
748         GtkWidget *vbox1;
749         GtkWidget *frame1;
750         GtkWidget *vbox2;
751         GtkWidget *rmmail_chkbtn;
752         GtkWidget *getall_chkbtn;
753         GtkWidget *recvatgetall_chkbtn;
754         GtkWidget *filter_on_recv_chkbtn;
755
756         vbox1 = gtk_vbox_new (FALSE, VSPACING);
757         gtk_widget_show (vbox1);
758         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
759         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
760
761         PACK_FRAME (vbox1, frame1, _("POP3"));
762
763         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
764         gtk_widget_show (vbox2);
765         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
766         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
767
768         PACK_CHECK_BUTTON (vbox2, rmmail_chkbtn,
769                            _("Remove messages on server when received"));
770         PACK_CHECK_BUTTON (vbox2, getall_chkbtn,
771                            _("Receive all messages on server"));
772         PACK_CHECK_BUTTON (vbox2, recvatgetall_chkbtn,
773                            _("Receive at getting from all accounts"));
774         PACK_CHECK_BUTTON (vbox2, filter_on_recv_chkbtn,
775                            _("Filter messages on receiving"));
776
777         receive.pop3_frame            = frame1;
778         receive.rmmail_chkbtn         = rmmail_chkbtn;
779         receive.getall_chkbtn         = getall_chkbtn;
780         receive.recvatgetall_chkbtn   = recvatgetall_chkbtn;
781         receive.filter_on_recv_chkbtn = filter_on_recv_chkbtn;
782 }
783
784 static void prefs_account_send_create(void)
785 {
786         GtkWidget *vbox1;
787         GtkWidget *vbox2;
788         GtkWidget *frame;
789         GtkWidget *date_chkbtn;
790         GtkWidget *msgid_chkbtn;
791         GtkWidget *hbox;
792         GtkWidget *customhdr_chkbtn;
793         GtkWidget *customhdr_edit_btn;
794         GtkWidget *frame2;
795         GtkWidget *table;
796         GtkWidget *autocc_chkbtn;
797         GtkWidget *autocc_entry;
798         GtkWidget *autobcc_chkbtn;
799         GtkWidget *autobcc_entry;
800         GtkWidget *autoreplyto_chkbtn;
801         GtkWidget *autoreplyto_entry;
802         GtkWidget *frame3;
803         GtkWidget *vbox3;
804         GtkWidget *smtp_auth_chkbtn;
805         GtkWidget *pop_bfr_smtp_chkbtn;
806
807         vbox1 = gtk_vbox_new (FALSE, VSPACING);
808         gtk_widget_show (vbox1);
809         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
810         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
811
812         PACK_FRAME (vbox1, frame, _("Header"));
813
814         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
815         gtk_widget_show (vbox2);
816         gtk_container_add (GTK_CONTAINER (frame), vbox2);
817         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
818
819         PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date header field"));
820         PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
821
822         hbox = gtk_hbox_new (FALSE, 12);
823         gtk_widget_show (hbox);
824         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
825
826         //      gtk_widget_set_sensitive(hbox, FALSE);
827
828         PACK_CHECK_BUTTON (hbox, customhdr_chkbtn,
829                            _("Add user-defined header"));
830
831         customhdr_edit_btn = gtk_button_new_with_label (_(" Edit... "));
832         gtk_widget_show (customhdr_edit_btn);
833         gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
834                             FALSE, FALSE, 0);
835
836         SET_TOGGLE_SENSITIVITY (customhdr_chkbtn, customhdr_edit_btn);
837
838         PACK_FRAME (vbox1, frame2, _("Automatically set following addresses"));
839
840         table =  gtk_table_new (3, 2, FALSE);
841         gtk_widget_show (table);
842         gtk_container_add (GTK_CONTAINER (frame2), table);
843         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
844         gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW);
845         gtk_table_set_col_spacings (GTK_TABLE (table), 8);
846
847         autocc_chkbtn = gtk_check_button_new_with_label (_("Cc"));
848         gtk_widget_show (autocc_chkbtn);
849         gtk_table_attach (GTK_TABLE (table), autocc_chkbtn, 0, 1, 0, 1,
850                           GTK_FILL, 0, 0, 0);
851
852         autocc_entry = gtk_entry_new ();
853         gtk_widget_show (autocc_entry);
854         gtk_table_attach (GTK_TABLE (table), autocc_entry, 1, 2, 0, 1,
855                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
856                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
857
858         SET_TOGGLE_SENSITIVITY (autocc_chkbtn, autocc_entry);
859
860         autobcc_chkbtn = gtk_check_button_new_with_label (_("Bcc"));
861         gtk_widget_show (autobcc_chkbtn);
862         gtk_table_attach (GTK_TABLE (table), autobcc_chkbtn, 0, 1, 1, 2,
863                           GTK_FILL, 0, 0, 0);
864
865         autobcc_entry = gtk_entry_new ();
866         gtk_widget_show (autobcc_entry);
867         gtk_table_attach (GTK_TABLE (table), autobcc_entry, 1, 2, 1, 2,
868                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
869                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
870
871         SET_TOGGLE_SENSITIVITY (autobcc_chkbtn, autobcc_entry);
872
873         autoreplyto_chkbtn = gtk_check_button_new_with_label (_("Reply-To"));
874         gtk_widget_show (autoreplyto_chkbtn);
875         gtk_table_attach (GTK_TABLE (table), autoreplyto_chkbtn, 0, 1, 2, 3,
876                           GTK_FILL, 0, 0, 0);
877
878         autoreplyto_entry = gtk_entry_new ();
879         gtk_widget_show (autoreplyto_entry);
880         gtk_table_attach (GTK_TABLE (table), autoreplyto_entry, 1, 2, 2, 3,
881                           GTK_EXPAND | GTK_SHRINK | GTK_FILL,
882                           GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
883
884         SET_TOGGLE_SENSITIVITY (autoreplyto_chkbtn, autoreplyto_entry);
885
886         PACK_FRAME (vbox1, frame3, _("Authentication"));
887
888         vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
889         gtk_widget_show (vbox3);
890         gtk_container_add (GTK_CONTAINER (frame3), vbox3);
891         gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
892
893         PACK_CHECK_BUTTON (vbox3, smtp_auth_chkbtn,
894                 _("SMTP Authentication (SMTP AUTH)"));
895         PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_chkbtn,
896                 _("Authenticate with POP3 before sending"));
897         gtk_widget_set_sensitive(pop_bfr_smtp_chkbtn, FALSE);
898
899         gtk_signal_connect(GTK_OBJECT(customhdr_edit_btn), "clicked",
900                            GTK_SIGNAL_FUNC(prefs_account_customhdr_edit),
901                            NULL);
902
903         send.date_chkbtn      = date_chkbtn;
904         send.msgid_chkbtn     = msgid_chkbtn;
905         send.customhdr_chkbtn = customhdr_chkbtn;
906
907         send.autocc_chkbtn      = autocc_chkbtn;
908         send.autocc_entry       = autocc_entry;
909         send.autobcc_chkbtn     = autobcc_chkbtn;
910         send.autobcc_entry      = autobcc_entry;
911         send.autoreplyto_chkbtn = autoreplyto_chkbtn;
912         send.autoreplyto_entry  = autoreplyto_entry;
913
914         send.smtp_auth_chkbtn    = smtp_auth_chkbtn;
915         send.pop_bfr_smtp_chkbtn = pop_bfr_smtp_chkbtn;
916 }
917
918 static void prefs_account_compose_create(void)
919 {
920         GtkWidget *vbox1;
921         GtkWidget *hbox;
922         GtkWidget *label;
923         GtkWidget *sigpath_entry;
924
925         vbox1 = gtk_vbox_new (FALSE, VSPACING);
926         gtk_widget_show (vbox1);
927         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
928         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
929
930         hbox = gtk_hbox_new (FALSE, 8);
931         gtk_widget_show (hbox);
932         gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
933
934         label = gtk_label_new (_("Signature file"));
935         gtk_widget_show (label);
936         gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
937
938         sigpath_entry = gtk_entry_new ();
939         gtk_widget_show (sigpath_entry);
940         gtk_box_pack_start (GTK_BOX (hbox), sigpath_entry, TRUE, TRUE, 0);
941
942         compose.sigpath_entry = sigpath_entry;
943 }
944
945 #if USE_GPGME
946 static void prefs_account_privacy_create(void)
947 {
948         GtkWidget *vbox1;
949         GtkWidget *frame1;
950         GtkWidget *vbox2;
951         GtkWidget *hbox1;
952         GtkWidget *label;
953         GtkWidget *defaultkey_radiobtn;
954         GtkWidget *emailkey_radiobtn;
955         GtkWidget *customkey_radiobtn;
956         GtkWidget *customkey_entry;
957
958         vbox1 = gtk_vbox_new (FALSE, VSPACING);
959         gtk_widget_show (vbox1);
960         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
961         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
962
963         PACK_FRAME (vbox1, frame1, _("Sign key"));
964
965         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
966         gtk_widget_show (vbox2);
967         gtk_container_add (GTK_CONTAINER (frame1), vbox2);
968         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
969
970         defaultkey_radiobtn = gtk_radio_button_new_with_label
971                 (NULL, _("Use default GnuPG key"));
972         gtk_widget_show (defaultkey_radiobtn);
973         gtk_box_pack_start (GTK_BOX (vbox2), defaultkey_radiobtn,
974                             FALSE, FALSE, 0);
975         gtk_object_set_user_data (GTK_OBJECT (defaultkey_radiobtn),
976                                   GINT_TO_POINTER (SIGN_KEY_DEFAULT));
977
978         emailkey_radiobtn = gtk_radio_button_new_with_label_from_widget
979                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
980                  _("Select key by your email address"));
981         gtk_widget_show (emailkey_radiobtn);
982         gtk_box_pack_start (GTK_BOX (vbox2), emailkey_radiobtn,
983                             FALSE, FALSE, 0);
984         gtk_object_set_user_data (GTK_OBJECT (emailkey_radiobtn),
985                                   GINT_TO_POINTER (SIGN_KEY_BY_FROM));
986
987         customkey_radiobtn = gtk_radio_button_new_with_label_from_widget
988                 (GTK_RADIO_BUTTON (defaultkey_radiobtn),
989                  _("Specify key manually"));
990         gtk_widget_show (customkey_radiobtn);
991         gtk_box_pack_start (GTK_BOX (vbox2), customkey_radiobtn,
992                             FALSE, FALSE, 0);
993         gtk_object_set_user_data (GTK_OBJECT (customkey_radiobtn),
994                                   GINT_TO_POINTER (SIGN_KEY_CUSTOM));
995
996         hbox1 = gtk_hbox_new (FALSE, 8);
997         gtk_widget_show (hbox1);
998         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
999
1000         label = gtk_label_new ("");
1001         gtk_widget_show (label);
1002         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1003         gtk_widget_set_usize (label, 16, -1);
1004
1005         label = gtk_label_new (_("User or key ID:"));
1006         gtk_widget_show (label);
1007         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1008
1009         customkey_entry = gtk_entry_new ();
1010         gtk_widget_show (customkey_entry);
1011         gtk_box_pack_start (GTK_BOX (hbox1), customkey_entry,
1012                             TRUE, TRUE, 0);
1013
1014         SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
1015
1016         privacy.defaultkey_radiobtn = defaultkey_radiobtn;
1017         privacy.emailkey_radiobtn = emailkey_radiobtn;
1018         privacy.customkey_radiobtn = customkey_radiobtn;
1019         privacy.customkey_entry = customkey_entry;
1020 }
1021 #endif /* USE_GPGME */
1022
1023 static void prefs_account_advanced_create(void)
1024 {
1025         GtkWidget *vbox1;
1026         GtkWidget *vbox2;
1027         GtkWidget *hbox1;
1028         GtkWidget *checkbtn_smtpport;
1029         GtkWidget *entry_smtpport;
1030         GtkWidget *hbox2;
1031         GtkWidget *checkbtn_popport;
1032         GtkWidget *entry_popport;
1033         GtkWidget *hbox3;
1034         GtkWidget *checkbtn_domain;
1035         GtkWidget *entry_domain;
1036
1037         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1038         gtk_widget_show (vbox1);
1039         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1040         gtk_container_set_border_width (GTK_CONTAINER (vbox1), BOX_BORDER);
1041
1042         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1043         gtk_widget_show (vbox2);
1044         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1045
1046         hbox1 = gtk_hbox_new (FALSE, 8);
1047         gtk_widget_show (hbox1);
1048         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
1049
1050         PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("Specify SMTP port"));
1051
1052         entry_smtpport = gtk_entry_new_with_max_length (5);
1053         gtk_widget_show (entry_smtpport);
1054         gtk_box_pack_start (GTK_BOX (hbox1), entry_smtpport, FALSE, FALSE, 0);
1055         gtk_widget_set_usize (entry_smtpport, 64, -1);
1056         SET_TOGGLE_SENSITIVITY(checkbtn_smtpport, entry_smtpport);
1057
1058         hbox2 = gtk_hbox_new (FALSE, 8);
1059         gtk_widget_show (hbox2);
1060         gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
1061
1062         PACK_CHECK_BUTTON (hbox2, checkbtn_popport, _("Specify POP3 port"));
1063
1064         entry_popport = gtk_entry_new_with_max_length (5);
1065         gtk_widget_show (entry_popport);
1066         gtk_box_pack_start (GTK_BOX (hbox2), entry_popport, FALSE, FALSE, 0);
1067         gtk_widget_set_usize (entry_popport, 64, -1);
1068         SET_TOGGLE_SENSITIVITY(checkbtn_popport, entry_popport);
1069
1070         hbox3 = gtk_hbox_new (FALSE, 8);
1071         gtk_widget_show (hbox3);
1072         gtk_box_pack_start (GTK_BOX (vbox2), hbox3, FALSE, FALSE, 0);
1073
1074         PACK_CHECK_BUTTON (hbox3, checkbtn_domain, _("Specify domain name"));
1075
1076         entry_domain = gtk_entry_new ();
1077         gtk_widget_show (entry_domain);
1078         gtk_box_pack_start (GTK_BOX (hbox3), entry_domain, TRUE, TRUE, 0);
1079         SET_TOGGLE_SENSITIVITY(checkbtn_domain, entry_domain);
1080
1081         advanced.smtpport_chkbtn        = checkbtn_smtpport;
1082         advanced.smtpport_entry         = entry_smtpport;
1083         advanced.popport_chkbtn         = checkbtn_popport;
1084         advanced.popport_entry          = entry_popport;
1085         advanced.domain_chkbtn          = checkbtn_domain;
1086         advanced.domain_entry           = entry_domain;
1087 }
1088
1089 static void prefs_account_key_pressed(GtkWidget *widget, GdkEventKey *event,
1090                                       gpointer data)
1091 {
1092         if (event && event->keyval == GDK_Escape)
1093                 prefs_account_cancel();
1094 }
1095
1096 static void prefs_account_ok(void)
1097 {
1098         if (prefs_account_apply() == 0)
1099                 gtk_main_quit();
1100 }
1101
1102 static gint prefs_account_apply(void)
1103 {
1104         RecvProtocol protocol;
1105         GtkWidget *menu;
1106         GtkWidget *menuitem;
1107
1108         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
1109         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1110         protocol = GPOINTER_TO_INT
1111                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1112
1113         if (*gtk_entry_get_text(GTK_ENTRY(basic.addr_entry)) == '\0') {
1114                 alertpanel_error(_("Mail address is not entered."));
1115                 return -1;
1116         }
1117         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_LOCAL) &&
1118             *gtk_entry_get_text(GTK_ENTRY(basic.smtpserv_entry)) == '\0') {
1119                 alertpanel_error(_("SMTP server is not entered."));
1120                 return -1;
1121         }
1122         if ((protocol == A_POP3 || protocol == A_APOP || protocol == A_LOCAL) &&
1123             *gtk_entry_get_text(GTK_ENTRY(basic.uid_entry)) == '\0') {
1124                 alertpanel_error(_("User ID is not entered."));
1125                 return -1;
1126         }
1127         if ((protocol == A_POP3 || protocol == A_APOP) &&
1128             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1129                 alertpanel_error(_("POP3 server is not entered."));
1130                 return -1;
1131         }
1132         if (protocol == A_IMAP4 &&
1133             *gtk_entry_get_text(GTK_ENTRY(basic.recvserv_entry)) == '\0') {
1134                 alertpanel_error(_("IMAP4 server is not entered."));
1135                 return -1;
1136         }
1137         if (protocol == A_NNTP &&
1138             *gtk_entry_get_text(GTK_ENTRY(basic.nntpserv_entry)) == '\0') {
1139                 alertpanel_error(_("NNTP server is not entered."));
1140                 return -1;
1141         }
1142
1143         prefs_set_data_from_dialog(param);
1144         return 0;
1145 }
1146
1147 static void prefs_account_cancel(void)
1148 {
1149         cancelled = TRUE;
1150         gtk_main_quit();
1151 }
1152
1153 static void prefs_account_customhdr_edit(void)
1154 {
1155         prefs_headers_open(&tmp_ac_prefs);
1156 }
1157
1158 #if USE_GPGME
1159
1160 static void prefs_account_sign_key_set_data_from_radiobtn(PrefParam *pparam)
1161 {
1162         GtkRadioButton *radiobtn;
1163         GSList *group;
1164
1165         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1166         group = gtk_radio_button_group (radiobtn);
1167         while (group != NULL) {
1168                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1169                 if (gtk_toggle_button_get_active (btn)) {
1170                         *((SignKeyType *)pparam->data) = GPOINTER_TO_INT
1171                                 (gtk_object_get_user_data (GTK_OBJECT (btn)));
1172                         break;
1173                 }
1174                 group = group->next;
1175         }
1176 }
1177
1178 static void prefs_account_sign_key_set_radiobtn(PrefParam *pparam)
1179 {
1180         GtkRadioButton *radiobtn;
1181         GSList *group;
1182         gpointer data;
1183
1184         data = GINT_TO_POINTER (*((RecvProtocol *)pparam->data));
1185         radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
1186         group = gtk_radio_button_group (radiobtn);
1187         while (group != NULL) {
1188                 GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
1189                 gpointer data1 = gtk_object_get_user_data (GTK_OBJECT (btn));
1190                 if (data1 == data) {
1191                         gtk_toggle_button_set_active (btn, TRUE);
1192                         break;
1193                 }
1194                 group = group->next;
1195         }
1196 }
1197
1198 #endif /* USE_GPGME */
1199
1200 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
1201 {
1202         GtkWidget *menu;
1203         GtkWidget *menuitem;
1204
1205         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1206         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1207         *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
1208                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1209 }
1210
1211 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
1212 {
1213         RecvProtocol protocol;
1214         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1215         GtkWidget *menu;
1216         GtkWidget *menuitem;
1217
1218         protocol = *((RecvProtocol *)pparam->data);
1219
1220         switch (protocol) {
1221         case A_POP3:
1222                 gtk_option_menu_set_history(optmenu, 0);
1223                 break;
1224         case A_APOP:
1225                 gtk_option_menu_set_history(optmenu, 1);
1226                 break;
1227         case A_IMAP4:
1228                 gtk_option_menu_set_history(optmenu, 2);
1229                 break;
1230         case A_NNTP:
1231                 gtk_option_menu_set_history(optmenu, 3);
1232                 break;
1233         case A_LOCAL:
1234                 gtk_option_menu_set_history(optmenu, 4);
1235                 break;
1236         default:
1237         }
1238
1239         menu = gtk_option_menu_get_menu(optmenu);
1240         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1241         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
1242 }
1243
1244 static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
1245 {
1246         RecvProtocol protocol;
1247
1248         protocol = GPOINTER_TO_INT
1249                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
1250
1251         switch(protocol) {
1252         case A_NNTP:
1253                 gtk_widget_set_sensitive(basic.inbox_label, FALSE);
1254                 gtk_widget_set_sensitive(basic.inbox_entry, FALSE);
1255                 gtk_widget_show(basic.nntpserv_label);
1256                 gtk_widget_show(basic.nntpserv_entry);
1257                 gtk_widget_hide(basic.recvserv_label);
1258                 gtk_widget_hide(basic.recvserv_entry);
1259                 gtk_widget_hide(basic.smtpserv_label);
1260                 gtk_widget_hide(basic.smtpserv_entry);
1261                 gtk_table_set_row_spacing (GTK_TABLE (basic.serv_table), 3, 0);
1262                 gtk_widget_set_sensitive(basic.uid_label,  FALSE);
1263                 gtk_widget_set_sensitive(basic.pass_label, FALSE);
1264                 gtk_widget_set_sensitive(basic.uid_entry,  FALSE);
1265                 gtk_widget_set_sensitive(basic.pass_entry, FALSE);
1266                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1267                 break;
1268         case A_LOCAL:
1269                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1270                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1271                 gtk_widget_hide(basic.nntpserv_label);
1272                 gtk_widget_hide(basic.nntpserv_entry);
1273                 gtk_widget_set_sensitive(basic.recvserv_label, FALSE);
1274                 gtk_widget_set_sensitive(basic.recvserv_entry, FALSE);
1275                 gtk_widget_show(basic.recvserv_label);
1276                 gtk_widget_show(basic.recvserv_entry);
1277                 gtk_widget_show(basic.smtpserv_label);
1278                 gtk_widget_show(basic.smtpserv_entry);
1279                 gtk_table_set_row_spacing
1280                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1281                 gtk_widget_set_sensitive(basic.uid_label,  FALSE);
1282                 gtk_widget_set_sensitive(basic.pass_label, FALSE);
1283                 gtk_widget_set_sensitive(basic.uid_entry,  FALSE);
1284                 gtk_widget_set_sensitive(basic.pass_entry, FALSE);
1285                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1286                 break;
1287         case A_IMAP4:
1288                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1289                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1290                 gtk_widget_hide(basic.nntpserv_label);
1291                 gtk_widget_hide(basic.nntpserv_entry);
1292                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1293                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1294                 gtk_widget_show(basic.recvserv_label);
1295                 gtk_widget_show(basic.recvserv_entry);
1296                 gtk_widget_show(basic.smtpserv_label);
1297                 gtk_widget_show(basic.smtpserv_entry);
1298                 gtk_table_set_row_spacing
1299                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1300                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1301                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1302                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1303                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1304                 gtk_widget_set_sensitive(receive.pop3_frame, FALSE);
1305                 break;
1306         default:
1307                 gtk_widget_set_sensitive(basic.inbox_label, TRUE);
1308                 gtk_widget_set_sensitive(basic.inbox_entry, TRUE);
1309                 gtk_widget_hide(basic.nntpserv_label);
1310                 gtk_widget_hide(basic.nntpserv_entry);
1311                 gtk_widget_set_sensitive(basic.recvserv_label, TRUE);
1312                 gtk_widget_set_sensitive(basic.recvserv_entry, TRUE);
1313                 gtk_widget_show(basic.recvserv_label);
1314                 gtk_widget_show(basic.recvserv_entry);
1315                 gtk_widget_show(basic.smtpserv_label);
1316                 gtk_widget_show(basic.smtpserv_entry);
1317                 gtk_table_set_row_spacing
1318                         (GTK_TABLE (basic.serv_table), 3, VSPACING_NARROW);
1319                 gtk_widget_set_sensitive(basic.uid_label,  TRUE);
1320                 gtk_widget_set_sensitive(basic.pass_label, TRUE);
1321                 gtk_widget_set_sensitive(basic.uid_entry,  TRUE);
1322                 gtk_widget_set_sensitive(basic.pass_entry, TRUE);
1323                 gtk_widget_set_sensitive(receive.pop3_frame, TRUE);
1324                 break;
1325         }
1326
1327         gtk_widget_queue_resize(basic.serv_frame);
1328 }