diff options
Diffstat (limited to 'addressbook/gui/component/addressbook-config.c')
-rw-r--r-- | addressbook/gui/component/addressbook-config.c | 530 |
1 files changed, 530 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..8dfed83c59 --- /dev/null +++ b/addressbook/gui/component/addressbook-config.c @@ -0,0 +1,530 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +#include <config.h> + +#include <glib.h> +#include <libgnome/gnome-defs.h> +#include <libgnome/gnome-i18n.h> +#include <libgnomeui/gnome-dialog.h> +#include <libgnomeui/gnome-stock.h> +#include <glade/glade.h> +#include <gal/widgets/e-unicode.h> +#include <gtkhtml/gtkhtml.h> +#include <e-util/e-html-utils.h> +#include "addressbook-config.h" +#include "addressbook-storage.h" + +typedef struct _AddressbookSourceDialog AddressbookSourceDialog; +typedef struct _AddressbookSourcePageItem AddressbookSourcePageItem; + +struct _AddressbookSourceDialog { + GladeXML *gui; + + GtkWidget *dialog; + + GtkWidget *notebook; + GtkWidget *basic_notebook; + GtkWidget *advanced_notebook; + + GtkWidget *name; + GtkWidget *host; + + GtkWidget *auth_checkbutton; + GtkWidget *auth_optionmenu; + GtkWidget *auth_notebook; + GtkWidget *email; + GtkWidget *binddn; + int auth; + + GtkWidget *port; + GtkWidget *rootdn; + GtkWidget *scope_optionmenu; + AddressbookLDAPScopeType ldap_scope; + + gint id; /* button we closed the dialog with */ + + AddressbookSource *source; /* our result if the Ok button was clicked */ +}; + +static void +addressbook_source_edit_changed (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + char *data; + gboolean complete = TRUE; + + 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 (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (dialog->host), 0, -1); + if (!data || !*data) + complete = FALSE; + g_free (data); + } + + if (complete) { + data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (dialog->port), 0, -1); + if (!data || !*data) + complete = FALSE; + /* XXX more validation on port here */ + g_free (data); + } + } + + gnome_dialog_set_sensitive (GNOME_DIALOG (dialog->dialog), 0, complete); +} + +static void +auth_checkbutton_changed (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + /* make sure the change is reflected by the state of the dialog's OK button */ + addressbook_source_edit_changed (item, dialog); + + gtk_widget_set_sensitive (dialog->auth_optionmenu, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->auth_checkbutton))); + gtk_widget_set_sensitive (dialog->auth_notebook, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(dialog->auth_checkbutton))); +} + +static void +scope_optionmenu_activated (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + /* make sure the change is reflected by the state of the dialog's OK button */ + addressbook_source_edit_changed (item, dialog); + + dialog->ldap_scope = g_list_index (gtk_container_children (GTK_CONTAINER (item->parent)), + item); +} + +static void +auth_optionmenu_activated (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + /* make sure the change is reflected by the state of the dialog's OK button */ + addressbook_source_edit_changed (item, dialog); + + dialog->auth = g_list_index (gtk_container_children (GTK_CONTAINER (item->parent)), + item) + 1; + + gtk_notebook_set_page (GTK_NOTEBOOK(dialog->auth_notebook), dialog->auth - 1); +} + +typedef struct { + GtkWidget *notebook; + int page_num; +} FocusHelpClosure; + +static void +focus_help (GtkWidget *w, GdkEventFocus *event, FocusHelpClosure *closure) +{ + gtk_notebook_set_page (GTK_NOTEBOOK(closure->notebook), closure->page_num); +} + +static void +add_focus_handler (GtkWidget *widget, GtkWidget *notebook, int page_num) +{ + FocusHelpClosure *focus_closure = g_new0 (FocusHelpClosure, 1); + focus_closure->notebook = notebook; + focus_closure->page_num = page_num; + + gtk_signal_connect_full (GTK_OBJECT (widget), + "focus_in_event" /* XXX */, + (GtkSignalFunc) focus_help, NULL, + focus_closure, + (GtkDestroyNotify) g_free, + FALSE, FALSE); +} + +static void +addressbook_source_dialog_set_source (AddressbookSourceDialog *dialog, AddressbookSource *source) +{ + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->name), source ? source->name : ""); + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->host), source ? source->host : ""); + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->email), source ? source->email_addr : ""); + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->binddn), source ? source->binddn : ""); + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->port), source ? source->port : "389"); + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->rootdn), source ? source->rootdn : ""); + + gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->scope_optionmenu), source ? source->scope : ADDRESSBOOK_LDAP_SCOPE_ONELEVEL); + dialog->auth = source ? source->auth : ADDRESSBOOK_LDAP_AUTH_NONE; + if (dialog->auth != ADDRESSBOOK_LDAP_AUTH_NONE) { + gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->auth_optionmenu), dialog->auth - 1); + gtk_notebook_set_page (GTK_NOTEBOOK(dialog->auth_notebook), dialog->auth - 1); + } + + dialog->ldap_scope = source ? source->scope : ADDRESSBOOK_LDAP_SCOPE_ONELEVEL; + gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->scope_optionmenu), dialog->ldap_scope); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog->auth_checkbutton), source && source->auth != ADDRESSBOOK_LDAP_AUTH_NONE); + gtk_widget_set_sensitive (dialog->auth_optionmenu, source && source->auth != ADDRESSBOOK_LDAP_AUTH_NONE); + gtk_widget_set_sensitive (dialog->auth_notebook, source && source->auth != ADDRESSBOOK_LDAP_AUTH_NONE); +} + +static AddressbookSource * +addressbook_source_dialog_get_source (AddressbookSourceDialog *dialog) +{ + AddressbookSource *source = g_new0 (AddressbookSource, 1); + + source->name = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->name)); + source->host = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->host)); + source->email_addr = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->email)); + source->binddn = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->binddn)); + source->port = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->port)); + source->rootdn = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->rootdn)); + source->scope = dialog->ldap_scope; + source->auth = dialog->auth; + + addressbook_storage_init_source_uri (source); + + return source; +} + +static void +addressbook_source_dialog_ok_clicked (GtkWidget *widget, AddressbookSourceDialog *dialog) +{ + dialog->source = addressbook_source_dialog_get_source (dialog); +} + +static void +add_scope_activate_cb (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (scope_optionmenu_activated), dialog); +} + +static void +add_auth_activate_cb (GtkWidget *item, AddressbookSourceDialog *dialog) +{ + gtk_signal_connect (GTK_OBJECT (item), "activate", + GTK_SIGNAL_FUNC (auth_optionmenu_activated), dialog); +} + + +static AddressbookSourceDialog* +addressbook_source_dialog (GladeXML *gui, AddressbookSource *source, GtkWidget *parent) +{ + AddressbookSourceDialog *dialog = g_new0 (AddressbookSourceDialog, 1); + GtkWidget *menu; + + dialog->gui = gui; + + dialog->dialog = glade_xml_get_widget (gui, "add_addressbook"); + + if (source) + gtk_window_set_title (GTK_WINDOW (dialog->dialog), _("Edit Addressbook")); + + gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE); + gtk_window_set_policy (GTK_WINDOW (dialog->dialog), + FALSE, TRUE, FALSE); + + gnome_dialog_set_parent (GNOME_DIALOG (dialog->dialog), + GTK_WINDOW (parent)); + + dialog->notebook = glade_xml_get_widget (gui, "add-addressbook-notebook"); + dialog->basic_notebook = glade_xml_get_widget (gui, "basic-notebook"); + dialog->advanced_notebook = glade_xml_get_widget (gui, "advanced-notebook"); + + /* BASIC STUFF */ + dialog->name = glade_xml_get_widget (gui, "account-name-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->name), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->name, dialog->basic_notebook, 0); + + dialog->host = glade_xml_get_widget (gui, "server-name-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->host), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->host, dialog->basic_notebook, 1); + + /* BASIC -> AUTH STUFF */ + dialog->auth_notebook = glade_xml_get_widget (gui, "auth-notebook"); + + dialog->auth_checkbutton = glade_xml_get_widget (gui, "auth-checkbutton"); + add_focus_handler (dialog->auth_checkbutton, dialog->basic_notebook, 2); + gtk_signal_connect (GTK_OBJECT (dialog->auth_checkbutton), "toggled", + GTK_SIGNAL_FUNC (auth_checkbutton_changed), dialog); + + dialog->auth_optionmenu = glade_xml_get_widget (gui, "auth-optionmenu"); + menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->auth_optionmenu)); + gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_auth_activate_cb, dialog); + add_focus_handler (dialog->auth_optionmenu, dialog->basic_notebook, 3); + + dialog->email = glade_xml_get_widget (gui, "email-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->email), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->email, dialog->basic_notebook, 4); + + dialog->binddn = glade_xml_get_widget (gui, "dn-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->binddn), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->binddn, dialog->basic_notebook, 5); + + /* ADVANCED STUFF */ + dialog->port = glade_xml_get_widget (gui, "port-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->port), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->port, dialog->advanced_notebook, 0); + + dialog->rootdn = glade_xml_get_widget (gui, "rootdn-entry"); + gtk_signal_connect (GTK_OBJECT (dialog->rootdn), "changed", + GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); + add_focus_handler (dialog->rootdn, dialog->advanced_notebook, 1); + + dialog->scope_optionmenu = glade_xml_get_widget (gui, "scope-optionmenu"); + add_focus_handler (dialog->scope_optionmenu, dialog->advanced_notebook, 2); + menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->scope_optionmenu)); + gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_scope_activate_cb, dialog); + + /* fill in source info if there is some */ + addressbook_source_dialog_set_source (dialog, source); + + /* always start out on the first page. */ + gtk_notebook_set_page (GTK_NOTEBOOK (dialog->notebook), 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_dialog_ok_clicked), + dialog); + + /* and set focus to be the Account field (the first editable + field on the first page) */ + gtk_widget_grab_focus (dialog->name); + + return dialog; +} + +static AddressbookSourceDialog * +addressbook_config_source_with_gui (GladeXML *gui, AddressbookSource *source, GtkWidget *parent) +{ + AddressbookSourceDialog* dialog; + + dialog = addressbook_source_dialog (gui, source, parent); + + gnome_dialog_close_hides (GNOME_DIALOG(dialog->dialog), TRUE); + + dialog->id = gnome_dialog_run_and_close (GNOME_DIALOG (dialog->dialog)); + + return dialog; +} + +void +addressbook_create_new_source (const char *new_source, GtkWidget *parent) +{ + AddressbookSourceDialog *dialog; + GladeXML *gui; + + gui = glade_xml_new (EVOLUTION_GLADEDIR "/addressbook-config.glade", NULL); + + dialog = addressbook_source_dialog (gui, NULL, parent); + + e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->name), new_source); + + gnome_dialog_close_hides (GNOME_DIALOG(dialog->dialog), TRUE); + + dialog->id = gnome_dialog_run_and_close (GNOME_DIALOG (dialog->dialog)); + + gtk_object_unref (GTK_OBJECT (dialog->gui)); + + if (dialog->id == 0) { + /* Ok was clicked */ + addressbook_storage_add_source (addressbook_source_copy(dialog->source)); + addressbook_storage_write_sources(); + } +} + + + +typedef struct { + GladeXML *gui; + GNOME_Evolution_Shell shell; + GtkWidget *dialog; + GtkWidget *clistSources; + GtkWidget *addSource; + GtkWidget *editSource; + GtkWidget *deleteSource; + gint source_row; +} AddressbookDialog; + +static void +update_sensitivity (AddressbookDialog *dialog) +{ + gboolean sensitive = dialog->source_row != -1; + + gtk_widget_set_sensitive (dialog->editSource, sensitive); + gtk_widget_set_sensitive (dialog->deleteSource, sensitive); +} + +static void +add_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) +{ + AddressbookSourceDialog *sdialog; + + sdialog = addressbook_config_source_with_gui (dialog->gui, NULL, dialog->dialog); + if (sdialog->id == 0) { + /* Ok was clicked */ + AddressbookSource *source = addressbook_source_copy(sdialog->source); + gint row; + gchar *text[2]; + + text[0] = source->name; + text[1] = source->host; + + row = e_utf8_gtk_clist_append (GTK_CLIST(dialog->clistSources), text); + gtk_clist_set_row_data_full (GTK_CLIST(dialog->clistSources), row, source, (GtkDestroyNotify) addressbook_source_free); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 0, TRUE); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 1, TRUE); + update_sensitivity (dialog); + } +} + +static void +edit_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) +{ + AddressbookSource *source; + AddressbookSourceDialog *sdialog; + + source = gtk_clist_get_row_data (GTK_CLIST (dialog->clistSources), dialog->source_row); + + sdialog = addressbook_config_source_with_gui (dialog->gui, source, dialog->dialog); + if (sdialog->id == 0) { + /* Ok was clicked */ + source = addressbook_source_copy(sdialog->source); + + e_utf8_gtk_clist_set_text (GTK_CLIST (dialog->clistSources), dialog->source_row, 0, source->name); + e_utf8_gtk_clist_set_text (GTK_CLIST (dialog->clistSources), dialog->source_row, 1, source->host); + gtk_clist_set_row_data (GTK_CLIST (dialog->clistSources), dialog->source_row, source); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 0, TRUE); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 1, TRUE); + update_sensitivity (dialog); + } +} + +static void +delete_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) +{ + gtk_clist_remove (GTK_CLIST (dialog->clistSources), dialog->source_row); + dialog->source_row = -1; + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 0, TRUE); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 1, TRUE); + update_sensitivity (dialog); +} + +static void +sources_select_row (GtkWidget *widget, gint row, gint column, + GdkEventButton *event, AddressbookDialog *dialog) +{ + dialog->source_row = row; + + update_sensitivity (dialog); +} + +static void +addressbook_dialog_close (GtkWidget *w, AddressbookDialog *dialog) +{ + gtk_widget_destroy (dialog->dialog); + gtk_object_unref (GTK_OBJECT (dialog->gui)); + g_free (dialog); +} + +static void +addressbook_dialog_apply (GtkWidget *w, AddressbookDialog *dialog) +{ + int i; + + addressbook_storage_clear_sources(); + + for (i = 0; i < GTK_CLIST(dialog->clistSources)->rows; i ++) { + AddressbookSource *source = (AddressbookSource*)gtk_clist_get_row_data (GTK_CLIST (dialog->clistSources), i); + addressbook_storage_add_source (addressbook_source_copy (source)); + } + + addressbook_storage_write_sources(); + + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 0, FALSE); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 1, FALSE); +} + +static void +addressbook_dialog_ok (GtkWidget *w, AddressbookDialog *dialog) +{ + addressbook_dialog_apply(w, dialog); + addressbook_dialog_close(w, dialog); +} + +void +addressbook_config (GNOME_Evolution_Shell shell) +{ + AddressbookDialog *dialog; + GladeXML *gui; + GtkWidget *clist; + GList *l; + + dialog = g_new0 (AddressbookDialog, 1); + + dialog->source_row = -1; + + gui = glade_xml_new (EVOLUTION_GLADEDIR "/addressbook-config.glade", NULL); + dialog->gui = gui; + dialog->shell = shell; + + dialog->dialog = glade_xml_get_widget (gui, "addressbook_sources"); + + clist = glade_xml_get_widget (gui, "clistSources"); + dialog->clistSources = clist; + + gtk_clist_column_titles_passive (GTK_CLIST (clist)); + gtk_clist_set_column_width (GTK_CLIST (clist), 0, 80); + + dialog->addSource = glade_xml_get_widget (gui, "addSource"); + gtk_signal_connect (GTK_OBJECT(dialog->addSource), "clicked", + GTK_SIGNAL_FUNC (add_source_clicked), + dialog); + + dialog->editSource = glade_xml_get_widget (gui, "editSource"); + gtk_signal_connect (GTK_OBJECT(dialog->editSource), "clicked", + GTK_SIGNAL_FUNC (edit_source_clicked), + dialog); + + dialog->deleteSource = glade_xml_get_widget (gui, "deleteSource"); + gtk_signal_connect (GTK_OBJECT(dialog->deleteSource), "clicked", + GTK_SIGNAL_FUNC (delete_source_clicked), + dialog); + + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 0, FALSE); + gnome_dialog_set_sensitive (GNOME_DIALOG(dialog->dialog), 1, FALSE); + update_sensitivity (dialog); + + l = addressbook_storage_get_sources (); + for (; l != NULL; l = l->next) { + AddressbookSource *source; + gint row; + gchar *text[2]; + + source = addressbook_source_copy ((AddressbookSource*)l->data); + + text[0] = source->name; + text[1] = source->host; + + row = e_utf8_gtk_clist_append (GTK_CLIST(clist), text); + gtk_clist_set_row_data_full (GTK_CLIST(clist), row, source, (GtkDestroyNotify) addressbook_source_free); + } + + gtk_signal_connect (GTK_OBJECT (clist), "select_row", + GTK_SIGNAL_FUNC (sources_select_row), + dialog); + + gnome_dialog_button_connect (GNOME_DIALOG(dialog->dialog), + 0 /* OK */, addressbook_dialog_ok, dialog); + + gnome_dialog_button_connect (GNOME_DIALOG(dialog->dialog), + 1 /* APPLY */, addressbook_dialog_apply, dialog); + + gnome_dialog_button_connect (GNOME_DIALOG(dialog->dialog), + 2 /* CLOSE */, addressbook_dialog_close, dialog); + + gnome_dialog_run (GNOME_DIALOG(dialog->dialog)); +} |