diff options
-rw-r--r-- | mail/ChangeLog | 8 | ||||
-rw-r--r-- | mail/mail-config.c | 321 |
2 files changed, 282 insertions, 47 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index e5d63b69f7..f3c517850d 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,11 @@ +2000-05-31 Jeffrey Stedfast <fejj@helixcode.com> + + * mail-config.c: Configuration dialog now allows + adding/editing/deleting of Identities (which leaves + adding/editing/deleting of sources left to implement). + The data is also saved when the dialog is exited via + the OK button. + 2000-05-31 Dan Winship <danw@helixcode.com> * mail-format.c (mail_format_mime_message): Initialize the "urls" diff --git a/mail/mail-config.c b/mail/mail-config.c index 9223a9da75..f4fb72e586 100644 --- a/mail/mail-config.c +++ b/mail/mail-config.c @@ -80,9 +80,9 @@ static GdkImlibImage *load_image (const char *name); static void prepare_first (GnomeDruidPage *page, GnomeDruid *druid, gpointer user_data); static void cancel (GnomeDruid *druid, gpointer window); static void finish (GnomeDruidPage *page, gpointer arg1, gpointer window); -static void on_cmdIdentityAdd_clicked (GtkButton *button, gpointer user_data); -static void on_cmdIdentityEdit_clicked (GtkButton *button, gpointer user_data); -static void on_cmdIdentityDelete_clicked (GtkButton *button, gpointer user_data); +static void on_cmdIdentityAdd_clicked (GtkWidget *widget, gpointer user_data); +static void on_cmdIdentityEdit_clicked (GtkWidget *widget, gpointer user_data); +static void on_cmdIdentityDelete_clicked (GtkWidget *widget, gpointer user_data); static void on_cmdSourcesAdd_clicked (GtkButton *button, gpointer user_data); static void on_cmdSourcesEdit_clicked (GtkButton *button, gpointer user_data); static void on_cmdSourcesDelete_clicked (GtkButton *button, gpointer user_data); @@ -182,7 +182,8 @@ identity_note_doneness (GtkObject *page, gpointer user_data) GtkEntry *entry; char *data; - exit_button = gtk_object_get_data (page, "exit_button"); + if (!(exit_button = gtk_object_get_data (page, "exit_button"))) + exit_button = gtk_object_get_data (page, "ok_button"); entry = gtk_object_get_data (page, "name"); data = gtk_entry_get_text (entry); @@ -227,16 +228,19 @@ static void destroy_identity (GtkObject *table, gpointer idrecp) { struct identity_record *idrec = idrecp; - GtkEditable *editable; + GtkWidget *entry; + + entry = gtk_object_get_data (table, "name"); + idrec->name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + + entry = gtk_object_get_data (table, "addr"); + idrec->address = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + + entry = gtk_object_get_data (table, "org"); + idrec->organization = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); - editable = gtk_object_get_data (table, "name"); - idrec->name = gtk_editable_get_chars (editable, 0, -1); - editable = gtk_object_get_data (table, "addr"); - idrec->address = gtk_editable_get_chars (editable, 0, -1); - editable = gtk_object_get_data (table, "org"); - idrec->organization = gtk_editable_get_chars (editable, 0, -1); - editable = gtk_object_get_data (table, "sig"); - idrec->sigfile = gtk_editable_get_chars (editable, 0, -1); + entry = gtk_object_get_data (table, "sig"); + idrec->sigfile = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); } static void @@ -247,7 +251,7 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) GtkWidget *name_entry, *addr_entry, *org_entry, *sig_entry; GtkWidget *hsep; char *user; - struct passwd *pw; + struct passwd *pw = NULL; html = html_new (FALSE); put_html (GTK_HTML (html), @@ -258,6 +262,7 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) gtk_box_pack_start (GTK_BOX (vbox), html->parent, FALSE, TRUE, 0); table = gtk_table_new (5, 2, FALSE); + gtk_widget_set_name (table, "table"); gtk_table_set_row_spacings (GTK_TABLE (table), 10); gtk_table_set_col_spacings (GTK_TABLE (table), 6); gtk_container_set_border_width (GTK_CONTAINER (table), 8); @@ -275,18 +280,22 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "name", name_entry); - user = getenv ("USER"); - if (user) - pw = getpwnam (user); - else - pw = getpwuid (getuid ()); - if (pw && pw->pw_gecos && *pw->pw_gecos) { + if (!idrec || !idrec->name) { + user = getenv ("USER"); + if (user) + pw = getpwnam (user); + else + pw = getpwuid (getuid ()); + } + if ((idrec && idrec->name) || (pw && pw->pw_gecos && *pw->pw_gecos)) { char *name; - int pos = 0; - name = g_strndup (pw->pw_gecos, strcspn (pw->pw_gecos, ",")); - gtk_editable_insert_text (GTK_EDITABLE (name_entry), - name, strlen (name), &pos); + if (idrec && idrec->name) + name = g_strdup (idrec->name); + else + name = g_strndup (pw->pw_gecos, strcspn (pw->pw_gecos, ",")); + gtk_entry_set_text (GTK_ENTRY (name_entry), name); + g_free (name); } addr = gtk_label_new (_("Email address:")); @@ -295,6 +304,8 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) gtk_misc_set_alignment (GTK_MISC (addr), 1, 0.5); addr_entry = gtk_entry_new (); + if (idrec && idrec->address) + gtk_entry_set_text (GTK_ENTRY (addr_entry), idrec->address); gtk_table_attach (GTK_TABLE (table), addr_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "addr", addr_entry); @@ -316,6 +327,8 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) gtk_misc_set_alignment (GTK_MISC (org), 1, 0.5); org_entry = gtk_entry_new (); + if (idrec && idrec->organization) + gtk_entry_set_text (GTK_ENTRY (org_entry), idrec->organization); gtk_table_attach (GTK_TABLE (table), org_entry, 1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 0, 0); gtk_object_set_data (GTK_OBJECT (vbox), "org", org_entry); @@ -326,6 +339,8 @@ create_identity_page (GtkWidget *vbox, struct identity_record *idrec) gtk_misc_set_alignment (GTK_MISC (sig), 1, 0); sig_entry = gnome_file_entry_new (NULL, _("Signature File")); + if (idrec && idrec->sigfile) + gtk_entry_set_text (GTK_ENTRY (sig_entry), idrec->sigfile); gtk_table_attach (GTK_TABLE (table), sig_entry, 1, 2, 4, 5, GTK_FILL, 0, 0, 0); gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (sig_entry), @@ -496,8 +511,10 @@ set_service_url (GtkObject *table, char *url_str) ex = camel_exception_new (); url = camel_url_new (url_str, ex); - if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) + if (camel_exception_get_id (ex) != CAMEL_EXCEPTION_NONE) { + camel_exception_free (ex); return; + } editable = gtk_object_get_data (table, "user_entry"); if (editable && url) @@ -512,9 +529,9 @@ set_service_url (GtkObject *table, char *url_str) gtk_entry_set_text (GTK_ENTRY (editable), url->path); /* How are we gonna do this? */ -#if 0 auth_optionmenu = gtk_object_get_data (table, "auth_optionmenu"); if (auth_optionmenu) { +#if 0 GtkWidget *menu, *item; CamelServiceAuthType *authtype; @@ -526,8 +543,9 @@ set_service_url (GtkObject *table, char *url_str) if (*authtype->authproto) url->authmech = g_strdup (authtype->authproto); } - } #endif + } + camel_exception_free (ex); camel_url_free (url); } @@ -999,12 +1017,10 @@ cancel (GnomeDruid *druid, gpointer window) } static void -finish (GnomeDruidPage *page, gpointer arg1, gpointer window) +write_config (void) { char *path; - cancel (arg1, window); - /* According to the API docs, there's an easier way to do this, * except that it doesn't work. Anyway, this will be replaced * by GConf eventually. FIXME. @@ -1041,6 +1057,13 @@ finish (GnomeDruidPage *page, gpointer arg1, gpointer window) gnome_config_sync (); } +static void +finish (GnomeDruidPage *page, gpointer arg1, gpointer window) +{ + cancel (arg1, window); + write_config(); +} + void mail_config_druid (void) { @@ -1185,22 +1208,214 @@ mail_config_druid (void) gtk_main (); } +static gint identity_row = -1; +static gint source_row = -1; + + +struct identity_dialog_data { + GtkWidget *clist; + struct identity_record *idrec; + gboolean new_entry; +}; + +static void +on_cmdIdentityConfigDialogOK_clicked (GtkWidget *dialog, gpointer user_data) +{ + struct identity_dialog_data *data = user_data; + GtkWidget *vbox = gtk_object_get_data (GTK_OBJECT (dialog), "vbox"); + + destroy_identity (GTK_OBJECT (vbox), data->idrec); + + gtk_clist_set_text (GTK_CLIST (data->clist), identity_row, 0, data->idrec->name); + gtk_clist_set_text (GTK_CLIST (data->clist), identity_row, 1, data->idrec->address); + gtk_clist_set_text (GTK_CLIST (data->clist), identity_row, 2, data->idrec->organization); + gtk_clist_set_text (GTK_CLIST (data->clist), identity_row, 3, data->idrec->sigfile); + + gtk_clist_set_row_data (GTK_CLIST (data->clist), identity_row, + g_memdup (data->idrec, sizeof (struct identity_record))); +} + +static void +on_cmdIdentityConfigDialogCancel_clicked (GtkWidget *dialog, gpointer user_data) +{ + struct identity_dialog_data *data = user_data; + + if (data && data->new_entry) { + gtk_clist_remove (GTK_CLIST (data->clist), identity_row); + identity_row = -1; + } +} + +static void +on_IdentityConfigDialogButton_clicked (GnomeDialog *dialog, int button, gpointer user_data) +{ + switch (button) { + case 0: /* OK clicked */ + g_print ("OK clicked\n"); + on_cmdIdentityConfigDialogOK_clicked (GTK_WIDGET (dialog), user_data); + break; + case 1: /* Cancel clicked */ + g_print ("Cancel clicked\n"); + on_cmdIdentityConfigDialogCancel_clicked (GTK_WIDGET (dialog), user_data); + break; + } + + if (button != -1) + gnome_dialog_close (dialog); +} + +static GtkWidget* +create_identity_config_dialog (gboolean edit_mode, struct identity_record *idrecp, GtkWidget *clist) +{ + static GtkWidget *config_dialog; + GtkWidget *dialog_vbox1; + GtkWidget *dialog_action_area1; + GtkWidget *cmdConfigDialogOK; + GtkWidget *cmdConfigDialogCancel; + GtkWidget *vbox; + struct identity_dialog_data *data = NULL; + + if (edit_mode) + config_dialog = gnome_dialog_new (_("Edit Identity"), NULL); + else + config_dialog = gnome_dialog_new (_("Add Identity"), NULL); + gtk_window_set_modal (GTK_WINDOW (config_dialog), TRUE); + gtk_widget_set_name (config_dialog, "config_dialog"); + gtk_object_set_data (GTK_OBJECT (config_dialog), "config_dialog", config_dialog); + gtk_window_set_policy (GTK_WINDOW (config_dialog), FALSE, FALSE, FALSE); + + dialog_vbox1 = GNOME_DIALOG (config_dialog)->vbox; + gtk_widget_set_name (dialog_vbox1, "dialog_vbox1"); + gtk_object_set_data (GTK_OBJECT (config_dialog), "dialog_vbox1", dialog_vbox1); + gtk_widget_show (dialog_vbox1); + + dialog_action_area1 = GNOME_DIALOG (config_dialog)->action_area; + gtk_widget_set_name (dialog_action_area1, "dialog_action_area1"); + gtk_object_set_data (GTK_OBJECT (config_dialog), "dialog_action_area1", dialog_action_area1); + gtk_widget_show (dialog_action_area1); + gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog_action_area1), 8); + + /* Create the vbox that we will pack the identity widget into */ + vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox, "vbox"); + gtk_object_set_data (GTK_OBJECT (config_dialog), "vbox", vbox); + gtk_widget_ref (vbox); + gtk_object_set_data_full (GTK_OBJECT (config_dialog), "vbox", vbox, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (vbox); + gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox, TRUE, TRUE, 0); + + gnome_dialog_append_button (GNOME_DIALOG (config_dialog), GNOME_STOCK_BUTTON_OK); + cmdConfigDialogOK = g_list_last (GNOME_DIALOG (config_dialog)->buttons)->data; + gtk_widget_set_name (cmdConfigDialogOK, "cmdConfigDialogOK"); + gtk_object_set_data (GTK_OBJECT (vbox), "ok_button", cmdConfigDialogOK); + gtk_widget_ref (cmdConfigDialogOK); + gtk_object_set_data_full (GTK_OBJECT (config_dialog), "cmdConfigDialogOK", cmdConfigDialogOK, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (cmdConfigDialogOK); + GTK_WIDGET_SET_FLAGS (cmdConfigDialogOK, GTK_CAN_DEFAULT); + gtk_widget_set_sensitive (cmdConfigDialogOK, FALSE); + + gnome_dialog_append_button (GNOME_DIALOG (config_dialog), GNOME_STOCK_BUTTON_CANCEL); + cmdConfigDialogCancel = g_list_last (GNOME_DIALOG (config_dialog)->buttons)->data; + gtk_widget_set_name (cmdConfigDialogCancel, "cmdConfigDialogCancel"); + gtk_widget_ref (cmdConfigDialogCancel); + gtk_object_set_data_full (GTK_OBJECT (config_dialog), "cmdConfigDialogCancel", cmdConfigDialogCancel, + (GtkDestroyNotify) gtk_widget_unref); + gtk_widget_show (cmdConfigDialogCancel); + GTK_WIDGET_SET_FLAGS (cmdConfigDialogCancel, GTK_CAN_DEFAULT); + + /* create/pack our Identity widget */ + create_identity_page (vbox, &idrec); + + /*gtk_signal_disconnect_by_func (GTK_OBJECT (vbox), GTK_SIGNAL_FUNC (destroy_identity), NULL);*/ + + data = g_malloc0 (sizeof (struct identity_dialog_data)); + data->clist = clist; + data->idrec = idrecp; + data->new_entry = !edit_mode; + + gtk_signal_connect(GTK_OBJECT (config_dialog), "clicked", + GTK_SIGNAL_FUNC (on_IdentityConfigDialogButton_clicked), + data); + /* + gtk_signal_connect (GTK_OBJECT (cmdConfigDialogOK), "clicked", + GTK_SIGNAL_FUNC (on_cmdIdentityConfigDialogOK_clicked), + data); + + gtk_signal_connect (GTK_OBJECT (cmdConfigDialogCancel), "clicked", + GTK_SIGNAL_FUNC (on_cmdIdentityConfigDialogCancel_clicked), + data); + */ + + return config_dialog; +} + static void -on_cmdIdentityAdd_clicked (GtkButton *button, gpointer user_data) +on_clistIdentities_select_row (GtkWidget *widget, gint row, gint column, + GdkEventButton *event, gpointer data) { + identity_row = row; +} +static void +on_clistSources_select_row (GtkWidget *widget, gint row, gint column, + GdkEventButton *event, gpointer data) +{ + source_row = row; } static void -on_cmdIdentityEdit_clicked (GtkButton *button, gpointer user_data) +on_cmdIdentityAdd_clicked (GtkWidget *widget, gpointer user_data) { + GtkWidget *dialog; + char *text[] = { "", "", "", "" }; + + gtk_clist_append (GTK_CLIST (user_data), text); + if (identity_row > -1) + gtk_clist_unselect_row (GTK_CLIST (user_data), identity_row, 0); + gtk_clist_select_row (GTK_CLIST (user_data), identity_row + 1, 0); + /* now create the editing dialog */ + dialog = create_identity_config_dialog (FALSE, &idrec, GTK_WIDGET (user_data)); + gtk_widget_show (dialog); } static void -on_cmdIdentityDelete_clicked (GtkButton *button, gpointer user_data) +on_cmdIdentityEdit_clicked (GtkWidget *widget, gpointer user_data) { + GtkWidget *dialog; + struct identity_record *idrecp; + + if (identity_row == -1) + return; + + idrecp = gtk_clist_get_row_data (GTK_CLIST (user_data), identity_row); + if (!idrecp) { + idrecp = &idrec; +#if 0 + g_free (idrecp->name); + idrecp->name = NULL; + g_free (idrecp->address); + idrecp->address = NULL; + g_free (idrecp->organization); + idrecp->organization = NULL; + g_free (idrecp->sigfile); + idrecp->sigfile = NULL; +#endif + } + /* now create the editing dialog */ + dialog = create_identity_config_dialog (TRUE, idrecp, GTK_WIDGET (user_data)); + gtk_widget_show (dialog); +} + +static void +on_cmdIdentityDelete_clicked (GtkWidget *widget, gpointer user_data) +{ + gtk_clist_remove (GTK_CLIST (user_data), identity_row); + identity_row = -1; } static void @@ -1239,6 +1454,8 @@ on_cmdCamelServicesOK_clicked (GtkButton *button, gpointer user_data) destroy_service (GTK_OBJECT (interior_notebook), (gpointer) &transport); gtk_widget_destroy(GTK_WIDGET (user_data)); } + + write_config(); } static void @@ -1278,6 +1495,7 @@ providers_config_new (void) GtkWidget *transport_page_vbox; GList *providers, *p, *sources, *transports; GtkWidget *table, *interior_notebook; + char *titles[] = { _("Name"), _("Address"), _("Organization"), _("Signature file") }; int page; @@ -1305,7 +1523,7 @@ providers_config_new (void) gtk_window_set_modal (GTK_WINDOW (providers_config), TRUE); gtk_widget_set_name (providers_config, "providers_config"); gtk_object_set_data (GTK_OBJECT (providers_config), "providers_config", providers_config); - gtk_window_set_policy (GTK_WINDOW (providers_config), FALSE, FALSE, FALSE); + gtk_window_set_policy (GTK_WINDOW (providers_config), TRUE, TRUE, FALSE); dialog_vbox1 = GNOME_DIALOG (providers_config)->vbox; gtk_widget_set_name (dialog_vbox1, "dialog_vbox1"); @@ -1337,7 +1555,7 @@ providers_config_new (void) gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow1, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - clistIdentities = gtk_clist_new (1); + clistIdentities = gtk_clist_new_with_titles (4, titles); gtk_widget_set_name (clistIdentities, "clistIdentities"); gtk_widget_ref (clistIdentities); gtk_object_set_data_full (GTK_OBJECT (providers_config), "clistIdentities", clistIdentities, @@ -1347,6 +1565,12 @@ providers_config_new (void) gtk_clist_set_column_width (GTK_CLIST (clistIdentities), 0, 80); gtk_clist_column_titles_show (GTK_CLIST (clistIdentities)); + /* TODO: we should really have a GList of identities */ + idrec.name = NULL; + idrec.address = NULL; + idrec.organization = NULL; + idrec.sigfile = NULL; + lblIdentities = gtk_label_new (_("Identities")); gtk_widget_set_name (lblIdentities, "lblIdentities"); gtk_widget_ref (lblIdentities); @@ -1536,34 +1760,37 @@ providers_config_new (void) gtk_signal_connect (GTK_OBJECT (cmdIdentityAdd), "clicked", GTK_SIGNAL_FUNC (on_cmdIdentityAdd_clicked), - NULL); + clistIdentities); gtk_signal_connect (GTK_OBJECT (cmdIdentityEdit), "clicked", GTK_SIGNAL_FUNC (on_cmdIdentityEdit_clicked), - NULL); + clistIdentities); gtk_signal_connect (GTK_OBJECT (cmdIdentityDelete), "clicked", GTK_SIGNAL_FUNC (on_cmdIdentityDelete_clicked), - NULL); + clistIdentities); + gtk_signal_connect (GTK_OBJECT (cmdSourcesAdd), "clicked", GTK_SIGNAL_FUNC (on_cmdSourcesAdd_clicked), - NULL); + clistSources); gtk_signal_connect (GTK_OBJECT (cmdSourcesEdit), "clicked", GTK_SIGNAL_FUNC (on_cmdSourcesEdit_clicked), - NULL); + clistSources); gtk_signal_connect (GTK_OBJECT (cmdSourcesDelete), "clicked", GTK_SIGNAL_FUNC (on_cmdSourcesDelete_clicked), - NULL); + clistSources); + gtk_signal_connect (GTK_OBJECT (cmdCamelServicesOK), "clicked", GTK_SIGNAL_FUNC (on_cmdCamelServicesOK_clicked), providers_config); gtk_signal_connect (GTK_OBJECT (cmdCamelServicesCancel), "clicked", GTK_SIGNAL_FUNC (on_cmdCamelServicesCancel_clicked), providers_config); + + gtk_signal_connect (GTK_OBJECT (clistIdentities), "select_row", + GTK_SIGNAL_FUNC (on_clistIdentities_select_row), + NULL); + gtk_signal_connect (GTK_OBJECT (clistSources), "select_row", + GTK_SIGNAL_FUNC (on_clistSources_select_row), + NULL); return providers_config; } - - - - - - |