aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/dialogs/calendar-setup.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/dialogs/calendar-setup.c')
-rw-r--r--calendar/gui/dialogs/calendar-setup.c773
1 files changed, 773 insertions, 0 deletions
diff --git a/calendar/gui/dialogs/calendar-setup.c b/calendar/gui/dialogs/calendar-setup.c
new file mode 100644
index 0000000000..b310bada53
--- /dev/null
+++ b/calendar/gui/dialogs/calendar-setup.c
@@ -0,0 +1,773 @@
+/* Evolution calendar - Calendar properties dialogs
+ *
+ * Copyright (C) 2003 Novell, Inc.
+ *
+ * Author: Hans Petter Jansson <hpj@ximian.com>
+ *
+ * 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 <config.h>
+#endif
+
+#include <string.h>
+#include <bonobo/bonobo-i18n.h>
+#include <gtk/gtkdialog.h>
+#include <gtk/gtkentry.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkmessagedialog.h>
+#include <gtk/gtkoptionmenu.h>
+#include <libgnomeui/gnome-druid.h>
+#include <libgnomeui/gnome-druid-page.h>
+#include <glade/glade.h>
+#include <libedataserver/e-source-list.h>
+#include <e-util/e-dialog-utils.h>
+#include <e-util/e-url.h>
+#include "calendar-setup.h"
+
+#define GLADE_FILE_NAME "calendar-setup.glade"
+
+typedef struct
+{
+ GladeXML *gui_xml;
+
+ /* Main widgets */
+ GtkWidget *window;
+ GtkWidget *druid;
+
+ /* Source selection */
+ ESourceList *source_list;
+ GtkWidget *group_optionmenu;
+
+ /* ESource we're currently editing (if any) */
+ ESource *source;
+
+ /* Source group we're creating/editing source in */
+ ESourceGroup *source_group;
+
+ /* General page fields */
+ GtkWidget *name_entry;
+
+ /* Location page fields */
+ GtkWidget *uri_entry;
+ GtkWidget *refresh_spin;
+}
+SourceDialog;
+
+static gchar *
+print_uri_noproto (EUri *uri)
+{
+ gchar *uri_noproto;
+
+ if (uri->port != 0)
+ uri_noproto = g_strdup_printf (
+ "%s%s%s%s%s%s%s:%d%s%s%s",
+ uri->user ? uri->user : "",
+ uri->authmech ? ";auth=" : "",
+ uri->authmech ? uri->authmech : "",
+ uri->passwd ? ":" : "",
+ uri->passwd ? uri->passwd : "",
+ uri->user ? "@" : "",
+ uri->host ? uri->host : "",
+ uri->port,
+ uri->path ? uri->path : "",
+ uri->query ? "?" : "",
+ uri->query ? uri->query : "");
+ else
+ uri_noproto = g_strdup_printf (
+ "%s%s%s%s%s%s%s%s%s%s",
+ uri->user ? uri->user : "",
+ uri->authmech ? ";auth=" : "",
+ uri->authmech ? uri->authmech : "",
+ uri->passwd ? ":" : "",
+ uri->passwd ? uri->passwd : "",
+ uri->user ? "@" : "",
+ uri->host ? uri->host : "",
+ uri->path ? uri->path : "",
+ uri->query ? "?" : "",
+ uri->query ? uri->query : "");
+
+ return uri_noproto;
+}
+
+static gboolean
+source_group_is_remote (ESourceGroup *group)
+{
+ EUri *uri;
+ gboolean is_remote = FALSE;
+
+ uri = e_uri_new (e_source_group_peek_base_uri (group));
+ if (!uri)
+ return FALSE;
+
+ if (uri->protocol && uri->protocol [0] && strcmp (uri->protocol, "file"))
+ is_remote = TRUE;
+
+ e_uri_free (uri);
+ return is_remote;
+}
+
+static gboolean
+source_is_remote (ESource *source)
+{
+ gchar *uri_str;
+ EUri *uri;
+ gboolean is_remote = FALSE;
+
+ uri_str = e_source_get_uri (source);
+ if (!uri_str)
+ return FALSE;
+
+ uri = e_uri_new (uri_str);
+ g_free (uri_str);
+
+ if (!uri)
+ return FALSE;
+
+ if (uri->protocol && uri->protocol [0] && strcmp (uri->protocol, "file"))
+ is_remote = TRUE;
+
+ e_uri_free (uri);
+ return is_remote;
+}
+
+static gboolean
+validate_remote_uri (const gchar *source_location, gboolean interactive, GtkWidget *parent)
+{
+ EUri *uri;
+
+ if (!source_location || !strlen (source_location)) {
+ if (interactive)
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("You must specify a location to get the calendar from."));
+ return FALSE;
+ }
+
+ uri = e_uri_new (source_location);
+ if (!uri) {
+ if (interactive)
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("The source location '%s' is not well-formed."),
+ source_location);
+ return FALSE;
+ }
+
+ /* Make sure we're in agreement with the protocol. Note that EUri sets it
+ * to 'file' if none was specified in the input URI. We don't want to
+ * silently translate an explicit file:// into http:// though. */
+ if (uri->protocol &&
+ strcmp (uri->protocol, "http") &&
+ strcmp (uri->protocol, "webcal")) {
+ e_uri_free (uri);
+
+ if (interactive)
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("The source location '%s' is not a webcal source."),
+ source_location);
+ return FALSE;
+ }
+
+ e_uri_free (uri);
+ return TRUE;
+}
+
+static void
+source_group_menu_add_groups (GtkMenuShell *menu_shell, ESourceList *source_list)
+{
+ GSList *groups, *sl;
+
+ groups = e_source_list_peek_groups (source_list);
+ for (sl = groups; sl; sl = g_slist_next (sl)) {
+ GtkWidget *menu_item;
+ ESourceGroup *group = sl->data;
+
+ menu_item = gtk_menu_item_new_with_label (e_source_group_peek_name (group));
+ gtk_widget_show (menu_item);
+ gtk_menu_shell_append (menu_shell, menu_item);
+ }
+}
+
+static ESource *
+create_new_source_with_group (GtkWindow *parent,
+ ESourceGroup *group,
+ const char *source_name,
+ const char *source_location)
+{
+ ESource *source;
+
+ if (e_source_group_peek_source_by_name (group, source_name)) {
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("Source with name '%s' already exists in the selected group"),
+ source_name);
+ return NULL;
+ }
+
+ if (source_group_is_remote (group)) {
+ EUri *uri;
+ gchar *relative_uri;
+
+ /* Remote source */
+
+ if (!source_location || !strlen (source_location)) {
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("The group '%s' is remote. You must specify a location "
+ "to get the calendar from"),
+ e_source_group_peek_name (group));
+ return NULL;
+ }
+
+ if (!validate_remote_uri (source_location, TRUE, GTK_WIDGET (parent)))
+ return NULL;
+
+ /* Our relative_uri is everything but protocol, which is supplied by parent group */
+ uri = e_uri_new (source_location);
+ relative_uri = print_uri_noproto (uri);
+ e_uri_free (uri);
+
+ /* Create source */
+ source = e_source_new (source_name, relative_uri);
+
+ g_free (relative_uri);
+ } else {
+ char *new_dir;
+
+ /* Local source */
+
+ new_dir = g_build_filename (e_source_group_peek_base_uri (group),
+ source_name, NULL);
+ if (e_mkdir_hier (new_dir, 0700)) {
+ g_free (new_dir);
+ e_notice (parent, GTK_MESSAGE_ERROR,
+ _("Could not create directory for new calendar"));
+ return NULL;
+ }
+
+ source = e_source_new (source_name, source_name);
+ g_free (new_dir);
+ }
+
+ e_source_group_add_source (group, source, -1);
+ return source;
+}
+
+static void
+source_dialog_destroy (SourceDialog *source_dialog)
+{
+ g_object_unref (source_dialog->gui_xml);
+
+ if (source_dialog->source)
+ g_object_unref (source_dialog->source);
+
+ g_free (source_dialog);
+}
+
+static void
+source_to_dialog (SourceDialog *source_dialog)
+{
+ ESource *source = source_dialog->source;
+
+ g_signal_handlers_block_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+ g_signal_handlers_block_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+ g_signal_handlers_block_matched (source_dialog->refresh_spin, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+
+ gtk_entry_set_text (GTK_ENTRY (source_dialog->name_entry), source ? e_source_peek_name (source) : "");
+ if (source && source_is_remote (source)) {
+ gchar *uri_str;
+ const gchar *refresh_str;
+
+ uri_str = e_source_get_uri (source);
+ gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), uri_str);
+ g_free (uri_str);
+
+ refresh_str = e_source_get_property (source, "refresh");
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin),
+ refresh_str ? atoi (refresh_str) : 30);
+ } else {
+ gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), "");
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), 30);
+ }
+
+ g_signal_handlers_unblock_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+ g_signal_handlers_unblock_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+ g_signal_handlers_unblock_matched (source_dialog->refresh_spin, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL, source_dialog);
+}
+
+static void
+dialog_to_source (SourceDialog *source_dialog)
+{
+ ESource *source = source_dialog->source;
+
+ g_return_if_fail (source != NULL);
+
+ e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)));
+ if (source_is_remote (source)) {
+ EUri *uri;
+ gchar *relative_uri;
+ gchar *refresh_str;
+
+ /* Our relative_uri is everything but protocol, which is supplied by parent group */
+ uri = e_uri_new (gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)));
+ if (!uri) {
+ g_warning ("Invalid remote URI!");
+ return;
+ }
+
+ relative_uri = print_uri_noproto (uri);
+ e_uri_free (uri);
+
+ refresh_str = g_strdup_printf ("%d",
+ gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (source_dialog->refresh_spin)));
+
+ e_source_set_property (source, "refresh", refresh_str);
+ g_free (refresh_str);
+ }
+}
+
+static gboolean
+general_page_verify (SourceDialog *source_dialog)
+{
+ const gchar *name;
+
+ if (!source_dialog->source_group && !source_dialog->source)
+ return FALSE;
+
+ name = gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry));
+ if (!name || !name [0])
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+remote_page_verify (SourceDialog *source_dialog)
+{
+ const gchar *uri;
+
+ uri = gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry));
+ if (!uri || !uri [0])
+ return FALSE;
+
+ if (!validate_remote_uri (uri, FALSE, NULL))
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+source_dialog_is_valid (SourceDialog *source_dialog)
+{
+ if (!general_page_verify (source_dialog))
+ return FALSE;
+
+ if (((source_dialog->source && source_is_remote (source_dialog->source)) ||
+ (source_dialog->source_group && source_group_is_remote (source_dialog->source_group))) &&
+ !remote_page_verify (source_dialog))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+editor_set_buttons_sensitive (SourceDialog *source_dialog, gboolean sensitive)
+{
+ gtk_widget_set_sensitive (glade_xml_get_widget (source_dialog->gui_xml, "ok-button"), sensitive);
+}
+
+static void
+general_page_modified (SourceDialog *source_dialog)
+{
+ if (source_dialog->druid) {
+ gnome_druid_set_buttons_sensitive (GNOME_DRUID (source_dialog->druid),
+ TRUE, /* Back */
+ general_page_verify (source_dialog), /* Next */
+ TRUE, /* Cancel */
+ FALSE); /* Help */
+ } else {
+ editor_set_buttons_sensitive (source_dialog, source_dialog_is_valid (source_dialog));
+ }
+}
+
+static void
+remote_page_modified (SourceDialog *source_dialog)
+{
+ if (source_dialog->druid) {
+ gnome_druid_set_buttons_sensitive (GNOME_DRUID (source_dialog->druid),
+ TRUE, /* Back */
+ remote_page_verify (source_dialog), /* Next */
+ TRUE, /* Cancel */
+ FALSE); /* Help */
+ } else {
+ editor_set_buttons_sensitive (source_dialog, source_dialog_is_valid (source_dialog));
+ }
+}
+
+static void
+source_group_changed (SourceDialog *source_dialog)
+{
+ source_dialog->source_group =
+ g_slist_nth (e_source_list_peek_groups (source_dialog->source_list),
+ gtk_option_menu_get_history (GTK_OPTION_MENU (source_dialog->group_optionmenu)))->data;
+}
+
+static void
+general_page_prepare (GtkWidget *page, GtkWidget *druid, SourceDialog *source_dialog)
+{
+ general_page_modified (source_dialog);
+ gtk_widget_grab_focus (source_dialog->name_entry);
+}
+
+static void
+remote_page_prepare (GtkWidget *page, GtkWidget *druid, SourceDialog *source_dialog)
+{
+ remote_page_modified (source_dialog);
+ gtk_widget_grab_focus (source_dialog->uri_entry);
+}
+
+static gboolean
+general_page_forward (GtkWidget *page, GtkWidget *widget, SourceDialog *source_dialog)
+{
+ GtkWidget *finish_page = glade_xml_get_widget (source_dialog->gui_xml, "finish-page");
+
+ if (!source_group_is_remote (source_dialog->source_group)) {
+ gnome_druid_set_page (GNOME_DRUID (source_dialog->druid), GNOME_DRUID_PAGE (finish_page));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+finish_page_back (GtkWidget *page, GtkWidget *widget, SourceDialog *source_dialog)
+{
+ GtkWidget *general_page = glade_xml_get_widget (source_dialog->gui_xml, "general-page");
+
+ if (!source_group_is_remote (source_dialog->source_group)) {
+ gnome_druid_set_page (GNOME_DRUID (source_dialog->druid), GNOME_DRUID_PAGE (general_page));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
+new_calendar_finish (SourceDialog *source_dialog)
+{
+ source_dialog->source =
+ create_new_source_with_group (GTK_WINDOW (source_dialog->window), source_dialog->source_group,
+ gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)),
+ gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)));
+ dialog_to_source (source_dialog);
+
+ gtk_widget_destroy (source_dialog->window);
+}
+
+static void
+new_calendar_cancel (SourceDialog *source_dialog)
+{
+ gtk_widget_destroy (source_dialog->window);
+}
+
+gboolean
+calendar_setup_new_calendar (GtkWindow *parent)
+{
+ SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
+ GConfClient *gconf_client;
+ GtkWidget *page;
+
+ source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "calendar-druid-window", NULL);
+ if (!source_dialog->gui_xml) {
+ g_warning (G_STRLOC ": Cannot load Glade file.");
+ g_free (source_dialog);
+ return FALSE;
+ }
+
+ source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "calendar-druid-window");
+ source_dialog->druid = glade_xml_get_widget (source_dialog->gui_xml, "druid");
+
+ /* General page */
+ page = glade_xml_get_widget (source_dialog->gui_xml, "general-page");
+ source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry");
+ g_signal_connect_swapped (source_dialog->name_entry, "changed",
+ G_CALLBACK (general_page_modified), source_dialog);
+ g_signal_connect_after (page, "prepare",
+ G_CALLBACK (general_page_prepare), source_dialog);
+ g_signal_connect_after (page, "next",
+ G_CALLBACK (general_page_forward), source_dialog);
+
+ gconf_client = gconf_client_get_default ();
+ source_dialog->source_list =
+ e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
+ source_dialog->group_optionmenu =
+ glade_xml_get_widget (source_dialog->gui_xml, "group-optionmenu");
+ if (!GTK_IS_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu)))) {
+ GtkWidget *menu = gtk_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu), menu);
+ gtk_widget_show (menu);
+ }
+
+ /* NOTE: This assumes that we have sources. If they don't exist, they're set up
+ * on startup of the calendar component. */
+ source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu (
+ GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog->source_list);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), 0);
+ source_dialog->source_group = e_source_list_peek_groups (source_dialog->source_list)->data;
+ g_signal_connect_swapped (source_dialog->group_optionmenu, "changed",
+ G_CALLBACK (source_group_changed), source_dialog);
+
+ /* Remote page */
+ page = glade_xml_get_widget (source_dialog->gui_xml, "remote-page");
+ source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry");
+ source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin");
+ g_signal_connect_swapped (source_dialog->uri_entry, "changed",
+ G_CALLBACK (remote_page_modified), source_dialog);
+ g_signal_connect_swapped (source_dialog->refresh_spin, "changed",
+ G_CALLBACK (remote_page_modified), source_dialog);
+ g_signal_connect_after (page, "prepare",
+ G_CALLBACK (remote_page_prepare), source_dialog);
+
+ /* Finish page */
+ page = glade_xml_get_widget (source_dialog->gui_xml, "finish-page");
+ g_signal_connect_swapped (page, "finish",
+ G_CALLBACK (new_calendar_finish), source_dialog);
+ g_signal_connect_after (page, "back",
+ G_CALLBACK (finish_page_back), source_dialog);
+ g_signal_connect_swapped (source_dialog->druid, "cancel",
+ G_CALLBACK (new_calendar_cancel), source_dialog);
+ g_object_weak_ref (G_OBJECT (source_dialog->window),
+ (GWeakNotify) source_dialog_destroy, source_dialog);
+
+ /* Prepare and show dialog */
+ source_to_dialog (source_dialog);
+
+ gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE);
+
+ gtk_widget_show_all (source_dialog->window);
+
+ return TRUE;
+}
+
+static void
+edit_calendar_finish (SourceDialog *source_dialog)
+{
+ dialog_to_source (source_dialog);
+ gtk_widget_destroy (source_dialog->window);
+}
+
+static void
+edit_calendar_cancel (SourceDialog *source_dialog)
+{
+ gtk_widget_destroy (source_dialog->window);
+}
+
+gboolean
+calendar_setup_edit_calendar (GtkWindow *parent, ESource *source)
+{
+ SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
+
+ g_return_val_if_fail (source != NULL, FALSE);
+
+ source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "calendar-editor-window", NULL);
+ if (!source_dialog->gui_xml) {
+ g_warning (G_STRLOC ": Cannot load Glade file.");
+ g_free (source_dialog);
+ return FALSE;
+ }
+
+ source_dialog->source = source;
+ g_object_ref (source);
+
+ source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "calendar-editor-window");
+
+ /* General page */
+ source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry");
+ g_signal_connect_swapped (source_dialog->name_entry, "changed",
+ G_CALLBACK (general_page_modified), source_dialog);
+
+ /* Remote page */
+ source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry");
+ source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin");
+ g_signal_connect_swapped (source_dialog->uri_entry, "changed",
+ G_CALLBACK (remote_page_modified), source_dialog);
+ g_signal_connect_swapped (source_dialog->refresh_spin, "changed",
+ G_CALLBACK (remote_page_modified), source_dialog);
+
+ /* Finishing */
+ g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "ok-button"), "clicked",
+ G_CALLBACK (edit_calendar_finish), source_dialog);
+ g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked",
+ G_CALLBACK (edit_calendar_cancel), source_dialog);
+ g_object_weak_ref (G_OBJECT (source_dialog->window),
+ (GWeakNotify) source_dialog_destroy, source_dialog);
+
+ /* Prepare and show dialog */
+ source_to_dialog (source_dialog);
+
+ gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE);
+
+ gtk_widget_show_all (source_dialog->window);
+
+ if (!source_is_remote (source_dialog->source))
+ gtk_widget_hide (glade_xml_get_widget (source_dialog->gui_xml, "remote-page"));
+
+ return TRUE;
+}
+
+static void
+new_task_list_finish (SourceDialog *source_dialog)
+{
+ source_dialog->source =
+ create_new_source_with_group (GTK_WINDOW (source_dialog->window), source_dialog->source_group,
+ gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry)),
+ gtk_entry_get_text (GTK_ENTRY (source_dialog->uri_entry)));
+ dialog_to_source (source_dialog);
+
+ gtk_widget_destroy (source_dialog->window);
+}
+
+static void
+new_task_list_cancel (SourceDialog *source_dialog)
+{
+ gtk_widget_destroy (source_dialog->window);
+}
+
+gboolean
+calendar_setup_new_task_list (GtkWindow *parent)
+{
+ SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
+ GConfClient *gconf_client;
+ GtkWidget *page;
+
+ source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "task-list-druid-window", NULL);
+ if (!source_dialog->gui_xml) {
+ g_warning (G_STRLOC ": Cannot load Glade file.");
+ g_free (source_dialog);
+ return FALSE;
+ }
+
+ source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "task-list-druid-window");
+ source_dialog->druid = glade_xml_get_widget (source_dialog->gui_xml, "druid");
+
+ /* General page */
+ page = glade_xml_get_widget (source_dialog->gui_xml, "general-page");
+ source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry");
+ g_signal_connect_swapped (source_dialog->name_entry, "changed",
+ G_CALLBACK (general_page_modified), source_dialog);
+ g_signal_connect_after (page, "prepare",
+ G_CALLBACK (general_page_prepare), source_dialog);
+
+ gconf_client = gconf_client_get_default ();
+ source_dialog->source_list =
+ e_source_list_new_for_gconf (gconf_client, "/apps/evolution/tasks/sources");
+ source_dialog->group_optionmenu =
+ glade_xml_get_widget (source_dialog->gui_xml, "group-optionmenu");
+ if (!GTK_IS_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu)))) {
+ GtkWidget *menu = gtk_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (source_dialog->group_optionmenu), menu);
+ gtk_widget_show (menu);
+ }
+
+ /* NOTE: This assumes that we have sources. If they don't exist, they're set up
+ * on startup of the calendar component. */
+ source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu (
+ GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog->source_list);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), 0);
+ source_dialog->source_group = e_source_list_peek_groups (source_dialog->source_list)->data;
+ g_signal_connect_swapped (source_dialog->group_optionmenu, "changed",
+ G_CALLBACK (source_group_changed), source_dialog);
+
+ /* Finish page */
+ page = glade_xml_get_widget (source_dialog->gui_xml, "finish-page");
+ g_signal_connect_swapped (page, "finish",
+ G_CALLBACK (new_task_list_finish), source_dialog);
+ g_signal_connect_swapped (source_dialog->druid, "cancel",
+ G_CALLBACK (new_task_list_cancel), source_dialog);
+ g_object_weak_ref (G_OBJECT (source_dialog->window),
+ (GWeakNotify) source_dialog_destroy, source_dialog);
+
+ /* Prepare and show dialog */
+ source_to_dialog (source_dialog);
+
+ gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE);
+
+ gtk_widget_show_all (source_dialog->window);
+
+ return TRUE;
+}
+
+static void
+edit_task_list_finish (SourceDialog *source_dialog)
+{
+ dialog_to_source (source_dialog);
+ gtk_widget_destroy (source_dialog->window);
+}
+
+static void
+edit_task_list_cancel (SourceDialog *source_dialog)
+{
+ gtk_widget_destroy (source_dialog->window);
+}
+
+gboolean
+calendar_setup_edit_task_list (GtkWindow *parent, ESource *source)
+{
+ SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
+
+ g_return_val_if_fail (source != NULL, FALSE);
+
+ source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "task-list-editor-window", NULL);
+ if (!source_dialog->gui_xml) {
+ g_warning (G_STRLOC ": Cannot load Glade file.");
+ g_free (source_dialog);
+ return FALSE;
+ }
+
+ source_dialog->source = source;
+ g_object_ref (source);
+
+ source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "task-list-editor-window");
+
+ /* General page */
+ source_dialog->name_entry = glade_xml_get_widget (source_dialog->gui_xml, "name-entry");
+ g_signal_connect_swapped (source_dialog->name_entry, "changed",
+ G_CALLBACK (general_page_modified), source_dialog);
+
+ /* Finishing */
+ g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "ok-button"), "clicked",
+ G_CALLBACK (edit_task_list_finish), source_dialog);
+ g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked",
+ G_CALLBACK (edit_task_list_cancel), source_dialog);
+ g_object_weak_ref (G_OBJECT (source_dialog->window),
+ (GWeakNotify) source_dialog_destroy, source_dialog);
+
+ /* Prepare and show dialog */
+ source_to_dialog (source_dialog);
+
+ gtk_window_set_type_hint (GTK_WINDOW (source_dialog->window), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_window_set_modal (GTK_WINDOW (source_dialog->window), TRUE);
+
+ gtk_widget_show_all (source_dialog->window);
+
+ return TRUE;
+}