From a8ce8864c08bb3972c73818491fe6475a4acf017 Mon Sep 17 00:00:00 2001 From: Praveen Kumar Date: Fri, 8 Jul 2005 13:45:19 +0000 Subject: Added entries for the files providing the delegation assistant feature 2005-07-08 Praveen Kumar * Makefile.am : Added entries for the files providing the delegation assistant feature * exchange-user-dialog.c : Added new * exchange-user-dialog.h : Added new * exchange-account-setup.c (btn_dass_clicked) : Enabled the code for for invoking the delegation assistant window * exchange-delegates-user.c : Modified to include the header files from include path instead of the local directory * exchange-permissions-dialog.c : Modified an occurence to include the file exchange-user-dialog.c instead of e2k-folder-dialog.c svn path=/trunk/; revision=29686 --- plugins/exchange-operations/exchange-user-dialog.c | 257 +++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 plugins/exchange-operations/exchange-user-dialog.c (limited to 'plugins/exchange-operations/exchange-user-dialog.c') diff --git a/plugins/exchange-operations/exchange-user-dialog.c b/plugins/exchange-operations/exchange-user-dialog.c new file mode 100644 index 0000000000..a9c78cc493 --- /dev/null +++ b/plugins/exchange-operations/exchange-user-dialog.c @@ -0,0 +1,257 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ + +/* Copyright (C) 2001-2004 Novell, Inc. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "exchange-user-dialog.h" +#include "e2k-types.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "e2k-xml-utils.h" + +struct _E2kUserDialogPrivate { + char *section_name; + ENameSelector *name_selector; + GtkWidget *entry, *parent_window; +}; + +#define PARENT_TYPE GTK_TYPE_DIALOG +static GtkDialogClass *parent_class; + +static void parent_window_destroyed (gpointer dialog, GObject *where_parent_window_was); + +static void +finalize (GObject *object) +{ + E2kUserDialog *dialog = E2K_USER_DIALOG (object); + + g_free (dialog->priv->section_name); + g_free (dialog->priv); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + +static void +dispose (GObject *object) +{ + E2kUserDialog *dialog = E2K_USER_DIALOG (object); + + if (dialog->priv->name_selector != NULL) { + g_object_unref (dialog->priv->name_selector); + dialog->priv->name_selector = NULL; + } + + if (dialog->priv->parent_window) { + g_object_weak_unref (G_OBJECT (dialog->priv->parent_window), + parent_window_destroyed, dialog); + dialog->priv->parent_window = NULL; + } + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +class_init (E2kUserDialogClass *class) +{ + GObjectClass *object_class = (GObjectClass *) class; + + parent_class = g_type_class_ref (GTK_TYPE_DIALOG); + + object_class->dispose = dispose; + object_class->finalize = finalize; +} + +static void +init (E2kUserDialog *dialog) +{ + dialog->priv = g_new0 (E2kUserDialogPrivate, 1); + + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 6); +} + +E2K_MAKE_TYPE (e2k_user_dialog, E2kUserDialog, class_init, init, PARENT_TYPE) + + + +static void +parent_window_destroyed (gpointer user_data, GObject *where_parent_window_was) +{ + E2kUserDialog *dialog = user_data; + + dialog->priv->parent_window = NULL; + gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL); +} + +static void +addressbook_dialog_response (ENameSelectorDialog *name_selector_dialog, gint response, gpointer data) +{ + gtk_widget_hide (GTK_WIDGET (name_selector_dialog)); +} + +static void +addressbook_clicked_cb (GtkWidget *widget, gpointer data) +{ + E2kUserDialog *dialog = data; + E2kUserDialogPrivate *priv; + ENameSelectorDialog *name_selector_dialog; + + priv = dialog->priv; + + name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector); + gtk_window_set_modal (GTK_WINDOW (dialog), FALSE); + gtk_widget_show (GTK_WIDGET (name_selector_dialog)); +} + +static gboolean +e2k_user_dialog_construct (E2kUserDialog *dialog, + GtkWidget *parent_window, + const char *label_text, + const char *section_name) +{ + E2kUserDialogPrivate *priv; + GtkWidget *hbox, *vbox, *label, *button; + ENameSelectorModel *name_selector_model; + ENameSelectorDialog *name_selector_dialog; + + gtk_window_set_title (GTK_WINDOW (dialog), _("Select User")); + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + + e_dialog_set_transient_for (GTK_WINDOW (dialog), parent_window); + + priv = dialog->priv; + priv->section_name = g_strdup (section_name); + + priv->parent_window = parent_window; + g_object_weak_ref (G_OBJECT (parent_window), + parent_window_destroyed, dialog); + + /* Set up the actual select names bits */ + priv->name_selector = e_name_selector_new (); + + /* Listen for responses whenever the dialog is shown */ + name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector); + g_signal_connect (name_selector_dialog, "response", + G_CALLBACK (addressbook_dialog_response), dialog); + + name_selector_model = e_name_selector_peek_model (priv->name_selector); + /* FIXME Limit to one user */ + e_name_selector_model_add_section (name_selector_model, section_name, section_name, NULL); + + hbox = gtk_hbox_new (FALSE, 6); + + label = gtk_label_new (label_text); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6); + + /* The vbox is a workaround for bug 43315 */ + vbox = gtk_vbox_new (FALSE, 0); + priv->entry = GTK_WIDGET (e_name_selector_peek_section_entry (priv->name_selector, section_name)); + gtk_box_pack_start (GTK_BOX (vbox), priv->entry, TRUE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 6); + + button = gtk_button_new_with_label (_("Addressbook...")); + g_signal_connect (button, "clicked", + G_CALLBACK (addressbook_clicked_cb), + dialog); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 6); + + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, + TRUE, TRUE, 6); + gtk_widget_show_all (hbox); + + return TRUE; +} + +/** + * e2k_user_dialog_new: + * @parent_window: The window invoking the dialog. + * @label_text: Text to label the entry in the initial dialog with + * @section_name: The section name for the select-names dialog + * + * Creates a new user selection dialog. + * + * Return value: A newly-created user selection dialog, or %NULL if + * the dialog could not be created. + **/ +GtkWidget * +e2k_user_dialog_new (GtkWidget *parent_window, + const char *label_text, const char *section_name) +{ + E2kUserDialog *dialog; + + g_return_val_if_fail (GTK_IS_WINDOW (parent_window), NULL); + g_return_val_if_fail (label_text != NULL, NULL); + g_return_val_if_fail (section_name != NULL, NULL); + + dialog = g_object_new (E2K_TYPE_USER_DIALOG, NULL); + if (!e2k_user_dialog_construct (dialog, parent_window, + label_text, section_name)) { + gtk_widget_destroy (GTK_WIDGET (dialog)); + return NULL; + } + + return GTK_WIDGET (dialog); +} + +/** + * e2k_user_dialog_get_user: + * @dialog: the dialog + * + * Gets the email address of the selected user from the dialog. + * + * Return value: the email address, which must be freed with g_free(). + **/ +char * +e2k_user_dialog_get_user (E2kUserDialog *dialog) +{ + E2kUserDialogPrivate *priv; + EDestinationStore *destination_store; + GList *destinations; + EDestination *destination; + gchar *result = NULL; + + g_return_val_if_fail (E2K_IS_USER_DIALOG (dialog), NULL); + + priv = dialog->priv; + + destination_store = e_name_selector_entry_peek_destination_store (E_NAME_SELECTOR_ENTRY (priv->entry)); + destinations = e_destination_store_list_destinations (destination_store); + if (!destinations) + return NULL; + + destination = destinations->data; + result = g_strdup (e_destination_get_email (destination)); + g_list_free (destinations); + + return result; +} -- cgit v1.2.3