diff options
Diffstat (limited to 'addressbook/gui/component/addressbook-config.c')
-rw-r--r-- | addressbook/gui/component/addressbook-config.c | 578 |
1 files changed, 578 insertions, 0 deletions
diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c new file mode 100644 index 0000000000..5cf672912f --- /dev/null +++ b/addressbook/gui/component/addressbook-config.c @@ -0,0 +1,578 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +#include <config.h> + +#include <gnome.h> +#include <gtkhtml/gtkhtml.h> +#include <gal/widgets/e-unicode.h> +#include "e-util/e-html-utils.h" + +typedef enum { + ADDRESSBOOK_SOURCE_FILE, +#if HAVE_LDAP + ADDRESSBOOK_SOURCE_LDAP, +#endif + ADDRESSBOOK_SOURCE_LAST +} AddressbookSourceType; + +#if HAVE_LDAP +typedef enum { + LDAP_AUTH_NONE, + LDAP_AUTH_SIMPLE, +#if LDAP_SASL + LDAP_AUTH_SASL, +#endif + LDAP_AUTH_LAST +} LDAPAuthType; +#endif + +typedef struct _AddressbookSourceDialog AddressbookSourceDialog; +typedef struct _AddressbookSourcePageItem AddressbookSourcePageItem; +typedef struct _LDAPAuthPageItem LDAPAuthPageItem; + +struct _AddressbookSourceDialog { + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *name; + GtkWidget *description; + GtkWidget *source_option; + GtkWidget *notebook; + + AddressbookSourcePageItem *source; +}; + +struct _AddressbookSourcePageItem { + gint pnum; + + AddressbookSourceType source_type; + + AddressbookSourceDialog *dialog; + + GtkWidget *item; + GtkWidget *vbox; + + /* file: addressbook's */ + GtkWidget *path; + GtkWidget *creat; + + /* ldap: addressbook's */ + GtkWidget *host; + GtkWidget *port; + GtkWidget *rootdn; + GtkWidget *auth_optionmenu; + GtkWidget *auth_notebook; + + LDAPAuthPageItem *auth; +}; + +#if HAVE_LDAP +struct _LDAPAuthPageItem { + gint pnum; + + LDAPAuthType auth_type; + + AddressbookSourceDialog *dialog; + AddressbookSourcePageItem *page; + + GtkWidget *item; + GtkWidget *vbox; + + /* simple (password) auth */ + GtkWidget *binddn; + GtkWidget *remember_passwd; +}; +#endif + +static void +html_size_req (GtkWidget *widget, GtkRequisition *requisition) +{ + requisition->height = GTK_LAYOUT (widget)->height; +} + +/* Returns a GtkHTML which is already inside a GtkScrolledWindow. If + * @white is TRUE, the GtkScrolledWindow will be inside a GtkFrame. + */ +static GtkWidget * +html_new (gboolean white) +{ + GtkWidget *html, *scrolled, *frame; + GtkStyle *style; + + html = gtk_html_new (); + GTK_LAYOUT (html)->height = 0; + gtk_signal_connect (GTK_OBJECT (html), "size_request", + GTK_SIGNAL_FUNC (html_size_req), NULL); + gtk_html_set_editable (GTK_HTML (html), FALSE); + style = gtk_rc_get_style (html); + if (style) { + gtk_html_set_default_background_color (GTK_HTML (html), + white ? &style->white : + &style->bg[0]); + } + gtk_widget_set_sensitive (html, FALSE); + scrolled = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_NEVER, + GTK_POLICY_NEVER); + gtk_container_add (GTK_CONTAINER (scrolled), html); + + if (white) { + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (frame), + GTK_SHADOW_ETCHED_IN); + gtk_container_add (GTK_CONTAINER (frame), scrolled); + gtk_widget_show_all (frame); + } else + gtk_widget_show_all (scrolled); + + return html; +} + +static void +put_html (GtkHTML *html, char *text) +{ + GtkHTMLStream *handle; + + text = e_text_to_html (text, E_TEXT_TO_HTML_CONVERT_NL); + handle = gtk_html_begin (html); + gtk_html_write (html, handle, "<HTML><BODY>", 12); + gtk_html_write (html, handle, text, strlen (text)); + gtk_html_write (html, handle, "</BODY></HTML>", 14); + g_free (text); + gtk_html_end (html, handle, GTK_HTML_STREAM_OK); +} + +static const char * +addressbook_config_source_label (AddressbookSourceType type) +{ + switch (type) { +#if HAVE_LDAP + case ADDRESSBOOK_SOURCE_LDAP: + return _("LDAP Server"); +#endif + case ADDRESSBOOK_SOURCE_FILE: + return _("File"); + default: + g_assert(0); + return _("Unknown addressbook type"); + } +} + +#if HAVE_LDAP +static const char * +addressbook_config_auth_label (AddressbookSourceType type) +{ + switch (type) { + case LDAP_AUTH_NONE: + return _("None (anonymous mode)"); + case LDAP_AUTH_SIMPLE: + return _("Password"); +#if LDAP_SASL + case LDAP_AUTH_SASL: + return _("SASL"); +#endif + default: + g_assert(0); + return _("Unknown auth type"); + } +} +#endif + +static void +addressbook_source_edit_changed (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + char *data; + gboolean complete = TRUE; + AddressbookSourcePageItem *source = dialog->source; + + if (source == NULL) + complete = FALSE; + + if (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (dialog->name), 0, -1); + if (!data || !*data) + complete = FALSE; + g_free (data); + } + + if (complete) { + if (source->source_type == ADDRESSBOOK_SOURCE_FILE) { + if (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source->path), 0, -1); + if (!data || !*data) + complete = FALSE; + g_free (data); + } + } +#if HAVE_LDAP + else { + if (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source->host), 0, -1); + if (!data || !*data) + complete = FALSE; + g_free (data); + } + + if (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source->port), 0, -1); + if (!data || !*data) + complete = FALSE; + /* XXX more validation on port here */ + g_free (data); + } + + if (complete) { + LDAPAuthPageItem *auth_page = source->auth; + + if (auth_page->auth_type == LDAP_AUTH_SIMPLE) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (auth_page->binddn), 0, -1); + if (!data || !*data) + complete = FALSE; + g_free (data); + } +#ifdef LDAP_SASL + else if (auth_page->auth_type == LDAP_AUTH_SASL) { + } +#endif + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source->port), 0, -1); + if (!data || !*data) + complete = FALSE; + /* XXX more validation on port here */ + g_free (data); + } + } +#endif + } + + gnome_dialog_set_sensitive (GNOME_DIALOG (dialog->dialog), 0, complete); +} + +static void +source_type_menuitem_activate (GtkWidget *item, gpointer data) +{ + AddressbookSourcePageItem *sitem = data; + + gtk_notebook_set_page (GTK_NOTEBOOK(sitem->dialog->notebook), sitem->pnum); + sitem->dialog->source = sitem; + + addressbook_source_edit_changed (item, sitem->dialog); +} + +static GtkWidget * +table_add_elem (AddressbookSourceDialog *dialog, GtkWidget *table, + int row, const char *label_text) +{ + GtkWidget *label, *entry; + + label = gtk_label_new (label_text); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, + row, row + 1, GTK_FILL, 0, 0, 0); + gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); + + entry = gtk_entry_new (); + gtk_table_attach (GTK_TABLE (table), entry, 1, 3, row, row + 1, + GTK_EXPAND | GTK_FILL, 0, 0, 0); + + gtk_signal_connect (GTK_OBJECT (entry), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + + return entry; +} + +#if HAVE_LDAP + +static void +ldap_auth_type_menuitem_activate (GtkWidget *item, gpointer data) +{ + LDAPAuthPageItem *auth_item = data; + + gtk_notebook_set_page (GTK_NOTEBOOK(auth_item->page->auth_notebook), auth_item->pnum); + + auth_item->page->auth = auth_item; + + addressbook_source_edit_changed (item, auth_item->dialog); +} + +static LDAPAuthPageItem * +addressbook_ldap_auth_item_new (AddressbookSourceDialog *dialog, + AddressbookSourcePageItem *page, + LDAPAuthType type) +{ + LDAPAuthPageItem *item = g_new0 (LDAPAuthPageItem, 1); + GtkWidget *table = NULL; + int row = 0; + + item->pnum = type; + item->auth_type = type; + item->dialog = dialog; + item->page = page; + item->vbox = gtk_vbox_new (FALSE, 0); + + switch (type) { + case LDAP_AUTH_NONE: + break; + case LDAP_AUTH_SIMPLE: + table = gtk_table_new (2, 2, FALSE); + item->binddn = table_add_elem (dialog, table, row++, _("Bind DN:")); + + item->remember_passwd = gtk_check_button_new_with_label (_("Remember this password")); + + gtk_table_attach (GTK_TABLE (table), item->remember_passwd, 1, 2, + row, row + 1, GTK_FILL, 0, 0, 0); + + gtk_box_pack_start (GTK_BOX (item->vbox), table, + TRUE, TRUE, 0); + break; +#if LDAP_SASL + case LDAP_AUTH_SASL: + break; +#endif + default: + g_assert (0); + return item; + } + + if (table) { + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 10); + gtk_container_set_border_width (GTK_CONTAINER (table), 8); + } + + gtk_widget_show_all (item->vbox); + + return item; +} +#endif + +static AddressbookSourcePageItem * +addressbook_source_item_new (AddressbookSourceDialog *dialog, AddressbookSourceType type) +{ + AddressbookSourcePageItem *item = g_new0 (AddressbookSourcePageItem, 1); + GtkWidget *table = NULL; + int row = 0; + + item->pnum = type; + item->source_type = type; + item->dialog = dialog; + + item->vbox = gtk_vbox_new (FALSE, 0); + + switch (type) { +#if HAVE_LDAP + case ADDRESSBOOK_SOURCE_LDAP: { + GtkWidget *label; + GtkWidget *menu; + int i; + LDAPAuthPageItem *first_item = NULL; + int position; + + table = gtk_table_new (5, 2, FALSE); + + item->host = table_add_elem (dialog, table, row++, _("Host:")); + item->port = table_add_elem (dialog, table, row++, _("Port:")); + gtk_editable_insert_text (GTK_EDITABLE (item->port), "389", 3, &position); + + item->rootdn = table_add_elem (dialog, table, row++, _("Root DN:")); + + gtk_box_pack_start (GTK_BOX (item->vbox), table, + TRUE, FALSE, 0); + + item->auth_optionmenu = gtk_option_menu_new (); + menu = gtk_menu_new (); + + item->auth_notebook = gtk_notebook_new(); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (item->auth_notebook), FALSE); + + for (i = 0; i < LDAP_AUTH_LAST; i++) { + LDAPAuthPageItem *auth_item; + + auth_item = addressbook_ldap_auth_item_new (dialog, item, i); + + if (!first_item) + first_item = auth_item; + + auth_item->item = gtk_menu_item_new_with_label (addressbook_config_auth_label (i)); + + gtk_notebook_append_page (GTK_NOTEBOOK (item->auth_notebook), + auth_item->vbox, NULL); + + gtk_signal_connect (GTK_OBJECT (auth_item->item), "activate", + GTK_SIGNAL_FUNC (ldap_auth_type_menuitem_activate), + auth_item); + + gtk_menu_append (GTK_MENU (menu), auth_item->item); + gtk_widget_show (auth_item->item); + } + + gtk_option_menu_set_menu (GTK_OPTION_MENU (item->auth_optionmenu), menu); + ldap_auth_type_menuitem_activate (first_item->item, first_item); + gtk_option_menu_set_history (GTK_OPTION_MENU(item->auth_optionmenu), 0); + + label = gtk_label_new (_("Authentication:")); + gtk_table_attach (GTK_TABLE (table), label, 0, 1, + row, row + 1, GTK_FILL, 0, 0, 0); + gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); + + gtk_table_attach (GTK_TABLE (table), + item->auth_optionmenu, + 1, 2, row, row + 1, + GTK_EXPAND | GTK_FILL, 0, + 0, 0); + + gtk_box_pack_start (GTK_BOX (item->vbox), item->auth_notebook, + TRUE, TRUE, 0); + break; + } +#endif + case ADDRESSBOOK_SOURCE_FILE: { + table = gtk_table_new (2, 2, FALSE); + item->path = table_add_elem (dialog, table, row++, _("Path:")); + + gtk_box_pack_start (GTK_BOX (item->vbox), table, + TRUE, TRUE, 0); + + item->creat = gtk_check_button_new_with_label (_("Create path if it doesn't exist.")); + gtk_table_attach (GTK_TABLE (table), item->creat, 1, 2, + row, row + 1, GTK_FILL, 0, 0, 0); + break; + } + default: + g_assert(0); + return item; + } + + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 10); + gtk_container_set_border_width (GTK_CONTAINER (table), 8); + + gtk_widget_show_all (item->vbox); + + return item; +} + +static void +addressbook_source_ok_clicked (GtkWidget *widget, AddressbookSourceDialog *sdialog) +{ +} + +static AddressbookSourceDialog* +addressbook_source_dialog (GtkWidget *parent) +{ + GtkWidget *html; + GtkWidget *table; + AddressbookSourceDialog *dialog = g_new0 (AddressbookSourceDialog, 1); + GtkWidget *vbox, *dialog_vbox; + GtkWidget *menu; + GtkWidget *area; + AddressbookSourcePageItem *first_item = NULL; + int i; + int row = 0; + + dialog->dialog = gnome_dialog_new (_("Add Addressbook"), NULL); + + gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE); + gtk_window_set_policy (GTK_WINDOW (dialog->dialog), + FALSE, TRUE, FALSE); + gtk_window_set_default_size (GTK_WINDOW (dialog->dialog), 300, 350); + gnome_dialog_set_parent (GNOME_DIALOG (dialog->dialog), + GTK_WINDOW (parent)); + + dialog->vbox = gtk_vbox_new (FALSE, 5); + dialog_vbox = GNOME_DIALOG (dialog->dialog)->vbox; + + vbox = gtk_vbox_new (FALSE, 0); + + html = html_new (FALSE); + put_html (GTK_HTML (html), + _("Select the kind of addressbook you have, and enter " + "the relevant information about it.")); + + table = gtk_table_new (2, 2, FALSE); + + dialog->name = table_add_elem (dialog, table, row++, _("Name:")); + dialog->description = table_add_elem (dialog, table, row++, _("Description:")); + + gtk_table_set_row_spacings (GTK_TABLE (table), 2); + gtk_table_set_col_spacings (GTK_TABLE (table), 10); + gtk_container_set_border_width (GTK_CONTAINER (table), 8); + + dialog->notebook = gtk_notebook_new(); + gtk_notebook_set_show_tabs (GTK_NOTEBOOK (dialog->notebook), FALSE); + + dialog->source_option = gtk_option_menu_new (); + menu = gtk_menu_new (); + + for (i = 0; i < ADDRESSBOOK_SOURCE_LAST; i ++) { + AddressbookSourcePageItem *item; + + item = addressbook_source_item_new (dialog, i); + + item->item = gtk_menu_item_new_with_label (addressbook_config_source_label (i)); + + if (!first_item) + first_item = item; + + gtk_notebook_append_page (GTK_NOTEBOOK (dialog->notebook), + item->vbox, NULL); + + gtk_signal_connect (GTK_OBJECT (item->item), "activate", + GTK_SIGNAL_FUNC (source_type_menuitem_activate), + item); + + gtk_menu_append (GTK_MENU (menu), item->item); + gtk_widget_show (item->item); + } + + gtk_option_menu_set_menu (GTK_OPTION_MENU (dialog->source_option), menu); + source_type_menuitem_activate (first_item->item, first_item); + gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->source_option), 0); + + + gtk_box_pack_start (GTK_BOX (vbox), html->parent, + FALSE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), table, + FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (vbox), dialog->source_option, + FALSE, FALSE, 0); + + gtk_box_pack_start (GTK_BOX (dialog->vbox), vbox, FALSE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (dialog->vbox), dialog->notebook, + TRUE, TRUE, 0); + + /* hook our ui into the gnome-dialog */ + gtk_box_pack_start (GTK_BOX (dialog_vbox), dialog->vbox, TRUE, TRUE, 0); + + gtk_widget_show_all (dialog->vbox); + + /* Buttons */ + area = GNOME_DIALOG (dialog->dialog)->action_area; + gtk_widget_show (area); + gtk_button_box_set_layout (GTK_BUTTON_BOX (area), GTK_BUTTONBOX_END); + gtk_button_box_set_spacing (GTK_BUTTON_BOX (area), 8); + + gnome_dialog_append_button (GNOME_DIALOG (dialog->dialog), + GNOME_STOCK_BUTTON_OK); + gnome_dialog_append_button (GNOME_DIALOG (dialog->dialog), + GNOME_STOCK_BUTTON_CANCEL); + + gnome_dialog_set_default (GNOME_DIALOG (dialog->dialog), 0); + + gnome_dialog_set_sensitive (GNOME_DIALOG (dialog->dialog), 0, FALSE); + + gnome_dialog_button_connect( GNOME_DIALOG (dialog->dialog), 0, + GTK_SIGNAL_FUNC (addressbook_source_ok_clicked), + dialog); + + return dialog; +} + +void +addressbook_config_source () +{ + AddressbookSourceDialog* dialog = addressbook_source_dialog (NULL); + + gnome_dialog_run_and_close (GNOME_DIALOG (dialog->dialog)); +} |