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



Sorry for the delay, school comes first, frustratingly.

Here's the trivially-fixed version. It still has the spacing issue - it
seems like recreating the container isn't really that big a deal, given
that you're rebuilding the entire thing anyways. The plugin would have
to have some small changes to accomodate that (not freeing the extra
widgetry itself), but that's pretty simple, and would need to wait for
the container change.

-David

On Thu, 2004-10-28 at 11:52 +0800, Not Zed wrote:
> 
> Hi David,
> 
> Sorry for taking a while to get back to you.  It looks pretty good to
> me.  The only thing is the registration of the hook types, this is now
> done in main.c, at least for the calendar, so it should just be moved
> there too.  I presume tasks has the same thing or can have.
> 
> Also, I tried putting the 6 pixel spacing into the e-config code - not
> going to work.  Looks like there's a problem with the SECTION_TABLE
> stuff, since all the factory methods append to the end of the table -
> but the table never shrinks, so it doesn't work, you end up with blank
> spacing above the content if you re-configure the window.  And the
> table adds each spacing space even between empty rows, which vbox's
> don't.  So this is something i'll have to work out some other way.  I
> might have to make the code more dynamic - that is, always destroy the
> section widgets rather than let them hang around.
> 
> Michael
> 
> On Thu, 2004-10-21 at 21:29 -0600, David Trowbridge wrote: 
> > 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
> 
> -- 
> 
> 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

? calendar-config-hooks.tar.gz
? plugins
? calendar/gui/.main.c.swp
? calendar/gui/e-cal-config.c
? calendar/gui/e-cal-config.h
? help/C/evolution-2.2-C.omf
? help/C/evolution-2.2.xml
? widgets/misc/test-source-option-menu
? widgets/misc/test-source-selector
Index: configure.in
===================================================================
RCS file: /cvs/gnome/evolution/configure.in,v
retrieving revision 1.740
diff -u -r1.740 configure.in
--- configure.in	29 Oct 2004 11:21:06 -0000	1.740
+++ configure.in	3 Nov 2004 09:29:36 -0000
@@ -1337,21 +1337,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="bbdb subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool mail-to-meeting mail-to-task folder-unsubscribe mark-calendar-offline audio-inline"
+plugins_base="calendar-http"
+plugins_all="calendar-http bbdb subject-thread save-attachments prefer-plain save-calendar select-one-source copy-tool mail-to-meeting mail-to-task folder-unsubscribe mark-calendar-offline audio-inline"
 
 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)
@@ -1549,6 +1555,7 @@
 mail/default/C/Makefile
 mail/importers/Makefile
 plugins/Makefile
+plugins/calendar-http/Makefile
 plugins/bbdb/Makefile
 plugins/audio-inline/Makefile
 plugins/mail-to-meeting/Makefile
Index: calendar/ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/calendar/ChangeLog,v
retrieving revision 1.2556
diff -u -r1.2556 ChangeLog
--- calendar/ChangeLog	28 Oct 2004 09:26:12 -0000	1.2556
+++ calendar/ChangeLog	3 Nov 2004 09:29:37 -0000
@@ -1,3 +1,10 @@
+2004-11-03  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-28  Not Zed  <NotZed Ximian com>
 
 	* gui/tasks-component.c (popup_event_cb): 
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	3 Nov 2004 09:29:37 -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/main.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/main.c,v
retrieving revision 1.168
diff -u -r1.168 main.c
--- calendar/gui/main.c	20 Oct 2004 18:51:16 -0000	1.168
+++ calendar/gui/main.c	3 Nov 2004 09:29:37 -0000
@@ -45,6 +45,8 @@
 #include "tasks-control.h"
 #include "tasks-component.h"
 
+#include <e-util/e-plugin.h>
+#include "e-cal-config.h"
 
 #define FACTORY_ID "OAFIID:GNOME_Evolution_Calendar_Factory:" BASE_VERSION
 
@@ -143,6 +145,7 @@
 	/* Initialize plugin system */
 	e_plugin_hook_register_type (e_cal_popup_hook_get_type());
 	e_plugin_hook_register_type (e_cal_menu_hook_get_type());
+	e_plugin_hook_register_type (e_cal_config_hook_get_type ());
 }
 
 
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	3 Nov 2004 09:29:38 -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	3 Nov 2004 09:29:38 -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	3 Nov 2004 09:29:38 -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]