Re: [evolution-patches] calendar properties window plugin hooks



So I got lots of stuff done today - here's the updated version, which
not only implements the new calendar dialog but also task list creation
and properties windows (with as much shared code as I think possible).

Lemme know how things look,

-David

On Thu, 2004-10-21 at 13:44 +0800, Not Zed wrote:
> 
> Looking good.
> 
> - dont set the table spacing.  yes the spacing is a bit wrong but that
> applies everywhere, it just needs to be fixed in e-config.c rather
> than worked-around in every component.
> - it may make sense to add a titled section to wrap things in, it just
> looks more consistent with the other components.
> - be nice if you didn't need the 'real' as well as the 'source' in the
> target, then again maybe thats better for plugins anyway and i need to
> do that elsewhere.  so leave that for now.
> - see the addressbook stuff for how to convert this to a 'dynamic' ui
> which can also be used for creating calendars.  you could basically
> just copy everything in eab-config.c into e-cal-config.c and rename or
> whatever, i just started with e-cal-config when i wrote it.  it
> handles various details you need for a dynamic ui.
> 
> The check stuff is wrong though. You should add a page-check function,
> and you call e_config_target_changed when things change (this can be
> done inside the target directly - again see the addressbook stuff i
> just committed), and that will trigger a validate, and manage the
> button sensitivity too.  That means you can remove all of the check
> and allocating your own stuff, etc.
> 
> You should use e_config_create_window() instead of
> e_config_create_widget(), to get all of the commit/validate stuff
> happening automatically, and you can get rid of all of the dialog
> handling/etc code because of that.
> 
> So basically looks ok, just a few tweaks, and the new stuff required
> for the create calendar window.
> 
> 
> On Wed, 2004-10-20 at 22:30 -0600, David Trowbridge wrote: 
> > Ok, here's an updated version, that ought to address your concerns.
> > 
> > -David
> > 
> > On Fri, 2004-10-15 at 09:07 +0800, Not Zed wrote:
> > > 
> > > The ESource in the target should be modified instantly as the widgets
> > > change.  This is required for a couple of reasons:
> > > 1. Communicate the changed state to any other interested widgets,
> > > which may be supplied by plugins
> > > 2. Lets the gui know when things have changed, so it can only enable
> > > the "ok" button if the data validates.
> > > 
> > > It also simplifies 'commit' since you just copy/install that source.
> > > Obviously the ESource in the target should be a working-copy and not
> > > the actual ESource.  And clearly point 1 is the vital one.
> > > 
> > > For the plugin it needs to ref the source and keep it around for the
> > > widget modified callbacks.  Also note that this should mean you don't
> > > need to keep any globals to access them since the data will just be on
> > > the source already.  It doesn't need a commit method really since all
> > > of its state is stored in the source which will be committed by the
> > > master programme.
> > > 
> > > I suspect as the calendar naming conventions seem to be e_cal, that
> > > would make sense more than ec_, esp since the filename was changed to
> > > e-cal-.
> > > 
> > > You should probably also do page_check(xx, NULL) since you want all
> > > values checked - there might be more pages.
> > > 
> > > But those are minor points apart from the instant-change-to-source
> > > thing.
> > > 
> > > I'm not sure who needs to own the copyrights if the code is going to
> > > be in the main tree, Novell may want to, even for plugins.
> > > 
> > > On Thu, 2004-10-14 at 15:27 -0600, David Trowbridge wrote: 
> > > > Here is my first attempt at adding config hooks for the calendar
> > > > properties window.
> > > > 
> > > > Note that at this time, field verification isn't enabled, since I wasn't
> > > > sure what people wanted for it.
> > > > 
> > > > It requires a plugin to be installed for webcal properties to function
> > > > correctly - i've added a plugins/ directory to the evolution root (as
> > > > per some discussion on irc a week or so back). This will probably mean
> > > > changing EPlugin to load plugins from both the system directory and the
> > > > user EVOLUTION_PLUGIN_PATH, rather than just one or the other.
> > > > 
> > > > -David
> > > -- 
> > > 
> > > Michael Zucchi <notzed ximian com>
> > > "born to die, live to work, it's
> > > all downhill from here"
> > > Novell's Evolution and Free
> > > Software Developer
> -- 
> 
> Michael Zucchi <notzed ximian com>
> "born to die, live to work, it's
> all downhill from here"
> Novell's Evolution and Free
> Software Developer

Attachment: newfiles.tar.gz
Description: application/compressed-tar

Index: configure.in
===================================================================
RCS file: /cvs/gnome/evolution/configure.in,v
retrieving revision 1.730
diff -u -r1.730 configure.in
--- configure.in	21 Oct 2004 08:51:32 -0000	1.730
+++ configure.in	22 Oct 2004 00:33:18 -0000
@@ -1338,21 +1338,27 @@
 EVO_PLUGIN_RULE=$srcdir/plugin.mk
 AC_SUBST_FILE(EVO_PLUGIN_RULE)
 
-AC_ARG_ENABLE(plugins, [  --enable-plugins=[no/all/list]      Enable plugins.],enable_plugins="$enableval",enable_plugins=no)
+AC_ARG_ENABLE(plugins, [  --enable-plugins=[base/no/all/list]      Enable plugins.],enable_plugins="$enableval",enable_plugins=base)
 
 dnl Add any new plugins here
-plugins_all="subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool"
+plugins_base="calendar-http"
+plugins_all="calendar-http subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool"
 
 if test x"$enable_plugins" = "xno"; then
 	plugins_enabled=""
 	msg_plugins="no"
 else
-	if test x"$enable_plugins" = "xall"; then
-		plugins_enabled="$plugins_all"
+	if test x"$enable_plugins" = "xbase"; then
+		plugins_enabled="$plugins_base"
+		msg_plugins="$plugins_base"
 	else
-		plugins_enabled="$enable_plugins"
-	fi	
-	msg_plugins="$enable_plugins"
+		if test x"$enable_plugins" = "xall"; then
+			plugins_enabled="$plugins_all"
+		else
+			plugins_enabled="$enable_plugins"
+		fi
+		msg_plugins="$enable_plugins"
+	fi
 fi
 AC_SUBST(plugins_enabled)
 AC_SUBST(plugins_all)
@@ -1533,6 +1539,7 @@
 mail/default/C/Makefile
 mail/importers/Makefile
 plugins/Makefile
+plugins/calendar-http/Makefile
 plugins/subject-thread/Makefile
 plugins/save-attachments/Makefile
 plugins/save-calendar/Makefile
Index: calendar/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2552
diff -u -r1.2552 ChangeLog
--- calendar/ChangeLog	20 Oct 2004 18:51:16 -0000	1.2552
+++ calendar/ChangeLog	22 Oct 2004 00:33:31 -0000
@@ -1,3 +1,10 @@
+2004-10-20  David Trowbridge  <trowbrds cs colorado edu>
+
+	* gui/e-cal-config.c: added EConfig subclass for calendars
+	* gui/calendar-component.c, gui/tasks-component.c: initialize
+	  plugin hooks on component startup.
+	* gui/dialogs/calendar-setup.c: Converted to use EConfig
+
 2004-10-20  JP Rosevear  <jpr novell com>
 
 	* gui/calendar-component.c: put an icon on the properties menu item
Index: calendar/gui/Makefile.am
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/Makefile.am,v
retrieving revision 1.299
diff -u -r1.299 Makefile.am
--- calendar/gui/Makefile.am	18 Oct 2004 04:08:47 -0000	1.299
+++ calendar/gui/Makefile.am	22 Oct 2004 00:33:31 -0000
@@ -59,6 +59,11 @@
 
 component_LTLIBRARIES = libevolution-calendar.la
 
+ecalendarincludedir = $(privincludedir)/calendar/gui
+
+ecalendarinclude_HEADERS =	\
+	e-cal-config.h
+
 INCLUDES =						\
 	-DG_LOG_DOMAIN=\"calendar-gui\"			\
 	-I$(top_builddir)/shell				\
@@ -115,6 +120,8 @@
 	e-alarm-list.h				\
 	e-cal-component-preview.c		\
 	e-cal-component-preview.h		\
+	e-cal-config.c				\
+	e-cal-config.h				\
 	e-cal-menu.c				\
 	e-cal-menu.h				\
 	e-cal-model-calendar.h			\
Index: calendar/gui/calendar-component.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-component.c,v
retrieving revision 1.189
diff -u -r1.189 calendar-component.c
--- calendar/gui/calendar-component.c	20 Oct 2004 18:51:16 -0000	1.189
+++ calendar/gui/calendar-component.c	22 Oct 2004 00:33:33 -0000
@@ -55,6 +55,7 @@
 #include "e-util/e-icon-factory.h"
 #include "e-cal-menu.h"
 #include "e-cal-popup.h"
+#include "e-cal-config.h"
 
 /* IDs for user creatable items */
 #define CREATE_EVENT_ID        "event"
@@ -376,7 +377,7 @@
 	if (!selected_source)
 		return;
 
-	calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel(ep->target->widget)), selected_source);
+	calendar_setup_edit_calendar (GTK_WINDOW (gtk_widget_get_toplevel (ep->target->widget)), selected_source);
 }
 
 static EPopupItem ecc_source_popups[] = {
@@ -1183,6 +1184,17 @@
 }
 
 static void
+cc_startup (CalendarComponent *cc)
+{
+	static int started = 0;
+	if (started)
+		return;
+	started = 1;
+
+	e_plugin_hook_register_type (e_cal_config_hook_get_type ());
+}
+
+static void
 impl_createControls (PortableServer_Servant servant,
 		     Bonobo_Control *corba_sidebar_control,
 		     Bonobo_Control *corba_view_control,
@@ -1192,7 +1204,9 @@
 	CalendarComponent *calendar_component = CALENDAR_COMPONENT (bonobo_object_from_servant (servant));
 	CalendarComponentPrivate *priv;
 	CalendarComponentView *component_view;
-	
+
+	cc_startup (calendar_component);
+
 	priv = calendar_component->priv;
 
 	/* Create the calendar component view */
Index: calendar/gui/tasks-component.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/tasks-component.c,v
retrieving revision 1.79
diff -u -r1.79 tasks-component.c
--- calendar/gui/tasks-component.c	20 Oct 2004 18:51:16 -0000	1.79
+++ calendar/gui/tasks-component.c	22 Oct 2004 00:33:35 -0000
@@ -983,6 +983,17 @@
 }
 
 static void
+tc_startup (TasksComponent *tc)
+{
+	static int started = 0;
+	if (started)
+		return;
+	started = 1;
+
+	e_plugin_hook_register_type (e_cal_config_hook_get_type ());
+}
+
+static void
 impl_createControls (PortableServer_Servant servant,
 		     Bonobo_Control *corba_sidebar_control,
 		     Bonobo_Control *corba_view_control,
@@ -992,6 +1003,8 @@
 	TasksComponent *component = TASKS_COMPONENT (bonobo_object_from_servant (servant));
 	TasksComponentPrivate *priv;
 	TasksComponentView *component_view;
+
+	tc_startup (component);
 	
 	priv = component->priv;
 
Index: calendar/gui/dialogs/Makefile.am
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/Makefile.am,v
retrieving revision 1.64
diff -u -r1.64 Makefile.am
--- calendar/gui/dialogs/Makefile.am	24 Jun 2004 21:02:09 -0000	1.64
+++ calendar/gui/dialogs/Makefile.am	22 Oct 2004 00:33:35 -0000
@@ -89,7 +89,6 @@
 	alarm-dialog.glade		\
 	alarm-list-dialog.glade		\
 	cal-prefs-dialog.glade		\
-	calendar-setup.glade		\
 	e-delegate-dialog.glade		\
 	event-page.glade		\
 	meeting-page.glade		\
Index: calendar/gui/dialogs/calendar-setup.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/calendar-setup.c,v
retrieving revision 1.29
diff -u -r1.29 calendar-setup.c
--- calendar/gui/dialogs/calendar-setup.c	30 Jul 2004 07:37:02 -0000	1.29
+++ calendar/gui/dialogs/calendar-setup.c	22 Oct 2004 00:33:35 -0000
@@ -1,12 +1,12 @@
-/* Evolution calendar - Calendar properties dialogs
+/*
+ * Authors: David Trowbridge <trowbrds cs colorado edu>
  *
- * Copyright (C) 2003 Novell, Inc.
- *
- * Author: Hans Petter Jansson <hpj ximian com>
+ * Copyright (C) 2004 Novell, Inc (www.novell.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.
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,879 +15,461 @@
  *
  * 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.
+ * 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 <gdk/gdkkeysyms.h>
+#include <gtk/gtkbox.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 <libgnome/libgnome.h>
-#include <libgnomeui/gnome-druid.h>
-#include <libgnomeui/gnome-druid-page.h>
-#include <libgnomeui/gnome-color-picker.h>
-#include <glade/glade.h>
+#include <gtk/gtkstock.h>
+#include <gtk/gtkvbox.h>
+
+#include <libedataserver/e-source.h>
 #include <libedataserver/e-source-list.h>
-#include <libecal/e-cal.h>
-#include <e-util/e-dialog-utils.h>
-#include <e-util/e-url.h>
-#include <e-util/e-icon-factory.h>
+#include <libgnome/gnome-i18n.h>
+#include <libgnomeui/libgnomeui.h>
+
 #include "calendar-setup.h"
+#include "../e-cal-config.h"
 
-#define GLADE_FILE_NAME "calendar-setup.glade"
+typedef struct _CalendarSourceDialog CalendarSourceDialog;
 
-typedef struct
-{
-	GladeXML     *gui_xml;
+struct _CalendarSourceDialog {
+	ECalConfig *config;	/* the config manager */
 
-	/* Main widgets */
-	GtkWidget    *window;
-	GtkWidget    *druid;
+	GtkWidget *window;
 
-	/* Source selection */
-	ESourceList  *source_list;
-	GtkWidget    *group_optionmenu;
+	/* Source selection (creation only) */
+	ESourceList *source_list;
+	GSList *menu_source_groups;
+	GtkWidget *group_optionmenu;
 
-	/* ESource we're currently editing (if any) */
-	ESource      *source;
+	/* ESource we're currently editing */
+	ESource *source;
+	/* The original source in edit mode.  Also used to flag when we are in edit mode. */
+	ESource *original_source;
 
-	/* Source group we're creating/editing source in */
+	/* Source group we're creating/editing a source in */
 	ESourceGroup *source_group;
-
-	/* General page fields */
-	GtkWidget    *name_entry;
-	GtkWidget    *source_color;
-
-	/* Location page fields */
-	GtkWidget    *uri_entry;
-	GtkWidget    *refresh_spin;
-
-	/* sensitive blocks */
-	GtkWidget    *uri_label;
-	GtkWidget    *uri_hbox;
-	GtkWidget    *refresh_label;
-	GtkWidget    *refresh_hbox;
-	GtkWidget    *refresh_optionmenu;
-	GtkWidget    *add_button;
-}
-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;
-	
-	if (!group)
-		return 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)
+eccp_check_complete (EConfig *ec, const char *pageid, void *data)
 {
-	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;
-	}
+	CalendarSourceDialog *sdialog = data;
+	gboolean valid = TRUE;
+	const char *tmp;
+	ESource *source;
 
-	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;
-	}
+	tmp = e_source_peek_name (sdialog->source);
+	valid = tmp && tmp[0] && ((source = e_source_group_peek_source_by_name (sdialog->source_group, tmp)) == NULL || source == sdialog->original_source);
 
-	/* 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;
+	return valid;
 }
 
-static gboolean
-source_group_is_mutable (ESourceGroup *source_group)
+static void
+colorpicker_set_color (GnomeColorPicker *color, guint32 rgb)
 {
-	gboolean mutable;
-	
-	if (!source_group)
-		return FALSE;
-	
-	mutable = !e_source_group_get_readonly (source_group);
-	
-	if (mutable) {
-		const char *uri = e_source_group_peek_base_uri (source_group);
-		
-		if (g_str_has_prefix (uri, "groupwise://") || g_str_has_prefix (uri, "exchange://"))
-			mutable = FALSE;
-		
-	}
-	
-	return mutable;	
+	gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff);
 }
 
-static int
-source_group_menu_add_groups (GtkMenuShell *menu_shell, SourceDialog *source_dialog)
+static guint32
+colorpicker_get_color (GnomeColorPicker *color)
 {
-	ESourceList *source_list = source_dialog->source_list;
-	GSList *groups, *sl;
-	int index=-1, i=0;
-	
-
-	if (source_list == NULL)
-		return index;
-
-	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);
-
-		if (!source_group_is_mutable (group))
-			gtk_widget_set_sensitive(menu_item, FALSE);
-		
-		if (source_dialog->source_group 
-		    && !strcmp (e_source_group_peek_uid (source_dialog->source_group), e_source_group_peek_uid (group)))
-			index = i;
+	guint8 r, g, b, a;
+	guint32 rgb = 0;
 
-		gtk_menu_shell_append (menu_shell, menu_item);
-		i++;
-	}
+	gnome_color_picker_get_i8 (color, &r, &g, &b, &a);
 
-	if (!source_dialog->source_group && groups) {
-		source_dialog->source_group = groups->data;
-		return -1;
-	}
+	rgb = r;
+	rgb <<= 8;
+	rgb |= g;
+	rgb <<= 8;
+	rgb |= b;
 
-	return index;
+	return rgb;
 }
 
-static ESource *
-create_new_source_with_group (GtkWindow *parent,
-			      ESourceGroup *group,
-			      const char *source_name,
-			      const char *source_location,
-			      ECalSourceType source_type)
+static void
+eccp_commit (EConfig *ec, GSList *items, void *data)
 {
-	ESource *source;
-	ECal *cal;
-
-	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;
+	CalendarSourceDialog *sdialog = data;
+	xmlNodePtr xml;
 
-		/* 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);
+	if (sdialog->original_source) {
+		guint32 color;
 
-		/* Create source */
-		source = e_source_new (source_name, relative_uri);
+		xml = xmlNewNode (NULL, "dummy");
+		e_source_dump_to_xml_node (sdialog->source, xml);
+		e_source_update_from_xml_node (sdialog->original_source, xml->children, NULL);
+		xmlFreeNode (xml);
 
-		g_free (relative_uri);
+		e_source_get_color (sdialog->source, &color);
+		e_source_set_color (sdialog->original_source, color);
 	} else {
-		/* Local source */
-		source = e_source_new (source_name, source_name);
-		e_source_set_relative_uri (source, e_source_peek_uid (source));
+		e_source_group_add_source (sdialog->source_group, sdialog->source, -1);
+		e_source_list_sync (sdialog->source_list, NULL);
 	}
-
-	e_source_group_add_source (group, source, -1);
-
-	/* create the calendar in the backend */
-	cal = e_cal_new (source, source_type);
-	if (!e_cal_open (cal, FALSE, NULL)) {
-		e_source_group_remove_source (group, source);
-		g_object_unref (source);
-		source = NULL;
-	}
-
-	g_object_unref (cal);
-
-	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 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 void
-general_entry_modified (SourceDialog *source_dialog)
+eccp_free (EConfig *ec, GSList *items, void *data)
 {
-	const char *text = gtk_entry_get_text (GTK_ENTRY (source_dialog->name_entry));
-	gboolean sensitive = text && *text != '\0';
+	CalendarSourceDialog *sdialog = data;
 
-	sensitive = sensitive && (source_dialog->source_group != NULL);
-
-	if (source_group_is_remote (source_dialog->source_group) && source_group_is_mutable (source_dialog->source_group)) {
-		sensitive = sensitive && remote_page_verify (source_dialog);
-	}
+	g_slist_free (items);
 
-	gtk_widget_set_sensitive (source_dialog->add_button, sensitive);
+	g_object_unref (sdialog->source);
+	if (sdialog->original_source)
+		g_object_unref (sdialog->original_source);
+	if (sdialog->source_list)
+		g_object_unref (sdialog->source_list);
+	g_slist_free (sdialog->menu_source_groups);
+	g_free (sdialog);
 }
 
 static void
-general_update_dialog (SourceDialog *source_dialog)
+eccp_type_changed (GtkComboBox *dropdown, CalendarSourceDialog *sdialog)
 {
-	gboolean remote = FALSE;
-	gboolean mutable = source_group_is_mutable (source_dialog->source_group);
+	int id = gtk_combo_box_get_active (dropdown);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-	if (source_dialog->source && e_source_get_readonly (source_dialog->source))
-		gtk_widget_set_sensitive (glade_xml_get_widget (source_dialog->gui_xml, "settings-table"), FALSE);
+	model = gtk_combo_box_get_model (dropdown);
+	if (id == -1 || !gtk_tree_model_iter_nth_child (model, &iter, NULL, id))
+		return;
 
-	/* These are calendar specific so make sure we have them */
-	if (source_dialog->uri_entry)
-		g_signal_handlers_block_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
-						 0, 0, NULL, NULL, source_dialog);
+	/* TODO: when we change the group type, we lose all of the pre-filled dialog info */
 
-	remote = (source_dialog->source && source_is_remote (source_dialog->source)) 
-		  || source_group_is_remote (source_dialog->source_group);
+	gtk_tree_model_get (model, &iter, 1, &sdialog->source_group, -1);
+	/* HACK: doesn't work if you don't do this */
+	e_source_set_absolute_uri (sdialog->source, NULL);
+	e_source_set_group (sdialog->source, sdialog->source_group);
 
+	e_source_set_relative_uri (sdialog->source, "");
 
-	if (!remote) {
-		if (source_dialog->uri_entry)
-			gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), "");
-		if (source_dialog->refresh_spin)
-			gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), 30);
-	}
-	
-	general_entry_modified (source_dialog);
-
-	if (source_dialog->uri_hbox)
-		gtk_widget_set_sensitive (source_dialog->uri_hbox, remote && mutable);
-	if (source_dialog->uri_label)
-		gtk_widget_set_sensitive (source_dialog->uri_label, remote && mutable);
-	if (source_dialog->refresh_label)
-		gtk_widget_set_sensitive (source_dialog->refresh_label, remote && mutable);
-	if (source_dialog->refresh_hbox)
-		gtk_widget_set_sensitive (source_dialog->refresh_hbox, remote && mutable);
-
-	if (source_dialog->uri_entry)
-		g_signal_handlers_unblock_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
-						   0, 0, NULL, NULL, source_dialog);
-}
-
-static void
-colorpicker_set_color (GnomeColorPicker *color, guint32 rgb)
-{
-	gnome_color_picker_set_i8 (color, (rgb & 0xff0000) >> 16, (rgb & 0xff00) >> 8, rgb & 0xff, 0xff);
+	e_config_target_changed ((EConfig *) sdialog->config, E_CONFIG_TARGET_CHANGED_REBUILD);
 }
 
-static guint32
-colorpicker_get_color (GnomeColorPicker *color)
+static GtkWidget *
+eccp_get_source_type (EConfig *ec, EConfigItem *item, GtkWidget *parent, GtkWidget *old, void *data)
 {
-	guint8 r, g, b, a;
-	guint32 rgb = 0;
-	
-	gnome_color_picker_get_i8 (color, &r, &g, &b, &a);
-	
-	rgb   = r;
-	rgb <<= 8;
-	rgb  |= g;
-	rgb <<= 8;
-	rgb  |= b;
-	
-	return rgb;
-}					    
+	static GtkWidget *label, *type;
+	int row;
+	CalendarSourceDialog *sdialog = data;
+	ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
+	ESource *source = t->source;
+	ESourceGroup *group = e_source_peek_group (source);
+	char *markup;
 
-static char *
-get_refresh_minutes (SourceDialog *source_dialog)
-{
-	int setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (source_dialog->refresh_spin));
+	if (old)
+		gtk_widget_destroy (label);
 
-	if (source_dialog->refresh_optionmenu)		
-		switch (gtk_option_menu_get_history (GTK_OPTION_MENU (source_dialog->refresh_optionmenu))){
-		case 0: /* minutes */
-			break;
-		case 1: /* hours */
-			setting *= 60;
-			break;
-		case 2: /* days */
-			setting *= 1440;
-			break;
-		case 3: /* weeks wtf? why so long */
-			setting *= 10080;
-			break;
-		default:
-			g_warning ("Time unit out of range");
-			break;
-		}
+	row = ((GtkTable *)parent)->nrows;
 
-	return g_strdup_printf ("%d", setting);
-}
+	if (sdialog->original_source) {
+		label = gtk_label_new (_("Type:"));
 
-static void
-set_refresh_time (SourceDialog *source_dialog) {
-        int time;
-	int item_num = 0;
-	
-	const char *refresh_str = e_source_get_property (source_dialog->source, "refresh");
-	time = refresh_str ? atoi (refresh_str) : 30;
-
-	if (source_dialog->refresh_optionmenu) {
-		if (time && !(time % 10080)) {
-			/* weeks */
-			item_num = 3;
-			time /= 10080;
-		} else if (time && !(time % 1440)) {
-			/* days */
-			item_num = 2;
-			time /= 1440;
-		} else if (time && !(time % 60)) {
-			/* days */
-			item_num = 1;
-			time /= 60;
+		type = gtk_label_new ("");
+		gtk_widget_show (type);
+		markup = g_strdup_printf ("<span weight=\"bold\">%s</span>", e_source_group_peek_name (group));
+		gtk_label_set_markup (GTK_LABEL (type), markup);
+		gtk_misc_set_alignment (GTK_MISC (type), 0.0, 0.5);
+		g_free (markup);
+		gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	} else {
+		GtkCellRenderer *cell;
+		GtkListStore *store;
+		GtkTreeIter iter;
+		GSList *l;
+		int active = 0, i = 0;
+
+		label = gtk_label_new_with_mnemonic(_("_Type:"));
+
+		type = gtk_combo_box_new ();
+		cell = gtk_cell_renderer_text_new ();
+		store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER);
+		for (l = sdialog->menu_source_groups; l; l = g_slist_next (l)) {
+			ESourceGroup *group = l->data;
+
+			gtk_list_store_append (store, &iter);
+			gtk_list_store_set (store, &iter, 0, e_source_group_peek_name (group), 1, group, -1);
+			if (sdialog->source_group == group)
+				active = i;
+			i++;
 		}
 
-		gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->refresh_optionmenu), item_num);
-	}
-
-	gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), time);
-	return;
-}
-
-static void
-source_to_dialog (SourceDialog *source_dialog)
-{
-	ESource *source = source_dialog->source;
-	gboolean remote = FALSE;
-
-	g_signal_handlers_block_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA,
-					 0, 0, NULL, NULL, source_dialog);
-
-	/* These are calendar specific so make sure we have them */
-	if (source_dialog->uri_entry)
-		g_signal_handlers_block_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
-						 0, 0, NULL, NULL, source_dialog);
-	if (source_dialog->refresh_spin)
-		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;
-
-		remote = TRUE;
-
-		uri_str = e_source_get_uri (source);
-		gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), uri_str);
-		g_free (uri_str);
-
-		set_refresh_time (source_dialog);
-	} else {
-		if (source_dialog->uri_entry)
-			gtk_entry_set_text (GTK_ENTRY (source_dialog->uri_entry), "");
-		if (source_dialog->refresh_spin)
-			gtk_spin_button_set_value (GTK_SPIN_BUTTON (source_dialog->refresh_spin), 30);
+		gtk_cell_layout_pack_start ((GtkCellLayout *) type, cell, TRUE);
+		gtk_cell_layout_set_attributes ((GtkCellLayout *) type, cell, "text", 0, NULL);
+		gtk_combo_box_set_model ((GtkComboBox *) type, (GtkTreeModel *) store);
+		gtk_combo_box_set_active ((GtkComboBox *) type, active);
+		g_signal_connect (type, "changed", G_CALLBACK (eccp_type_changed), sdialog);
+		gtk_widget_show (type);
+		gtk_table_attach (GTK_TABLE (parent), type, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+		gtk_label_set_mnemonic_widget (GTK_LABEL (label), type);
 	}
 
-	general_update_dialog (source_dialog);
-
-	g_signal_handlers_unblock_matched (source_dialog->name_entry, G_SIGNAL_MATCH_DATA,
-					   0, 0, NULL, NULL, source_dialog);
-	if (source_dialog->uri_entry)
-		g_signal_handlers_unblock_matched (source_dialog->uri_entry, G_SIGNAL_MATCH_DATA,
-						   0, 0, NULL, NULL, source_dialog);
-	if (source_dialog->refresh_spin)
-		g_signal_handlers_unblock_matched (source_dialog->refresh_spin, G_SIGNAL_MATCH_DATA,
-						   0, 0, NULL, NULL, source_dialog);
-	if (source_dialog->source_color) {
-		static guint32 assigned_colors[] = {
-			0xBECEDD, /* 190 206 221     Blue */
-			0xE2F0EF, /* 226 240 239     Light Blue */
-			0xC6E2B7, /* 198 226 183     Green */
-			0xE2F0D3, /* 226 240 211     Light Green */
-			0xE2D4B7, /* 226 212 183     Khaki */
-			0xEAEAC1, /* 234 234 193     Light Khaki */
-			0xF0B8B7, /* 240 184 183     Pink */
-			0xFED4D3, /* 254 212 211     Light Pink */
-			0xE2C6E1, /* 226 198 225     Purple */
-			0xF0E2EF  /* 240 226 239     Light Purple */
-		};
-		GRand *rand = g_rand_new ();
-		guint32 color;
-
-		color = assigned_colors[g_rand_int_range (rand, 0, 9)];
-		g_rand_free (rand);
-
-		if (source_dialog->source)
-			e_source_get_color (source_dialog->source, &color);
-		else 
-			/* FIXME */;
+	gtk_widget_show (label);
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
-		colorpicker_set_color (GNOME_COLOR_PICKER (source_dialog->source_color), color);
-	}
+	return type;
 }
 
 static void
-dialog_to_source (SourceDialog *source_dialog)
+name_changed (GtkEntry *entry, ECalConfigTargetSource *t)
 {
-	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_source_set_relative_uri (source, relative_uri);
-		g_free (relative_uri);
-		e_uri_free (uri);
-
-		refresh_str = get_refresh_minutes (source_dialog);
-		e_source_set_property (source, "refresh", refresh_str);
-		g_free (refresh_str);
-	}
-	
-	if (source_dialog->source_color)
-		e_source_set_color (source, 
-				    colorpicker_get_color (GNOME_COLOR_PICKER (source_dialog->source_color)));
+	ESource *source = t->source;
+	e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (entry)));
 }
 
-static void
-dialog_hide_unused_options (SourceDialog *source_dialog)
+static GtkWidget *
+eccp_get_source_name (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
 {
-	ESource *source = source_dialog->source;
+	static GtkWidget *label, *entry;
+	int row;
+	ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
+	ESource *source = t->source;
 
-	if (source && (!source_is_remote (source) || !source_group_is_mutable (source_dialog->source_group))) {
-		if (source_dialog->uri_hbox)
-			gtk_widget_hide (source_dialog->uri_hbox);
-		if (source_dialog->uri_label)
-			gtk_widget_hide (source_dialog->uri_label);
-		if (source_dialog->refresh_label)
-			gtk_widget_hide (source_dialog->refresh_label);
-		if (source_dialog->refresh_hbox)
-			gtk_widget_hide (source_dialog->refresh_hbox);
-	}
-}
+	if (old)
+		gtk_widget_destroy (label);
 
-static void
-source_group_changed_sensitive (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;
+	row = ((GtkTable*)parent)->nrows;
 
-	general_update_dialog (source_dialog);
-}
+	label = gtk_label_new_with_mnemonic (_("_Name:"));
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_widget_show (label);
+	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
-static gboolean
-key_press_event (GtkWidget *widget, GdkEventKey *event)
-{
-	if (event->keyval == GDK_Escape) {
-		gtk_widget_destroy (widget);
-		return TRUE;
-	}
+	entry = gtk_entry_new ();
+	gtk_widget_show (entry);
+	gtk_table_attach (GTK_TABLE (parent), entry, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry);
+	g_signal_connect (G_OBJECT (entry), "changed", G_CALLBACK (name_changed), (gpointer) t);
 
-	return FALSE;
-}
+	if (source)
+		gtk_entry_set_text (GTK_ENTRY (entry), e_source_peek_name (source));
 
-static void
-new_calendar_cancel (SourceDialog *source_dialog)
-{
-	gtk_widget_destroy (source_dialog->window);
+	return entry;
 }
 
 static void
-new_calendar_add (SourceDialog *source_dialog)
+color_changed (GnomeColorPicker *picker, guint r, guint g, guint b, guint a, ECalConfigTargetSource *t)
 {
-	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)),
-					      E_CAL_SOURCE_TYPE_EVENT);
-	dialog_to_source (source_dialog);
-	
-	gtk_widget_destroy (source_dialog->window);
+	ESource *source = t->source;
+	e_source_set_color (source, colorpicker_get_color (picker));
 }
 
-static void
-edit_calendar_finish (SourceDialog *source_dialog)
+static GtkWidget *
+eccp_get_source_color (EConfig *ec, EConfigItem *item, struct _GtkWidget *parent, struct _GtkWidget *old, void *data)
 {
-	dialog_to_source (source_dialog);
-	gtk_widget_destroy (source_dialog->window);
-}
+	CalendarSourceDialog *sdialog = data;
+	static GtkWidget *label, *picker;
+	int row;
+	ECalConfigTargetSource *t = (ECalConfigTargetSource *) ec->target;
+	ESource *source = t->source;
 
-gboolean
-calendar_setup_edit_calendar (GtkWindow *parent, ESource *source)
-{
-	SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
-	int index;
-	GList *icon_list;
+	static guint32 assigned_colors[] = {
+		0xBECEDD, /* 190 206 221     Blue */
+		0xE2F0EF, /* 226 240 239     Light Blue */
+		0xC6E2B7, /* 198 226 183     Green */
+		0xE2F0D3, /* 226 240 211     Light Green */
+		0xE2D4B7, /* 226 212 183     Khaki */
+		0xEAEAC1, /* 234 234 193     Light Khaki */
+		0xF0B8B7, /* 240 184 183     Pink */
+		0xFED4D3, /* 254 212 211     Light Pink */
+		0xE2C6E1, /* 226 198 225     Purple */
+		0xF0E2EF  /* 240 226 239     Light Purple */
+	};
+	GRand *rand = g_rand_new ();
+	guint32 color;
 
-	source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "add-calendar-window", NULL);
-	if (!source_dialog->gui_xml) {
-		g_warning (G_STRLOC ": Cannot load Glade file.");
-		g_free (source_dialog);
-		return FALSE;
-	}
+	if (old)
+		gtk_widget_destroy (label);
 
-	source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "add-calendar-window");
-	if (source) {
-		gtk_window_set_title (GTK_WINDOW (source_dialog->window), "Calendar Properties");
-		source_dialog->source = source;
-		source_dialog->source_group = e_source_peek_group (source);
-		g_object_ref (source);
-	}
-	
-	g_signal_connect (source_dialog->window, "key-press-event", G_CALLBACK (key_press_event), NULL);
+	row = ((GtkTable*)parent)->nrows;
 
-	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_entry_modified), source_dialog);      
-	source_dialog->source_list = e_source_list_new_for_gconf_default ("/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);
-	}
-	gtk_widget_set_sensitive (source_dialog->group_optionmenu, source == NULL);
+	color = assigned_colors[g_rand_int_range (rand, 0, 9)];
+	g_rand_free (rand);
 
-	/* NOTE: This assumes that we have sources. If they don't exist, they're set up
-	 * on startup of the calendar component. */
-	index = source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu (
-		GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog);
-	gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), index);
-
-	g_signal_connect_swapped (source_dialog->group_optionmenu, "changed",
-				  G_CALLBACK (source_group_changed_sensitive), source_dialog);
-	source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry");
-	source_dialog->uri_label = glade_xml_get_widget (source_dialog->gui_xml, "uri-label");
-	source_dialog->uri_hbox = glade_xml_get_widget (source_dialog->gui_xml, "uri-hbox");
-
-	g_signal_connect_swapped (source_dialog->uri_entry, "changed",
-				  G_CALLBACK (general_entry_modified), source_dialog);
-
-	source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin");
-	source_dialog->refresh_optionmenu = glade_xml_get_widget (source_dialog->gui_xml, "refresh-optionmenu");
-	source_dialog->refresh_label = glade_xml_get_widget (source_dialog->gui_xml, "refresh-label");
-	source_dialog->refresh_hbox = glade_xml_get_widget (source_dialog->gui_xml, "refresh-hbox");
+	label = gtk_label_new_with_mnemonic (_("C_olor:"));
+	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+	gtk_widget_show (label);
+	gtk_table_attach (GTK_TABLE (parent), label, 0, 1, row, row+1, GTK_FILL, 0, 0, 0);
 
-	g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked",
-				  G_CALLBACK (new_calendar_cancel), source_dialog);
+	picker = gnome_color_picker_new ();
+	gtk_widget_show (picker);
+	gtk_label_set_mnemonic_widget (GTK_LABEL (label), picker);
+	gtk_table_attach (GTK_TABLE (parent), picker, 1, 2, row, row+1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+	g_signal_connect (G_OBJECT (picker), "color-set", G_CALLBACK (color_changed), t);
 
-	source_dialog->add_button = glade_xml_get_widget (source_dialog->gui_xml, "add-button");
-	gtk_widget_set_sensitive (source_dialog->add_button, FALSE);
+	if (sdialog->original_source)
+		e_source_get_color (sdialog->original_source, &color);
+	else
+		/* since we don't have an original source here, we want to set
+		 * the initial color */
+		e_source_set_color (sdialog->source, color);
+
+	colorpicker_set_color (GNOME_COLOR_PICKER (picker), color);
+
+	return picker;
+}
+
+static ECalConfigItem eccp_items[] = {
+	{ E_CONFIG_BOOK, "", NULL },
+	{ E_CONFIG_PAGE,          "00.general", N_("General") },
+	{ E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Calendar") },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/00.type", NULL, eccp_get_source_type },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/10.name", NULL, eccp_get_source_name },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/20.color", NULL, eccp_get_source_color },
+	{ 0 },
+};
+
+static ECalConfigItem ectp_items[] = {
+	{ E_CONFIG_BOOK, "", NULL },
+	{ E_CONFIG_PAGE,          "00.general", N_("General") },
+	{ E_CONFIG_SECTION_TABLE, "00.general/00.source", N_("Tasks List") },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/00.type", NULL, eccp_get_source_type },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/10.name", NULL, eccp_get_source_name },
+	{ E_CONFIG_ITEM_TABLE,    "00.general/00.source/20.color", NULL, eccp_get_source_color },
+	{ 0 },
+};
+
+/**
+ * calendar_setup_edit_calendar:
+ * @parent: parent window for dialog (current unused)
+ * @source: the ESource corresponding to the calendar
+ *
+ * Show calendar properties for @source.
+ **/
+void
+calendar_setup_edit_calendar (struct _GtkWindow *parent, ESource *source)
+{
+	CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1);
+	char *xml;
+	ECalConfig *ec;
+	int i;
+	GSList *items = NULL;
+	ECalConfigTargetSource *target;
 
 	if (source) {
-		gtk_button_set_use_stock (GTK_BUTTON (source_dialog->add_button), TRUE);
-		gtk_button_set_label (GTK_BUTTON (source_dialog->add_button), GTK_STOCK_OK);
+		guint32 color;
 
-		g_signal_connect_swapped (source_dialog->add_button, "clicked",
-					  G_CALLBACK (edit_calendar_finish), source_dialog);
+		sdialog->original_source = source;
+		g_object_ref (source);
+		sdialog->source_group = e_source_peek_group (source);
+		xml = e_source_to_standalone_xml (source);
+		sdialog->source = e_source_new_from_standalone_xml (xml);
+		g_free (xml);
+
+		e_source_get_color (source, &color);
+		e_source_set_color (sdialog->source, color);
 	} else {
-		g_signal_connect_swapped (source_dialog->add_button, "clicked",
-					  G_CALLBACK (new_calendar_add), source_dialog);
-	}
+		GConfClient *gconf;
+		GSList *l;
 
-	source_dialog->source_color = glade_xml_get_widget (source_dialog->gui_xml, "source-color");
+		sdialog->source = e_source_new ("", "");
+		gconf = gconf_client_get_default ();
+		sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/calendar/sources");
+		l = e_source_list_peek_groups (sdialog->source_list);
+		sdialog->menu_source_groups = g_slist_copy(l);
 
-	g_object_weak_ref (G_OBJECT (source_dialog->window),
-			   (GWeakNotify) source_dialog_destroy, source_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);
-	
-	icon_list = e_icon_factory_get_icon_list ("stock_calendar");
-	if (icon_list) {
-		gtk_window_set_icon_list (GTK_WINDOW (source_dialog->window), icon_list);
-		g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
-		g_list_free (icon_list);
+		sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data;
+		g_object_unref (gconf);
 	}
 
-	dialog_hide_unused_options (source_dialog);
-	gtk_widget_show (source_dialog->window);
-	return TRUE;
-}
+	/* HACK: doesn't work if you don't do this */
+	e_source_set_absolute_uri (sdialog->source, NULL);
+	e_source_set_group (sdialog->source, sdialog->source_group);
 
-static void
-new_task_list_cancel (SourceDialog *source_dialog)
-{
-	gtk_widget_destroy (source_dialog->window);
-}
+	sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties");
+	for (i = 0; eccp_items[i].path; i++)
+		items = g_slist_prepend (items, &eccp_items[i]);
+	e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog);
+	e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog);
 
-static void
-new_task_list_add (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)),
-					      E_CAL_SOURCE_TYPE_TODO);
-	dialog_to_source (source_dialog);
-	
-	gtk_widget_destroy (source_dialog->window);
-}
+	target = e_cal_config_target_new_source (ec, sdialog->source);
+	e_config_set_target ((EConfig *) ec, (EConfigTarget *) target);
 
-gboolean
-calendar_setup_new_calendar (GtkWindow *parent)
-{
-	return calendar_setup_edit_calendar (parent, NULL);
+	sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Calendar Properties"));
+
+	/* forces initial validation */
+	if (!sdialog->original_source)
+		e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE);
+
+	return;
 }
 
-static void
-edit_task_list_finish (SourceDialog *source_dialog)
+void
+calendar_setup_new_calendar (struct _GtkWindow *parent)
 {
-	dialog_to_source (source_dialog);
-	gtk_widget_destroy (source_dialog->window);
+	calendar_setup_edit_calendar (parent, NULL);
 }
 
-gboolean
-calendar_setup_edit_task_list (GtkWindow *parent, ESource *source)
+void
+calendar_setup_edit_task_list (struct _GtkWindow *parent, ESource *source)
 {
-	SourceDialog *source_dialog = g_new0 (SourceDialog, 1);
-	int index;
-	GList *icon_list;
-
-	source_dialog->gui_xml = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "add-task-list-window", NULL);
-	if (!source_dialog->gui_xml) {
-		g_warning (G_STRLOC ": Cannot load Glade file.");
-		g_free (source_dialog);
-		return FALSE;
-	}
+	CalendarSourceDialog *sdialog = g_new0 (CalendarSourceDialog, 1);
+	char *xml;
+	ECalConfig *ec;
+	int i;
+	GSList *items = NULL;
+	ECalConfigTargetSource *target;
 
-	source_dialog->window = glade_xml_get_widget (source_dialog->gui_xml, "add-task-list-window");
 	if (source) {
-		gtk_window_set_title (GTK_WINDOW (source_dialog->window), "Task List Properties");
-		source_dialog->source = source;
-		source_dialog->source_group = e_source_peek_group (source);
+		guint32 color;
+
+		sdialog->original_source = source;
 		g_object_ref (source);
-	}	
+		sdialog->source_group = e_source_peek_group (source);
+		xml = e_source_to_standalone_xml (source);
+		sdialog->source = e_source_new_from_standalone_xml (xml);
+		g_free (xml);
 
-	g_signal_connect (source_dialog->window, "key-press-event", G_CALLBACK (key_press_event), NULL);
+		e_source_get_color (source, &color);
+		e_source_set_color (sdialog->source, color);
+	} else {
+		GConfClient *gconf;
+		GSList *l;
+
+		sdialog->source = e_source_new ("", "");
+		gconf = gconf_client_get_default ();
+		sdialog->source_list = e_source_list_new_for_gconf (gconf, "/apps/evolution/tasks/sources");
+		l = e_source_list_peek_groups (sdialog->source_list);
+		sdialog->menu_source_groups = g_slist_copy(l);
 
-	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_entry_modified), source_dialog);      
-	source_dialog->source_list = e_source_list_new_for_gconf_default ("/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);
+		sdialog->source_group = (ESourceGroup *)sdialog->menu_source_groups->data;
+		g_object_unref (gconf);
 	}
-	gtk_widget_set_sensitive (source_dialog->group_optionmenu, source == NULL);
 
-	/* NOTE: This assumes that we have sources. If they don't exist, they're set up
-	 * on startup of the calendar component. */
-	index = source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu (
-		GTK_OPTION_MENU (source_dialog->group_optionmenu))), source_dialog);
-	gtk_option_menu_set_history (GTK_OPTION_MENU (source_dialog->group_optionmenu), index);
-
-	g_signal_connect_swapped (source_dialog->group_optionmenu, "changed",
-				  G_CALLBACK (source_group_changed_sensitive), source_dialog);
-
-	source_dialog->uri_entry = glade_xml_get_widget (source_dialog->gui_xml, "uri-entry");
-	source_dialog->uri_label = glade_xml_get_widget (source_dialog->gui_xml, "uri-label");
-	source_dialog->uri_hbox = glade_xml_get_widget (source_dialog->gui_xml, "uri-hbox");
-
-	g_signal_connect_swapped (source_dialog->uri_entry, "changed",
-				  G_CALLBACK (general_entry_modified), source_dialog);
-
-	source_dialog->refresh_spin = glade_xml_get_widget (source_dialog->gui_xml, "refresh-spin");
-	source_dialog->refresh_optionmenu = glade_xml_get_widget (source_dialog->gui_xml, "refresh-optionmenu");
-	source_dialog->refresh_label = glade_xml_get_widget (source_dialog->gui_xml, "refresh-label");
-	source_dialog->refresh_hbox = glade_xml_get_widget (source_dialog->gui_xml, "refresh-hbox");
-
-	g_signal_connect_swapped (glade_xml_get_widget (source_dialog->gui_xml, "cancel-button"), "clicked",
-				  G_CALLBACK (new_task_list_cancel), source_dialog);
-
-	source_dialog->add_button = glade_xml_get_widget (source_dialog->gui_xml, "add-button");
-	gtk_widget_set_sensitive (source_dialog->add_button, FALSE);
-	
-	if (source) {
-		gtk_button_set_use_stock (GTK_BUTTON (source_dialog->add_button), TRUE);
-		gtk_button_set_label (GTK_BUTTON (source_dialog->add_button), GTK_STOCK_OK);
+	/* HACK: doesn't work if you don't do this */
+	e_source_set_absolute_uri (sdialog->source, NULL);
+	e_source_set_group (sdialog->source, sdialog->source_group);
 
-		g_signal_connect_swapped (source_dialog->add_button, "clicked",
-					  G_CALLBACK (edit_task_list_finish), source_dialog);
-	} else {
-		g_signal_connect_swapped (source_dialog->add_button, "clicked",
-					  G_CALLBACK (new_task_list_add), source_dialog);
-	}
+	sdialog->config = ec = e_cal_config_new (E_CONFIG_BOOK, "org.gnome.evolution.calendar.calendarProperties");
+	for (i = 0; ectp_items[i].path; i++)
+		items = g_slist_prepend (items, &ectp_items[i]);
+	e_config_add_items ((EConfig *) ec, items, eccp_commit, NULL, eccp_free, sdialog);
+	e_config_add_page_check ((EConfig *) ec, NULL, eccp_check_complete, sdialog);
 
-	g_object_weak_ref (G_OBJECT (source_dialog->window),
-			   (GWeakNotify) source_dialog_destroy, source_dialog);
-	
-	source_dialog->source_color = glade_xml_get_widget (source_dialog->gui_xml, "source-color");
-
-	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);
-	
-	icon_list = e_icon_factory_get_icon_list ("stock_task");
-	if (icon_list) {
-		gtk_window_set_icon_list (GTK_WINDOW (source_dialog->window), icon_list);
-		g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
-		g_list_free (icon_list);
-	}
+	target = e_cal_config_target_new_source (ec, sdialog->source);
+	e_config_set_target ((EConfig *) ec, (EConfigTarget *) target);
+
+	sdialog->window = e_config_create_window ((EConfig *)ec, NULL, _("Task List Properties"));
+
+	/* forces initial validation */
+	if (!sdialog->original_source)
+		e_config_target_changed ((EConfig *)ec, E_CONFIG_TARGET_CHANGED_STATE);
 
-	dialog_hide_unused_options (source_dialog);
-	gtk_widget_show (source_dialog->window);
-	return TRUE;
+	return;
 }
 
-gboolean
-calendar_setup_new_task_list (GtkWindow *parent)
+void
+calendar_setup_new_task_list (struct _GtkWindow *parent)
 {
-	return calendar_setup_edit_task_list (parent, NULL);
+	calendar_setup_edit_task_list (parent, NULL);
 }
-
Index: calendar/gui/dialogs/calendar-setup.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/calendar-setup.h,v
retrieving revision 1.1
diff -u -r1.1 calendar-setup.h
--- calendar/gui/dialogs/calendar-setup.h	9 Jan 2004 20:50:22 -0000	1.1
+++ calendar/gui/dialogs/calendar-setup.h	22 Oct 2004 00:33:35 -0000
@@ -1,12 +1,12 @@
-/* Evolution calendar - Calendar properties dialogs.
+/*
+ * Authors: David Trowbridge <trowbrds cs colorado edu>
  *
- * Copyright (C) 2004 Novell, Inc.
- *
- * Author: Hans Petter Jansson <hpj ximian com>
+ * Copyright (C) 2004 Novell, Inc (www.novell.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.
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,18 +15,29 @@
  *
  * 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.
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
  */
 
-#ifndef CALENDAR_CONFIG_H
-#define CALENDAR_CONFIG_H
+#ifndef __CALENDAR_SETUP_H__
+#define __CALENDAR_SETUP_H__
 
-#include <gtk/gtkwindow.h>
+struct _GtkWindow;
+struct _ESource;
 
-gboolean calendar_setup_new_calendar   (GtkWindow *parent);
-gboolean calendar_setup_edit_calendar  (GtkWindow *parent, ESource *source);
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif
 
-gboolean calendar_setup_new_task_list  (GtkWindow *parent);
-gboolean calendar_setup_edit_task_list (GtkWindow *parent, ESource *source);
+void calendar_setup_edit_calendar  (struct _GtkWindow *parent, struct _ESource *source);
+void calendar_setup_new_calendar   (struct _GtkWindow *parent);
 
+void calendar_setup_edit_task_list (struct _GtkWindow *parent, struct _ESource *source);
+void calendar_setup_new_task_list  (struct _GtkWindow *parent);
+
+#ifdef __cplusplus
+}
 #endif
+
+#endif /* __CALENDAR_SETUP_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]