[evolution-patches] [Fwd: ical publishing patch]



forgot the attachment this time...
-- 
Stéphane Konstantaropoulos
- Research Student, Computer Science
-- University of York, http://www-users.cs.york.ac.uk/~stephane
--- Begin Message ---
Hello All,

There is a (preview) patch that allows to publish the evolution
calendars and task lists into an ical file, remotely (http, https, ftp,
ssh) or locally to a file.

This aims at solving the related bounty.

Could you perhaps give it a quick go at testing, I have not tested the
FTP or HTTPS for example.

Notice, that this patch breaks the free/busy publishing code, as I was
modifying it to give it gnome-vfs functionnality too.

soup is still used for http/https as http/put does not seem to work with
gnome-vfs.

You can try www.icalx.com for publishing your calendars.

This is incomplete as it lacks testing and I need to implement the
alarms publishing or not.

Hope you like it,
-- 
Stéphane Konstantaropoulos
- Research Student, Computer Science
-- University of York, http://www-users.cs.york.ac.uk/~stephane

Attachment: signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=


--- End Message ---
Index: calendar/gui/apps_evolution_calendar.schemas.in.in
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/apps_evolution_calendar.schemas.in.in,v
retrieving revision 1.7
diff -u -u -r1.7 apps_evolution_calendar.schemas.in.in
--- calendar/gui/apps_evolution_calendar.schemas.in.in	8 Feb 2005 00:35:55 -0000	1.7
+++ calendar/gui/apps_evolution_calendar.schemas.in.in	24 Mar 2005 20:54:57 -0000
@@ -394,8 +394,8 @@
       <list_type>string</list_type>
       <default>[]</default>
       <locale name="C">
-        <short>Free/busy server urls</short>
-        <long>List of server urls for free/busy publishing.</long>
+        <short>List of urls for online publishing</short>
+        <long>List of server urls for publishing.</long>
       </locale>
     </schema>    
 
@@ -405,9 +405,31 @@
       <owner>evolution-calendar</owner>
       <type>string</type>
       <locale name="C">
-        <short>Free/busy template url</short>
+        <short>The url template to use as an online publishing data fallback</short>
+      </locale>
+    </schema>
+    <schema>
+      <key>/schemas/apps/evolution/calendar/publish/fb-uris</key>
+      <applyto>/apps/evolution/calendar/publish/fb-uris</applyto>
+      <owner>evolution-calendar</owner>
+      <type>list</type>
+      <list_type>string</list_type>
+      <default>[]</default>
+      <locale name="C">
+        <short>List of urls for free/busy publishing</short>
+      </locale>
+    </schema>    
+
+    <schema>
+      <key>/schemas/apps/evolution/calendar/publish/fb-template</key>
+      <applyto>/apps/evolution/calendar/publish/fb-template</applyto>
+      <owner>evolution-calendar</owner>
+      <type>string</type>
+      <locale name="C">
+        <short>The url template to use as a free/busy data fallback</short>
         <long>The url template to use as a free/busy data fallback, %u is replaced by the user part of the mail address and %d is replaced by the domain.</long>
       </locale>
     </schema>
+
   </schemalist>
 </gconfschemafile>
Index: calendar/gui/calendar-commands.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-commands.c,v
retrieving revision 1.159
diff -u -u -r1.159 calendar-commands.c
--- calendar/gui/calendar-commands.c	1 Feb 2005 11:46:33 -0000	1.159
+++ calendar/gui/calendar-commands.c	24 Mar 2005 20:54:57 -0000
@@ -333,7 +333,13 @@
 static void
 publish_freebusy_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
 {
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
+}
+
+static void
+publish_cmd (BonoboUIComponent *uic, gpointer data, const gchar *path)
+{
+	e_pub_publish (PUB_ONLINE, TRUE);
 }
 
 static void
@@ -617,6 +623,7 @@
 	BONOBO_UI_VERB ("ShowListView", show_list_view_clicked),
 
 	BONOBO_UI_VERB ("PublishFreeBusy", publish_freebusy_cmd),
+	BONOBO_UI_VERB ("Publish", publish_cmd),
 	BONOBO_UI_VERB ("CalendarPurge", purge_cmd),
 
 	BONOBO_UI_VERB_END
Index: calendar/gui/calendar-component.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-component.c,v
retrieving revision 1.201
diff -u -u -r1.201 calendar-component.c
--- calendar/gui/calendar-component.c	22 Mar 2005 15:09:10 -0000	1.201
+++ calendar/gui/calendar-component.c	24 Mar 2005 20:54:57 -0000
@@ -111,6 +111,7 @@
 
 	GConfClient *gconf_client;
 	int gconf_notify_id;
+	int gconf_notify_fb_id;
 
 	ESourceList *source_list;
 	ESourceList *task_source_list;
@@ -743,7 +744,8 @@
 init_calendar_publishing_cb (gpointer data)
 {	
 	/* Publish if it is time to publish again */
-	e_pub_publish (FALSE);
+	e_pub_publish (PUB_ONLINE, FALSE);
+	e_pub_publish (PUB_FREE_BUSY, FALSE);
 
 	return FALSE;
 }
@@ -755,7 +757,17 @@
 		       void *user_data)
 {
 	/* publish config changed, so publish */
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_ONLINE, TRUE);
+}
+
+static void
+conf_fb_changed_callback (GConfClient *client,
+		       unsigned int connection_id,
+		       GConfEntry *entry,
+		       void *user_data)
+{
+	/* publish config changed, so publish */
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
 }
 
 /* Evolution::Component CORBA methods.  */
@@ -1674,7 +1686,11 @@
 		= gconf_client_notify_add (priv->gconf_client, CALENDAR_CONFIG_PUBLISH,
 					   (GConfClientNotifyFunc) conf_changed_callback, NULL,
 					   NULL, NULL);
-	
+	priv->gconf_notify_fb_id
+		= gconf_client_notify_add (priv->gconf_client, CALENDAR_CONFIG_FB_PUBLISH,
+					   (GConfClientNotifyFunc) conf_fb_changed_callback, NULL,
+					   NULL, NULL);
+
 	idle_id = g_idle_add ((GSourceFunc) init_calendar_publishing_cb, GINT_TO_POINTER (idle_id));
 }
 
Index: calendar/gui/calendar-config-keys.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config-keys.h,v
retrieving revision 1.6
diff -u -u -r1.6 calendar-config-keys.h
--- calendar/gui/calendar-config-keys.h	18 Dec 2004 13:01:17 -0000	1.6
+++ calendar/gui/calendar-config-keys.h	24 Mar 2005 20:54:57 -0000
@@ -71,6 +71,10 @@
 #define CALENDAR_CONFIG_DEFAULT_REMINDER_UNITS CALENDAR_CONFIG_PREFIX "/other/default_reminder_units"
 
 /* Free/Busy settings */
+#define CALENDAR_CONFIG_FB_PUBLISH CALENDAR_CONFIG_PREFIX"/publish/fb-uris"
+#define CALENDAR_CONFIG_FB_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/fb-template"
+
+/* Online publish settings */
 #define CALENDAR_CONFIG_PUBLISH CALENDAR_CONFIG_PREFIX"/publish/uris"
 #define CALENDAR_CONFIG_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/template"
 
Index: calendar/gui/calendar-config.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.c,v
retrieving revision 1.72
diff -u -u -r1.72 calendar-config.c
--- calendar/gui/calendar-config.c	31 Dec 2004 16:59:18 -0000	1.72
+++ calendar/gui/calendar-config.c	24 Mar 2005 20:54:57 -0000
@@ -1107,13 +1107,27 @@
 GSList *
 calendar_config_get_free_busy (void)
 {	
-	return gconf_client_get_list (config, CALENDAR_CONFIG_PUBLISH, 
+	return gconf_client_get_list (config, CALENDAR_CONFIG_FB_PUBLISH, 
 				      GCONF_VALUE_STRING, NULL);
 }
 
 void
 calendar_config_set_free_busy (GSList *url_list)
 {
+	gconf_client_set_list (config, CALENDAR_CONFIG_FB_PUBLISH, 
+			       GCONF_VALUE_STRING, url_list, NULL);
+}
+
+GSList *
+calendar_config_get_publish (void)
+{	
+	return gconf_client_get_list (config, CALENDAR_CONFIG_PUBLISH, 
+				      GCONF_VALUE_STRING, NULL);
+}
+
+void
+calendar_config_set_publish (GSList *url_list)
+{
 	gconf_client_set_list (config, CALENDAR_CONFIG_PUBLISH, 
 			       GCONF_VALUE_STRING, url_list, NULL);
 }
@@ -1121,12 +1135,24 @@
 gchar *
 calendar_config_get_free_busy_template (void)
 {
-	return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
+	return gconf_client_get_string (config, CALENDAR_CONFIG_FB_TEMPLATE, NULL);
 }
 
 void
 calendar_config_set_free_busy_template (const gchar *template)
 {
+	gconf_client_set_string (config, CALENDAR_CONFIG_FB_TEMPLATE, template, NULL);
+}
+
+gchar *
+calendar_config_get_publish_template (void)
+{
+	return gconf_client_get_string (config, CALENDAR_CONFIG_TEMPLATE, NULL);
+}
+
+void
+calendar_config_set_publish_template (const gchar *template)
+{
 	gconf_client_set_string (config, CALENDAR_CONFIG_TEMPLATE, template, NULL);
 }
 
@@ -1136,6 +1162,18 @@
 {
 	guint id;
 	
+	id = gconf_client_notify_add (config, CALENDAR_CONFIG_FB_TEMPLATE, func, data, 
+				      NULL, NULL);
+	
+	return id;	
+}
+
+guint 
+calendar_config_add_notification_publish_template (GConfClientNotifyFunc func, 
+						     gpointer data)
+{
+	guint id;
+	
 	id = gconf_client_notify_add (config, CALENDAR_CONFIG_TEMPLATE, func, data, 
 				      NULL, NULL);
 	
Index: calendar/gui/calendar-config.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/calendar-config.h,v
retrieving revision 1.36
diff -u -u -r1.36 calendar-config.h
--- calendar/gui/calendar-config.h	31 Dec 2004 16:59:18 -0000	1.36
+++ calendar/gui/calendar-config.h	24 Mar 2005 20:54:57 -0000
@@ -206,6 +206,14 @@
 void calendar_config_set_free_busy_template (const gchar *template);
 guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, 
 							   gpointer data);
+/* online publishing settings */
+GSList * calendar_config_get_publish (void);
+void calendar_config_set_publish (GSList * url_list);
+
+gchar *calendar_config_get_publish_template (void);
+void calendar_config_set_publish_template (const gchar *template);
+guint calendar_config_add_notification_free_busy_template (GConfClientNotifyFunc func, 
+							   gpointer data);
 
 /* Shows the timezone dialog if the user hasn't set a default timezone. */
 void	  calendar_config_check_timezone_set	(void);
Index: calendar/gui/e-calendar-view.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-calendar-view.c,v
retrieving revision 1.77
diff -u -u -r1.77 e-calendar-view.c
--- calendar/gui/e-calendar-view.c	21 Mar 2005 14:29:15 -0000	1.77
+++ calendar/gui/e-calendar-view.c	24 Mar 2005 20:54:57 -0000
@@ -1251,7 +1251,13 @@
 static void
 on_publish (EPopup *ep, EPopupItem *pitem, void *data)
 {
-	e_pub_publish (TRUE);
+	e_pub_publish (PUB_ONLINE, TRUE);
+}
+
+static void
+on_publish_fb (EPopup *ep, EPopupItem *pitem, void *data)
+{
+	e_pub_publish (PUB_FREE_BUSY, TRUE);
 }
 
 static void
@@ -1390,7 +1396,8 @@
 	{ E_POPUP_BAR, "70." },
 
 	/* TODO: Why is this in a context menu when it applies globally? */
-	{ E_POPUP_ITEM, "70.publish", N_("_Publish Free/Busy Information"), on_publish, },
+	{ E_POPUP_ITEM, "70.publish", N_("_Publish Calendars"), on_publish, },
+	{ E_POPUP_ITEM, "71.publish", N_("_Publish Free/Busy Information"), on_publish_fb, },
 };
 
 static EPopupItem ecv_child_items [] = {
Index: calendar/gui/e-pub-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-pub-utils.c,v
retrieving revision 1.7
diff -u -u -r1.7 e-pub-utils.c
--- calendar/gui/e-pub-utils.c	23 Feb 2005 18:56:56 -0000	1.7
+++ calendar/gui/e-pub-utils.c	24 Mar 2005 20:54:57 -0000
@@ -28,6 +28,7 @@
 #include <libedataserver/e-source-list.h>
 #include <libedataserverui/e-passwords.h>
 #include <libecal/e-cal-time-util.h>
+#include <libecal/e-cal-listener.h>
 #include <libgnome/gnome-i18n.h>
 #include "calendar-config.h"
 #include "common/authentication.h"
@@ -35,16 +36,52 @@
 #include "e-pub-utils.h"
 
 void
-e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml)
+e_pub_uri_free(EPublishUri *uri)
+{
+	GSList *l = NULL;
+	g_return_if_fail(uri != NULL);
+
+	if(uri->location){
+		xmlFree(uri->location);
+		uri->location = NULL;
+	}
+	if(uri->username){
+		xmlFree(uri->username);
+		uri->location = NULL;
+	}
+	if(uri->last_pub_time){
+		xmlFree(uri->last_pub_time);
+		uri->last_pub_time = NULL;
+	}
+	if((l = uri->calendars)){
+		for(; l != NULL; l = l->next)
+			xmlFree(l->data);
+		g_slist_free(uri->calendars);
+		uri->calendars = NULL;
+	}
+	if((l = uri->tasks)){
+		for(; l != NULL; l = l->next)
+			xmlFree(l->data);
+		g_slist_free(uri->tasks);
+		uri->tasks = NULL;
+	}
+}
+
+void
+e_pub_uri_from_xml (EPublishUri *uri, const guchar *xml)
 {
 	xmlDocPtr doc;
 	xmlNodePtr root, p;
-	xmlChar *location, *enabled, *frequency;
+	xmlChar *location, *type, *enabled, *frequency;
 	xmlChar *username, *publish_time;
-	GSList *l = NULL;
+	xmlChar *remember_pw, *no_pw;
+	xmlChar *alarm_publish;
+	xmlChar *auto_publish;
 	
 	uri->location = NULL;
-	doc = xmlParseDoc ((char *)xml);
+	uri->calendars = NULL;
+	uri->tasks = NULL;
+	doc = xmlParseDoc ((guchar *)xml);
 	if (doc == NULL) {
 		uri->location = NULL;
 		return;
@@ -54,48 +91,87 @@
 	if (strcmp (root->name, "uri") != 0) {
 		return;
 	}
+
 	location = xmlGetProp (root, "location");
+	type = xmlGetProp (root, "type");
 	enabled = xmlGetProp (root, "enabled");
-	frequency = xmlGetProp (root, "frequency");
 	username = xmlGetProp (root, "username");
 	publish_time = xmlGetProp (root, "publish_time");
+	remember_pw = xmlGetProp (root, "remember_pw");
+	no_pw = xmlGetProp (root, "no_password");
 	
 	if (location != NULL)
-		uri->location = g_strdup (location);
-	if (enabled != NULL)
+		uri->location = location;
+
+	if (type != NULL) {
+		uri->type = atoi (type);
+		xmlFree(type);	
+	}
+	if (enabled != NULL) {
 		uri->enabled = atoi (enabled);
-	if (frequency != NULL)
-		uri->publish_freq = atoi (frequency);
+		xmlFree(enabled);
+	}
 	if (username != NULL)
-		uri->username = g_strdup (username);
+		uri->username = username;
+	if(no_pw != NULL) {
+		uri->no_pw = atoi(no_pw);
+		xmlFree(no_pw);
+	}
+	if(remember_pw != NULL) {
+		uri->remember_pw = atoi(remember_pw);
+		xmlFree(remember_pw);
+	}
+
 	if (publish_time != NULL)
-		uri->last_pub_time = g_strdup (publish_time);
+		uri->last_pub_time = publish_time;
 	
-	uri->password = g_strdup ("");
+	if(uri->type == PUB_ONLINE) {
+		auto_publish = xmlGetProp (root, "auto_publish");
+		alarm_publish = xmlGetProp (root, "alarm_publish");
+
+		if (auto_publish != NULL) {
+			uri->auto_publish = atoi(auto_publish);
+			xmlFree(auto_publish);
+		}
+		if (alarm_publish != NULL) {
+			uri->alarm_publish = atoi(alarm_publish);
+			xmlFree(alarm_publish);
+		}
+		for (p = root->children; p != NULL; p = p->next) {
+			xmlChar *uid = xmlGetProp (p, "uid_task");
+			if(uid)
+				uri->tasks = g_slist_append (uri->tasks, uid);
+		}	
+	}
+
+	if(uri->type == PUB_FREE_BUSY) {
+		frequency = xmlGetProp (root, "frequency");
+		if (frequency != NULL) {
+			uri->publish_freq = atoi (frequency);
+			xmlFree(frequency);
+		}
+	}
 
 	for (p = root->children; p != NULL; p = p->next) {
 		xmlChar *uid = xmlGetProp (p, "uid");
-
-		l = g_slist_append (l, uid);
+		if(uid)
+			uri->calendars = g_slist_append (uri->calendars, uid);
 	}	
-	uri->calendars = l;
-	
-	xmlFree(location);
-	xmlFree(enabled);
+
 	xmlFreeDoc(doc);
 	return;
 }
 
-gchar *
+guchar *
 e_pub_uri_to_xml (EPublishUri *uri)
 {
 	xmlDocPtr doc;
 	xmlNodePtr root;
-	gchar *enabled, *frequency;
 	GSList *cals = NULL;
 	xmlChar *xml_buffer;
 	char *returned_buffer;
 	int xml_buffer_size;
+	gchar *str; /* temporary string from value to xml */
 
 	g_return_val_if_fail (uri != NULL, NULL);
 	g_return_val_if_fail (uri->location != NULL, NULL);
@@ -103,13 +179,43 @@
 	doc = xmlNewDoc ("1.0");
 
 	root = xmlNewDocNode (doc, NULL, "uri", NULL);
-	enabled = g_strdup_printf ("%d", uri->enabled);
-	frequency = g_strdup_printf ("%d", uri->publish_freq);
+	str = g_strdup_printf ("%d", uri->type);
+	xmlSetProp (root, "type", str);
+	g_free(str);
+	str = g_strdup_printf ("%d", uri->enabled);
+	xmlSetProp (root, "enabled", str);
+	g_free(str);
 	xmlSetProp (root, "location", uri->location);
-	xmlSetProp (root, "enabled", enabled);
-	xmlSetProp (root, "frequency", frequency);
 	xmlSetProp (root, "username", uri->username);
+	xmlSetProp (root, "username", uri->username);
+	str = g_strdup_printf ("%d", uri->no_pw);
+	xmlSetProp (root, "no_password", str);
+	g_free(str);
+	str = g_strdup_printf ("%d", uri->remember_pw);
+	xmlSetProp (root, "remember_pw", str);
+	g_free(str);
+
 	xmlSetProp (root, "publish_time", uri->last_pub_time);
+
+	if(uri->type == PUB_FREE_BUSY) {
+		str = g_strdup_printf ("%d", uri->publish_freq);
+		xmlSetProp (root, "frequency", str);
+		g_free(str);
+	}
+	
+	if(uri->type == PUB_ONLINE) {
+		str = g_strdup_printf ("%d", uri->auto_publish);
+		xmlSetProp (root, "auto_publish", str);
+		g_free(str);
+		str = g_strdup_printf ("%d", uri->alarm_publish);
+		xmlSetProp (root, "alarm_publish", str);
+		g_free(str);
+		for (cals = uri->tasks; cals != NULL; cals = cals->next) {
+			xmlNodePtr node;
+			node = xmlNewChild (root, NULL, "source", NULL);
+			xmlSetProp (node, "uid_task", cals->data);
+		}
+	}
 	
 	for (cals = uri->calendars; cals != NULL; cals = cals->next) {
 		xmlNodePtr node;
@@ -126,7 +232,6 @@
 	memcpy (returned_buffer, xml_buffer, xml_buffer_size);
 	returned_buffer [xml_buffer_size] = '\0';
 	xmlFree (xml_buffer);
-	g_free (enabled);
 
 	return returned_buffer;
 }
@@ -167,6 +272,8 @@
 					return TRUE;
 				}
 				break;
+			case URI_PUBLISH_USER:
+					return TRUE;
 		}
 	}
 	
@@ -188,150 +295,236 @@
 		else
 			return FALSE;
 	}
-
 	
 	return TRUE;
 }
 
+static void
+e_pub_uri_calendar_modified_cb(ECalListener *listener,
+		ECalendarStatus status,
+		const char *id, gpointer data){ /* not used */
+	g_return_if_fail(listener != NULL);
+	g_return_if_fail(E_IS_CAL_LISTENER(listener));
+	if(status != E_CALENDAR_STATUS_OK)
+		return;
+	e_pub_publish(PUB_ONLINE, TRUE);	
+}
+
 void
-e_pub_publish (gboolean publish) {
-	icaltimezone *utc;
+e_pub_publish (EPublishUriType type, gboolean publish) {
+	icaltimezone *utc = NULL;
 	time_t start = time (NULL), end;
-	GSList *uri_config_list, *l, *uri_list = NULL;
-	ESourceList *source_list;
-	GConfClient *gconf_client;
+	GSList *uri_config_list = NULL, *l = NULL, *uri_list = NULL;
+	ESourceList *source_list_cal, *source_list_tasks;
 	gboolean published = FALSE;
-	
-	gconf_client = gconf_client_get_default ();
-	source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/calendar/sources");
-	
+
+	source_list_cal = e_source_list_new_for_gconf_default(
+			"/apps/evolution/calendar/sources");
+	source_list_tasks = e_source_list_new_for_gconf_default(
+			"/apps/evolution/tasks/sources");
+
 	utc = icaltimezone_get_utc_timezone ();	
 	start = time_day_begin_with_zone (start, utc);
 	end = time_add_week_with_zone (start, 6, utc);
-		
-	uri_config_list = calendar_config_get_free_busy ();
-
+	
+	switch(type) {
+	case PUB_ONLINE:	
+		uri_config_list = calendar_config_get_publish ();
+		break;
+	case PUB_FREE_BUSY:
+		uri_config_list = calendar_config_get_free_busy ();
+		break;
+	}
+	
+	/* loop URIs */
 	for (l = uri_config_list; l != NULL; l = l->next) {
 		GSList *p =NULL;
-		EPublishUri *uri;
-		ECalComponent *clone = NULL;
-		gboolean cloned = FALSE;
+		EPublishUri uri;
 		ECal *client = NULL;
-		char *prompt;
+		gchar *prompt;
 		gboolean remember = FALSE;
-		gchar *password;
+		gchar *password = NULL;
 
 		gchar *xml = (gchar *)l->data;
 		
-		uri = g_new0 (EPublishUri, 1);		
-		e_pub_uri_from_xml (uri, xml);
+		e_pub_uri_from_xml (&uri, xml);
 		
 		/* kludge to safeguard against loop from gconf update */
-		if (!just_published (uri->last_pub_time))
-			return;
+//		if (just_published (uri->last_pub_time))
+//			continue;
 		
-		/* TODO: make sure we're online */
 		/* skip this url if it isn't enabled or if it is manual */
-		if (!uri->enabled) {
-			uri_config_list = g_slist_next (uri_config_list);
+		if (!uri.enabled)
 			continue;
-		}	
 		
 		if (!publish) {
 			/* a g_idle publish, make sure we are not set to user only */
-			if (uri->publish_freq == URI_PUBLISH_USER) {
-				uri_config_list = g_slist_next (uri_config_list);
+			if (uri.publish_freq == URI_PUBLISH_USER)
 				continue;
-			}
 			
 			/* If not is it time to publish again? */
-			publish = is_publish_time (uri);
-				
+			publish = is_publish_time (&uri);
+
+			/* TODO: register the notifiers for calendars
+			 * marked auto_publish */
 		}
 		
 		/* User published or config change */
 		if (publish) {
+			icalcomponent *toplevel; /* new toplevel component that will hold all the data */
+			ECalComponent *e_toplevel;
 			/* We still need to set the last_pub_time */
-			uri->last_pub_time = 0;
-			is_publish_time (uri);
+			uri.last_pub_time = 0;
+			is_publish_time (&uri);
+			
+			toplevel = e_cal_util_new_top_level ();
+			e_toplevel = e_cal_component_new();
+			e_cal_component_set_icalcomponent(e_toplevel, toplevel);
+			icalcomponent_set_method (toplevel, ICAL_METHOD_PUBLISH);
 			
-			for (p = uri->calendars; p != NULL; p = p->next) {
-				GList *comp_list = NULL;
+			/* loop calendars */
+			for (p = uri.calendars; p != NULL; p = p->next) {
+				GList *comp_list = NULL; /* list of icalcomponents for this calendar */
+				GList *tmp;
 				gchar *source_uid;
 				ESource * source;
+				gboolean ret = FALSE;
 	
 				source_uid = g_strdup (p->data);
-				source =  e_source_list_peek_source_by_uid (source_list, source_uid);
+				source =  e_source_list_peek_source_by_uid (source_list_cal, source_uid);
 				if (source)
 					client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
 
 				if (!client) {
-					g_warning (G_STRLOC ": Could not publish Free/Busy: Calendar backend no longer exists");
+					g_warning (G_STRLOC ": Could not publish calendar: Calendar backend no longer exists.");
 
 					continue;
 				}
-			
-				e_cal_open (client, TRUE, NULL);
-				
-				if (e_cal_get_free_busy ((ECal *) client, NULL,
+				if(!e_cal_open (client, TRUE, NULL)){
+					g_warning (G_STRLOC ": Could not publish calendar: could not open calendar.");
+					continue;
+				}
+
+				switch(type) {
+				case PUB_ONLINE:
+					ret = e_cal_get_object_list (client, "#t",
+							&comp_list, NULL);
+					break;
+				case PUB_FREE_BUSY:
+					/* TODO fix this, it no longer works!!! */
+					{
+					gboolean cloned = FALSE;	
+					ECalComponent *clone = NULL;
+					ret = e_cal_get_free_busy (client, NULL,
 							 start, end, 
-							 &comp_list, NULL)) {
+							 &tmp, NULL);
+					for (; tmp; tmp = tmp->next) {
+						ECalComponent *comp = E_CAL_COMPONENT (tmp->data);
+						cloned = itip_publish_begin (comp, cloned, &clone);
+						g_object_unref (comp);
+					}
+					comp_list = g_list_append(comp_list, itip_comp_fb_normalize(
+								e_cal_component_get_icalcomponent(clone)));
+					ret = cloned;
+					break;
+					}
+				}
+				
+				if (ret) {
 					GList *l;
-	
 					for (l = comp_list; l; l = l->next) {
-						ECalComponent *comp = E_CAL_COMPONENT (l->data);
-					
-						cloned = itip_publish_begin (comp, (ECal *) client, cloned, &clone);
-						g_object_unref (comp);
+						/* TODO check against alarm_publish and todo_publish */
+						icalcomponent_add_component(toplevel, l->data);
 					}
 					g_list_free (comp_list);
 				}
+//				offline |= e_source_get_property (source, "offline");
 				
 				g_object_unref (client);
+				client = NULL;
 			
 				g_free (source_uid);
-			}
+			} /* end loop calendars */
 
-			/* add password to the uri */
-			password = e_passwords_get_password ("Calendar", 
-							     (gchar *)uri->location);
+			/* loop task lists */
+			for (p = uri.tasks; type == PUB_ONLINE && p != NULL; p = p->next) {
+				GList *comp_list = NULL; /* list of icalcomponents for this task list */
+				gchar *source_uid;
+				ESource * source;
+				gboolean ret = FALSE;
+	
+				source_uid = g_strdup (p->data);
+				source =  e_source_list_peek_source_by_uid (source_list_tasks, source_uid);
+				if (source)
+					client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
+
+				if (!client) {
+					g_warning (G_STRLOC ": Could not publish task list: backend no longer exists.");
+					continue;
+				}
+				if(!e_cal_open (client, TRUE, NULL)){
+					g_warning (G_STRLOC ": Could not publish task list: could not open it.");
+					continue;
+				}
+
+				ret = e_cal_get_object_list (client, "#t",
+							&comp_list, NULL);
+	
+				if (ret) {
+					GList *l;
+					for (l = comp_list; l; l = l->next) {
+						icalcomponent_add_component(toplevel, l->data);
+					}
+					g_list_free (comp_list);
+				}
+	
+				g_object_unref (client);
 			
-			if (!password) {
-				prompt = g_strdup_printf (_("Enter the password for %s"), (gchar *)uri->location);
-				password = e_passwords_ask_password (_("Enter password"), 
-								     "Calendar", (gchar *)uri->location, 
-								     prompt,
-								     E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
-								     &remember, NULL);
+				g_free (source_uid);
+			} /* end loop tasks */
 
-				g_free (prompt);
-					
+			/* add password to the uri */
+			if(!uri.no_pw) {
+				password = e_passwords_get_password ("Calendar", 
+							     (gchar *)uri.location);
 				if (!password) {
-					g_slist_free (p);
-					continue;
+					prompt = g_strdup_printf (
+						_("Enter the password for %s"), (gchar *)uri.location);
+					password = e_passwords_ask_password (_("Enter password"), 
+							     "Calendar", (gchar *)uri.location, 
+							     prompt,
+							     E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE,
+							     &remember, NULL);
+					g_free (prompt);
 				}
 			}
-		
-			if (cloned && clone)
-				published = itip_publish_comp ((ECal *) client,
-						       uri->location,
-						       uri->username, 
-						       password, &clone);
-			
+			e_cal_component_set_url(e_toplevel, uri.location);	
+			published = itip_publish_comp (toplevel, TRUE,//offline,
+					       uri.location,
+					       uri.username, 
+					       password);
 			g_slist_free (p);
-		}
-		xml = e_pub_uri_to_xml (uri);
+		} /* end if(publish) */
+
+		xml = e_pub_uri_to_xml (&uri);
 		if (xml != NULL) {
 			uri_list = g_slist_append (uri_list, xml);
 		}
-		g_free (uri);
-	}
+		e_pub_uri_free(&uri);
+	} /* end loop URIs */
 	
 	if (published) {
 		/* Update gconf so we have the last_pub_time */
-		calendar_config_set_free_busy (uri_list);
+		switch (type) {
+		case PUB_ONLINE:
+			calendar_config_set_publish (uri_list);
+			break;
+		case PUB_FREE_BUSY:
+			calendar_config_set_free_busy (uri_list);
+			break;
+		}
 	}
-		
+
 	g_slist_free (uri_config_list);
 	g_slist_free (uri_list);
 }
Index: calendar/gui/e-pub-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/e-pub-utils.h,v
retrieving revision 1.1
diff -u -u -r1.1 e-pub-utils.h
--- calendar/gui/e-pub-utils.h	13 Jan 2004 01:59:28 -0000	1.1
+++ calendar/gui/e-pub-utils.h	24 Mar 2005 20:54:57 -0000
@@ -28,11 +28,11 @@
 
 G_BEGIN_DECLS
 
-enum publish_frequency{
+typedef enum {
 	URI_PUBLISH_DAILY,
 	URI_PUBLISH_WEEKLY,
-	URI_PUBLISH_USER
-};
+	URI_PUBLISH_USER,
+} EPublishFreq;
 
 static const int pub_frequency_type_map[] = {
 	URI_PUBLISH_DAILY,
@@ -41,21 +41,33 @@
 	-1
 };
 
-struct _EPublishUri {
+typedef enum {
+	PUB_FREE_BUSY,
+	PUB_ONLINE
+} EPublishUriType;
+
+typedef struct {
+	/* for both types */
+	EPublishUriType type;
 	gint enabled;
 	gchar *location;
-	gint publish_freq;
 	gchar *username;
-	gchar *password;
+	gboolean no_pw;
+	gboolean remember_pw;
 	GSList *calendars;
 	gchar *last_pub_time;
-};
-
-typedef struct _EPublishUri EPublishUri;
-
-void e_pub_uri_from_xml (EPublishUri *uri, const gchar *xml);
-gchar  *e_pub_uri_to_xml (EPublishUri *uri);
-void e_pub_publish (gboolean publish) ;
+	/* only for PUB_FREE_BUSY */
+	EPublishFreq publish_freq;
+	/* only for PUB_ONLINE */
+	GSList *tasks;
+	gboolean auto_publish;
+	gboolean alarm_publish;
+} EPublishUri;
+
+void e_pub_uri_free(EPublishUri *uri);
+void e_pub_uri_from_xml (EPublishUri *uri, const guchar *xml);
+guchar  *e_pub_uri_to_xml (EPublishUri *uri);
+void e_pub_publish (EPublishUriType type, gboolean publish) ;
 
 G_END_DECLS
 
Index: calendar/gui/itip-utils.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/itip-utils.c,v
retrieving revision 1.98
diff -u -u -r1.98 itip-utils.c
--- calendar/gui/itip-utils.c	15 Mar 2005 16:05:07 -0000	1.98
+++ calendar/gui/itip-utils.c	24 Mar 2005 20:54:57 -0000
@@ -36,9 +36,11 @@
 #include <e-util/e-time-utils.h>
 #include <libecal/e-cal-time-util.h>
 #include <libecal/e-cal-util.h>
+#include <libedataserverui/e-passwords.h>
 #include <libsoup/soup-session-async.h>
 #include <libsoup/soup-message.h>
 #include <libsoup/soup-uri.h>
+#include <libgnomevfs/gnome-vfs.h>
 #include "calendar-config.h"
 #include "itip-utils.h"
 #include "dialogs/cal-attachment.h"
@@ -1052,36 +1054,32 @@
 }
 
 gboolean
-itip_publish_begin (ECalComponent *pub_comp, ECal *client, 
+itip_publish_begin (ECalComponent *pub_comp, 
 		    gboolean cloned, ECalComponent **clone)
 {
 	icalcomponent *icomp =NULL, *icomp_clone = NULL;
 	icalproperty *prop;
-		
-	if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) {
-				
+	if (e_cal_component_get_vtype (pub_comp) == E_CAL_COMPONENT_FREEBUSY) {		
 		if (!cloned) {
 			*clone = e_cal_component_clone (pub_comp);
-			cloned = TRUE;
 		} else {
-			
 			icomp = e_cal_component_get_icalcomponent (pub_comp);
 			icomp_clone = e_cal_component_get_icalcomponent (*clone);
 			for (prop = icalcomponent_get_first_property (icomp,
 						      ICAL_FREEBUSY_PROPERTY);
 	     			prop != NULL;
-	     			prop = icalcomponent_get_next_property (icomp, 
+     				prop = icalcomponent_get_next_property (icomp, 
 						       ICAL_FREEBUSY_PROPERTY))
 			{
 				icalproperty *p;
-		
+	
 				p = icalproperty_new_clone (prop);
 				icalcomponent_add_property (icomp_clone, p);
 			}
-		}		
+		}
+		return TRUE;
 	}
-
-	return TRUE;
+	return FALSE;
 }
 
 static void
@@ -1111,8 +1109,8 @@
 	}
 }
 
-static icalcomponent *
-comp_fb_normalize (icalcomponent *icomp)
+icalcomponent *
+itip_comp_fb_normalize (icalcomponent *icomp)
 {
 	icalcomponent *iclone;
 	icalproperty *prop, *p;
@@ -1197,64 +1195,133 @@
 }
 
 gboolean
-itip_publish_comp (ECal *client, gchar *uri, gchar *username, 
-		   gchar *password, ECalComponent **pub_comp)
+itip_publish_comp (icalcomponent *toplevel, gboolean offline,
+		gchar *uri, gchar *username, gchar *password)
 {
-	icalcomponent *toplevel = NULL, *icalcomp = NULL;
-	icalcomponent *icomp = NULL;
-	SoupSession *session;
-	SoupMessage *msg;
-	SoupUri *real_uri;
+	icalcomponent *icalcomp = NULL;
 	char *ical_string;
+	gboolean http;
+	GnomeVFSURI *vfs_uri;
+	GnomeVFSHandle *handle = NULL;
+	GnomeVFSResult result;
+	GnomeVFSFileSize bytes;
+	GnomeVFSFileSize bytes_written = 0;
+
+	/* for URIs that need password input, like ssh */
+	gnome_authentication_manager_init();
+
+	if(strncasecmp(uri, "http", 4) == 0){
+		/* Publish the component with SOAP */
+		SoupSession *session;
+		SoupUri *real_uri;
+		SoupMessage *msg;
+		session = soup_session_async_new ();
+		real_uri = soup_uri_new (uri);
+		if (!real_uri || !real_uri->host) {
+			g_warning (G_STRLOC ": Invalid URL: %s", uri);
+			g_object_unref (session);
+			return FALSE;
+		}
+  
+		real_uri->user = g_strdup (username);
+		real_uri->passwd = g_strdup (password);
+  	
+		/* build the SOAP message */
+		msg = soup_message_new_from_uri (SOUP_METHOD_PUT, real_uri);
+		if (!msg) {
+			g_warning (G_STRLOC ": Could not build SOAP message");
+			g_object_unref (session);
+			return FALSE;
+		}
+		soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);	
+		ical_string = icalcomponent_as_ical_string (toplevel);
+		soup_message_set_request (msg, "text/calendar", SOUP_BUFFER_USER_OWNED,
+					  ical_string, strlen (ical_string));
+  
+		/* send message to server */
+		soup_session_send_message (session, msg);
+		if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+			g_warning(G_STRLOC ": Could not publish calendars: %d: %s", 
+					msg->status_code, 
+					soup_status_get_phrase (msg->status_code));
+			g_object_unref (session);
+			return FALSE;
+		}
+  
+		soup_uri_free (real_uri);
+		g_object_unref (session);
+		return TRUE;
+	}
 	
-	toplevel = e_cal_util_new_top_level ();
-	icalcomponent_set_method (toplevel, ICAL_METHOD_PUBLISH);
-	
-	e_cal_component_set_url (*pub_comp, uri);
-	
-	icalcomp = e_cal_component_get_icalcomponent (*pub_comp);
+	if((vfs_uri = gnome_vfs_uri_new(uri)) == NULL){
+		g_warning (G_STRLOC ": Invalid URL: %s", uri);
+		return FALSE;
+	}
+	if(!gnome_vfs_uri_is_local(vfs_uri)){
+		/* TODO: if this is not a local uri. make sure we're online */
+	/*
+		GNOME_Evolution_Offline offline_obj;
+		CORBA_Environment ev;
+		CORBA_boolean offline = FALSE;
+		
+		CORBA_exception_init (&ev);
+		interface = Bonobo_Unknown_queryInterface(
+		objref, "IDL:GNOME/Evolution/Offline:1.0", &ev);
+
+		if (ev._major != CORBA_NO_EXCEPTION) {
+			CORBA_exception_free (&ev);
+			return;
+		}
+		
+		offline = GNOME_Evolution_Offline__get_isOffline(offline_obj, &ev);
+		if (ev._major != CORBA_NO_EXCEPTION) {
+			CORBA_exception_free (&ev);
+			//error querying CORBA object
+			return;
+		}
+		
+		if (offline) {
+			//error... we are offline
+			CORBA_exception_free (&ev);
+			return;
+		}
 	
-	icomp = comp_fb_normalize (icalcomp);	
-
-	icalcomponent_add_component (toplevel, icomp);
-	ical_string = icalcomponent_as_ical_string (toplevel);
+		CORBA_exception_free (&ev);
+	*/
+	}
 
-	/* Publish the component */
-	session = soup_session_async_new ();
+	gnome_vfs_uri_set_user_name(vfs_uri, username);
+	gnome_vfs_uri_set_password(vfs_uri, password);
+	if(!gnome_vfs_uri_exists(vfs_uri)) {
+		result = gnome_vfs_create_uri(&handle, vfs_uri,
+			GNOME_VFS_OPEN_WRITE,
+			FALSE, GNOME_VFS_PERM_USER_WRITE | GNOME_VFS_PERM_USER_READ);
+	} else {
+		result = gnome_vfs_open_uri(&handle, vfs_uri, GNOME_VFS_OPEN_WRITE);
+	}
 
-	real_uri = soup_uri_new (uri);
-	if (!real_uri || !real_uri->host) {
-		g_warning (G_STRLOC ": Invalid URL: %s", uri);
-		g_object_unref (session);
+	if(result != GNOME_VFS_OK){
+		g_warning("Publish: Cannot open uri: %s, %s", uri, gnome_vfs_result_to_string(result));
 		return FALSE;
 	}
 	
-	real_uri->user = g_strdup (username);
-	real_uri->passwd = g_strdup (password);
-		
-	/* build the SOAP message */
-	msg = soup_message_new_from_uri (SOUP_METHOD_PUT, real_uri);
-	if (!msg) {
-		g_warning (G_STRLOC ": Could not build SOAP message");
-		g_object_unref (session);
-		return FALSE;
+	ical_string = icalcomponent_as_ical_string (toplevel);
+	bytes = strlen (ical_string);
+	while(bytes > bytes_written) {
+		bytes = bytes - bytes_written;
+		ical_string = ical_string + bytes_written;
+		result = gnome_vfs_write(handle, ical_string, bytes, &bytes_written);
+		if(result != GNOME_VFS_OK){
+			g_warning(gnome_vfs_result_to_string(result));
+			return FALSE;
+		}
 	}
-	soup_message_set_flags (msg, SOUP_MESSAGE_NO_REDIRECT);	
-	soup_message_set_request (msg, "text/calendar", SOUP_BUFFER_USER_OWNED,
-				  ical_string, strlen (ical_string));
-	
-	/* send message to server */
-	soup_session_send_message (session, msg);
-	if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
-		g_warning(G_STRLOC ": Could not publish Free/Busy: %d: %s", 
-			  msg->status_code, 
-			  soup_status_get_phrase (msg->status_code));
-		g_object_unref (session);
+
+	result = gnome_vfs_close(handle);
+	if(result != GNOME_VFS_OK){
+		g_warning("Publish: Cannot close uri: %s, %s", uri, gnome_vfs_result_to_string(result));
 		return FALSE;
 	}
 	
-	soup_uri_free (real_uri);
-	g_object_unref (session);
-	
 	return TRUE;
 }
Index: calendar/gui/itip-utils.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/itip-utils.h,v
retrieving revision 1.17
diff -u -u -r1.17 itip-utils.h
--- calendar/gui/itip-utils.h	8 Jan 2005 10:53:53 -0000	1.17
+++ calendar/gui/itip-utils.h	24 Mar 2005 20:54:57 -0000
@@ -31,10 +31,11 @@
 gboolean itip_send_comp (ECalComponentItipMethod method, ECalComponent *comp,
 			 ECal *client, icalcomponent *zones, GSList *attachments_list);
 
-gboolean itip_publish_comp (ECal *client, gchar* uri, gchar* username, 
-			    gchar* password, ECalComponent **pub_comp);
+gboolean itip_publish_comp (icalcomponent *toplevel, gboolean offline,
+		gchar* uri, gchar* username, gchar* password);
 
-gboolean itip_publish_begin (ECalComponent *pub_comp, ECal *client, 
+gboolean itip_publish_begin (ECalComponent *pub_comp, 
 			     gboolean cloned, ECalComponent **clone);
+icalcomponent *itip_comp_fb_normalize (icalcomponent *icomp);
 
 #endif
Index: calendar/gui/dialogs/Makefile.am
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/Makefile.am,v
retrieving revision 1.69
diff -u -u -r1.69 Makefile.am
--- calendar/gui/dialogs/Makefile.am	8 Jan 2005 10:53:52 -0000	1.69
+++ calendar/gui/dialogs/Makefile.am	24 Mar 2005 20:54:57 -0000
@@ -62,6 +62,8 @@
 	event-page.h		\
 	meeting-page.c		\
 	meeting-page.h		\
+	publish-editor-dialog.c	\
+	publish-editor-dialog.h	\
 	recurrence-page.c	\
 	recurrence-page.h	\
 	recur-comp.c		\
@@ -91,6 +93,7 @@
 	e-delegate-dialog.glade		\
 	event-page.glade		\
 	meeting-page.glade		\
+	publish-editor-dialog.glade	\
 	recurrence-page.glade		\
 	schedule-page.glade		\
 	task-details-page.glade		\
Index: calendar/gui/dialogs/cal-prefs-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.c,v
retrieving revision 1.41
diff -u -u -r1.41 cal-prefs-dialog.c
--- calendar/gui/dialogs/cal-prefs-dialog.c	31 Dec 2004 16:59:18 -0000	1.41
+++ calendar/gui/dialogs/cal-prefs-dialog.c	24 Mar 2005 20:54:57 -0000
@@ -35,6 +35,7 @@
 #include "cal-prefs-dialog.h"
 #include "../calendar-config.h"
 #include "url-editor-dialog.h"
+#include "publish-editor-dialog.h"
 
 #include <gtk/gtk.h>
 #include <gtk/gtkmain.h>
@@ -87,6 +88,18 @@
 						   GtkTreeViewColumn *column, 
 						   DialogData *dialog_data);
 static void show_fb_config (DialogData *dialog_data);
+static void show_publish_config (DialogData *dialog_data);
+
+static void cal_prefs_dialog_pub_url_add_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_edit_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_remove_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_enable_clicked (GtkWidget *button, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_change (GtkTreeSelection *selection, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_enable_toggled (GtkCellRendererToggle *renderer, const char *path_string, DialogData *dialog_data);
+static void cal_prefs_dialog_pub_url_list_double_click(GtkTreeView *treeview, 
+						   GtkTreePath *path, 
+						   GtkTreeViewColumn *column, 
+						   DialogData *dialog_data);
 
 GtkWidget *cal_prefs_dialog_create_time_edit (void);
 
@@ -356,7 +369,7 @@
 		char *xml;
 		
 		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		
 		if ((xml = e_pub_uri_to_xml (url)))
@@ -371,12 +384,50 @@
 }
 
 static void
+pub_url_list_changed (DialogData *dialog_data)
+{
+	GtkListStore *model = NULL;
+	GSList *url_list = NULL;
+	GtkTreeIter iter;
+	gboolean valid;
+	
+	url_list = NULL;
+	
+	model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->pub_url_list);
+	
+	valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+	while (valid) {
+		EPublishUri *url;
+		char *xml;
+		
+		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		
+		if ((xml = e_pub_uri_to_xml (url)))
+			url_list = g_slist_append (url_list, xml);
+		
+		valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
+	}
+	
+	calendar_config_set_publish (url_list);
+	
+	g_slist_free (url_list);
+}
+
+static void
 template_url_changed (GtkEntry *entry, DialogData *dialog_data)
 {
 	calendar_config_set_free_busy_template (gtk_entry_get_text (entry));
 }
 
 static void
+pub_template_url_changed (GtkEntry *entry, DialogData *dialog_data)
+{
+	calendar_config_set_publish_template (gtk_entry_get_text (entry));
+}
+
+static void
 setup_changes (DialogData *dialog_data)
 {
 	int i;
@@ -420,6 +471,7 @@
 			  G_CALLBACK (default_reminder_units_changed), dialog_data);
 
 	g_signal_connect (dialog_data->template_url, "changed", G_CALLBACK (template_url_changed), dialog_data);
+	g_signal_connect (dialog_data->pub_template_url, "changed", G_CALLBACK (pub_template_url_changed), dialog_data);
 }
 
 /* Gets the widgets from the XML file and returns if they are all available.
@@ -473,6 +525,12 @@
 
 	data->template_url = GW("template_url");
 
+	data->pub_url_add = GW ("pub_url_add");
+	data->pub_url_edit = GW ("pub_url_edit");
+	data->pub_url_remove = GW ("pub_url_remove");
+	data->pub_url_enable = GW ("pub_url_enable");
+	data->pub_url_list = GTK_TREE_VIEW (GW ("pub_url_list"));
+	data->pub_template_url = GW("pub_template_url");
 #undef GW
 
 	return (data->page
@@ -506,7 +564,12 @@
 		&& data->url_edit
 		&& data->url_remove
 		&& data->url_enable
-		&& data->url_list);
+		&& data->url_list
+		&& data->pub_url_add
+		&& data->pub_url_edit
+		&& data->pub_url_remove
+		&& data->pub_url_enable
+		&& data->pub_url_list);
 }
 
 
@@ -596,6 +659,66 @@
 	g_signal_connect (dialog_data->url_list, "row-activated",
 			 G_CALLBACK (cal_prefs_dialog_url_list_double_click),
 			 dialog_data);
+	g_signal_connect (selection, "changed",
+			 G_CALLBACK (cal_prefs_dialog_url_list_change),
+			 dialog_data);
+
+	/* Online Publishing */
+	g_signal_connect (dialog_data->pub_url_add, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_add_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_edit, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_edit_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_remove, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_remove_clicked),
+			  dialog_data);
+	
+	g_signal_connect (dialog_data->pub_url_enable, "clicked",
+			  G_CALLBACK (cal_prefs_dialog_pub_url_enable_clicked),
+			  dialog_data);
+	
+	/* Online Publishing Listview */
+	renderer = gtk_cell_renderer_toggle_new();
+	g_object_set ((GObject *) renderer, "activatable", TRUE, NULL);
+	
+	model = gtk_list_store_new (URL_LIST_N_COLUMNS, G_TYPE_BOOLEAN,
+				    G_TYPE_STRING, G_TYPE_POINTER);
+	
+	gtk_tree_view_set_model (dialog_data->pub_url_list, 
+				 (GtkTreeModel *) model);
+
+	gtk_tree_view_insert_column_with_attributes (dialog_data->pub_url_list, -1,
+						    _("Enabled"), renderer,
+						    "active", 
+						     URL_LIST_ENABLED_COLUMN, 
+						    NULL);
+
+	g_signal_connect (renderer, "toggled", 
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_enable_toggled),
+			 dialog_data);
+	
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes(dialog_data->pub_url_list, -1, 
+						    _("Location"), renderer,
+						    "text", 
+						    URL_LIST_LOCATION_COLUMN, 
+						    NULL);
+	
+	selection = gtk_tree_view_get_selection (
+			(GtkTreeView *) dialog_data->pub_url_list);
+	gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+	gtk_tree_view_set_headers_visible (
+			(GtkTreeView *) dialog_data->pub_url_list, TRUE);
+	
+	g_signal_connect (dialog_data->pub_url_list, "row-activated",
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_double_click),
+			 dialog_data);
+	g_signal_connect (selection, "changed",
+			 G_CALLBACK (cal_prefs_dialog_pub_url_list_change),
+			 dialog_data);
 }
 
 /* Sets the color in a color picker from an X color spec */
@@ -638,7 +761,7 @@
 					   url->enabled,
 					   URL_LIST_LOCATION_COLUMN, 
 					   g_strdup (url->location),
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 			
 			url_list_changed (dialog_data);
@@ -669,7 +792,7 @@
 		selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->url_list);
 		if (gtk_tree_selection_get_selected (selection, &model, &iter)){
 			gtk_tree_model_get (model, &iter, 
-					    URL_LIST_FREE_BUSY_URL_COLUMN, 
+					    URL_LIST_URL_COLUMN, 
 					    &url, 
 					    -1);
 
@@ -683,7 +806,7 @@
 					   g_strdup (url->location), 
 					   URL_LIST_ENABLED_COLUMN, 
 					   url->enabled, 
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 			
 			url_list_changed (dialog_data);
@@ -715,7 +838,7 @@
 	selection = gtk_tree_view_get_selection (dialog_data->url_list);
 	if (gtk_tree_selection_get_selected (selection, &model, &iter))
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 	
 	/* make sure we have a valid account selected and that 
@@ -757,7 +880,7 @@
 			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_remove), FALSE);
 			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->url_enable), FALSE);
 		}
-		g_free (url);
+		g_free(url);
 		url_list_changed (dialog_data);
 	}
 }
@@ -773,7 +896,7 @@
 	selection = gtk_tree_view_get_selection (dialog_data->url_list);
 	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		url->enabled = !url->enabled;
 		
@@ -807,7 +930,7 @@
 
 	if (gtk_tree_model_get_iter (model, &iter, path)) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 		
 		url->enabled = !url->enabled;
@@ -846,7 +969,7 @@
 	state = gtk_tree_selection_get_selected (selection, &model, &iter);
 	if (state) {
 		gtk_tree_model_get (model, &iter, 
-				    URL_LIST_FREE_BUSY_URL_COLUMN, &url, 
+				    URL_LIST_URL_COLUMN, &url, 
 				    -1);
 
 		if (url->location && url->enabled)
@@ -902,6 +1025,7 @@
 		gchar *xml = (gchar *)url_config_list->data;
 		EPublishUri *url;
 		url = g_new0 (EPublishUri, 1);
+		url->type = PUB_FREE_BUSY;
 		
 		e_pub_uri_from_xml (url, xml);
 		if (url->location) {
@@ -911,7 +1035,7 @@
 					   url->enabled,
 					   URL_LIST_LOCATION_COLUMN, 
 					   url->location,
-					   URL_LIST_FREE_BUSY_URL_COLUMN, url,
+					   URL_LIST_URL_COLUMN, url,
 					   -1);
 		}
 
@@ -928,6 +1052,323 @@
 	g_free (template_url);
 }
 
+/* Shows the current Online Publishing settings in the dialog */
+static void
+show_publish_config (DialogData *dialog_data)
+{
+	GSList *url_config_list = NULL;
+	GtkListStore *model;
+	GtkTreeIter iter;
+	gchar *template_url;
+	
+	model = (GtkListStore *) gtk_tree_view_get_model (dialog_data->pub_url_list);
+	gtk_list_store_clear (model);
+	
+	/* restore urls from gconf */
+	url_config_list = calendar_config_get_publish();
+
+	if (!url_config_list) {
+		/* list is empty-disable edit, remove, and enable buttons */
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), 
+					 FALSE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), 
+					 FALSE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), 
+					 FALSE);
+	}	else {
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), 
+					 TRUE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), 
+					 TRUE);
+
+		gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), 
+					 TRUE);
+	}
+	
+	while (url_config_list) {
+		gchar *xml = (gchar *)url_config_list->data;
+		EPublishUri *url;
+		url = g_new0 (EPublishUri, 1);
+		url->type = PUB_ONLINE;
+		
+		e_pub_uri_from_xml (url, xml);
+		if (url->location) {
+			gtk_list_store_append (model, &iter);
+			gtk_list_store_set (model, &iter, 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled,
+					   URL_LIST_LOCATION_COLUMN, 
+					   url->location,
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+		}
+
+		url_config_list = g_slist_next (url_config_list);
+		g_free (xml);
+	}
+
+	g_slist_foreach (url_config_list, (GFunc) g_free, NULL);
+	g_slist_free (url_config_list);
+
+	template_url = calendar_config_get_publish_template ();
+	gtk_entry_set_text (GTK_ENTRY (dialog_data->pub_template_url), template_url);
+
+	g_free (template_url);
+}
+
+static void
+cal_prefs_dialog_pub_url_add_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	
+	model = gtk_tree_view_get_model (dialog_data->pub_url_list);
+	url = g_new0 (EPublishUri, 1);
+	url->enabled = TRUE;
+	url->location = "";
+	
+	if (!dialog_data->publish_editor) {
+		dialog_data->publish_editor = publish_editor_dialog_new (dialog_data, 
+								 url);
+
+		if (url->location != "") {
+			gtk_list_store_append(GTK_LIST_STORE (model), &iter);
+			gtk_list_store_set (GTK_LIST_STORE(model), &iter, 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled,
+					   URL_LIST_LOCATION_COLUMN, 
+					   g_strdup (url->location),
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+			
+			pub_url_list_changed (dialog_data);
+	
+			if (!GTK_WIDGET_SENSITIVE (
+					(GtkWidget *) dialog_data->pub_url_remove)) {
+				selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+				gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+				gtk_widget_set_sensitive ((GtkWidget*) dialog_data->pub_url_remove, TRUE);
+				gtk_tree_selection_select_iter (selection, &iter);
+			}	
+		}
+		dialog_data->publish_editor = FALSE;
+		dialog_data->publish_editor_dlg = NULL;
+	} else {
+		gdk_window_raise (dialog_data->publish_editor_dlg->window);
+	}	
+}
+
+static void
+cal_prefs_dialog_pub_url_edit_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	if (!dialog_data->publish_editor) {
+		GtkTreeSelection *selection;
+		EPublishUri *url = NULL;
+		GtkTreeModel *model;
+		GtkTreeIter iter;
+		
+		selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+		if (gtk_tree_selection_get_selected (selection, &model, &iter)){
+			gtk_tree_model_get (model, &iter, 
+					    URL_LIST_URL_COLUMN, 
+					    &url, 
+					    -1);
+
+		}
+
+		if (url) {
+			dialog_data->publish_editor = publish_editor_dialog_new (dialog_data, url);
+			
+			gtk_list_store_set ((GtkListStore *) model, &iter, 
+					   URL_LIST_LOCATION_COLUMN, 
+					   g_strdup (url->location), 
+					   URL_LIST_ENABLED_COLUMN, 
+					   url->enabled, 
+					   URL_LIST_URL_COLUMN, url,
+					   -1);
+			
+			pub_url_list_changed (dialog_data);
+			
+			if (!GTK_WIDGET_SENSITIVE ((GtkWidget *) dialog_data->pub_url_remove)) {
+				selection = gtk_tree_view_get_selection ((GtkTreeView *) dialog_data->pub_url_list);
+				gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+				gtk_widget_set_sensitive ((GtkWidget*) dialog_data->pub_url_remove, TRUE);
+				gtk_tree_selection_select_iter (selection, &iter);
+			}
+			dialog_data->publish_editor = FALSE;
+			dialog_data->publish_editor_dlg = NULL;
+		}
+	} else {
+		gdk_window_raise (dialog_data->publish_editor_dlg->window);
+	}	
+}
+
+static void
+cal_prefs_dialog_pub_url_remove_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeSelection * selection;
+	GtkTreeModel *model;
+	GtkWidget *confirm;
+	GtkTreeIter iter;
+	int ans;
+	
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+	if (gtk_tree_selection_get_selected (selection, &model, &iter))
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+	
+	/* make sure we have a valid account selected and that 
+	   we aren't editing anything... */
+	if (url == NULL || dialog_data->publish_editor)
+		return;
+	
+	confirm = gtk_message_dialog_new (PREFS_WINDOW (dialog_data),
+					  GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+					  GTK_MESSAGE_QUESTION, 
+					  GTK_BUTTONS_NONE,
+					  _("Are you sure you want to remove this URL?"));
+	
+	button = gtk_button_new_from_stock (GTK_STOCK_YES);
+	gtk_button_set_label ((GtkButton *) button, _("Remove"));
+	gtk_dialog_add_action_widget ((GtkDialog *) confirm, (GtkWidget *) button, GTK_RESPONSE_YES);
+	gtk_widget_show ((GtkWidget *) button);
+	
+	button = gtk_button_new_from_stock (GTK_STOCK_NO);
+	gtk_button_set_label ((GtkButton *) button, _("Don't Remove"));
+	gtk_dialog_add_action_widget ((GtkDialog *) confirm, 
+				      (GtkWidget *) button, GTK_RESPONSE_NO);
+
+	gtk_widget_show ((GtkWidget *) button);
+	
+	ans = gtk_dialog_run ((GtkDialog *) confirm);
+	gtk_widget_destroy (confirm);
+	
+	if (ans == GTK_RESPONSE_YES) {
+		int len;
+		
+		gtk_list_store_remove ((GtkListStore *) model, &iter);
+		
+		len = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
+		if (len > 0) {
+			gtk_tree_selection_select_iter (selection, &iter);
+		} else {
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), FALSE);
+			gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), FALSE);
+		}
+		g_free(url);
+		pub_url_list_changed (dialog_data);
+	}
+}
+
+static void
+cal_prefs_dialog_pub_url_enable_clicked (GtkWidget *button, DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeSelection * selection;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+	if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		url->enabled = !url->enabled;
+		
+		gtk_tree_selection_select_iter (selection, &iter);
+		
+		gtk_list_store_set ((GtkListStore *) model, &iter, 
+				    URL_LIST_ENABLED_COLUMN, url->enabled, 
+				    -1);
+		
+		gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, 
+				      url->enabled ? _("Disable") : _("Enable"));
+		
+		pub_url_list_changed (dialog_data);
+	}
+}
+ 
+static void
+cal_prefs_dialog_pub_url_list_enable_toggled (GtkCellRendererToggle *renderer, 
+					  const char *path_string, 
+					  DialogData *dialog_data)
+{
+	GtkTreeSelection * selection;
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	
+	path = gtk_tree_path_new_from_string (path_string);
+	model = gtk_tree_view_get_model (dialog_data->pub_url_list);
+	selection = gtk_tree_view_get_selection (dialog_data->pub_url_list);
+
+	if (gtk_tree_model_get_iter (model, &iter, path)) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+		
+		url->enabled = !url->enabled;
+		gtk_list_store_set((GtkListStore *) model, &iter, 
+				   URL_LIST_ENABLED_COLUMN,
+				   url->enabled, -1);
+		
+		if (gtk_tree_selection_iter_is_selected (selection, &iter))
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, 
+					      url->enabled ? _("Disable") : _("Enable"));
+		
+		pub_url_list_changed (dialog_data);
+	}
+
+	gtk_tree_path_free (path);
+}
+
+static void
+cal_prefs_dialog_pub_url_list_double_click (GtkTreeView *treeview, 
+					GtkTreePath *path, 
+					GtkTreeViewColumn *column, 
+					DialogData *dialog_data)
+{
+	cal_prefs_dialog_pub_url_edit_clicked  (NULL, dialog_data);
+}				
+
+static void
+cal_prefs_dialog_pub_url_list_change (GtkTreeSelection *selection, 
+				  DialogData *dialog_data)
+{
+	EPublishUri *url = NULL;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	int state;
+	
+	state = gtk_tree_selection_get_selected (selection, &model, &iter);
+	if (state) {
+		gtk_tree_model_get (model, &iter, 
+				    URL_LIST_URL_COLUMN, &url, 
+				    -1);
+
+		if (url->location && url->enabled)
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, _("Disable"));
+		else
+			gtk_button_set_label ((GtkButton *) dialog_data->pub_url_enable, _("Enable"));
+	} else {
+		gtk_widget_grab_focus (GTK_WIDGET (dialog_data->pub_url_add));
+	}
+	
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_edit), state);
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_remove), state);
+	gtk_widget_set_sensitive (GTK_WIDGET (dialog_data->pub_url_enable), state);
+}
+
+
 /* Shows the current task list settings in the dialog */
 static void
 show_task_list_config (DialogData *dialog_data)
@@ -1027,6 +1468,9 @@
 	/* Free/Busy */
 	show_fb_config (dialog_data);
 
+	/* Online Publishing */
+	show_publish_config (dialog_data);
+
 	/* Other page */
 
 	e_dialog_toggle_set (dialog_data->confirm_delete, calendar_config_get_confirm_delete ());
Index: calendar/gui/dialogs/cal-prefs-dialog.glade
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.glade,v
retrieving revision 1.31
diff -u -u -r1.31 cal-prefs-dialog.glade
--- calendar/gui/dialogs/cal-prefs-dialog.glade	26 Jan 2005 11:48:21 -0000	1.31
+++ calendar/gui/dialogs/cal-prefs-dialog.glade	24 Mar 2005 20:54:57 -0000
@@ -2012,6 +2012,479 @@
 	      <property name="type">tab</property>
 	    </packing>
 	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox19">
+	      <property name="border_width">12</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkFrame" id="frame3">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment9">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">12</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkHBox" id="hbox31">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkScrolledWindow" id="scrolledwindow2">
+			      <property name="visible">True</property>
+			      <property name="can_focus">True</property>
+			      <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			      <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+			      <property name="shadow_type">GTK_SHADOW_IN</property>
+			      <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+			      <child>
+				<widget class="GtkTreeView" id="pub_url_list">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="headers_visible">True</property>
+				  <property name="rules_hint">False</property>
+				  <property name="reorderable">False</property>
+				  <property name="enable_search">True</property>
+				</widget>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">True</property>
+			      <property name="fill">True</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkVBox" id="vbox20">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">6</property>
+
+			      <child>
+				<widget class="GtkVButtonBox" id="vbuttonbox5">
+				  <property name="visible">True</property>
+				  <property name="layout_style">GTK_BUTTONBOX_START</property>
+				  <property name="spacing">6</property>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_add">
+				      <property name="visible">True</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment10">
+					  <property name="visible">True</property>
+					  <property name="can_default">True</property>
+					  <property name="can_focus">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">0</property>
+					  <property name="yscale">0</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox32">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">2</property>
+
+					      <child>
+						<widget class="GtkImage" id="image3">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-add</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label64">
+						  <property name="visible">True</property>
+						  <property name="can_default">True</property>
+						  <property name="can_focus">True</property>
+						  <property name="label" translatable="yes">_Add URL</property>
+						  <property name="use_underline">True</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_edit">
+				      <property name="visible">True</property>
+				      <property name="sensitive">False</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+
+				      <child>
+					<widget class="GtkAlignment" id="alignment11">
+					  <property name="visible">True</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xscale">0</property>
+					  <property name="yscale">0</property>
+					  <property name="top_padding">0</property>
+					  <property name="bottom_padding">0</property>
+					  <property name="left_padding">0</property>
+					  <property name="right_padding">0</property>
+
+					  <child>
+					    <widget class="GtkHBox" id="hbox33">
+					      <property name="visible">True</property>
+					      <property name="homogeneous">False</property>
+					      <property name="spacing">2</property>
+
+					      <child>
+						<widget class="GtkImage" id="image4">
+						  <property name="visible">True</property>
+						  <property name="stock">gtk-properties</property>
+						  <property name="icon_size">4</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+
+					      <child>
+						<widget class="GtkLabel" id="label65">
+						  <property name="visible">True</property>
+						  <property name="label" translatable="yes">_Edit</property>
+						  <property name="use_underline">True</property>
+						  <property name="use_markup">False</property>
+						  <property name="justify">GTK_JUSTIFY_LEFT</property>
+						  <property name="wrap">False</property>
+						  <property name="selectable">False</property>
+						  <property name="xalign">0.5</property>
+						  <property name="yalign">0.5</property>
+						  <property name="xpad">0</property>
+						  <property name="ypad">0</property>
+						</widget>
+						<packing>
+						  <property name="padding">0</property>
+						  <property name="expand">False</property>
+						  <property name="fill">False</property>
+						</packing>
+					      </child>
+					    </widget>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_remove">
+				      <property name="visible">True</property>
+				      <property name="sensitive">False</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label">gtk-remove</property>
+				      <property name="use_stock">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				  </child>
+
+				  <child>
+				    <widget class="GtkButton" id="pub_url_enable">
+				      <property name="visible">True</property>
+				      <property name="can_default">True</property>
+				      <property name="can_focus">True</property>
+				      <property name="label" translatable="yes">E_nable</property>
+				      <property name="use_underline">True</property>
+				      <property name="relief">GTK_RELIEF_NORMAL</property>
+				      <property name="focus_on_click">True</property>
+				    </widget>
+				  </child>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkVButtonBox" id="vbuttonbox6">
+				  <property name="visible">True</property>
+				  <property name="layout_style">GTK_BUTTONBOX_START</property>
+				  <property name="spacing">3</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkLabel" id="label66">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes"></property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label67">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Publishing&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkFrame" id="frame4">
+		  <property name="visible">True</property>
+		  <property name="label_xalign">0</property>
+		  <property name="label_yalign">0.5</property>
+		  <property name="shadow_type">GTK_SHADOW_NONE</property>
+
+		  <child>
+		    <widget class="GtkAlignment" id="alignment12">
+		      <property name="visible">True</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xscale">1</property>
+		      <property name="yscale">1</property>
+		      <property name="top_padding">12</property>
+		      <property name="bottom_padding">0</property>
+		      <property name="left_padding">12</property>
+		      <property name="right_padding">0</property>
+
+		      <child>
+			<widget class="GtkVBox" id="vbox21">
+			  <property name="visible">True</property>
+			  <property name="homogeneous">False</property>
+			  <property name="spacing">6</property>
+
+			  <child>
+			    <widget class="GtkHBox" id="hbox34">
+			      <property name="visible">True</property>
+			      <property name="homogeneous">False</property>
+			      <property name="spacing">12</property>
+
+			      <child>
+				<widget class="GtkLabel" id="label68">
+				  <property name="visible">True</property>
+				  <property name="label" translatable="yes">Template:</property>
+				  <property name="use_underline">False</property>
+				  <property name="use_markup">False</property>
+				  <property name="justify">GTK_JUSTIFY_LEFT</property>
+				  <property name="wrap">False</property>
+				  <property name="selectable">False</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xpad">0</property>
+				  <property name="ypad">0</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">False</property>
+				  <property name="fill">False</property>
+				</packing>
+			      </child>
+
+			      <child>
+				<widget class="GtkEntry" id="pub_template_url">
+				  <property name="visible">True</property>
+				  <property name="can_focus">True</property>
+				  <property name="editable">True</property>
+				  <property name="visibility">True</property>
+				  <property name="max_length">0</property>
+				  <property name="text" translatable="yes"></property>
+				  <property name="has_frame">True</property>
+				  <property name="invisible_char" translatable="yes">*</property>
+				  <property name="activates_default">False</property>
+				</widget>
+				<packing>
+				  <property name="padding">0</property>
+				  <property name="expand">True</property>
+				  <property name="fill">True</property>
+				</packing>
+			      </child>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+
+			  <child>
+			    <widget class="GtkLabel" id="label69">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">&lt;i&gt;%u and %d will be replaced by user and domain from the email address.&lt;/i&gt;</property>
+			      <property name="use_underline">False</property>
+			      <property name="use_markup">True</property>
+			      <property name="justify">GTK_JUSTIFY_LEFT</property>
+			      <property name="wrap">True</property>
+			      <property name="selectable">False</property>
+			      <property name="xalign">0.49</property>
+			      <property name="yalign">0.5</property>
+			      <property name="xpad">0</property>
+			      <property name="ypad">0</property>
+			    </widget>
+			    <packing>
+			      <property name="padding">0</property>
+			      <property name="expand">False</property>
+			      <property name="fill">False</property>
+			    </packing>
+			  </child>
+			</widget>
+		      </child>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label70">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Default Server&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		    <packing>
+		      <property name="type">label_item</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="tab_expand">False</property>
+	      <property name="tab_fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label63">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">Online Publishing</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">False</property>
+	      <property name="justify">GTK_JUSTIFY_CENTER</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="type">tab</property>
+	    </packing>
+	  </child>
 	</widget>
 	<packing>
 	  <property name="padding">0</property>
Index: calendar/gui/dialogs/cal-prefs-dialog.h
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/cal-prefs-dialog.h,v
retrieving revision 1.11
diff -u -u -r1.11 cal-prefs-dialog.h
--- calendar/gui/dialogs/cal-prefs-dialog.h	18 Dec 2004 13:01:17 -0000	1.11
+++ calendar/gui/dialogs/cal-prefs-dialog.h	24 Mar 2005 20:54:57 -0000
@@ -42,7 +42,7 @@
 enum {
 	URL_LIST_ENABLED_COLUMN,
 	URL_LIST_LOCATION_COLUMN,
-	URL_LIST_FREE_BUSY_URL_COLUMN,
+	URL_LIST_URL_COLUMN,
 	URL_LIST_N_COLUMNS
 };
 
@@ -82,11 +82,20 @@
 	GtkTreeView *url_list;
 	gboolean url_editor;
 	GtkWidget* url_editor_dlg;
-	guint destroyed : 1;
 
 	/* widgets for the Free/Busy template */
 	GtkWidget *template_url;
-		
+
+	/* Widgets for the Online Publishing options */
+	GtkWidget *pub_url_add;
+	GtkWidget *pub_url_edit;
+	GtkWidget *pub_url_remove;
+	GtkWidget *pub_url_enable;
+	GtkTreeView *pub_url_list;
+	gboolean publish_editor;
+	GtkWidget* publish_editor_dlg;
+	GtkWidget *pub_template_url;
+	
 	/* Other page options */
 	GtkWidget *confirm_delete;
 	GtkWidget *default_reminder;
Index: calendar/gui/dialogs/url-editor-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/calendar/gui/dialogs/url-editor-dialog.c,v
retrieving revision 1.7
diff -u -u -r1.7 url-editor-dialog.c
--- calendar/gui/dialogs/url-editor-dialog.c	23 Feb 2005 18:56:57 -0000	1.7
+++ calendar/gui/dialogs/url-editor-dialog.c	24 Mar 2005 20:54:57 -0000
@@ -66,6 +66,7 @@
 url_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
 {
 	int b;
+	char *password;
 
 	UrlDialogData *url_dlg_data = g_new0 (UrlDialogData, 1);
 	url_dlg_data->xml = glade_xml_new (EVOLUTION_GLADEDIR "/url-editor-dialog.glade", NULL, NULL);
@@ -95,17 +96,19 @@
 		}
 	}
 	
-	uri->password = e_passwords_get_password ("Calendar", url_dlg_data->url_data->location);
+	password = e_passwords_get_password ("Calendar", url_dlg_data->url_data->location);
 	
-	if (uri->password) {
-		if (strlen(uri->password) != 0) {
+	if (password) {
+		if (strlen(password) != 0) {
 			gtk_entry_set_text (url_dlg_data->password_entry, 
-					    uri->password);
+					    password);
 
 			e_dialog_toggle_set (url_dlg_data->remember_pw, TRUE);
 		} else {
 			e_dialog_toggle_set (url_dlg_data->remember_pw, FALSE);
 		}
+		g_free(password);
+		password = NULL;
 	}
 	
 	switch (uri->publish_freq) {
@@ -136,9 +139,9 @@
 		if ((GtkEntry *) url_dlg_data->url_entry) {
 			url_editor_dialog_fb_url_activated (url_dlg_data->url_entry, url_dlg_data);
 			url_dlg_data->url_data->username = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->username_entry));
-			url_dlg_data->url_data->password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
+			password = g_strdup (gtk_entry_get_text ((GtkEntry *) url_dlg_data->password_entry));
 			if (e_dialog_toggle_get (url_dlg_data->remember_pw)) {
-				e_passwords_add_password (url_dlg_data->url_data->location, url_dlg_data->url_data->password);
+				e_passwords_add_password (url_dlg_data->url_data->location, password);
 				e_passwords_remember_password ("Calendar", url_dlg_data->url_data->location);				
 			} else {
 				e_passwords_forget_password ("Calendar", url_dlg_data->url_data->location);
@@ -306,11 +309,10 @@
 				      void *data)
 {
 	UrlDialogData *url_dlg_data  = (UrlDialogData *) data;
-	enum publish_frequency frequency;
 	
-	frequency = e_dialog_radio_get (url_dlg_data->daily, 
+	url_dlg_data->url_data->publish_freq = 
+		e_dialog_radio_get (url_dlg_data->daily, 
 					pub_frequency_type_map);
-	url_dlg_data->url_data->publish_freq = frequency;
 	gtk_widget_set_sensitive ((GtkWidget *) url_dlg_data->ok, TRUE);
 }
 
Index: ui/evolution-calendar.xml
===================================================================
RCS file: /cvs/gnome/evolution/ui/evolution-calendar.xml,v
retrieving revision 1.69
diff -u -u -r1.69 evolution-calendar.xml
--- ui/evolution-calendar.xml	16 Dec 2004 18:26:54 -0000	1.69
+++ ui/evolution-calendar.xml	24 Mar 2005 20:54:57 -0000
@@ -24,6 +24,7 @@
     <cmd name="DeleteOccurrence" _tip="Delete this occurrence" pixtype="stock" pixname="gtk-delete"/>
     <cmd name="DeleteAllOccurrences" _tip="Delete All Occurrences" pixtype="stock" pixname="gtk-delete"/>
 
+    <cmd name="Publish" _tip="Publish this calendar to a remote server"/>
     <cmd name="PublishFreeBusy" _tip="Publish Free/Busy information for this calendar"/>
     <cmd name="CalendarPurge" _label="Purg_e" _tip="Purge old appointments and meetings" accel="*Control*e"/>
   </commands>
@@ -70,6 +71,7 @@
     <submenu name="Actions" _label="_Actions">
       <placeholder name="ComponentActionsPlaceholder">
         <separator/>
+        <menuitem name="Publish" verb="" _label="Publish this calendar to a remote server"/>
 	<menuitem name="PublishFreeBusy" verb="" _label="_Publish Free/Busy Information"/>
 	<menuitem name="CalendarPurge" verb=""/>
       </placeholder>
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.h	2005-03-24 14:52:34.828539816 +0000
@@ -0,0 +1,47 @@
+/*
+ * PublishDialog - a GObject that handles a libglade-loaded dialog to
+ * edit the online publishing settings of calendars.
+ */
+
+#ifndef _PUBLISH_EDITOR_DIALOG_H_
+#define _PUBLISH_EDITOR_DIALOG_H_
+
+G_BEGIN_DECLS
+
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+
+#include "cal-prefs-dialog.h"
+#include <libedataserverui/e-source-selector.h>
+
+struct _PublishEditorDialogData {
+	GladeXML *xml;
+	DialogData *url_dialog;
+	GtkWidget *publish_editor;
+
+	GtkEntry *url_entry;
+	GtkWidget *auto_publish;
+	GtkWidget *alarm_publish;
+	GtkWidget *scheme_combo;
+	
+	GtkWidget *calendar_list_label;
+	GtkWidget *scrolled_window;
+	GtkWidget *scrolled_window_todo;
+	
+	GtkEntry *username_entry;
+	GtkEntry *password_entry;
+	GtkWidget *no_pw;
+	GtkWidget *remember_pw;
+	
+	GtkWidget *cancel;
+	GtkWidget *ok;
+	EPublishUri *url_data;
+};
+typedef struct _PublishEditorDialogData PublishEditorDialogData;
+
+gboolean			
+publish_editor_dialog_new (DialogData *dialog_data, EPublishUri *pub_uri);
+
+G_END_DECLS
+
+#endif /* _PUBLISH_EDITOR_DIALOG_H_ */
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.c	2005-03-24 20:05:20.756685104 +0000
@@ -0,0 +1,472 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "cal-prefs-dialog.h"
+#include "publish-editor-dialog.h"
+
+#include <libedataserverui/e-passwords.h>
+#include <gtk/gtk.h>
+#include <gtk/gtksignal.h>
+#include <gtk/gtkoptionmenu.h>
+#include <gtk/gtktogglebutton.h>
+#include <libgnomeui/gnome-color-picker.h>
+#include <libgnomevfs/gnome-vfs.h>
+#include <glade/glade.h>
+#include <e-util/e-dialog-widgets.h>
+#include <e-util/e-icon-factory.h>
+#include <widgets/misc/e-dateedit.h>
+#include <stdlib.h>
+#include <string.h>
+
+enum scheme {
+	LOCAL, HTTP, HTTPS, FTP, SSH
+};
+
+static gboolean get_widgets (PublishEditorDialogData *);
+static void init_widgets (PublishEditorDialogData *);
+
+static void scheme_combo_changed (GtkComboBox *, gpointer);
+static void url_changed (GtkEntry *, gpointer);
+static void url_activated (GtkEntry *, gpointer);
+static void ok_enable (GtkWidget *, gpointer);
+static void auto_toggled(GtkWidget *, gpointer);
+static void alarm_toggled(GtkWidget *, gpointer);
+static void no_pw_toggled(GtkWidget *, gpointer);
+static void selection_changed_callback (ESourceSelector *, gpointer); 
+static void selection_todo_changed_callback (ESourceSelector *, gpointer);
+
+/**
+ * publish_editor_dialog_new:
+ **/
+gboolean
+publish_editor_dialog_new (DialogData *dialog_data, EPublishUri *uri)
+{
+	int b;
+	gboolean remember_pw = uri->remember_pw;
+	char *password;
+
+	PublishEditorDialogData self;
+	self.xml = glade_xml_new(EVOLUTION_GLADEDIR "/publish-editor-dialog.glade", NULL, NULL);
+	if (!self.xml) {
+		g_message("publish_editor_dialog_new(): Could not load the .glade file!");
+		return FALSE;
+	}
+
+	if (!get_widgets(&self)) {
+		g_message ("publish_editor_dialog_new(): Could not find all the widgets in the .glade file!");
+		return FALSE;
+	}
+	
+	self.url_dialog = dialog_data;
+	self.url_data = uri;
+	
+	if (self.url_data->type != PUB_ONLINE)
+		self.url_data->type = PUB_ONLINE;
+	
+	init_widgets(&self);
+
+	/* check whether the URL is local or remote
+	 * then update the combobox, which should update
+	 * the url_entry and show/hide the authentication box */
+	if (self.url_data->location) {
+		GnomeVFSURI *uri = gnome_vfs_uri_new(self.url_data->location);
+
+		if(uri == NULL) {
+			g_message ("publish_editor_dialog_new(): "
+			"Malformed URI: %s", self.url_data->location);
+			goto next;
+		}
+
+		if(gnome_vfs_uri_is_local(uri)) {
+			gtk_combo_box_set_active(GTK_COMBO_BOX(self.scheme_combo),
+					LOCAL);
+		} else {
+			const char *scheme_str = gnome_vfs_uri_get_scheme(uri);
+			if(strncasecmp(scheme_str, "http", 4) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					HTTP);
+			else if(strncasecmp(scheme_str, "https", 5) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					HTTPS);
+			else if(strncasecmp(scheme_str, "ftp", 3) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					FTP);
+			else if(strncasecmp(scheme_str, "sftp", 4) == 0)
+				gtk_combo_box_set_active(
+					GTK_COMBO_BOX(self.scheme_combo),
+					SSH);
+
+			if (self.url_data->username &&
+					(strlen(self.url_data->username) != 0)){
+				gtk_entry_set_text(self.username_entry, 
+					    self.url_data->username);
+			}
+			/* passwords make sense only for a remote URL
+			 * and only if no_pw was not set 
+			 */
+			if (!self.url_data->no_pw) {
+				password = 
+					e_passwords_get_password ("Calendar",
+							self.url_data->location);
+				if (password && (strlen(password) != 0)) {
+					gtk_entry_set_text(self.password_entry, password);
+					e_dialog_toggle_set(self.remember_pw,
+							self.url_data->remember_pw);
+					e_dialog_toggle_set(self.no_pw, FALSE);
+				} else {
+					e_dialog_toggle_set(self.remember_pw, FALSE);
+					e_dialog_toggle_set(self.no_pw, TRUE);
+				}
+				if(password)
+					g_free(password);
+			}
+		}
+
+		if (strlen(self.url_data->location) != 0) {
+			gtk_entry_set_text (self.url_entry, 
+					    self.url_data->location);
+		}
+
+		gnome_vfs_uri_unref(uri);
+	}
+next:
+	dialog_data->publish_editor = TRUE; 
+	dialog_data->publish_editor_dlg = (GtkWidget *) &self;
+	gtk_widget_set_sensitive ((GtkWidget *) self.ok, FALSE);
+	
+	b = gtk_dialog_run ((GtkDialog *) self.publish_editor);
+	
+	if (b == GTK_RESPONSE_OK) {
+		if ((GtkEntry *) self.url_entry) {
+			url_activated(self.url_entry, &self);
+			self.url_data->username = g_strdup(gtk_entry_get_text(
+					(GtkEntry *) self.username_entry));
+			if((self.url_data->no_pw =
+					e_dialog_toggle_get(self.no_pw)))
+				;
+			else {
+				password = gtk_entry_get_text(GTK_ENTRY(self.password_entry));
+				if(password && (strlen(password) > 0)){
+					e_passwords_add_password(self.url_data->location, password);
+					if (e_dialog_toggle_get(self.remember_pw))
+						e_passwords_remember_password ("Calendar", self.url_data->location);
+				}
+				if (remember_pw ==TRUE && self.url_data->remember_pw == FALSE)
+					e_passwords_forget_password ("Calendar", self.url_data->location);
+			}
+			self.url_data->auto_publish =
+				e_dialog_toggle_get(self.auto_publish);
+			self.url_data->alarm_publish =
+				e_dialog_toggle_get(self.alarm_publish);
+		}
+	}
+	
+	gtk_widget_destroy (self.publish_editor);
+	g_object_unref (self.xml);
+	return FALSE;
+}
+
+static gboolean
+get_widgets (PublishEditorDialogData *data)
+{
+#define GW(name) glade_xml_get_widget (data->xml, name)
+
+	data->publish_editor = GW ("publish_editor");
+	data->url_entry = GTK_ENTRY (GW ("url_entry_local"));
+	data->auto_publish = GW ("auto_publish");
+	data->alarm_publish = GW ("alarm_publish");
+	data->scheme_combo = GW ("scheme_combo");
+	data->calendar_list_label = GW ("calendar_list_label");
+	data->scrolled_window =  GW ("scrolled_window");
+	data->scrolled_window_todo =  GW ("scrolled_window_todo");
+	data->username_entry = GTK_ENTRY (GW ("username_entry"));
+	data->password_entry = GTK_ENTRY (GW ("password_entry"));
+	data->no_pw = GW ("no_pw");
+	data->remember_pw = GW ("remember_pw");
+	data->cancel = GW ("cancel");
+	data->ok = GW ("ok");
+
+#undef GW
+
+	return (data ->publish_editor
+		&& data->url_entry
+		&& data->auto_publish
+		&& data->alarm_publish
+		&& data->scheme_combo
+		&& data->calendar_list_label
+		&& data->scrolled_window
+		&& data->scrolled_window_todo
+		&& data->username_entry
+		&& data->password_entry
+		&& data->no_pw
+		&& data->remember_pw
+		&& data->cancel
+		&& data->ok);
+}
+
+static void
+selection_changed_callback (ESourceSelector *selector,
+			    gpointer data)
+{
+	PublishEditorDialogData *self  = (PublishEditorDialogData *) data;
+	GSList *selection = e_source_selector_get_selection (selector);
+	
+	if (selection != NULL) {
+		GSList *p, *l =  NULL;
+		
+		for (p = selection; p != NULL; p = p->next) {
+			ESource *source = E_SOURCE(p->data);
+			gchar* source_uid = g_strdup(e_source_peek_uid(source));
+			
+			l = g_slist_append(l, source_uid);
+		}
+		self->url_data->calendars = l;
+	}
+	
+	e_source_selector_free_selection(selection);
+	gtk_widget_set_sensitive ((GtkWidget *) self->ok, TRUE);
+}
+
+static void
+selection_todo_changed_callback (ESourceSelector *selector,
+			    gpointer data)
+{
+	PublishEditorDialogData *self  = (PublishEditorDialogData *) data;
+	GSList *selection = e_source_selector_get_selection (selector);
+	
+	if (selection != NULL) {
+		GSList *p, *l =  NULL;
+		
+		for (p = selection; p != NULL; p = p->next) {
+			ESource *source = E_SOURCE(p->data);
+			gchar* source_uid = g_strdup(e_source_peek_uid(source));
+			
+			l = g_slist_append(l, source_uid);
+		}
+		self->url_data->tasks = l;
+	}
+	
+	e_source_selector_free_selection(selection);
+	gtk_widget_set_sensitive ((GtkWidget *) self->ok, TRUE);
+}
+
+/* Connects any necessary signal handlers. */
+static void
+init_widgets (PublishEditorDialogData *self)
+{
+	ESourceList *source_list = e_source_list_new_for_gconf_default(
+			"/apps/evolution/calendar/sources");
+	ESourceList *source_list_todo = e_source_list_new_for_gconf_default(
+			"/apps/evolution/tasks/sources");
+	GtkWidget *selector = e_source_selector_new (source_list);
+	GtkWidget *selector_todo = e_source_selector_new (source_list_todo);
+	GList *icon_list;
+	
+	gtk_widget_ensure_style(self->publish_editor);
+	gtk_container_set_border_width(GTK_CONTAINER(
+			GTK_DIALOG(self->publish_editor)->vbox), 0);
+	gtk_container_set_border_width(GTK_CONTAINER(
+			GTK_DIALOG(self->publish_editor)->action_area), 12);
+	g_object_set(G_OBJECT(glade_xml_get_widget(self->xml, "gnome_entry")),
+			"filechooser-action", GTK_FILE_CHOOSER_ACTION_SAVE, NULL, NULL);
+	g_signal_connect(self->scheme_combo, "changed",
+			G_CALLBACK(scheme_combo_changed), self);
+	g_signal_connect (glade_xml_get_widget(self->xml, "url_entry_local"), "changed", 
+			  G_CALLBACK(url_changed), self);
+	g_signal_connect (glade_xml_get_widget(self->xml, "url_entry_remote"), "changed", 
+			  G_CALLBACK(url_changed), self);
+	g_signal_connect (self->username_entry, "changed", 
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->password_entry, "changed", 
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->remember_pw, "toggled",
+			  G_CALLBACK (ok_enable), self);
+	g_signal_connect (self->url_entry, "activate",
+			  G_CALLBACK (url_activated), self);
+	g_signal_connect (self->auto_publish, "toggled",
+			  G_CALLBACK (auto_toggled), self);
+	g_signal_connect (self->alarm_publish, "toggled",
+			  G_CALLBACK (alarm_toggled), self);
+	g_signal_connect (self->no_pw, "toggled",
+			  G_CALLBACK (no_pw_toggled), self);
+
+	gtk_combo_box_set_active(GTK_COMBO_BOX(self->scheme_combo), HTTP);
+
+	if (self->url_data->calendars) {
+		ESource *source;
+		GSList *p;
+
+		for(p = self->url_data->calendars; p != NULL; p = p->next) {
+#warning FIX this extra allocation
+			gchar *source_uid  = g_strdup (p->data);
+			source =  e_source_list_peek_source_by_uid(source_list,
+					source_uid);			
+			e_source_selector_select_source(
+					(ESourceSelector *)selector, source);
+			g_free (source_uid);
+		}
+	}
+
+	if (self->url_data->tasks) {
+		ESource *source;
+		GSList *p;
+
+		for(p = self->url_data->tasks; p != NULL; p = p->next) {
+#warning FIX this extra allocation
+			gchar *source_uid  = g_strdup (p->data);
+			source =  e_source_list_peek_source_by_uid(source_list_todo,
+					source_uid);			
+			e_source_selector_select_source(
+					(ESourceSelector *)selector_todo, source);
+			g_free (source_uid);
+		}
+	}
+
+	e_source_selector_show_selection ((ESourceSelector *) selector, TRUE);
+	g_signal_connect (selector, "selection_changed", 
+			  G_CALLBACK (selection_changed_callback), self);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL(self->calendar_list_label),
+				       selector);
+	gtk_widget_show (selector);
+	gtk_container_add (GTK_CONTAINER(self->scrolled_window), 
+			   selector);
+
+	e_source_selector_show_selection ((ESourceSelector *) selector_todo, TRUE);
+	g_signal_connect (selector_todo, "selection_changed", 
+			  G_CALLBACK (selection_todo_changed_callback), self);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL(self->calendar_list_label),
+				       selector_todo);
+	gtk_widget_show (selector_todo);
+	gtk_container_add (GTK_CONTAINER(self->scrolled_window_todo), 
+			   selector_todo);
+
+	icon_list = e_icon_factory_get_icon_list ("stock_calendar");
+	if (icon_list) {
+		gtk_window_set_icon_list (GTK_WINDOW(self->publish_editor), icon_list);
+		g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
+		g_list_free (icon_list);
+	}
+	gtk_widget_show (self->scrolled_window);
+	gtk_widget_show (self->scrolled_window_todo);
+}
+
+static void scheme_combo_changed (GtkComboBox *box, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	enum scheme i = gtk_combo_box_get_active(box);
+	GtkWidget *auth_box = glade_xml_get_widget(self->xml, "auth_box");
+	GtkWidget *gnome_entry = glade_xml_get_widget(self->xml, "gnome_entry");
+	GtkEntry *url_entry_remote = GTK_ENTRY(glade_xml_get_widget(self->xml, "url_entry_remote"));
+	switch(i) {
+		case LOCAL:
+			if(GTK_WIDGET_VISIBLE(GTK_WIDGET(url_entry_remote)))
+				gtk_widget_hide(GTK_WIDGET(url_entry_remote));
+			if(!GTK_WIDGET_VISIBLE(gnome_entry))
+				gtk_widget_show(gnome_entry);
+			if(GTK_WIDGET_VISIBLE(auth_box))
+				gtk_widget_hide(auth_box);
+			self->url_entry = GTK_ENTRY(glade_xml_get_widget(
+					self->xml, "url_entry_local"));
+			e_dialog_toggle_set(self->no_pw, TRUE);
+			return;
+			break;
+		case HTTP:
+			gtk_entry_set_text(url_entry_remote, "http://";);
+			break;
+		case HTTPS:
+			gtk_entry_set_text(url_entry_remote, "https://";);
+			break;
+		case FTP:
+			gtk_entry_set_text(url_entry_remote, "ftp://";);
+			break;
+		case SSH:
+			gtk_entry_set_text(url_entry_remote, "sftp://";);
+			e_dialog_toggle_set(self->no_pw, TRUE);
+			break;
+	}
+	if(GTK_WIDGET_VISIBLE(gnome_entry))
+		gtk_widget_hide(gnome_entry);
+	if(!GTK_WIDGET_VISIBLE(GTK_WIDGET(url_entry_remote)))
+		gtk_widget_show(GTK_WIDGET(url_entry_remote));
+	if(!GTK_WIDGET_VISIBLE(auth_box))
+		gtk_widget_show(auth_box);
+	self->url_entry = url_entry_remote;
+}
+static void
+url_activated (GtkEntry *url_entry, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	
+	self->url_data->location = g_strdup (gtk_entry_get_text ((GtkEntry *) url_entry));
+}
+
+static void
+url_changed (GtkEntry *url_entry, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	
+	const gchar *entry_contents;
+	GtkListStore *model;
+	GtkTreeIter iter;
+	gboolean valid;
+
+	model = (GtkListStore *) gtk_tree_view_get_model (self->url_dialog->url_list);
+	
+	entry_contents = gtk_entry_get_text ((GtkEntry *) url_entry);
+	/* duplicate check */
+	valid = gtk_tree_model_get_iter_first ((GtkTreeModel *) model, &iter);
+	while (valid) {
+		gchar *url_name;
+		gtk_tree_model_get ((GtkTreeModel *) model, &iter, 
+				    URL_LIST_LOCATION_COLUMN, &url_name, 
+				    -1);
+
+		if (!strcasecmp (url_name, entry_contents)) {
+			gtk_widget_set_sensitive ((GtkWidget *) self->ok, FALSE);
+			return;
+		}
+		valid = gtk_tree_model_iter_next ((GtkTreeModel *) model, &iter);
+	}
+	/* valid and unique */
+	gtk_widget_set_sensitive (GTK_WIDGET (self->ok), TRUE);
+	gtk_widget_grab_default (GTK_WIDGET (self->ok));
+	gtk_entry_set_activates_default ((GtkEntry*) self->url_entry, TRUE);
+}
+
+static void ok_enable (GtkWidget *widget, gpointer data) {
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);
+}
+
+/* ToggleButtons callbacks, can do better than repeating the same function 
+ * 5 times, no? Later
+ */
+static void auto_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->auto_publish = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
+
+static void alarm_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->alarm_publish = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
+
+static void no_pw_toggled(GtkWidget *button, gpointer data)
+{
+	PublishEditorDialogData *self = (PublishEditorDialogData *) data;
+	self->url_data->no_pw = e_dialog_toggle_get (button);
+	gtk_widget_set_sensitive(GTK_WIDGET(self->password_entry), !self->url_data->no_pw);
+	gtk_widget_set_sensitive(self->remember_pw , !self->url_data->no_pw);
+	gtk_widget_set_sensitive (GTK_WIDGET(self->ok), TRUE);	
+}
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ calendar/gui/dialogs/publish-editor-dialog.glade	2005-03-24 15:33:56.320295728 +0000
@@ -0,0 +1,694 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
+
+<glade-interface>
+<requires lib="gnome"/>
+
+<widget class="GtkDialog" id="publish_editor">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Online Publishing Settings</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+  <property name="modal">False</property>
+  <property name="default_width">380</property>
+  <property name="default_height">508</property>
+  <property name="resizable">True</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="has_separator">False</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="publish">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="hbuttonbox1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="has_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="ok">
+	      <property name="visible">True</property>
+	      <property name="sensitive">False</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox2">
+	  <property name="border_width">12</property>
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">12</property>
+
+	  <child>
+	    <widget class="GtkLabel" id="calendar_list_label">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Calendars to publish:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox3">
+	      <property name="height_request">100</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label6">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolled_window">
+		  <property name="height_request">150</property>
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label17">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Task lists to publish:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox10">
+	      <property name="height_request">90</property>
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label16">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkScrolledWindow" id="scrolled_window_todo">
+		  <property name="height_request">150</property>
+		  <property name="visible">True</property>
+		  <property name="can_focus">True</property>
+		  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+		  <property name="shadow_type">GTK_SHADOW_IN</property>
+		  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+		  <child>
+		    <placeholder/>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox2">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label4">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes"></property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkVBox" id="vbox3">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">6</property>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto_publish">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="label" translatable="yes">Automatically publish changes</property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">True</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkHBox" id="hbox8">
+		      <property name="visible">True</property>
+		      <property name="homogeneous">False</property>
+		      <property name="spacing">0</property>
+
+		      <child>
+			<widget class="GtkCheckButton" id="alarm_publish">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">Publish calendar alarms</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="padding">0</property>
+			  <property name="expand">False</property>
+			  <property name="fill">True</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox9">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">12</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label15">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">Publish my calendar with</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">False</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkComboBox" id="scheme_combo">
+		  <property name="visible">True</property>
+		  <property name="items" translatable="yes">local
+http
+https
+ftp
+ssh</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkLabel" id="label5">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">&lt;b&gt;Publishing URL:&lt;/b&gt;</property>
+	      <property name="use_underline">True</property>
+	      <property name="use_markup">True</property>
+	      <property name="justify">GTK_JUSTIFY_LEFT</property>
+	      <property name="wrap">False</property>
+	      <property name="selectable">False</property>
+	      <property name="xalign">0</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xpad">0</property>
+	      <property name="ypad">0</property>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="vbox4">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkEntry" id="url_entry_remote">
+		  <property name="can_focus">True</property>
+		  <property name="editable">True</property>
+		  <property name="visibility">True</property>
+		  <property name="max_length">0</property>
+		  <property name="text" translatable="yes"></property>
+		  <property name="has_frame">True</property>
+		  <property name="invisible_char" translatable="yes">*</property>
+		  <property name="activates_default">False</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GnomeFileEntry" id="gnome_entry">
+		  <property name="visible">True</property>
+		  <property name="history_id">publish_editor_dialog</property>
+		  <property name="max_saved">10</property>
+		  <property name="browse_dialog_title" translatable="yes">Choose a file to publish to</property>
+		  <property name="directory_entry">False</property>
+		  <property name="modal">True</property>
+		  <property name="use_filechooser">True</property>
+
+		  <child internal-child="entry">
+		    <widget class="GtkEntry" id="url_entry_local">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="editable">True</property>
+		      <property name="visibility">True</property>
+		      <property name="max_length">0</property>
+		      <property name="text" translatable="yes"></property>
+		      <property name="has_frame">True</property>
+		      <property name="invisible_char" translatable="yes">*</property>
+		      <property name="activates_default">False</property>
+		    </widget>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkVBox" id="auth_box">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label7">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Authentication:&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<widget class="GtkHBox" id="hbox4">
+		  <property name="visible">True</property>
+		  <property name="homogeneous">False</property>
+		  <property name="spacing">12</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label8">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">False</property>
+		      <property name="fill">False</property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkTable" id="table1">
+		      <property name="visible">True</property>
+		      <property name="n_rows">3</property>
+		      <property name="n_columns">2</property>
+		      <property name="homogeneous">False</property>
+		      <property name="row_spacing">6</property>
+		      <property name="column_spacing">12</property>
+
+		      <child>
+			<widget class="GtkLabel" id="label9">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Username:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">username_entry</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkLabel" id="label10">
+			  <property name="visible">True</property>
+			  <property name="label" translatable="yes">_Password:</property>
+			  <property name="use_underline">True</property>
+			  <property name="use_markup">False</property>
+			  <property name="justify">GTK_JUSTIFY_LEFT</property>
+			  <property name="wrap">False</property>
+			  <property name="selectable">False</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			  <property name="mnemonic_widget">password_entry</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="x_options">fill</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkEntry" id="username_entry">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="visibility">True</property>
+			  <property name="max_length">0</property>
+			  <property name="text" translatable="yes"></property>
+			  <property name="has_frame">True</property>
+			  <property name="invisible_char" translatable="yes">*</property>
+			  <property name="activates_default">False</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">0</property>
+			  <property name="bottom_attach">1</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkEntry" id="password_entry">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="editable">True</property>
+			  <property name="visibility">False</property>
+			  <property name="max_length">0</property>
+			  <property name="text" translatable="yes"></property>
+			  <property name="has_frame">True</property>
+			  <property name="invisible_char" translatable="yes">*</property>
+			  <property name="activates_default">False</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">1</property>
+			  <property name="bottom_attach">2</property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="remember_pw">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">_Remember password</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">1</property>
+			  <property name="right_attach">2</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_options"></property>
+			  <property name="y_options"></property>
+			</packing>
+		      </child>
+
+		      <child>
+			<widget class="GtkCheckButton" id="no_pw">
+			  <property name="visible">True</property>
+			  <property name="can_focus">True</property>
+			  <property name="label" translatable="yes">No password</property>
+			  <property name="use_underline">True</property>
+			  <property name="relief">GTK_RELIEF_NORMAL</property>
+			  <property name="focus_on_click">True</property>
+			  <property name="active">False</property>
+			  <property name="inconsistent">False</property>
+			  <property name="draw_indicator">True</property>
+			</widget>
+			<packing>
+			  <property name="left_attach">0</property>
+			  <property name="right_attach">1</property>
+			  <property name="top_attach">2</property>
+			  <property name="bottom_attach">3</property>
+			  <property name="x_padding">2</property>
+			  <property name="x_options"></property>
+			  <property name="y_options">fill</property>
+			</packing>
+		      </child>
+		    </widget>
+		    <packing>
+		      <property name="padding">0</property>
+		      <property name="expand">True</property>
+		      <property name="fill">True</property>
+		    </packing>
+		  </child>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">True</property>
+		  <property name="fill">True</property>
+		</packing>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>

Attachment: signature.asc
Description: Ceci est une partie de message =?ISO-8859-1?Q?num=E9riquement?= =?ISO-8859-1?Q?_sign=E9e?=



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