evolution r35746 - in branches/kill-bonobo: art calendar/gui calendar/gui/dialogs data/icons mail ui



Author: mbarnes
Date: Tue Jul 15 18:34:59 2008
New Revision: 35746
URL: http://svn.gnome.org/viewvc/evolution?rev=35746&view=rev

Log:
Migrate CompEditor, CompEditorPage, and the various subclasses from
BonoboUI to GtkUIManager.  See bug #542125.


Modified:
   branches/kill-bonobo/art/Makefile.am
   branches/kill-bonobo/calendar/gui/calendar-component.c
   branches/kill-bonobo/calendar/gui/comp-editor-factory.c
   branches/kill-bonobo/calendar/gui/dialogs/alarm-dialog.c
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.c
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.h
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor-util.c
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c
   branches/kill-bonobo/calendar/gui/dialogs/comp-editor.h
   branches/kill-bonobo/calendar/gui/dialogs/event-editor.c
   branches/kill-bonobo/calendar/gui/dialogs/event-editor.h
   branches/kill-bonobo/calendar/gui/dialogs/event-page.c
   branches/kill-bonobo/calendar/gui/dialogs/event-page.h
   branches/kill-bonobo/calendar/gui/dialogs/memo-editor.c
   branches/kill-bonobo/calendar/gui/dialogs/memo-editor.h
   branches/kill-bonobo/calendar/gui/dialogs/memo-page.c
   branches/kill-bonobo/calendar/gui/dialogs/memo-page.h
   branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.c
   branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.h
   branches/kill-bonobo/calendar/gui/dialogs/schedule-page.c
   branches/kill-bonobo/calendar/gui/dialogs/schedule-page.h
   branches/kill-bonobo/calendar/gui/dialogs/task-details-page.c
   branches/kill-bonobo/calendar/gui/dialogs/task-details-page.h
   branches/kill-bonobo/calendar/gui/dialogs/task-editor.c
   branches/kill-bonobo/calendar/gui/dialogs/task-editor.h
   branches/kill-bonobo/calendar/gui/dialogs/task-page.c
   branches/kill-bonobo/calendar/gui/dialogs/task-page.h
   branches/kill-bonobo/calendar/gui/e-cal-popup.c
   branches/kill-bonobo/calendar/gui/e-calendar-table.c
   branches/kill-bonobo/calendar/gui/e-calendar-view.c
   branches/kill-bonobo/calendar/gui/e-comp-editor-registry.c
   branches/kill-bonobo/calendar/gui/e-memo-table.c
   branches/kill-bonobo/calendar/gui/e-tasks.c
   branches/kill-bonobo/calendar/gui/gnome-cal.c
   branches/kill-bonobo/calendar/gui/memos-component.c
   branches/kill-bonobo/calendar/gui/tasks-component.c
   branches/kill-bonobo/data/icons/Makefile.am
   branches/kill-bonobo/mail/em-filter-i18n.h
   branches/kill-bonobo/ui/Makefile.am
   branches/kill-bonobo/ui/evolution-editor.xml
   branches/kill-bonobo/ui/evolution-event-editor.xml
   branches/kill-bonobo/ui/evolution-memo-editor.xml
   branches/kill-bonobo/ui/evolution-task-editor.xml

Modified: branches/kill-bonobo/art/Makefile.am
==============================================================================
--- branches/kill-bonobo/art/Makefile.am	(original)
+++ branches/kill-bonobo/art/Makefile.am	Tue Jul 15 18:34:59 2008
@@ -3,7 +3,6 @@
 	offline.png			\
 	online.png			\
 	world_map-960.png		\
-	query-free-busy.png		\
 	plus.png			\
 	minus.png
 

Modified: branches/kill-bonobo/calendar/gui/calendar-component.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/calendar-component.c	(original)
+++ branches/kill-bonobo/calendar/gui/calendar-component.c	Tue Jul 15 18:34:59 2008
@@ -1294,7 +1294,7 @@
 		e_calendar_view_new_appointment_full (view, is_allday, is_meeting, TRUE);
 	} else {
 		ECalComponent *comp;
-		EventEditor *editor;
+		CompEditor *editor;
 		CompEditorFlags flags;
 
 		flags = COMP_EDITOR_USER_ORG | COMP_EDITOR_NEW_ITEM;
@@ -1304,12 +1304,12 @@
 		editor = event_editor_new (ecal, flags);
 		e_cal_component_commit_sequence (comp);
 
-		comp_editor_edit_comp (COMP_EDITOR (editor), comp);
+		comp_editor_edit_comp (editor, comp);
 		if (is_meeting)
-			event_editor_show_meeting (editor);
-		comp_editor_focus (COMP_EDITOR (editor));
+			event_editor_show_meeting (EVENT_EDITOR (editor));
+		gtk_window_present (GTK_WINDOW (editor));
 
-		e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE);
+		e_comp_editor_registry_add (comp_editor_registry, editor, TRUE);
 	}
 
 	return TRUE;

Modified: branches/kill-bonobo/calendar/gui/comp-editor-factory.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/comp-editor-factory.c	(original)
+++ branches/kill-bonobo/calendar/gui/comp-editor-factory.c	Tue Jul 15 18:34:59 2008
@@ -265,7 +265,7 @@
 		if (e_cal_component_has_attendees (comp))
 			flags |= COMP_EDITOR_MEETING;
 
-		editor = COMP_EDITOR (event_editor_new (oc->client, flags));
+		editor = event_editor_new (oc->client, flags);
 		break;
 
 	case E_CAL_COMPONENT_TODO:
@@ -280,7 +280,7 @@
 
 	/* Set the object on the editor */
 	comp_editor_edit_comp (editor, comp);
-	comp_editor_focus (editor);
+	gtk_window_present (GTK_WINDOW (editor));
 	g_object_unref (comp);
 
 	oc->editor_count++;
@@ -308,15 +308,15 @@
 
 	switch (type) {
 	case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_EVENT:
-		editor = COMP_EDITOR (event_editor_new (oc->client, FALSE));
+		editor = event_editor_new (oc->client, FALSE);
 		comp = cal_comp_event_new_with_current_time (oc->client, FALSE);
 		break;
 	case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING:
-		editor = COMP_EDITOR (event_editor_new (oc->client, TRUE));
+		editor = event_editor_new (oc->client, TRUE);
 		comp = cal_comp_event_new_with_current_time (oc->client, FALSE);
 		break;
 	case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_ALLDAY_EVENT:
-		editor = COMP_EDITOR (event_editor_new (oc->client, FALSE));
+		editor = event_editor_new (oc->client, FALSE);
 		comp = cal_comp_event_new_with_current_time (oc->client, TRUE);
 		break;
 	case GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_TODO:
@@ -331,7 +331,7 @@
 	comp_editor_edit_comp (editor, comp);
 	if (type == GNOME_Evolution_Calendar_CompEditorFactory_EDITOR_MODE_MEETING)
 		event_editor_show_meeting (EVENT_EDITOR (editor));
-	comp_editor_focus (editor);
+	gtk_window_present (GTK_WINDOW (editor));
 
 	oc->editor_count++;
 	g_signal_connect (editor, "destroy", G_CALLBACK (editor_destroy_cb), oc);
@@ -566,7 +566,7 @@
 	if (editor == NULL) {
 		edit_existing (oc, uid);
 	} else {
-		comp_editor_focus (editor);
+		gtk_window_present (GTK_WINDOW (editor));
 	}
 }
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/alarm-dialog.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/alarm-dialog.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/alarm-dialog.c	Tue Jul 15 18:34:59 2008
@@ -31,9 +31,6 @@
 #include <string.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-exception.h>
-#include <bonobo/bonobo-widget.h>
 #include <glade/glade.h>
 #include <libedataserver/e-time-utils.h>
 #include "e-util/e-dialog-widgets.h"

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.c	Tue Jul 15 18:34:59 2008
@@ -23,84 +23,111 @@
 #endif
 
 #include <glib/gi18n.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 
-
-
-static void comp_editor_page_class_init (CompEditorPageClass *class);
-static void comp_editor_page_init (CompEditorPage *page);
-static void comp_editor_page_dispose (GObject *object);
-
-static gpointer parent_class;
+#define COMP_EDITOR_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPagePrivate))
+
+struct _CompEditorPagePrivate {
+	CompEditor *editor;  /* not referenced */
+	gboolean updating;
+};
 
-/* Signal IDs */
+enum {
+	PROP_0,
+	PROP_EDITOR,
+	PROP_UPDATING
+};
 
 enum {
-	CHANGED,
-	NEEDS_SEND,
-	SUMMARY_CHANGED,
 	DATES_CHANGED,
-	CLIENT_CHANGED,
-	FOCUS_IN,
-	FOCUS_OUT,
 	LAST_SIGNAL
 };
 
+static gpointer parent_class;
 static guint comp_editor_page_signals[LAST_SIGNAL];
 
-#define CLASS(page) (COMP_EDITOR_PAGE_CLASS (G_OBJECT_GET_CLASS (page)))
+static void
+comp_editor_page_set_property (GObject *object,
+                               guint property_id,
+                               const GValue *value,
+                               GParamSpec *pspec)
+{
+	CompEditorPagePrivate *priv;
+
+	priv = COMP_EDITOR_PAGE_GET_PRIVATE (object);
+
+	switch (property_id) {
+		case PROP_EDITOR:
+			priv->editor = g_value_get_object (value);
+			return;
+
+		case PROP_UPDATING:
+			comp_editor_page_set_updating (
+				COMP_EDITOR_PAGE (object),
+				g_value_get_boolean (value));
+			return;
+	}
 
-
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
 
-/**
- * comp_editor_page_get_type:
- *
- * Registers the #CompEditorPage class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #CompEditorPage class.
- **/
-GType
-comp_editor_page_get_type (void)
+static void
+comp_editor_page_get_property (GObject *object,
+                               guint property_id,
+                               GValue *value,
+                               GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_EDITOR:
+			g_value_set_object (
+				value, comp_editor_page_get_editor (
+				COMP_EDITOR_PAGE (object)));
+			return;
+
+		case PROP_UPDATING:
+			g_value_set_boolean (
+				value, comp_editor_page_get_updating (
+				COMP_EDITOR_PAGE (object)));
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+comp_editor_page_dispose (GObject *object)
 {
-	static GType type = 0;
+	CompEditorPage *page;
 
-	if (G_UNLIKELY (type == 0)) {
-		static const GTypeInfo type_info = {
-			sizeof (CompEditorPageClass),
-			(GBaseInitFunc) NULL,
-			(GBaseFinalizeFunc) NULL,
-			(GClassInitFunc) comp_editor_page_class_init,
-			(GClassFinalizeFunc) NULL,
-			NULL,  /* class_data */
-			sizeof (CompEditorPage),
-			0,     /* n_preallocs */
-			(GInstanceInitFunc) comp_editor_page_init,
-			NULL   /* value_table */
-		};
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (IS_COMP_EDITOR_PAGE (object));
 
-		type = g_type_register_static (
-			G_TYPE_OBJECT, "CompEditorPage", &type_info, 0);
+	page = COMP_EDITOR_PAGE (object);
+
+	if (page->accel_group) {
+		g_object_unref (page->accel_group);
+		page->accel_group = NULL;
 	}
 
-	return type;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
-/* Class initialization function for the abstract editor page */
 static void
 comp_editor_page_class_init (CompEditorPageClass *class)
 {
 	GObjectClass *object_class;
 
 	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (CompEditorPagePrivate));
 
 	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = comp_editor_page_set_property;
+	object_class->get_property = comp_editor_page_get_property;
 	object_class->dispose = comp_editor_page_dispose;
 
-	class->changed = NULL;
-	class->summary_changed = NULL;
 	class->dates_changed = NULL;
 
 	class->get_widget = NULL;
@@ -108,35 +135,28 @@
 	class->fill_widgets = NULL;
 	class->fill_component = NULL;
 	class->fill_timezones = NULL;
-	class->set_summary = NULL;
 	class->set_dates = NULL;
 
-	comp_editor_page_signals[CHANGED] =
-		g_signal_new ("changed",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, changed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	comp_editor_page_signals[NEEDS_SEND] =
-		g_signal_new ("needs_send",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, needs_send),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	comp_editor_page_signals[SUMMARY_CHANGED] =
-		g_signal_new ("summary_changed",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, summary_changed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
+	g_object_class_install_property (
+		object_class,
+		PROP_EDITOR,
+		g_param_spec_object (
+			"editor",
+			NULL,
+			NULL,
+			TYPE_COMP_EDITOR,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT_ONLY));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_UPDATING,
+		g_param_spec_boolean (
+			"updating",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
 
 	comp_editor_page_signals[DATES_CHANGED] =
 		g_signal_new ("dates_changed",
@@ -146,66 +166,57 @@
 			      NULL, NULL,
 			      g_cclosure_marshal_VOID__POINTER,
 			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-
-	comp_editor_page_signals[CLIENT_CHANGED] =
-		g_signal_new ("client_changed",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, client_changed),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__OBJECT,
-			      G_TYPE_NONE, 1, G_TYPE_OBJECT);
-	comp_editor_page_signals[FOCUS_IN] =
-		g_signal_new ("focus_in",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, focus_in),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
-	comp_editor_page_signals[FOCUS_OUT] =
-		g_signal_new ("focus_out",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_FIRST,
-			      G_STRUCT_OFFSET (CompEditorPageClass, focus_out),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__POINTER,
-			      G_TYPE_NONE, 1, G_TYPE_POINTER);
 }
 
-
-
 static void
 comp_editor_page_init (CompEditorPage *page)
 {
-	page->client = NULL;
+	page->priv = COMP_EDITOR_PAGE_GET_PRIVATE (page);
+
 	page->accel_group = NULL;
 }
 
-
-static void
-comp_editor_page_dispose (GObject *object)
+GType
+comp_editor_page_get_type (void)
 {
-	CompEditorPage *page;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (object));
-
-	page = COMP_EDITOR_PAGE (object);
+	static GType type = 0;
 
-	if (page->client) {
-		g_object_unref (page->client);
-		page->client = NULL;
-	}
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+			sizeof (CompEditorPageClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) comp_editor_page_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (CompEditorPage),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) comp_editor_page_init,
+			NULL   /* value_table */
+		};
 
-	if (page->accel_group) {
-		g_object_unref (page->accel_group);
-		page->accel_group = NULL;
+		type = g_type_register_static (
+			G_TYPE_OBJECT, "CompEditorPage", &type_info, 0);
 	}
 
-	G_OBJECT_CLASS (parent_class)->dispose (object);
+	return type;
 }
 
+/**
+ * comp_editor_page_get_editor:
+ * @page: a #CompEditorPage
+ *
+ * Returns the #CompEditor to which @page belongs.
+ *
+ * Returns: the parent #CompEditor
+ **/
+CompEditor *
+comp_editor_page_get_editor (CompEditorPage *page)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
+
+	return page->priv->editor;
+}
 
 /**
  * comp_editor_page_get_widget:
@@ -219,11 +230,50 @@
 GtkWidget *
 comp_editor_page_get_widget (CompEditorPage *page)
 {
-	g_return_val_if_fail (page != NULL, NULL);
+	CompEditorPageClass *class;
+
 	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), NULL);
-	g_return_val_if_fail (CLASS (page)->get_widget != NULL, NULL);
 
-	return (* CLASS (page)->get_widget) (page);
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
+	g_return_val_if_fail (class->get_widget != NULL, NULL);
+
+	return class->get_widget (page);
+}
+
+gboolean
+comp_editor_page_get_updating (CompEditorPage *page)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
+
+	return page->priv->updating;
+}
+
+void
+comp_editor_page_set_updating (CompEditorPage *page,
+                               gboolean updating)
+{
+	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+
+	page->priv->updating = updating;
+
+	g_object_notify (G_OBJECT (page), "updating");
+}
+
+void
+comp_editor_page_changed (CompEditorPage *page)
+{
+	CompEditor *editor;
+
+	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+
+	/* Block change notifications if the page is updating.  This right
+	 * here is why we have an 'updating' flag.  It's up to subclasses
+	 * to set and clear it at appropriate times. */
+	if (page->priv->updating)
+		return;
+
+	editor = comp_editor_page_get_editor (page);
+	comp_editor_set_changed (editor, TRUE);
 }
 
 /**
@@ -237,11 +287,14 @@
 void
 comp_editor_page_focus_main_widget (CompEditorPage *page)
 {
-	g_return_if_fail (page != NULL);
+	CompEditorPageClass *class;
+
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-	g_return_if_fail (CLASS (page)->focus_main_widget != NULL);
 
-	(* CLASS (page)->focus_main_widget) (page);
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
+	g_return_if_fail (class->focus_main_widget != NULL);
+
+	class->focus_main_widget (page);
 }
 
 /**
@@ -252,13 +305,23 @@
  * Fills the widgets of an editor page with the data from a calendar component.
  **/
 gboolean
-comp_editor_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
+comp_editor_page_fill_widgets (CompEditorPage *page,
+                               ECalComponent *comp)
 {
+	CompEditorPageClass *class;
+	gboolean success;
+
 	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
 	g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
-	g_return_val_if_fail (CLASS (page)->fill_widgets != NULL, FALSE);
 
-	return (* CLASS (page)->fill_widgets) (page, comp);
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
+	g_return_val_if_fail (class->fill_widgets != NULL, FALSE);
+
+	comp_editor_page_set_updating (page, TRUE);
+	success = class->fill_widgets (page, comp);
+	comp_editor_page_set_updating (page, FALSE);
+
+	return success;
 }
 
 /**
@@ -275,12 +338,15 @@
 gboolean
 comp_editor_page_fill_component (CompEditorPage *page, ECalComponent *comp)
 {
-	g_return_val_if_fail (page != NULL, FALSE);
+	CompEditorPageClass *class;
+
 	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
 	g_return_val_if_fail (comp != NULL, FALSE);
 
-	if (CLASS (page)->fill_component != NULL)
-		return (* CLASS (page)->fill_component) (page, comp);
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
+
+	if (class->fill_component != NULL)
+		return class->fill_component (page, comp);
 
 	return TRUE;
 }
@@ -298,90 +364,20 @@
 gboolean
 comp_editor_page_fill_timezones (CompEditorPage *page, GHashTable *timezones)
 {
+	CompEditorPageClass *class;
+
 	g_return_val_if_fail (IS_COMP_EDITOR_PAGE (page), FALSE);
 	g_return_val_if_fail (timezones != NULL, FALSE);
 
-	if (CLASS (page)->fill_timezones != NULL)
-		return (* CLASS (page)->fill_timezones) (page, timezones);
-
-	return TRUE;
-}
-
-/**
- * comp_editor_page_set_e_cal:
- * @page: An editor page
- * @client: A #ECal object
- *
- * Sets the #ECal for the dialog page to use.
- **/
-void
-comp_editor_page_set_e_cal (CompEditorPage *page, ECal *client)
-{
-	g_return_if_fail (page != NULL);
-        g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	if (client == page->client)
-		return;
-
-	if (page->client)
-		g_object_unref (page->client);
-
-	page->client = client;
-	if (page->client)
-		g_object_ref (client);
-}
-
-/**
- * comp_editor_page_set_summary:
- * @page: An editor page
- * @summary: The text of the new summary value
- *
- * Sets the summary value for this group of widgets
- **/
-void
-comp_editor_page_set_summary (CompEditorPage *page, const char *summary)
-{
-	g_return_if_fail (page != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	if (CLASS (page)->set_summary != NULL)
-		(* CLASS (page)->set_summary) (page, summary);
-}
-
-/**
- * comp_editor_page_unset_focused_widget
- * @page: An editor page
- * @widget: The widget that has the current focus
-**/
-void
-comp_editor_page_unset_focused_widget (CompEditorPage *page, GtkWidget *widget)
-{
-	g_return_if_fail (page!= NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
 
-	g_signal_emit (page,
-		       comp_editor_page_signals[FOCUS_OUT], 0,
-		       widget);
+	if (class->fill_timezones != NULL)
+		return class->fill_timezones (page, timezones);
 
+	return TRUE;
 }
 
 /**
- * comp_editor_page_set_focussed_widget:
- * @page: An editor page
- * @widget: The widget that has the current focus
-**/
-void
-comp_editor_page_set_focused_widget (CompEditorPage *page, GtkWidget *widget)
-{
-	g_return_if_fail (page!= NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	g_signal_emit (page,
-		       comp_editor_page_signals[FOCUS_IN], 0,
-		       widget);
-
-}
-/**
  * comp_editor_page_set_dates:
  * @page: An editor page
  * @dates: A collection of various dates in time_t format
@@ -391,62 +387,14 @@
 void
 comp_editor_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
 {
-	g_return_if_fail (page != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	if (CLASS (page)->set_dates != NULL)
-		(* CLASS (page)->set_dates) (page, dates);
-}
+	CompEditorPageClass *class;
 
-/**
- * comp_editor_page_notify_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "changed" signal.  This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_changed (CompEditorPage *page)
-{
-	g_return_if_fail (page != NULL);
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
 
-	g_signal_emit (page, comp_editor_page_signals[CHANGED], 0);
-}
+	class = COMP_EDITOR_PAGE_GET_CLASS (page);
 
-/**
- * comp_editor_page_notify_needs_send:
- * @page:
- *
- *
- **/
-void
-comp_editor_page_notify_needs_send (CompEditorPage *page)
-{
-	g_return_if_fail (page != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	g_signal_emit (page, comp_editor_page_signals[NEEDS_SEND], 0);
-}
-
-/**
- * comp_editor_page_notify_summary_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "summary_changed" signal.  This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_summary_changed (CompEditorPage *page,
-					 const char *summary)
-{
-	g_return_if_fail (page != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-
-	g_signal_emit (page,
-		       comp_editor_page_signals[SUMMARY_CHANGED], 0,
-		       summary);
+	if (class->set_dates != NULL)
+		class->set_dates (page, dates);
 }
 
 /**
@@ -460,7 +408,6 @@
 comp_editor_page_notify_dates_changed (CompEditorPage *page,
 				       CompEditorPageDates *dates)
 {
-	g_return_if_fail (page != NULL);
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
 
 	g_signal_emit (page,
@@ -469,26 +416,6 @@
 }
 
 /**
- * comp_editor_page_notify_client_changed:
- * @page: An editor page.
- *
- * Makes an editor page emit the "client_changed" signal.  This is meant to be
- * used only by page implementations.
- **/
-void
-comp_editor_page_notify_client_changed (CompEditorPage *page,
-					ECal *client)
-{
-	g_return_if_fail (page != NULL);
-	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
-
-	comp_editor_page_set_e_cal (page, client);
-	g_signal_emit (page,
-		       comp_editor_page_signals[CLIENT_CHANGED], 0,
-		       client);
-}
-
-/**
  * comp_editor_page_display_validation_error:
  * @page: An editor page.
  * @msg: Error message to display.

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor-page.h	Tue Jul 15 18:34:59 2008
@@ -26,15 +26,33 @@
 #include <libecal/e-cal-component.h>
 #include <libecal/e-cal.h>
 
+/* Standard GObject macros */
+#define TYPE_COMP_EDITOR_PAGE \
+	(comp_editor_page_get_type ())
+#define COMP_EDITOR_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPage))
+#define COMP_EDITOR_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_COMP_EDITOR_PAGE, CompEditorPageClass))
+#define IS_COMP_EDITOR_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_COMP_EDITOR_PAGE))
+#define IS_COMP_EDITOR_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_COMP_EDITOR_PAGE))
+#define COMP_EDITOR_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPageClass))
+
 G_BEGIN_DECLS
 
-
+/* Use a forward declaration to avoid a circular reference. */
+struct _CompEditor;
 
-#define TYPE_COMP_EDITOR_PAGE            (comp_editor_page_get_type ())
-#define COMP_EDITOR_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_COMP_EDITOR_PAGE, CompEditorPage))
-#define COMP_EDITOR_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR_PAGE,	CompEditorPageClass))
-#define IS_COMP_EDITOR_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
-#define IS_COMP_EDITOR_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_COMP_EDITOR_PAGE))
+typedef struct _CompEditorPage CompEditorPage;
+typedef struct _CompEditorPageClass CompEditorPageClass;
+typedef struct _CompEditorPagePrivate CompEditorPagePrivate;
 
 typedef struct {
 	ECalComponentDateTime *start;
@@ -43,45 +61,25 @@
 	struct icaltimetype *complete;
 } CompEditorPageDates;
 
-typedef enum {
-	COMP_EDITOR_PAGE_NEW_ITEM = 1<<0,
-	COMP_EDITOR_PAGE_MEETING = 1<<1,
-	COMP_EDITOR_PAGE_DELEGATE = 1<<2,
-	COMP_EDITOR_PAGE_USER_ORG = 1<<3,
-	COMP_EDITOR_PAGE_IS_ASSIGNED = 1<<4,
-	COMP_EDITOR_PAGE_IS_SHARED = 1<<5
-} CompEditorPageFlags;
-
-typedef struct {
+struct _CompEditorPage {
 	GObject object;
 
-	/* Some of the pages need the ECal to access timezone data. Also,
-	 * the event page needs to know it to fill the source option menu. */
-	ECal *client;
-
 	/* The GtkAccelGroup for the page. We install this when the page is
 	   mapped, and uninstall when it is unmapped. libglade would do this
 	   normally, but we create our pages individually so have to do it
 	   ourselves. */
 	GtkAccelGroup *accel_group;
 
-	CompEditorPageFlags flags;
-
-} CompEditorPage;
+	CompEditorPagePrivate *priv;
+};
 
-typedef struct {
+struct _CompEditorPageClass {
 	GObjectClass parent_class;
 
 	/* Notification signals */
 
-	void (* changed)    (CompEditorPage *page);
-	void (* needs_send) (CompEditorPage *page);
-
-	void (* summary_changed) (CompEditorPage *page, const char *summary);
 	void (* dates_changed)   (CompEditorPage *page, const char *dates);
-	void (* client_changed)  (CompEditorPage *page, ECal *client);
-	void (* focus_in) 	 (CompEditorPage *page, GtkWidget *widget);
-	void (* focus_out)	 (CompEditorPage *page, GtkWidget *widget);
+
 	/* Virtual methods */
 
 	GtkWidget *(* get_widget) (CompEditorPage *page);
@@ -91,42 +89,35 @@
 	gboolean (* fill_component) (CompEditorPage *page, ECalComponent *comp);
 	gboolean (* fill_timezones) (CompEditorPage *page, GHashTable *timezones);
 
-	void (* set_summary) (CompEditorPage *page, const char *summary);
 	void (* set_dates) (CompEditorPage *page, CompEditorPageDates *dates);
-} CompEditorPageClass;
-
-GType      comp_editor_page_get_type               (void);
-GtkWidget *comp_editor_page_get_widget             (CompEditorPage      *page);
-void       comp_editor_page_focus_main_widget      (CompEditorPage      *page);
-void       comp_editor_page_unset_focused_widget   (CompEditorPage *page, GtkWidget *widget);
-void       comp_editor_page_set_focused_widget     (CompEditorPage *page, GtkWidget *widget);
-gboolean   comp_editor_page_fill_widgets           (CompEditorPage      *page,
-						    ECalComponent        *comp);
-gboolean   comp_editor_page_fill_component         (CompEditorPage      *page,
-						    ECalComponent        *comp);
-gboolean   comp_editor_page_fill_timezones         (CompEditorPage      *page,
-						    GHashTable          *timezones);
-void       comp_editor_page_set_e_cal              (CompEditorPage      *page,
-						    ECal           *client);
-void       comp_editor_page_set_summary            (CompEditorPage      *page,
-						    const char          *summary);
-void       comp_editor_page_set_dates              (CompEditorPage      *page,
-						    CompEditorPageDates *dates);
-void       comp_editor_page_notify_changed         (CompEditorPage      *page);
-void       comp_editor_page_notify_needs_send      (CompEditorPage      *page);
-void       comp_editor_page_notify_summary_changed (CompEditorPage      *page,
-						    const char          *summary);
-void       comp_editor_page_notify_dates_changed   (CompEditorPage      *page,
-						    CompEditorPageDates *dates);
-void       comp_editor_page_notify_client_changed  (CompEditorPage      *page,
-						    ECal                *client);
-void       comp_editor_page_display_validation_error (CompEditorPage      *page,
-						      const char          *msg,
-						      GtkWidget           *field);
-
+};
 
-
+GType		comp_editor_page_get_type	(void);
+struct _CompEditor *
+		comp_editor_page_get_editor	(CompEditorPage *page);
+GtkWidget *	comp_editor_page_get_widget	(CompEditorPage *page);
+gboolean	comp_editor_page_get_updating	(CompEditorPage *page);
+void		comp_editor_page_set_updating	(CompEditorPage *page,
+						 gboolean updating);
+void		comp_editor_page_changed	(CompEditorPage *page);
+void		comp_editor_page_focus_main_widget
+						(CompEditorPage *page);
+gboolean	comp_editor_page_fill_widgets	(CompEditorPage *page,
+						 ECalComponent *comp);
+gboolean	comp_editor_page_fill_component	(CompEditorPage *page,
+						 ECalComponent *comp);
+gboolean	comp_editor_page_fill_timezones	(CompEditorPage *page,
+						 GHashTable *timezones);
+void		comp_editor_page_set_dates	(CompEditorPage *page,
+						 CompEditorPageDates *dates);
+void		comp_editor_page_notify_dates_changed
+						(CompEditorPage *page,
+						 CompEditorPageDates *dates);
+void		comp_editor_page_display_validation_error
+						(CompEditorPage *page,
+						 const char *msg,
+						 GtkWidget *field);
 
 G_END_DECLS
 
-#endif
+#endif /* COMP_EDITOR_PAGE_H */

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor-util.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor-util.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor-util.c	Tue Jul 15 18:34:59 2008
@@ -26,9 +26,6 @@
 #include <string.h>
 #include <libical/ical.h>
 #include <glib/gi18n.h>
-#include <bonobo-activation/bonobo-activation.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-widget.h>
 #include <libedataserver/e-time-utils.h>
 #include <libecal/e-cal-time-util.h>
 #include "../calendar-config.h"

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor.c	Tue Jul 15 18:34:59 2008
@@ -30,16 +30,10 @@
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <gdk/gdkkeysyms.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
 #include <libgnome/libgnome.h>
-#include <libgnomeui/gnome-uidefs.h>
-#include <libgnomeui/gnome-dialog.h>
-#include <libgnomeui/gnome-dialog-util.h>
-#include <libgnomeui/gnome-messagebox.h>
 #include <e-util/e-dialog-utils.h>
-#include <e-util/e-icon-factory.h>
 #include <e-util/e-util-private.h>
+#include <e-util/gconf-bridge.h>
 #include <evolution-shell-component-utils.h>
 
 #include <camel/camel-url.h>
@@ -62,16 +56,18 @@
 #include "recur-comp.h"
 #include "comp-editor.h"
 #include "../e-cal-popup.h"
+#include "../calendar-config-keys.h"
 #include "cal-attachment-select-file.h"
 
 #include "e-attachment-bar.h"
 #include "misc/e-expander.h"
 #include "e-util/e-error.h"
 
+#define COMP_EDITOR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_COMP_EDITOR, CompEditorPrivate))
 
-#define d(x) x
-
-
+#define d(x)
 
 /* Private part of the CompEditor structure */
 struct _CompEditorPrivate {
@@ -93,9 +89,6 @@
 	/* Notebook to hold the pages */
 	GtkNotebook *notebook;
 
-	/* Focussed Widget*/
-	GtkWidget *focused_entry;
-
 	/* Attachment handling */
 	GtkWidget *attachment_bar;
 	GtkWidget *attachment_scrolled_window;
@@ -104,6 +97,11 @@
 	GtkWidget *attachment_expander_icon;
 	GtkWidget *attachment_expander_num;
 
+	/* Manages menus and toolbars */
+	GtkUIManager *manager;
+
+	gchar *summary;
+
 	guint32 attachment_bar_visible : 1;
 
 	/* TODO use this flags for setting all the boolean variables
@@ -120,35 +118,63 @@
 	gboolean is_group_item;
 
  	gboolean warned;
+};
 
-        char *help_section;
+enum {
+	PROP_0,
+	PROP_CHANGED,
+	PROP_CLIENT,
+	PROP_FLAGS,
+	PROP_SUMMARY
 };
 
-
+static const gchar *ui =
+"<ui>"
+"  <menubar action='main-menu'>"
+"    <menu action='file-menu'>"
+"      <menuitem action='save'/>"
+"      <menuitem action='close'/>"
+"    </menu>"
+"    <menu action='edit-menu'>"
+"      <menuitem action='cut'/>"
+"      <menuitem action='copy'/>"
+"      <menuitem action='paste'/>"
+"      <separator/>"
+"      <menuitem action='select-all'/>"
+"    </menu>"
+"    <menu action='view-menu'/>"
+"    <menu action='insert-menu'>"
+"      <menuitem action='attach'/>"
+"      <menuitem action='attach-recent'/>"
+"    </menu>"
+"    <menu action='options-menu'/>"
+"    <menu action='help-menu'>"
+"      <menuitem action='help'/>"
+"    </menu>"
+"  </menubar>"
+"  <toolbar name='main-toolbar'>"
+"    <toolitem action='save'/>"
+"    <toolitem action='close'/>"
+"    <separator/>"
+"    <toolitem action='attach'/>"
+"  </toolbar>"
+"</ui>";
 
-static gint comp_editor_key_press_event (GtkWidget *d, GdkEventKey *e);
-static void comp_editor_finalize (GObject *object);
 static void comp_editor_show_help (CompEditor *editor);
+static void setup_widgets (CompEditor *editor);
 
-static void real_set_e_cal (CompEditor *editor, ECal *client);
 static void real_edit_comp (CompEditor *editor, ECalComponent *comp);
 static gboolean real_send_comp (CompEditor *editor, ECalComponentItipMethod method);
 static gboolean prompt_and_save_changes (CompEditor *editor, gboolean send);
-static void delete_comp (CompEditor *editor);
 static void close_dialog (CompEditor *editor);
 
-static void page_changed_cb (GtkObject *obj, gpointer data);
-static void needs_send_cb (GtkObject *obj, gpointer data);
-static void page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data);
-static void page_dates_changed_cb (GtkObject *obj, CompEditorPageDates *dates, gpointer data);
-static void page_focus_in_widget_cb (GtkObject *obj, GtkWidget *widget, gpointer data);
-static void page_focus_out_widget_cb (GtkObject *obj, GtkWidget *widget, gpointer data);
+static void page_dates_changed_cb (CompEditor *editor, CompEditorPageDates *dates, CompEditorPage *page);
 
-static void obj_modified_cb (ECal *client, GList *objs, gpointer data);
-static void obj_removed_cb (ECal *client, GList *uids, gpointer data);
+static void obj_modified_cb (ECal *client, GList *objs, CompEditor *editor);
+static void obj_removed_cb (ECal *client, GList *uids, CompEditor *editor);
 static gboolean open_attachment (EAttachmentBar *bar, CompEditor *editor);
 
-G_DEFINE_TYPE (CompEditor, comp_editor, BONOBO_TYPE_WINDOW)
+G_DEFINE_TYPE (CompEditor, comp_editor, GTK_TYPE_WINDOW)
 
 enum {
 	DND_TYPE_MESSAGE_RFC822,
@@ -535,98 +561,28 @@
 	return action != 0;
 }
 
-/* Class initialization function for the calendar component editor */
 static void
-comp_editor_class_init (CompEditorClass *klass)
+add_to_bar (CompEditor *editor, GPtrArray *file_list, int is_inline)
 {
-	GObjectClass *object_class;
-	GtkWidgetClass *widget_class;
+	CompEditorPrivate *priv = editor->priv;
 	int i;
 
-	for (i=0;i<sizeof(drag_info)/sizeof(drag_info[0]);i++)
-		drag_info[i].atom = gdk_atom_intern(drag_info[i].target, FALSE);
-
-	object_class = G_OBJECT_CLASS (klass);
-	widget_class = GTK_WIDGET_CLASS (klass);
-
-	klass->set_e_cal = real_set_e_cal;
-	klass->edit_comp = real_edit_comp;
-	klass->send_comp = real_send_comp;
-	klass->object_created = NULL;
-
-	comp_editor_signals[OBJECT_CREATED] =
-		g_signal_new ("object_created",
-			      G_TYPE_FROM_CLASS (klass),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (CompEditorClass, object_created),
-			      NULL, NULL,
-			      g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
-
-	widget_class->key_press_event = comp_editor_key_press_event;
-	object_class->finalize = comp_editor_finalize;
-}
-
-static void
-listen_for_changes (CompEditor *editor)
-{
-	CompEditorPrivate *priv;
-	const char *uid = NULL;
-
-	priv = editor->priv;
-
-	/* Discard change listener */
-	if (priv->view) {
-		g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
-						      G_SIGNAL_MATCH_DATA,
-						      0, 0, NULL, NULL,
-						      editor);
-
-		g_object_unref (priv->view);
-		priv->view = NULL;
-	}
-
-	/* Listen for changes */
-	if (priv->comp)
-		e_cal_component_get_uid (priv->comp, &uid);
-
-	if (uid) {
-		char *query;
-
-		query = g_strdup_printf ("(uid? \"%s\")", uid);
-		e_cal_get_query (priv->source_client, query, &priv->view, NULL);
-		g_free (query);
-	}
+	for (i = 0; i < file_list->len; i++) {
+		CamelURL *url;
 
-	if (priv->view) {
-		g_signal_connect (priv->view, "objects_modified",
-				  G_CALLBACK (obj_modified_cb), editor);
+		if (!(url = camel_url_new (file_list->pdata[i], NULL)))
+			continue;
 
-		g_signal_connect((priv->view), "objects_removed",
-				 G_CALLBACK (obj_removed_cb), editor);
+		if (!g_ascii_strcasecmp (url->protocol, "file")) {
+			e_attachment_bar_attach((EAttachmentBar *)priv->attachment_bar, url->path, is_inline ? "inline" : "attachment");
+		} else {
+			e_attachment_bar_attach_remote_file ((EAttachmentBar *)priv->attachment_bar, file_list->pdata[i], is_inline ? "inline" : "attachment");
+		}
 
-		e_cal_view_start (priv->view);
+		camel_url_free (url);
 	}
 }
 
-/* This sets the focus to the toplevel, so any field being edited is committed.
-   FIXME: In future we may also want to check some of the fields are valid,
-   e.g. the EDateEdit fields. */
-static void
-commit_all_fields (CompEditor *editor)
-{
-	gtk_window_set_focus (GTK_WINDOW (editor), NULL);
-}
-
-static void
-send_timezone (gpointer key, gpointer value, gpointer user_data)
-{
-	icaltimezone *zone = value;
-	CompEditor *editor = user_data;
-
-	e_cal_add_timezone (editor->priv->client, zone, NULL);
-}
-
 static GSList *
 get_attachment_list (CompEditor *editor)
 {
@@ -701,10 +657,72 @@
 	return list;
 }
 
+/* This sets the focus to the toplevel, so any field being edited is committed.
+   FIXME: In future we may also want to check some of the fields are valid,
+   e.g. the EDateEdit fields. */
+static void
+commit_all_fields (CompEditor *editor)
+{
+	gtk_window_set_focus (GTK_WINDOW (editor), NULL);
+}
+
+static void
+listen_for_changes (CompEditor *editor)
+{
+	CompEditorPrivate *priv;
+	const char *uid = NULL;
+
+	priv = editor->priv;
+
+	/* Discard change listener */
+	if (priv->view) {
+		g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
+						      G_SIGNAL_MATCH_DATA,
+						      0, 0, NULL, NULL,
+						      editor);
+
+		g_object_unref (priv->view);
+		priv->view = NULL;
+	}
+
+	/* Listen for changes */
+	if (priv->comp)
+		e_cal_component_get_uid (priv->comp, &uid);
+
+	if (uid) {
+		char *query;
+
+		query = g_strdup_printf ("(uid? \"%s\")", uid);
+		e_cal_get_query (priv->source_client, query, &priv->view, NULL);
+		g_free (query);
+	}
+
+	if (priv->view) {
+		g_signal_connect (
+			priv->view, "objects_modified",
+			G_CALLBACK (obj_modified_cb), editor);
+		g_signal_connect (
+			priv->view, "objects_removed",
+			G_CALLBACK (obj_removed_cb), editor);
+
+		e_cal_view_start (priv->view);
+	}
+}
+
+static void
+send_timezone (gpointer key, gpointer value, gpointer user_data)
+{
+	icaltimezone *zone = value;
+	CompEditor *editor = user_data;
+
+	e_cal_add_timezone (editor->priv->client, zone, NULL);
+}
+
 static gboolean
 save_comp (CompEditor *editor)
 {
 	CompEditorPrivate *priv;
+	CompEditorFlags flags;
 	ECalComponent *clone;
 	GList *l;
 	gboolean result;
@@ -718,6 +736,8 @@
 	if (!priv->changed)
 		return TRUE;
 
+	flags = comp_editor_get_flags (editor);
+
 	/* Stop listening because we are about to change things */
 	if (priv->view) {
 		g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
@@ -781,7 +801,7 @@
 
 		if (result && priv->mod == CALOBJ_MOD_THIS) {
 			/* FIXME do we really need to do this ? */
-			if ((priv->flags & COMP_EDITOR_DELEGATE) || !e_cal_component_has_organizer (clone) || itip_organizer_is_user (clone, priv->client) || itip_sentby_is_user (clone))
+			if ((flags & COMP_EDITOR_DELEGATE) || !e_cal_component_has_organizer (clone) || itip_organizer_is_user (clone, priv->client) || itip_sentby_is_user (clone))
 				e_cal_component_commit_sequence (clone);
 			else
 				e_cal_component_abort_sequence (clone);
@@ -857,13 +877,15 @@
 save_comp_with_send (CompEditor *editor)
 {
 	CompEditorPrivate *priv;
+	CompEditorFlags flags;
 	gboolean send;
 	gboolean delegate;
 
 	priv = editor->priv;
 
+	flags = comp_editor_get_flags (editor);
 	send = priv->changed && priv->needs_send;
-	delegate = priv->flags & COMP_EDITOR_DELEGATE;
+	delegate = flags & COMP_EDITOR_DELEGATE;
 
 	if (delegate) {
 		icalcomponent *icalcomp = e_cal_component_get_icalcomponent (priv->comp);
@@ -895,118 +917,1002 @@
 	return TRUE;
 }
 
-static gboolean
-prompt_and_save_changes (CompEditor *editor, gboolean send)
+static void
+update_window_border (CompEditor *editor,
+                      const gchar *description)
 {
-	CompEditorPrivate *priv;
-	gboolean read_only, correct = FALSE;
-	ECalComponent *comp;
-	ECalComponentText text;
+	const gchar *icon_name;
+	const gchar *format;
+	gchar *title;
+
+	if (editor->priv->comp == NULL) {
+		title = g_strdup (_("Edit Appointment"));
+		icon_name = "stock_calendar";
+		goto exit;
+
+	} else switch (e_cal_component_get_vtype (editor->priv->comp)) {
+		case E_CAL_COMPONENT_EVENT:
+			if (editor->priv->is_group_item)
+				format = _("Meeting - %s");
+			else
+				format = _("Appointment - %s");
+			icon_name = "appointment-new";
+			break;
 
-	priv = editor->priv;
+		case E_CAL_COMPONENT_TODO:
+			if (editor->priv->is_group_item)
+				format = _("Assigned Task - %s");
+			else
+				format = _("Task - %s");
+			icon_name = "stock_task";
+			break;
 
-	if (!priv->changed)
-		return TRUE;
+		case E_CAL_COMPONENT_JOURNAL:
+			format = _("Memo - %s");
+			icon_name = "stock_insert-note";
+			break;
 
-	switch (save_component_dialog (GTK_WINDOW(editor), priv->comp)) {
-	case GTK_RESPONSE_YES: /* Save */
-		if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) {
-			e_error_run ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (editor)), "calendar:prompt-read-only-cal-editor", e_source_peek_name (e_cal_get_source (priv->client)), NULL);
-			/* don't discard changes when selected readonly calendar */
-			return FALSE;
-		}
+		default:
+			g_return_if_reached ();
+	}
 
-		comp = comp_editor_get_current_comp (editor, &correct);
-		e_cal_component_get_summary (comp, &text);
-		g_object_unref (comp);
+	if (description == NULL || *description == '\0') {
+		ECalComponentText text;
 
-		if (!correct)
-			return FALSE;
+		e_cal_component_get_summary (editor->priv->comp, &text);
+		description = text.value;
+	}
 
-		if (!text.value)
-			if (!send_component_prompt_subject ((GtkWindow *) editor, priv->client, priv->comp))
-				return FALSE;
+	if (description == NULL || *description == '\0')
+		description = _("No Summary");
 
-		if (e_cal_component_is_instance (priv->comp))
-			if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor), FALSE))
-				return FALSE;
+	title = g_strdup_printf (format, description);
 
-		if (send && save_comp_with_send (editor))
-			return TRUE;
-		else if (!send && save_comp (editor))
-			return TRUE;
-		else
-			return FALSE;
-	case GTK_RESPONSE_NO: /* Discard */
-		return TRUE;
-	case GTK_RESPONSE_CANCEL: /* Cancel */
-	default:
-		return FALSE;
-	}
+exit:
+	gtk_window_set_icon_name (GTK_WINDOW (editor), icon_name);
+	gtk_window_set_title (GTK_WINDOW (editor), title);
+
+	g_free (title);
 }
 
-static int
-delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
+static void
+action_attach_cb (GtkAction *action,
+                  CompEditor *editor)
 {
-	CompEditor *editor = COMP_EDITOR (data);
+	GPtrArray *file_list;
+	gboolean is_inline = FALSE;
+	int i;
+
+	file_list = comp_editor_select_file_attachments (editor, &is_inline);
+
+	if (file_list) {
+		add_to_bar (editor, file_list, is_inline);
+
+		for (i = 0; i < file_list->len; i++)
+			g_free (file_list->pdata[i]);
+
+		g_ptr_array_free (file_list, TRUE);
+	}
+}
 
+static void
+action_close_cb (GtkAction *action,
+                 CompEditor *editor)
+{
 	commit_all_fields (editor);
 
 	if (prompt_and_save_changes (editor, TRUE))
 		close_dialog (editor);
-
-	return TRUE;
 }
 
 static void
-attachment_bar_changed_cb (EAttachmentBar *bar,
-			   void *data)
+action_copy_cb (GtkAction *action,
+                CompEditor *editor)
 {
-	CompEditor *editor = COMP_EDITOR (data);
+	GtkWidget *focus;
 
-	guint attachment_num = e_attachment_bar_get_num_attachments (
-		E_ATTACHMENT_BAR (editor->priv->attachment_bar));
-	if (attachment_num) {
-		gchar *num_text = g_strdup_printf (
-			ngettext ("<b>%d</b> Attachment", "<b>%d</b> Attachments", attachment_num),
-			attachment_num);
-		gtk_label_set_markup (GTK_LABEL (editor->priv->attachment_expander_num),
-				      num_text);
-		g_free (num_text);
+	focus = gtk_window_get_focus (GTK_WINDOW (editor));
 
-		gtk_widget_show (editor->priv->attachment_expander_icon);
-		e_expander_set_expanded(E_EXPANDER(editor->priv->attachment_expander),TRUE);
+	if (GTK_IS_ENTRY (focus))
+		gtk_editable_copy_clipboard (GTK_EDITABLE (focus));
 
-	} else {
-		gtk_label_set_text (GTK_LABEL (editor->priv->attachment_expander_num), "");
-		gtk_widget_hide (editor->priv->attachment_expander_icon);
-		e_expander_set_expanded(E_EXPANDER(editor->priv->attachment_expander),FALSE);
-	}
+	if (GTK_IS_TEXT_VIEW (focus))
+		g_signal_emit_by_name (focus, "copy-clipboard");
+}
 
+static void
+action_cut_cb (GtkAction *action,
+               CompEditor *editor)
+{
+	GtkWidget *focus;
 
-	/* Mark the editor as changed so it prompts about unsaved
-           changes on close */
-	comp_editor_set_changed (editor, TRUE);
+	focus = gtk_window_get_focus (GTK_WINDOW (editor));
+
+	if (GTK_IS_ENTRY (focus))
+		gtk_editable_cut_clipboard (GTK_EDITABLE (focus));
 
+	if (GTK_IS_TEXT_VIEW (focus))
+		g_signal_emit_by_name (focus, "cut-clipboard");
 }
 
 static void
-attachment_expander_activate_cb (EExpander *expander,
-				 void *data)
+action_help_cb (GtkAction *action,
+                CompEditor *editor)
 {
-	CompEditor *editor = COMP_EDITOR (data);
-	gboolean show = e_expander_get_expanded (expander);
-
-	/* Update the expander label */
-	if (show)
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
-					          _("Hide Attachment _Bar"));
-	else
-		gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
-						  _("Show Attachment _Bar"));
+	comp_editor_show_help (editor);
 }
 
-static gboolean
+static void
+action_paste_cb (GtkAction *action,
+                 CompEditor *editor)
+{
+	GtkWidget *focus;
+
+	focus = gtk_window_get_focus (GTK_WINDOW (editor));
+
+	if (GTK_IS_ENTRY (focus))
+		gtk_editable_paste_clipboard (GTK_EDITABLE (focus));
+
+	if (GTK_IS_TEXT_VIEW (focus))
+		g_signal_emit_by_name (focus, "paste-clipboard");
+}
+
+static void
+action_print_cb (GtkAction *action,
+                 CompEditor *editor)
+{
+	CompEditorPrivate *priv = editor->priv;
+	ECalComponent *comp;
+	GList *l;
+	icalcomponent *icalcomp = e_cal_component_get_icalcomponent (priv->comp);
+
+	comp = e_cal_component_new ();
+	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
+
+	for (l = priv->pages; l != NULL; l = l->next)
+		 comp_editor_page_fill_component (l->data, comp);
+
+	print_comp (comp, priv->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+
+	g_object_unref (comp);
+}
+
+static void
+action_print_preview_cb (GtkAction *action,
+                         CompEditor *editor)
+{
+	CompEditorPrivate *priv = editor->priv;
+	ECalComponent *comp;
+	GList *l;
+	icalcomponent *icalcomp = e_cal_component_get_icalcomponent (priv->comp);
+
+	comp = e_cal_component_new ();
+	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
+	for (l = priv->pages; l != NULL; l = l->next)
+		 comp_editor_page_fill_component (l->data, comp);
+	print_comp (comp, priv->client, TRUE);
+
+	g_object_unref (comp);
+}
+
+static void
+action_save_cb (GtkAction *action,
+                CompEditor *editor)
+{
+	CompEditorPrivate *priv = editor->priv;
+	ECalComponentText text;
+	gboolean delegated = FALSE;
+	gboolean read_only, correct = FALSE;
+	ECalComponent *comp;
+
+	if (e_attachment_bar_get_download_count (E_ATTACHMENT_BAR (editor->priv->attachment_bar)) ){
+		gboolean response = 1;
+	/*FIXME: Cannot use mail functions from calendar!!!! */
+#if 0
+		ECalComponentVType vtype = e_cal_component_get_vtype(editor->priv->comp);
+
+		if (vtype == E_CAL_COMPONENT_EVENT)
+			response = em_utils_prompt_user((GtkWindow *)widget,
+							 NULL,
+							 "calendar:ask-send-event-pending-download",
+							  NULL);
+		else
+			response = em_utils_prompt_user((GtkWindow *)widget,
+							 NULL,
+							 "calendar:ask-send-task-pending-download",
+							  NULL);
+#endif
+	if (!response)
+		return;
+	}
+
+	if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) {
+		e_error_run ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (editor)), "calendar:prompt-read-only-cal-editor", e_source_peek_name (e_cal_get_source (priv->client)), NULL);
+		return;
+	}
+
+	commit_all_fields (editor);
+	if (e_cal_component_is_instance (priv->comp))
+		if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor), delegated))
+			return;
+
+	comp = comp_editor_get_current_comp (editor, &correct);
+	e_cal_component_get_summary (comp, &text);
+	g_object_unref (comp);
+
+	if (!correct)
+		return;
+
+	if (!text.value)
+		if (!send_component_prompt_subject ((GtkWindow *) editor, priv->client, priv->comp))
+			return;
+	if (save_comp_with_send (editor))
+		close_dialog (editor);
+
+}
+
+static void
+action_select_all_cb (GtkAction *action,
+                      CompEditor *editor)
+{
+	GtkWidget *focus;
+
+	focus = gtk_window_get_focus (GTK_WINDOW (editor));
+
+	if (GTK_IS_ENTRY (focus)) {
+		gtk_editable_set_position (GTK_EDITABLE (focus), -1);
+		gtk_editable_select_region (GTK_EDITABLE (focus), 0, -1);
+	}
+
+	if (GTK_IS_TEXT_VIEW (focus))
+		g_signal_emit_by_name (focus, "select-all", TRUE);
+}
+
+static void
+action_view_categories_cb (GtkToggleAction *action,
+                           CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_categories != NULL)
+		class->show_categories (editor, active);
+}
+
+static void
+action_view_role_cb (GtkToggleAction *action,
+                     CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_role != NULL)
+		class->show_role (editor, active);
+}
+
+static void
+action_view_rsvp_cb (GtkToggleAction *action,
+                     CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_rsvp != NULL)
+		class->show_rsvp (editor, active);
+}
+
+static void
+action_view_status_cb (GtkToggleAction *action,
+                       CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_status != NULL)
+		class->show_status (editor, active);
+}
+
+static void
+action_view_time_zone_cb (GtkToggleAction *action,
+                          CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_time_zone != NULL)
+		class->show_time_zone (editor, active);
+}
+
+static void
+action_view_type_cb (GtkToggleAction *action,
+                     CompEditor *editor)
+{
+	CompEditorClass *class;
+	gboolean active;
+
+	class = COMP_EDITOR_GET_CLASS (editor);
+	active = gtk_toggle_action_get_active (action);
+
+	if (class->show_type != NULL)
+		class->show_type (editor, active);
+}
+
+static GtkActionEntry core_entries[] = {
+
+	{ "close",
+	  GTK_STOCK_CLOSE,
+	  NULL,
+	  NULL,
+	  N_("Click here to close the current window"),
+	  G_CALLBACK (action_close_cb) },
+
+	{ "copy",
+	  GTK_STOCK_COPY,
+	  NULL,
+	  NULL,
+	  N_("Copy selected text to the clipboard"),
+	  G_CALLBACK (action_copy_cb) },
+
+	{ "cut",
+	  GTK_STOCK_CUT,
+	  NULL,
+	  NULL,
+	  N_("Cut selected text to the clipboard"),
+	  G_CALLBACK (action_cut_cb) },
+
+	{ "help",
+	  GTK_STOCK_HELP,
+	  NULL,
+	  NULL,
+	  N_("Click here to view help available"),
+	  G_CALLBACK (action_help_cb) },
+
+	{ "paste",
+	  GTK_STOCK_PASTE,
+	  NULL,
+	  NULL,
+	  N_("Paste text from the clipboard"),
+	  G_CALLBACK (action_paste_cb) },
+
+	{ "print",
+	  GTK_STOCK_PRINT,
+	  NULL,
+	  NULL,
+	  NULL,
+	  G_CALLBACK (action_print_cb) },
+
+	{ "print-preview",
+	  GTK_STOCK_PRINT_PREVIEW,
+	  NULL,
+	  NULL,
+	  NULL,
+	  G_CALLBACK (action_print_preview_cb) },
+
+	{ "save",
+	  GTK_STOCK_SAVE,
+	  NULL,
+	  NULL,
+	  N_("Click here to save the current window"),
+	  G_CALLBACK (action_save_cb) },
+
+	{ "select-all",
+	  GTK_STOCK_SELECT_ALL,
+	  NULL,
+	  NULL,
+	  N_("Select all text"),
+	  G_CALLBACK (action_select_all_cb) },
+
+	/* Menus */
+
+	{ "classification-menu",
+	  NULL,
+	  N_("_Classification"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "edit-menu",
+	  NULL,
+	  N_("_Edit"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "file-menu",
+	  NULL,
+	  N_("_File"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "help-menu",
+	  NULL,
+	  N_("_Help"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "insert-menu",
+	  NULL,
+	  N_("_Insert"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "options-menu",
+	  NULL,
+	  N_("_Options"),
+	  NULL,
+	  NULL,
+	  NULL },
+
+	{ "view-menu",
+	  NULL,
+	  N_("_View"),
+	  NULL,
+	  NULL,
+	  NULL }
+};
+
+static GtkActionEntry individual_entries[] = {
+
+	{ "attach",
+	  "mail-attachment",
+	  N_("_Attachment..."),
+	  "<Control>m",
+	  N_("Click here to attach a file"),
+	  G_CALLBACK (action_attach_cb) }
+};
+
+static GtkToggleActionEntry individual_toggle_entries[] = {
+
+	{ "view-categories",
+	  NULL,
+	  N_("_Categories"),
+	  NULL,
+	  N_("Toggles whether to display categories"),
+	  G_CALLBACK (action_view_categories_cb),
+	  FALSE },
+
+	{ "view-time-zone",
+	  "stock_timezone",
+	  N_("Time _Zone"),
+	  NULL,
+	  N_("Toggles whether the time zone is displayed"),
+	  G_CALLBACK (action_view_time_zone_cb),
+	  FALSE }
+};
+
+static GtkRadioActionEntry classification_radio_entries[] = {
+
+	{ "classify-public",
+	  NULL,
+	  N_("Pu_blic"),
+	  NULL,
+	  N_("Classify as public"),
+	  E_CAL_COMPONENT_CLASS_PUBLIC },
+
+	{ "classify-private",
+	  NULL,
+	  N_("_Private"),
+	  NULL,
+	  N_("Classify as private"),
+	  E_CAL_COMPONENT_CLASS_PRIVATE },
+
+	{ "classify-confidential",
+	  NULL,
+	  N_("_Confidential"),
+	  NULL,
+	  N_("Classify as confidential"),
+	  E_CAL_COMPONENT_CLASS_CONFIDENTIAL }
+};
+
+static GtkToggleActionEntry coordinated_toggle_entries[] = {
+
+	{ "view-role",
+	  NULL,
+	  N_("R_ole Field"),
+	  NULL,
+	  N_("Toggles whether the Role field is displayed"),
+	  G_CALLBACK (action_view_role_cb),
+	  FALSE },
+
+	{ "view-rsvp",
+	  NULL,
+	  N_("_RSVP"),
+	  NULL,
+	  N_("Toggles whether the RSVP field is displayed"),
+	  G_CALLBACK (action_view_rsvp_cb),
+	  FALSE },
+
+	{ "view-status",
+	  NULL,
+	  N_("_Status Field"),
+	  NULL,
+	  N_("Toggles whether the Status field is displayed"),
+	  G_CALLBACK (action_view_status_cb),
+	  FALSE },
+
+	{ "view-type",
+	  NULL,
+	  N_("_Type Field"),
+	  NULL,
+	  N_("Toggles whether the Attendee Type is displayed"),
+	  G_CALLBACK (action_view_type_cb),
+	  FALSE }
+};
+
+static void
+comp_editor_set_property (GObject *object,
+                          guint property_id,
+                          const GValue *value,
+                          GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CHANGED:
+			comp_editor_set_changed (
+				COMP_EDITOR (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_CLIENT:
+			comp_editor_set_client (
+				COMP_EDITOR (object),
+				g_value_get_object (value));
+			return;
+
+		case PROP_FLAGS:
+			comp_editor_set_flags (
+				COMP_EDITOR (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_SUMMARY:
+			comp_editor_set_summary (
+				COMP_EDITOR (object),
+				g_value_get_string (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+comp_editor_get_property (GObject *object,
+                          guint property_id,
+                          GValue *value,
+                          GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_CHANGED:
+			g_value_set_boolean (
+				value, comp_editor_get_changed (
+				COMP_EDITOR (object)));
+			return;
+
+		case PROP_CLIENT:
+			g_value_set_object (
+				value, comp_editor_get_client (
+				COMP_EDITOR (object)));
+			return;
+
+		case PROP_FLAGS:
+			g_value_set_int (
+				value, comp_editor_get_flags (
+				COMP_EDITOR (object)));
+			return;
+
+		case PROP_SUMMARY:
+			g_value_set_string (
+				value, comp_editor_get_summary (
+				COMP_EDITOR (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+comp_editor_dispose (GObject *object)
+{
+	CompEditorPrivate *priv;
+
+	priv = COMP_EDITOR_GET_PRIVATE (object);
+
+	if (priv->client) {
+		g_object_unref (priv->client);
+		priv->client = NULL;
+	}
+
+	if (priv->source_client) {
+		g_object_unref (priv->source_client);
+		priv->source_client = NULL;
+	}
+
+	if (priv->view) {
+		g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
+						      G_SIGNAL_MATCH_DATA,
+						      0, 0, NULL, NULL,
+						      object);
+
+		g_object_unref (priv->view);
+		priv->view = NULL;
+	}
+
+	/* We want to destroy the pages after the widgets get destroyed,
+	   since they have lots of signal handlers connected to the widgets
+	   with the pages as the data. */
+	g_list_foreach (priv->pages, (GFunc) g_object_unref, NULL);
+	g_list_free (priv->pages);
+	priv->pages = NULL;
+
+	if (priv->comp) {
+		g_object_unref (priv->comp);
+		priv->comp = NULL;
+	}
+
+	if (priv->manager != NULL) {
+		g_object_unref (priv->manager);
+		priv->manager = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (comp_editor_parent_class)->dispose (object);
+}
+
+static void
+comp_editor_finalize (GObject *object)
+{
+	CompEditorPrivate *priv;
+
+	priv = COMP_EDITOR_GET_PRIVATE (object);
+
+	g_free (priv->summary);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (comp_editor_parent_class)->finalize (object);
+}
+
+static void
+comp_editor_map (GtkWidget *widget)
+{
+	CompEditor *editor = COMP_EDITOR (widget);
+	GConfBridge *bridge = gconf_bridge_get ();
+	GtkAction *action;
+
+	/* Give subclasses a chance to construct their pages before
+	 * we fiddle with their widgets.  That's why we don't do this
+	 * until after object construction. */
+
+	action = comp_editor_get_action (editor, "view-categories");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_CATEGORIES,
+		G_OBJECT (action), "active");
+
+	action = comp_editor_get_action (editor, "view-role");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_ROLE,
+		G_OBJECT (action), "active");
+
+	action = comp_editor_get_action (editor, "view-rsvp");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_RSVP,
+		G_OBJECT (action), "active");
+
+	action = comp_editor_get_action (editor, "view-status");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_STATUS,
+		G_OBJECT (action), "active");
+
+	action = comp_editor_get_action (editor, "view-time-zone");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_TIMEZONE,
+		G_OBJECT (action), "active");
+
+	action = comp_editor_get_action (editor, "view-type");
+	gconf_bridge_bind_property (
+		bridge, CALENDAR_CONFIG_SHOW_TYPE,
+		G_OBJECT (action), "active");
+
+	/* Chain up to parent's map() method. */
+	GTK_WIDGET_CLASS (comp_editor_parent_class)->map (widget);
+}
+
+static void
+comp_editor_class_init (CompEditorClass *class)
+{
+	GObjectClass *object_class;
+	GtkWidgetClass *widget_class;
+	int i;
+
+	for (i = 0; i < G_N_ELEMENTS (drag_info); i++)
+		drag_info[i].atom = gdk_atom_intern(drag_info[i].target, FALSE);
+
+	g_type_class_add_private (class, sizeof (CompEditorPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = comp_editor_set_property;
+	object_class->get_property = comp_editor_get_property;
+	object_class->dispose = comp_editor_dispose;
+	object_class->finalize = comp_editor_finalize;
+
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->map = comp_editor_map;
+
+	class->help_section = "usage-calendar";
+	class->edit_comp = real_edit_comp;
+	class->send_comp = real_send_comp;
+	class->object_created = NULL;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_CHANGED,
+		g_param_spec_boolean (
+			"changed",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_CLIENT,
+		g_param_spec_object (
+			"client",
+			NULL,
+			NULL,
+			E_TYPE_CAL,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	/* FIXME: Use a proper flags type instead of int. */
+	g_object_class_install_property (
+		object_class,
+		PROP_FLAGS,
+		g_param_spec_int (
+			"flags",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE |
+			G_PARAM_CONSTRUCT));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_SUMMARY,
+		g_param_spec_string (
+			"summary",
+			NULL,
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	comp_editor_signals[OBJECT_CREATED] =
+		g_signal_new ("object_created",
+			      G_TYPE_FROM_CLASS (class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (CompEditorClass, object_created),
+			      NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE, 0);
+}
+
+static void
+comp_editor_init (CompEditor *editor)
+{
+	CompEditorPrivate *priv;
+	GtkActionGroup *action_group;
+	GtkAction *action;
+	GError *error = NULL;
+
+	editor->priv = priv = COMP_EDITOR_GET_PRIVATE (editor);
+
+	priv->pages = NULL;
+	priv->changed = FALSE;
+	priv->needs_send = FALSE;
+	priv->mod = CALOBJ_MOD_ALL;
+ 	priv->existing_org = FALSE;
+ 	priv->user_org = FALSE;
+ 	priv->warned = FALSE;
+	priv->is_group_item = FALSE;
+
+	priv->attachment_bar = e_attachment_bar_new (NULL);
+	priv->manager = gtk_ui_manager_new ();
+
+	action_group = gtk_action_group_new ("core");
+	gtk_action_group_set_translation_domain (
+		action_group, GETTEXT_PACKAGE);
+	gtk_action_group_add_actions (
+		action_group, core_entries,
+		G_N_ELEMENTS (core_entries), editor);
+	gtk_ui_manager_insert_action_group (
+		priv->manager, action_group, 0);
+	g_object_unref (action_group);
+
+	action_group = gtk_action_group_new ("individual");
+	gtk_action_group_set_translation_domain (
+		action_group, GETTEXT_PACKAGE);
+	gtk_action_group_add_actions (
+		action_group, individual_entries,
+		G_N_ELEMENTS (individual_entries), editor);
+	gtk_action_group_add_toggle_actions (
+		action_group, individual_toggle_entries,
+		G_N_ELEMENTS (individual_toggle_entries), editor);
+	gtk_action_group_add_radio_actions (
+		action_group, classification_radio_entries,
+		G_N_ELEMENTS (classification_radio_entries),
+		E_CAL_COMPONENT_CLASS_PUBLIC,
+		NULL, NULL);  /* no callback */
+	action = e_attachment_bar_recent_action_new (
+		E_ATTACHMENT_BAR (priv->attachment_bar),
+		"attach-recent", _("Recent Docu_ments"));
+	gtk_action_group_add_action (action_group, action);
+	gtk_ui_manager_insert_action_group (
+		priv->manager, action_group, 0);
+	g_object_unref (action_group);
+
+	action_group = gtk_action_group_new ("coordinated");
+	gtk_action_group_set_translation_domain (
+		action_group, GETTEXT_PACKAGE);
+	gtk_action_group_add_toggle_actions (
+		action_group, coordinated_toggle_entries,
+		G_N_ELEMENTS (coordinated_toggle_entries), editor);
+	gtk_ui_manager_insert_action_group (
+		priv->manager, action_group, 0);
+	g_object_unref (action_group);
+
+	/* Fine Tuning */
+
+	action = comp_editor_get_action (editor, "attach");
+	g_object_set (G_OBJECT (action), "short-label", _("Attach"), NULL);
+
+	/* Desensitize the "save" action. */
+	action = comp_editor_get_action (editor, "save");
+	gtk_action_set_sensitive (action, FALSE);
+
+	gtk_ui_manager_add_ui_from_string (priv->manager, ui, -1, &error);
+	if (error != NULL) {
+		g_warning ("%s: %s", G_STRFUNC, error->message);
+		g_error_free (error);
+	}
+
+	setup_widgets (editor);
+
+	/* DND support */
+	gtk_drag_dest_set (GTK_WIDGET (editor), GTK_DEST_DEFAULT_ALL,  drop_types, num_drop_types, GDK_ACTION_COPY|GDK_ACTION_ASK|GDK_ACTION_MOVE);
+	g_signal_connect(editor, "drag_data_received", G_CALLBACK (drag_data_received), NULL);
+	g_signal_connect(editor, "drag-motion", G_CALLBACK(drag_motion), editor);
+
+	gtk_window_set_type_hint (GTK_WINDOW (editor), GDK_WINDOW_TYPE_HINT_NORMAL);
+}
+
+static gboolean
+prompt_and_save_changes (CompEditor *editor, gboolean send)
+{
+	CompEditorPrivate *priv;
+	gboolean read_only, correct = FALSE;
+	ECalComponent *comp;
+	ECalComponentText text;
+
+	priv = editor->priv;
+
+	if (!priv->changed)
+		return TRUE;
+
+	switch (save_component_dialog (GTK_WINDOW(editor), priv->comp)) {
+	case GTK_RESPONSE_YES: /* Save */
+		if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) {
+			e_error_run ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (editor)), "calendar:prompt-read-only-cal-editor", e_source_peek_name (e_cal_get_source (priv->client)), NULL);
+			/* don't discard changes when selected readonly calendar */
+			return FALSE;
+		}
+
+		comp = comp_editor_get_current_comp (editor, &correct);
+		e_cal_component_get_summary (comp, &text);
+		g_object_unref (comp);
+
+		if (!correct)
+			return FALSE;
+
+		if (!text.value)
+			if (!send_component_prompt_subject ((GtkWindow *) editor, priv->client, priv->comp))
+				return FALSE;
+
+		if (e_cal_component_is_instance (priv->comp))
+			if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor), FALSE))
+				return FALSE;
+
+		if (send && save_comp_with_send (editor))
+			return TRUE;
+		else if (!send && save_comp (editor))
+			return TRUE;
+		else
+			return FALSE;
+	case GTK_RESPONSE_NO: /* Discard */
+		return TRUE;
+	case GTK_RESPONSE_CANCEL: /* Cancel */
+	default:
+		return FALSE;
+	}
+}
+
+static int
+delete_event_cb (GtkWidget *widget,
+                 GdkEvent *event,
+                 CompEditor *editor)
+{
+	commit_all_fields (editor);
+
+	if (prompt_and_save_changes (editor, TRUE))
+		close_dialog (editor);
+
+	return TRUE;
+}
+
+static void
+attachment_bar_changed_cb (EAttachmentBar *bar,
+                           CompEditor *editor)
+{
+	guint attachment_num = e_attachment_bar_get_num_attachments (
+		E_ATTACHMENT_BAR (editor->priv->attachment_bar));
+	if (attachment_num) {
+		gchar *num_text = g_strdup_printf (
+			ngettext ("<b>%d</b> Attachment", "<b>%d</b> Attachments", attachment_num),
+			attachment_num);
+		gtk_label_set_markup (GTK_LABEL (editor->priv->attachment_expander_num),
+				      num_text);
+		g_free (num_text);
+
+		gtk_widget_show (editor->priv->attachment_expander_icon);
+		e_expander_set_expanded(E_EXPANDER(editor->priv->attachment_expander),TRUE);
+
+	} else {
+		gtk_label_set_text (GTK_LABEL (editor->priv->attachment_expander_num), "");
+		gtk_widget_hide (editor->priv->attachment_expander_icon);
+		e_expander_set_expanded(E_EXPANDER(editor->priv->attachment_expander),FALSE);
+	}
+
+
+	/* Mark the editor as changed so it prompts about unsaved
+           changes on close */
+	comp_editor_set_changed (editor, TRUE);
+
+}
+
+static void
+attachment_expander_activate_cb (EExpander *expander,
+				 void *data)
+{
+	CompEditor *editor = COMP_EDITOR (data);
+	gboolean show = e_expander_get_expanded (expander);
+
+	/* Update the expander label */
+	if (show)
+		gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
+					          _("Hide Attachment _Bar"));
+	else
+		gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label),
+						  _("Show Attachment _Bar"));
+}
+
+static gboolean
 open_attachment (EAttachmentBar *bar, CompEditor *editor)
 {
 	GnomeIconList *icon_list;
@@ -1186,380 +2092,107 @@
 	t->target.widget = (GtkWidget *)bar;
 	menu = e_popup_create_menu_once((EPopup *)ecp, (EPopupTarget *)t, 0);
 
-	if (event == NULL)
-		gtk_menu_popup(menu, NULL, NULL, cab_popup_position, bar, 0, gtk_get_current_event_time());
-	else
-		gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time);
-}
-
-/* GtkWidget methods.  */
-
-static gboolean
-popup_menu_event (GtkWidget *widget)
-{
-	cab_popup((EAttachmentBar *)widget, NULL, -1);
-	return TRUE;
-}
-
-
-static int
-button_press_event (GtkWidget *widget, GdkEventButton *event)
-{
-	EAttachmentBar *bar = (EAttachmentBar *)widget;
-	GnomeIconList *icon_list = GNOME_ICON_LIST(widget);
-	int icon_number = -1;
-
-	if (event->button != 3)
-		return FALSE;
-
-	if (!gnome_icon_list_get_selection (icon_list)) {
-		icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
-		if (icon_number >= 0) {
-			gnome_icon_list_unselect_all(icon_list);
-			gnome_icon_list_select_icon (icon_list, icon_number);
-		}
-	}
-
-	cab_popup(bar, event, icon_number);
-
-	return TRUE;
-}
-
-static gint
-key_press_event(GtkWidget *widget, GdkEventKey *event)
-{
-	EAttachmentBar *bar = (EAttachmentBar *)widget;
-	if (event->keyval == GDK_Delete) {
-                e_attachment_bar_remove_selected (bar);
-                return TRUE;
-        }
-
-        return FALSE;
-}
-
-static gint
-editor_key_press_event(GtkWidget *widget, GdkEventKey *event, CompEditor *editor)
-{
-        if (event->keyval == GDK_Escape) {
-		commit_all_fields (editor);
-
-		if (prompt_and_save_changes (editor, TRUE))
-			close_dialog (editor);
-
-                return TRUE;
-        }
-
-        return FALSE;
-}
-/* Menu callbacks */
-static void
-menu_file_save_cb (BonoboUIComponent *uic,
-		   void *data,
-		   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-	ECalComponentText text;
-	gboolean delegated = FALSE;
-	gboolean read_only, correct = FALSE;
-	ECalComponent *comp;
-
-	if (e_attachment_bar_get_download_count (E_ATTACHMENT_BAR (editor->priv->attachment_bar)) ){
-		gboolean response = 1;
-	/*FIXME: Cannot use mail functions from calendar!!!! */
-#if 0
-		ECalComponentVType vtype = e_cal_component_get_vtype(editor->priv->comp);
-
-		if (vtype == E_CAL_COMPONENT_EVENT)
-			response = em_utils_prompt_user((GtkWindow *)widget,
-							 NULL,
-							 "calendar:ask-send-event-pending-download",
-							  NULL);
-		else
-			response = em_utils_prompt_user((GtkWindow *)widget,
-							 NULL,
-							 "calendar:ask-send-task-pending-download",
-							  NULL);
-#endif
-	if (!response)
-		return;
-	}
-
-	if (!e_cal_is_read_only (priv->client, &read_only, NULL) || read_only) {
-		e_error_run ((GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (editor)), "calendar:prompt-read-only-cal-editor", e_source_peek_name (e_cal_get_source (priv->client)), NULL);
-		return;
-	}
-
-	commit_all_fields (editor);
-	if (e_cal_component_is_instance (priv->comp))
-		if (!recur_component_dialog (priv->client, priv->comp, &priv->mod, GTK_WINDOW (editor), delegated))
-			return;
-
-	comp = comp_editor_get_current_comp (editor, &correct);
-	e_cal_component_get_summary (comp, &text);
-	g_object_unref (comp);
-
-	if (!correct)
-		return;
-
-	if (!text.value)
-		if (!send_component_prompt_subject ((GtkWindow *) editor, priv->client, priv->comp))
-			return;
-	if (save_comp_with_send (editor))
-		close_dialog (editor);
-
-}
-
-static void
-menu_file_print_cb (BonoboUIComponent *uic,
-		   void *data,
-		   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-	ECalComponent *comp;
-	GList *l;
-	icalcomponent *icalcomp = e_cal_component_get_icalcomponent (priv->comp);
-
-	comp = e_cal_component_new ();
-	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
-
-	for (l = priv->pages; l != NULL; l = l->next)
-		 comp_editor_page_fill_component (l->data, comp);
-
-	print_comp (comp, priv->client, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
-
-	g_object_unref (comp);
-}
-
-static void
-menu_file_print_preview_cb (BonoboUIComponent *uic,
-		   void *data,
-		   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-	ECalComponent *comp;
-	GList *l;
-	icalcomponent *icalcomp = e_cal_component_get_icalcomponent (priv->comp);
-
-	comp = e_cal_component_new ();
-	e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
-	for (l = priv->pages; l != NULL; l = l->next)
-		 comp_editor_page_fill_component (l->data, comp);
-	print_comp (comp, priv->client, TRUE);
-
-	g_object_unref (comp);
-}
-
-static void
-menu_file_close_cb (BonoboUIComponent *uic,
-		   void *data,
-		   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-
-	commit_all_fields (editor);
-
-	if (prompt_and_save_changes (editor, TRUE))
-		close_dialog (editor);
-}
-
-static void
-menu_edit_copy_cb (BonoboUIComponent *uic,
-		   void *data,
-		   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-
-	if (GTK_IS_ENTRY (priv->focused_entry))
-		gtk_editable_copy_clipboard (GTK_EDITABLE (priv->focused_entry));
-	if (GTK_IS_TEXT_VIEW (priv->focused_entry))
-		g_signal_emit_by_name (priv->focused_entry, "copy-clipboard");
-}
-
-static void
-menu_edit_paste_cb (BonoboUIComponent *uic,
-		    void *data,
-		    const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-
-	if (GTK_IS_ENTRY (priv->focused_entry))
-		gtk_editable_paste_clipboard (GTK_EDITABLE (priv->focused_entry));
-	if (GTK_IS_TEXT_VIEW (priv->focused_entry))
-		g_signal_emit_by_name (priv->focused_entry, "paste-clipboard");
-
-
-}
-
-static void
-menu_edit_selectall_cb (BonoboUIComponent *uic,
-			void *data,
-			const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	CompEditorPrivate *priv = editor->priv;
-
-	if (GTK_IS_ENTRY (priv->focused_entry)) {
-		gtk_editable_set_position (GTK_EDITABLE (priv->focused_entry), -1);
-		gtk_editable_select_region (GTK_EDITABLE (priv->focused_entry), 0, -1);
-	}
-	if (GTK_IS_TEXT_VIEW (priv->focused_entry))
-		g_signal_emit_by_name (priv->focused_entry, "select-all", TRUE);
-}
-
-static void
-menu_edit_cut_cb (BonoboUIComponent *uic,
-		  void *data,
-		  const char *path)
-{
-	CompEditor *editor = data;
-	CompEditorPrivate *priv = editor->priv;
-
-	if (GTK_IS_ENTRY (priv->focused_entry))
-		gtk_editable_cut_clipboard (GTK_EDITABLE (priv->focused_entry));
-	if (GTK_IS_TEXT_VIEW (priv->focused_entry))
-		g_signal_emit_by_name (priv->focused_entry, "cut-clipboard");
-
-
-}
-
-static void
-add_to_bar (CompEditor *editor, GPtrArray *file_list, int is_inline)
-{
-	CompEditorPrivate *priv = editor->priv;
-	int i;
-
-	for (i = 0; i < file_list->len; i++) {
-		CamelURL *url;
-
-		if (!(url = camel_url_new (file_list->pdata[i], NULL)))
-			continue;
-
-		if (!g_ascii_strcasecmp (url->protocol, "file")) {
-			e_attachment_bar_attach((EAttachmentBar *)priv->attachment_bar, url->path, is_inline ? "inline" : "attachment");
-		} else {
-			e_attachment_bar_attach_remote_file ((EAttachmentBar *)priv->attachment_bar, file_list->pdata[i], is_inline ? "inline" : "attachment");
-		}
-
-		camel_url_free (url);
-	}
+	if (event == NULL)
+		gtk_menu_popup(menu, NULL, NULL, cab_popup_position, bar, 0, gtk_get_current_event_time());
+	else
+		gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event->button, event->time);
 }
 
-static void
-menu_insert_attachment_cb (BonoboUIComponent *uic,
-		   	   void *data,
-		   	   const char *path)
-{
-	CompEditor *editor = (CompEditor *) data;
-	GPtrArray *file_list;
-	gboolean is_inline = FALSE;
-	int i;
-
-	file_list = comp_editor_select_file_attachments (editor, &is_inline);
-
-	if (file_list) {
-		add_to_bar (editor, file_list, is_inline);
+/* GtkWidget methods.  */
 
-		for (i = 0; i < file_list->len; i++)
-			g_free (file_list->pdata[i]);
+static gboolean
+popup_menu_event (EAttachmentBar *bar)
+{
+	cab_popup (bar, NULL, -1);
 
-		g_ptr_array_free (file_list, TRUE);
-	}
+	return TRUE;
 }
 
-static void
-menu_insert_attach_recent_docs_cb (BonoboUIComponent *uic,
-				   gpointer user_data,
-				   const char *cname)
-{
-	CompEditor *editor = (CompEditor *) user_data;
-	gchar *command = NULL, *uri = NULL;
-	GPtrArray *file_list = g_ptr_array_new ();
-	int i;
 
-	command = g_strdup_printf ("/commands/%s", cname);
-	uri = bonobo_ui_component_get_prop (editor->uic, command, "uri", NULL);
-	g_free (command);
+static int
+button_press_event (EAttachmentBar *bar,
+                    GdkEventButton *event)
+{
+	GnomeIconList *icon_list = GNOME_ICON_LIST (bar);
+	int icon_number = -1;
+
+	if (event->button != 3)
+		return FALSE;
 
-	if (uri && *uri) {
-		g_ptr_array_add (file_list, uri);
-		add_to_bar (editor, file_list, FALSE);
+	if (!gnome_icon_list_get_selection (icon_list)) {
+		icon_number = gnome_icon_list_get_icon_at (icon_list, event->x, event->y);
+		if (icon_number >= 0) {
+			gnome_icon_list_unselect_all(icon_list);
+			gnome_icon_list_select_icon (icon_list, icon_number);
+		}
 	}
 
-	for (i = 0; i < file_list->len; i++)
-		g_free (file_list->pdata[i]);
-	g_ptr_array_free (file_list, TRUE);
+	cab_popup(bar, event, icon_number);
+
+	return TRUE;
 }
 
-static void
-menu_help_cb (BonoboUIComponent *uic,
-	      void *data,
-	      const char *path)
+static gint
+key_press_event (EAttachmentBar *bar,
+                 GdkEventKey *event)
 {
-	CompEditor *editor = (CompEditor *) data;
+	if (event->keyval == GDK_Delete) {
+                e_attachment_bar_remove_selected (bar);
+                return TRUE;
+        }
 
-	comp_editor_show_help (editor);
+        return FALSE;
 }
 
-static BonoboUIVerb verbs [] = {
-
-	BONOBO_UI_VERB ("FileSave", menu_file_save_cb),
-	BONOBO_UI_VERB ("CalendarPrint", menu_file_print_cb),
-	BONOBO_UI_VERB ("CalendarPrintPreview", menu_file_print_preview_cb),
-	BONOBO_UI_VERB ("FileClose", menu_file_close_cb),
-
-	BONOBO_UI_VERB ("EditCopy", menu_edit_copy_cb),
-	BONOBO_UI_VERB ("EditPaste", menu_edit_paste_cb),
-	BONOBO_UI_VERB ("EditCut", menu_edit_cut_cb),
-	BONOBO_UI_VERB ("EditSelectAll", menu_edit_selectall_cb),
-	BONOBO_UI_VERB ("InsertAttachments", menu_insert_attachment_cb),
+static gint
+editor_key_press_event (CompEditor *editor,
+                        GdkEventKey *event)
+{
+        if (event->keyval == GDK_Escape) {
+		commit_all_fields (editor);
 
-	BONOBO_UI_VERB ("Help", menu_help_cb),
+		if (prompt_and_save_changes (editor, TRUE))
+			close_dialog (editor);
 
-	BONOBO_UI_VERB_END
-};
+                return TRUE;
+        }
 
-static EPixmap pixmaps[] = {
-	E_PIXMAP ("/commands/FileSave", "document-save", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/FileClose", "window-close", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/EditCut", "edit-cut", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/EditCopy", "edit-copy", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/EditPaste", "edit-paste", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/InsertAttachments", "mail-attachment", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/Help", "help-contents", E_ICON_SIZE_MENU),
-
-	E_PIXMAP ("/Toolbar/FileSave", "document-save", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/FileClose", "window-close", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/InsertAttachments", "mail-attachment", E_ICON_SIZE_LARGE_TOOLBAR),
+        return FALSE;
+}
 
-	E_PIXMAP_END
-};
+/* Menu callbacks */
 
-/* Creates the basic in the editor */
 static void
 setup_widgets (CompEditor *editor)
 {
 	CompEditorPrivate *priv;
-	GtkWidget *expander_hbox, *vbox;
-	GdkPixbuf *attachment_pixbuf;
+	GtkWidget *expander_hbox;
+	GtkWidget *widget;
+	GtkWidget *vbox;
 
 	priv = editor->priv;
 
 	/* Useful vbox */
 	vbox = gtk_vbox_new (FALSE, 0);
-	bonobo_window_set_contents (BONOBO_WINDOW (editor), vbox);
+	gtk_container_add (GTK_CONTAINER (editor), vbox);
 	gtk_widget_show (vbox);
 
+	/* Main Menu */
+	widget = comp_editor_get_managed_widget (editor, "/main-menu");
+	gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
+	gtk_widget_show (widget);
+
+	/* Main Toolbar */
+	widget = comp_editor_get_managed_widget (editor, "/main-toolbar");
+	gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
+	gtk_widget_show (widget);
+
 	/* Notebook */
-	priv->notebook = GTK_NOTEBOOK (gtk_notebook_new ());
-	gtk_widget_show (GTK_WIDGET (priv->notebook));
-	gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (priv->notebook),
-			    TRUE, TRUE, 0);
-	gtk_notebook_set_show_tabs (priv->notebook, FALSE);
+	widget = gtk_notebook_new ();
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (widget), FALSE);
+	gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 0);
+	gtk_widget_show (widget);
+	priv->notebook = GTK_NOTEBOOK (widget);
 
 	g_signal_connect (editor, "delete_event", G_CALLBACK (delete_event_cb), editor);
 	g_signal_connect (editor, "key_press_event", G_CALLBACK (editor_key_press_event), editor);
@@ -1571,8 +2204,6 @@
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->attachment_scrolled_window),
 					GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
-	priv->attachment_bar = e_attachment_bar_new (NULL);
-
 	g_signal_connect (priv->attachment_bar, "button_press_event", G_CALLBACK (button_press_event), NULL);
         g_signal_connect (priv->attachment_bar, "key_press_event", G_CALLBACK (key_press_event), NULL);
         g_signal_connect (priv->attachment_bar, "popup-menu", G_CALLBACK (popup_menu_event), NULL);
@@ -1593,11 +2224,9 @@
 	gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_num), 1.0, 0.5);
 	expander_hbox = gtk_hbox_new (FALSE, 0);
 
-	attachment_pixbuf = e_icon_factory_get_icon ("mail-attachment", E_ICON_SIZE_MENU);
-	priv->attachment_expander_icon = gtk_image_new_from_pixbuf (attachment_pixbuf);
+	priv->attachment_expander_icon = gtk_image_new_from_icon_name ("mail-attachment", GTK_ICON_SIZE_MENU);
 	gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_icon), 1, 0.5);
 	gtk_widget_set_size_request (priv->attachment_expander_icon, 100, -1);
-	g_object_unref (attachment_pixbuf);
 
 	gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_label,
 			    TRUE, TRUE, 0);
@@ -1614,151 +2243,24 @@
 	atk_object_set_description (gtk_widget_get_accessible (priv->attachment_expander), _("Press space key to toggle attachment bar"));
 	gtk_container_add (GTK_CONTAINER (priv->attachment_expander), priv->attachment_scrolled_window);
 
-	gtk_box_pack_start (GTK_BOX (vbox), priv->attachment_expander, FALSE, FALSE, GNOME_PAD_SMALL);
+	gtk_box_pack_start (GTK_BOX (vbox), priv->attachment_expander, FALSE, FALSE, 4);
 	gtk_widget_show (priv->attachment_expander);
 	e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), FALSE);
 	g_signal_connect_after (priv->attachment_expander, "activate",
 				G_CALLBACK (attachment_expander_activate_cb), editor);
 }
 
-/* Object initialization function for the calendar component editor */
-static void
-comp_editor_init (CompEditor *editor)
-{
-	CompEditorPrivate *priv;
-	BonoboUIContainer *container;
-	char *xmlfile;
-
-	priv = g_new0 (CompEditorPrivate, 1);
-	editor->priv = priv;
-
-	setup_widgets (editor);
-
-	priv->focused_entry = NULL;
-	priv->pages = NULL;
-	priv->changed = FALSE;
-	priv->needs_send = FALSE;
-	priv->mod = CALOBJ_MOD_ALL;
- 	priv->existing_org = FALSE;
- 	priv->user_org = FALSE;
- 	priv->warned = FALSE;
-	priv->is_group_item = FALSE;
-	priv->help_section = g_strdup ("usage-calendar");
-
-	container = bonobo_window_get_ui_container (BONOBO_WINDOW (editor));
-	editor->uic = bonobo_ui_component_new_default ();
-	/* FIXME: handle bonobo exceptions */
-	bonobo_ui_component_set_container (editor->uic, bonobo_object_corba_objref (BONOBO_OBJECT (container)), NULL);
-
-	bonobo_ui_component_add_verb_list_with_data (editor->uic, verbs, editor);
-
-	bonobo_ui_component_freeze (editor->uic, NULL);
-
-	xmlfile = g_build_filename (EVOLUTION_UIDIR,
-				    "evolution-editor.xml",
-				    NULL);
-	bonobo_ui_util_set_ui (editor->uic, PREFIX,
-			       xmlfile,
-			       "evolution-editor", NULL);
-	g_free (xmlfile);
-
-	e_pixmaps_update (editor->uic, pixmaps);
-	bonobo_ui_component_thaw (editor->uic, NULL);
-
-	bonobo_ui_component_set_prop (editor->uic, "/commands/FileSave", "sensitive", "0", NULL);
-
-	/* FIXME: this should have been setup_widgets, but editor->uic is uninitialized then */
-	e_attachment_bar_bonobo_ui_populate_with_recent (editor->uic, "/menu/Insert/RecentDocsPlaceholder", 
-							 E_ATTACHMENT_BAR (priv->attachment_bar), 
-							 menu_insert_attach_recent_docs_cb, editor);
-
-	/* DND support */
-	gtk_drag_dest_set (GTK_WIDGET (editor), GTK_DEST_DEFAULT_ALL,  drop_types, num_drop_types, GDK_ACTION_COPY|GDK_ACTION_ASK|GDK_ACTION_MOVE);
-	g_signal_connect(editor, "drag_data_received", G_CALLBACK (drag_data_received), NULL);
-	g_signal_connect(editor, "drag-motion", G_CALLBACK(drag_motion), editor);
-
-	gtk_window_set_type_hint (GTK_WINDOW (editor), GDK_WINDOW_TYPE_HINT_NORMAL);
-}
-
-
-static gint
-comp_editor_key_press_event (GtkWidget *d, GdkEventKey *e)
-{
-#if 0
-	if (e->keyval == GDK_Escape) {
-		if (prompt_and_save_changes (COMP_EDITOR (d), TRUE))
-			close_dialog (COMP_EDITOR (d));
-		return TRUE;
-	}
-#endif
-
-	if (GTK_WIDGET_CLASS (comp_editor_parent_class)->key_press_event)
-		return (* GTK_WIDGET_CLASS (comp_editor_parent_class)->key_press_event) (d, e);
-
-	return FALSE;
-}
-
-/* Destroy handler for the calendar component editor */
-static void
-comp_editor_finalize (GObject *object)
-{
-	CompEditor *editor;
-	CompEditorPrivate *priv;
-	GList *l;
-
-	editor = COMP_EDITOR (object);
-	priv = editor->priv;
-
-	g_free (priv->help_section);
-
-	if (priv->client) {
-		g_object_unref (priv->client);
-		priv->client = NULL;
-	}
-
-	if (priv->source_client) {
-		g_object_unref (priv->source_client);
-		priv->source_client = NULL;
-	}
-
-	if (priv->view) {
-		g_signal_handlers_disconnect_matched (G_OBJECT (priv->view),
-						      G_SIGNAL_MATCH_DATA,
-						      0, 0, NULL, NULL,
-						      editor);
-
-		g_object_unref (priv->view);
-		priv->view = NULL;
-	}
-
-	/* We want to destroy the pages after the widgets get destroyed,
-	   since they have lots of signal handlers connected to the widgets
-	   with the pages as the data. */
-	for (l = priv->pages; l != NULL; l = l->next)
-		g_object_unref (l->data);
-
-	if (priv->comp) {
-		g_object_unref (priv->comp);
-		priv->comp = NULL;
-	}
-
-	g_free (priv);
-	editor->priv = NULL;
-
-	if (G_OBJECT_CLASS (comp_editor_parent_class)->finalize)
-		(* G_OBJECT_CLASS (comp_editor_parent_class)->finalize) (object);
-}
 
 static void
 comp_editor_show_help (CompEditor *editor)
 {
+	CompEditorClass *class;
 	GError *error = NULL;
-	CompEditorPrivate *priv;
 
-	priv = editor->priv;
+	class = COMP_EDITOR_GET_CLASS (editor);
+	g_return_if_fail (class->help_section != NULL);
 
-	gnome_help_display (
-		"evolution.xml", priv->help_section, &error);
+	gnome_help_display ("evolution.xml", class->help_section, &error);
 	if (error != NULL) {
 		g_warning ("%s", error->message);
 		g_error_free (error);
@@ -1766,30 +2268,11 @@
 }
 
 
-static void
-delete_comp (CompEditor *editor)
-{
-	CompEditorPrivate *priv;
-	const char *uid;
-
-	priv = editor->priv;
-
-	e_cal_component_get_uid (priv->comp, &uid);
-	if (e_cal_component_is_instance (priv->comp)|| e_cal_component_has_recurrences (priv->comp))
-		e_cal_remove_object_with_mod (priv->client, uid, NULL,
-				CALOBJ_MOD_ALL, NULL);
-	else
-		e_cal_remove_object (priv->client, uid, NULL);
-	close_dialog (editor);
-}
-
 /* Closes the dialog box and emits the appropriate signals */
 static void
 close_dialog (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
+	CompEditorPrivate *priv = editor->priv;
 
 	/* FIXME Unfortunately we do this here because otherwise corba
 	   calls happen during destruction and we might get a change
@@ -1806,79 +2289,122 @@
 void
 comp_editor_set_existing_org (CompEditor *editor, gboolean existing_org)
 {
-	CompEditorPrivate *priv;
-
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
 
-	priv = editor->priv;
-
-	priv->existing_org = existing_org;
+	editor->priv->existing_org = existing_org;
 }
 
 gboolean
 comp_editor_get_existing_org (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	g_return_val_if_fail (editor != NULL, FALSE);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
-	priv = editor->priv;
-
-	return priv->existing_org;
+	return editor->priv->existing_org;
 }
 
 void
-comp_editor_set_user_org (CompEditor *editor, gboolean user_org)
+comp_editor_set_user_org (CompEditor *editor,
+                          gboolean user_org)
 {
-	CompEditorPrivate *priv;
-
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
 
-	priv = editor->priv;
-
-	priv->user_org = user_org;
+	editor->priv->user_org = user_org;
 }
 
 gboolean
 comp_editor_get_user_org (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	g_return_val_if_fail (editor != NULL, FALSE);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
-	priv = editor->priv;
+	return editor->priv->user_org;
+}
+
+void
+comp_editor_set_group_item (CompEditor *editor,
+                            gboolean group_item)
+{
+	g_return_if_fail (IS_COMP_EDITOR (editor));
+
+	editor->priv->is_group_item = group_item;
+}
+
+gboolean
+comp_editor_get_group_item (CompEditor *editor)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
-	return priv->user_org;
+	return editor->priv->is_group_item;
 }
 
 void
-comp_editor_set_group_item (CompEditor *editor, gboolean group_item)
+comp_editor_set_classification (CompEditor *editor,
+                                ECalComponentClassification classification)
 {
-	CompEditorPrivate *priv;
+	GtkAction *action;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
 
-	priv = editor->priv;
+	switch (classification) {
+		case E_CAL_COMPONENT_CLASS_PUBLIC:
+		case E_CAL_COMPONENT_CLASS_PRIVATE:
+		case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
+			break;
+		default:
+			classification = E_CAL_COMPONENT_CLASS_PUBLIC;
+			break;
+	}
 
-	priv->is_group_item = group_item;
+	action = comp_editor_get_action (editor, "classify-public");
+	gtk_radio_action_set_current_value (
+		GTK_RADIO_ACTION (action), classification);
 }
 
-gboolean
-comp_editor_get_group_item (CompEditor *editor)
+ECalComponentClassification
+comp_editor_get_classification (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
+	GtkAction *action;
 
-	g_return_val_if_fail (editor != NULL, FALSE);
-	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), 0);
 
-	priv = editor->priv;
+	action = comp_editor_get_action (editor, "classify-public");
+	return gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
+}
+
+void
+comp_editor_set_summary (CompEditor *editor,
+                         const gchar *summary)
+{
+	gboolean show_warning;
+
+	g_return_if_fail (IS_COMP_EDITOR (editor));
+
+	g_free (editor->priv->summary);
+	editor->priv->summary = g_strdup (summary);
+
+	show_warning =
+		!editor->priv->warned &&
+		editor->priv->existing_org &&
+		!editor->priv->user_org;
+
+	if (show_warning) {
+		e_notice (
+			editor->priv->notebook, GTK_MESSAGE_INFO,
+			_("Changes made to this item may be "
+			  "discarded if an update arrives"));
+		editor->priv->warned = TRUE;
+	}
+
+	update_window_border (editor, summary);
+
+	g_object_notify (G_OBJECT (editor), "summary");
+}
+
+const gchar *
+comp_editor_get_summary (CompEditor *editor)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
 
-	return priv->is_group_item;
+	return editor->priv->summary;
 }
 
 /**
@@ -1889,16 +2415,33 @@
  * Set the dialog changed state to the given value
  **/
 void
-comp_editor_set_changed (CompEditor *editor, gboolean changed)
+comp_editor_set_changed (CompEditor *editor,
+                         gboolean changed)
 {
-	CompEditorPrivate *priv;
+	GtkAction *action;
+	gboolean show_warning;
 
-	priv = editor->priv;
+	g_return_if_fail (IS_COMP_EDITOR (editor));
+
+	editor->priv->changed = changed;
 
-	priv->changed = changed;
+	action = comp_editor_get_action (editor, "save");
+	g_return_if_fail (action != NULL);
+	gtk_action_set_sensitive (action, changed);
 
-	bonobo_ui_component_set_prop (editor->uic, "/commands/FileSave", "sensitive", changed ? "1" : "0"
-			, NULL);
+	show_warning =
+		changed && !editor->priv->warned &&
+		editor->priv->existing_org && !editor->priv->user_org;
+
+	if (show_warning) {
+		e_notice (
+			editor->priv->notebook, GTK_MESSAGE_INFO,
+			_("Changes made to this item may be "
+			  "discarded if an update arrives"));
+		editor->priv->warned = TRUE;
+	}
+
+	g_object_notify (G_OBJECT (editor), "changed");
 }
 
 /**
@@ -1913,40 +2456,100 @@
 gboolean
 comp_editor_get_changed (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
+
+	return editor->priv->changed;
+}
+
+void
+comp_editor_set_flags (CompEditor *editor,
+                       CompEditorFlags flags)
+{
+	g_return_if_fail (IS_COMP_EDITOR (editor));
+
+	editor->priv->flags = flags;
+
+	g_object_notify (G_OBJECT (editor), "flags");
+}
+
+
+CompEditorFlags
+comp_editor_get_flags (CompEditor *editor)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
+
+	return editor->priv->flags;
+}
+
+GtkUIManager *
+comp_editor_get_ui_manager (CompEditor *editor)
+{
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+
+	return editor->priv->manager;
+}
+
+GtkAction *
+comp_editor_get_action (CompEditor *editor,
+                        const gchar *action_name)
+{
+	GtkAction *action = NULL;
+	GList *iter;
 
-	priv = editor->priv;
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+	g_return_val_if_fail (action_name != NULL, NULL);
+
+	iter = gtk_ui_manager_get_action_groups (editor->priv->manager);
+	while (iter != NULL && action == NULL) {
+		GtkActionGroup *action_group = iter->data;
 
-	return priv->changed;
+		action = gtk_action_group_get_action (
+			action_group, action_name);
+		iter = g_list_next (iter);
+	}
+	g_return_val_if_fail (action != NULL, NULL);
+
+	return action;
 }
 
-void
-comp_editor_set_flags (CompEditor *editor, CompEditorFlags flags)
+GtkActionGroup *
+comp_editor_get_action_group (CompEditor *editor,
+                              const gchar *group_name)
 {
+	GList *iter;
 
-	CompEditorPrivate *priv;
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+	g_return_val_if_fail (group_name != NULL, NULL);
 
-	g_return_if_fail (editor != NULL);
-	g_return_if_fail (IS_COMP_EDITOR (editor));
+	iter = gtk_ui_manager_get_action_groups (editor->priv->manager);
+	while (iter != NULL) {
+		GtkActionGroup *action_group = iter->data;
+		const gchar *name;
 
-	priv = editor->priv;
+		name = gtk_action_group_get_name (action_group);
+		if (strcmp (name, group_name) == 0)
+			return action_group;
+		iter = g_list_next (iter);
+	}
 
-	priv->flags = flags;
+	g_return_val_if_reached (NULL);
 }
 
-
-CompEditorFlags
-comp_editor_get_flags (CompEditor *editor)
+GtkWidget *
+comp_editor_get_managed_widget (CompEditor *editor,
+                                const gchar *widget_path)
 {
+	GtkUIManager *manager;
+	GtkWidget *widget;
 
-	CompEditorPrivate *priv;
-
-	g_return_val_if_fail (editor != NULL, FALSE);
-	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+	g_return_val_if_fail (widget_path != NULL, NULL);
 
-	priv = editor->priv;
+	manager = comp_editor_get_ui_manager (editor);
+	widget = gtk_ui_manager_get_widget (manager, widget_path);
+	g_return_val_if_fail (widget != NULL, NULL);
 
-	return priv->flags;
+	return widget;
 }
 
 /**
@@ -1957,13 +2560,12 @@
  * Set the dialog needs send state to the given value
  **/
 void
-comp_editor_set_needs_send (CompEditor *editor, gboolean needs_send)
+comp_editor_set_needs_send (CompEditor *editor,
+                            gboolean needs_send)
 {
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
+	g_return_if_fail (IS_COMP_EDITOR (editor));
 
-	priv->needs_send = needs_send;
+	editor->priv->needs_send = needs_send;
 }
 
 /**
@@ -1978,15 +2580,14 @@
 gboolean
 comp_editor_get_needs_send (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
-	return priv->needs_send;
+	return editor->priv->needs_send;
 }
 
-static void page_mapped_cb (GtkWidget *page_widget,
-			    CompEditorPage *page)
+static void
+page_mapped_cb (GtkWidget *page_widget,
+                CompEditorPage *page)
 {
 	GtkWidget *toplevel;
 
@@ -2000,8 +2601,9 @@
 	}
 }
 
-static void page_unmapped_cb (GtkWidget *page_widget,
-			      CompEditorPage *page)
+static void
+page_unmapped_cb (GtkWidget *page_widget,
+                  CompEditorPage *page)
 {
 	GtkWidget *toplevel;
 
@@ -2036,18 +2638,13 @@
 	GtkWidget *label_widget = NULL;
 	gboolean is_first_page;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
-	g_return_if_fail (page != NULL);
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
 
 	priv = editor->priv;
 
 	g_object_ref (page);
 
-	/* set the flags */
-	page->flags = priv->flags;
-
 	/* If we are editing something, fill the widgets with current info */
 	if (priv->comp != NULL) {
 		ECalComponent *comp;
@@ -2071,24 +2668,18 @@
 		gtk_notebook_append_page (priv->notebook, page_widget, label_widget);
 
 	/* Listen for things happening on the page */
-	g_signal_connect(page, "changed",
-			    G_CALLBACK (page_changed_cb), editor);
-	g_signal_connect(page, "needs_send",
-			    G_CALLBACK (needs_send_cb), editor);
-	g_signal_connect(page, "summary_changed",
-			    G_CALLBACK (page_summary_changed_cb), editor);
-	g_signal_connect(page, "dates_changed",
-			    G_CALLBACK (page_dates_changed_cb), editor);
-	g_signal_connect(page, "focus_in",
-			        G_CALLBACK (page_focus_in_widget_cb), editor);
-	g_signal_connect(page, "focus_out",
-				G_CALLBACK (page_focus_out_widget_cb), editor);
+	g_signal_connect_swapped (
+		page, "dates_changed",
+		G_CALLBACK (page_dates_changed_cb), editor);
+
 	/* Listen for when the page is mapped/unmapped so we can
 	   install/uninstall the appropriate GtkAccelGroup. */
-	g_signal_connect((page_widget), "map",
-			    G_CALLBACK (page_mapped_cb), page);
-	g_signal_connect((page_widget), "unmap",
-			    G_CALLBACK (page_unmapped_cb), page);
+	g_signal_connect (
+		page_widget, "map",
+		G_CALLBACK (page_mapped_cb), page);
+	g_signal_connect(
+		page_widget, "unmap",
+		G_CALLBACK (page_unmapped_cb), page);
 
 	/* The first page is the main page of the editor, so we ask it to focus
 	 * its main widget.
@@ -2111,9 +2702,7 @@
 	GtkWidget *page_widget;
 	gint page_num;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
-	g_return_if_fail (page != NULL);
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
 
 	priv = editor->priv;
@@ -2147,9 +2736,7 @@
 	GtkWidget *page_widget;
 	gint page_num;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
-	g_return_if_fail (page != NULL);
 	g_return_if_fail (IS_COMP_EDITOR_PAGE (page));
 
 	priv = editor->priv;
@@ -2160,28 +2747,35 @@
 }
 
 /**
- * comp_editor_set_e_cal:
+ * comp_editor_set_client:
  * @editor: A component editor
  * @client: The calendar client to use
  *
  * Sets the calendar client used by the editor to update components
  **/
 void
-comp_editor_set_e_cal (CompEditor *editor, ECal *client)
+comp_editor_set_client (CompEditor *editor,
+                        ECal *client)
 {
-	CompEditorClass *klass;
-
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
+	g_return_if_fail (client == NULL || E_IS_CAL (client));
+
+	if (client != NULL)
+		g_object_ref (client);
+
+	if (editor->priv->client != NULL)
+		g_object_unref (editor->priv->client);
 
-	klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
+	editor->priv->client = client;
 
-	if (klass->set_e_cal)
-		klass->set_e_cal (editor, client);
+	if (editor->priv->source_client == NULL && client != NULL)
+		editor->priv->source_client = g_object_ref (client);
+
+	g_object_notify (G_OBJECT (editor), "client");
 }
 
 /**
- * comp_editor_get_e_cal:
+ * comp_editor_get_client:
  * @editor: A component editor
  *
  * Returns the calendar client of the editor
@@ -2189,177 +2783,11 @@
  * Return value: The calendar client of the editor
  **/
 ECal *
-comp_editor_get_e_cal (CompEditor *editor)
+comp_editor_get_client (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	g_return_val_if_fail (editor != NULL, NULL);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
 
-	priv = editor->priv;
-
-	return priv->client;
-}
-
-void
-comp_editor_set_help_section (CompEditor *editor, const char *section)
-{
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
-
-	g_free (priv->help_section);
-	priv->help_section = g_strdup (section);
-}
-
-/* Creates an appropriate title for the event editor dialog */
-static char *
-make_title_from_comp (ECalComponent *comp, gboolean is_group_item)
-{
-	char *title;
-	const char *type_string;
-	ECalComponentVType type;
-	ECalComponentText text;
-
-	if (!comp)
-		return g_strdup (_("Edit Appointment"));
-
-	type = e_cal_component_get_vtype (comp);
-	switch (type) {
-	case E_CAL_COMPONENT_EVENT:
-		if (is_group_item)
-			type_string = _("Meeting - %s");
-		else
-			type_string = _("Appointment - %s");
-		break;
-	case E_CAL_COMPONENT_TODO:
-		if (is_group_item)
-			type_string = _("Assigned Task - %s");
-		else
-			type_string = _("Task - %s");
-		break;
-	case E_CAL_COMPONENT_JOURNAL:
-		type_string = _("Memo - %s");
-		break;
-	default:
-		g_message ("make_title_from_comp(): Cannot handle object of type %d", type);
-		return NULL;
-	}
-
-	e_cal_component_get_summary (comp, &text);
-	if (text.value) {
-		title = g_strdup_printf (type_string, text.value);
-	} else {
-		title = g_strdup_printf (type_string, _("No summary"));
-	}
-
-	return title;
-}
-
-/* Creates an appropriate title for the event editor dialog */
-static char *
-make_title_from_string (ECalComponent *comp, const char *str, gboolean is_group_item)
-{
-	char *title;
-	const char *type_string;
-	ECalComponentVType type;
-
-	if (!comp)
-		return g_strdup (_("Edit Appointment"));
-
-	type = e_cal_component_get_vtype (comp);
-	switch (type) {
-	case E_CAL_COMPONENT_EVENT:
-		if (is_group_item)
-			type_string = _("Meeting - %s");
-		else
-			type_string = _("Appointment - %s");
-		break;
-	case E_CAL_COMPONENT_TODO:
-		if (is_group_item)
-			type_string = _("Assigned Task - %s");
-		else
-			type_string = _("Task - %s");
-		break;
-	case E_CAL_COMPONENT_JOURNAL:
-		type_string = _("Memo - %s");
-		break;
-	default:
-		g_message ("make_title_from_string(): Cannot handle object of type %d", type);
-		return NULL;
-	}
-
-	if (str) {
-		title = g_strdup_printf (type_string, str);
-	} else {
-		title = g_strdup_printf (type_string, _("No summary"));
-	}
-
-	return title;
-}
-
-static const char *
-make_icon_from_comp (ECalComponent *comp)
-{
-	ECalComponentVType type;
-
-	if (!comp)
-		return "stock_calendar";
-
-	type = e_cal_component_get_vtype (comp);
-	switch (type) {
-	case E_CAL_COMPONENT_EVENT:
-		return "appointment-new";
-	case E_CAL_COMPONENT_TODO:
-		return "stock_task";
-	case E_CAL_COMPONENT_JOURNAL:
-		return "stock_insert-note";
-	default:
-		return "stock_calendar";
-	}
-}
-
-/* Sets the event editor's window title from a calendar component */
-static void
-set_title_from_comp (CompEditor *editor)
-{
-	CompEditorPrivate *priv;
-	char *title;
-
-	priv = editor->priv;
-	title = make_title_from_comp (priv->comp, priv->is_group_item);
-	gtk_window_set_title (GTK_WINDOW (editor), title);
-	g_free (title);
-}
-
-static void
-set_title_from_string (CompEditor *editor, const char *str)
-{
-	CompEditorPrivate *priv;
-	char *title;
-
-	priv = editor->priv;
-	title = make_title_from_string (priv->comp, str, priv->is_group_item);
-	gtk_window_set_title (GTK_WINDOW (editor), title);
-	g_free (title);
-}
-
-static void
-set_icon_from_comp (CompEditor *editor)
-{
-	CompEditorPrivate *priv;
-	const char *icon_name;
-	GList *icon_list;
-
-	priv = editor->priv;
-	icon_name = make_icon_from_comp (priv->comp);
-
-	icon_list = e_icon_factory_get_icon_list (icon_name);
-	if (icon_list) {
-		gtk_window_set_icon_list (GTK_WINDOW (editor), icon_list);
-		g_list_foreach (icon_list, (GFunc) g_object_unref, NULL);
-		g_list_free (icon_list);
-	}
+	return editor->priv->client;
 }
 
 static void
@@ -2479,45 +2907,11 @@
 }
 
 static void
-real_set_e_cal (CompEditor *editor, ECal *client)
-{
-	CompEditorPrivate *priv;
-	GList *elem;
-
-	g_return_if_fail (editor != NULL);
-	g_return_if_fail (IS_COMP_EDITOR (editor));
-
-	priv = editor->priv;
-
-	if (client == priv->client)
-		return;
-
-	if (client) {
-		g_return_if_fail (E_IS_CAL (client));
-		g_return_if_fail (e_cal_get_load_state (client) ==
-				  E_CAL_LOAD_LOADED);
-		g_object_ref (client);
-	}
-
-	if (priv->client)
-		g_object_unref (priv->client);
-
-	priv->client = client;
-	if (!priv->source_client)
-		priv->source_client = g_object_ref (client);
-
-	/* Pass the client to any pages that need it. */
-	for (elem = priv->pages; elem; elem = elem->next)
-		comp_editor_page_set_e_cal (elem->data, client);
-}
-
-static void
 real_edit_comp (CompEditor *editor, ECalComponent *comp)
 {
 	CompEditorPrivate *priv;
 	const char *uid;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
 
 	priv = editor->priv;
@@ -2534,8 +2928,7 @@
  	priv->user_org = (itip_organizer_is_user (comp, priv->client) || itip_sentby_is_user (comp));
  	priv->warned = FALSE;
 
-	set_title_from_comp (editor);
-	set_icon_from_comp (editor);
+	update_window_border (editor, NULL);
 	e_cal_component_get_uid (comp, &uid);
 
 	fill_widgets (editor);
@@ -2607,14 +3000,15 @@
 real_send_comp (CompEditor *editor, ECalComponentItipMethod method)
 {
 	CompEditorPrivate *priv;
+	CompEditorFlags flags;
 	ECalComponent *send_comp = NULL;
 	char *address = NULL;
 	GList *users = NULL;
 
-	g_return_val_if_fail (editor != NULL, FALSE);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
 	priv = editor->priv;
+	flags = comp_editor_get_flags (editor);
 
 	if (priv->mod == CALOBJ_MOD_ALL && e_cal_component_is_instance (priv->comp)) {
 		/* Ensure we send the master object, not the instance only */
@@ -2639,7 +3033,7 @@
 		get_users_from_memo_comp (send_comp, &users);
 
 	/* The user updates the delegated status to the Organizer, so remove all other attendees */
-	if ((priv->flags & COMP_EDITOR_DELEGATE)) {
+	if (flags & COMP_EDITOR_DELEGATE) {
 		address = itip_get_comp_attendee (send_comp, priv->client);
 
 		if (address)
@@ -2695,30 +3089,23 @@
 void
 comp_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
 {
-	CompEditorClass *klass;
+	CompEditorClass *class;
 
-	g_return_if_fail (editor != NULL);
 	g_return_if_fail (IS_COMP_EDITOR (editor));
-	g_return_if_fail (comp != NULL);
 	g_return_if_fail (E_IS_CAL_COMPONENT (comp));
 
-	klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
+	class = COMP_EDITOR_GET_CLASS (editor);
 
-	if (klass->edit_comp)
-		klass->edit_comp (editor, comp);
+	if (class->edit_comp)
+		class->edit_comp (editor, comp);
 }
 
 ECalComponent *
 comp_editor_get_comp (CompEditor *editor)
 {
-	CompEditorPrivate *priv;
-
-	g_return_val_if_fail (editor != NULL, NULL);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
 
-	priv = editor->priv;
-
-	return priv->comp;
+	return editor->priv->comp;
 }
 
 /**
@@ -2737,7 +3124,6 @@
 	GList *l;
 	gboolean all_ok = TRUE;
 
-	g_return_val_if_fail (editor != NULL, NULL);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
 
 	priv = editor->priv;
@@ -2775,7 +3161,20 @@
 void
 comp_editor_delete_comp (CompEditor *editor)
 {
-	delete_comp (editor);
+	CompEditorPrivate *priv;
+	const char *uid;
+
+	g_return_if_fail (IS_COMP_EDITOR (editor));
+
+	priv = editor->priv;
+
+	e_cal_component_get_uid (priv->comp, &uid);
+	if (e_cal_component_is_instance (priv->comp)|| e_cal_component_has_recurrences (priv->comp))
+		e_cal_remove_object_with_mod (priv->client, uid, NULL,
+				CALOBJ_MOD_ALL, NULL);
+	else
+		e_cal_remove_object (priv->client, uid, NULL);
+	close_dialog (editor);
 }
 
 /**
@@ -2788,15 +3187,14 @@
 gboolean
 comp_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
 {
-	CompEditorClass *klass;
+	CompEditorClass *class;
 
-	g_return_val_if_fail (editor != NULL, FALSE);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
-	klass = COMP_EDITOR_CLASS (G_OBJECT_GET_CLASS (editor));
+	class = COMP_EDITOR_GET_CLASS (editor);
 
-	if (klass->send_comp)
-		return klass->send_comp (editor, method);
+	if (class->send_comp)
+		return class->send_comp (editor, method);
 
 	return FALSE;
 }
@@ -2806,7 +3204,6 @@
 {
 	gboolean close;
 
-	g_return_val_if_fail (editor != NULL, FALSE);
 	g_return_val_if_fail (IS_COMP_EDITOR (editor), FALSE);
 
 	commit_all_fields (editor);
@@ -2870,150 +3267,16 @@
 	return attach_list;
 }
 
-/* Brings attention to a window by raising it and giving it focus */
-static void
-raise_and_focus (GtkWidget *widget)
-{
-	g_return_if_fail (GTK_WIDGET_REALIZED (widget));
-	gdk_window_show (widget->window);
-	gtk_widget_grab_focus (widget);
-}
-
-/**
- * comp_editor_focus:
- * @editor: A component editor
- *
- * Brings the editor window to the front and gives it focus
- **/
-void
-comp_editor_focus (CompEditor *editor)
-{
-	g_return_if_fail (editor != NULL);
-	g_return_if_fail (IS_COMP_EDITOR (editor));
-
-	gtk_widget_show (GTK_WIDGET (editor));
-	raise_and_focus (GTK_WIDGET (editor));
-}
-
-/**
- * comp_editor_notify_client_changed:
- * @editor: A component editor.
- *
- * Makes an editor emit the "client_changed" signal.
- **/
-void
-comp_editor_notify_client_changed (CompEditor *editor, ECal *client)
-{
-	GList *l;
-	CompEditorPrivate *priv;
-	gboolean read_only;
-
-	g_return_if_fail (editor != NULL);
-	g_return_if_fail (IS_COMP_EDITOR (editor));
-
-	priv = editor->priv;
-
-	priv->changed = TRUE;
-
-	g_object_unref (priv->client);
-	priv->client = client;
-
-	comp_editor_set_e_cal (editor, client);
-	for (l = priv->pages; l != NULL; l = l->next)
-		comp_editor_page_notify_client_changed (COMP_EDITOR_PAGE (l->data), client);
-
-	if (!e_cal_is_read_only (client, &read_only, NULL))
-		read_only = TRUE;
-
-	/* FIXME: SRINI: Disable widgets */
-}
-
-static void
-page_changed_cb (GtkObject *obj, gpointer data)
-{
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
-
-	comp_editor_set_changed (editor, TRUE);
-
-	if (!priv->warned && priv->existing_org && !priv->user_org) {
-		e_notice (priv->notebook, GTK_MESSAGE_INFO,
-			  _("Changes made to this item may be discarded if an update arrives"));
-		priv->warned = TRUE;
-	}
-
-}
-
-static void
-needs_send_cb (GtkObject *obj, gpointer data)
-{
-	CompEditor *editor = COMP_EDITOR (data);
-
-	comp_editor_set_needs_send (editor, TRUE);
-}
-
-/* Focus out widget callback */
-static void
-page_focus_out_widget_cb (GtkObject *obj, GtkWidget *widget, gpointer data)
-{
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
-
-	priv->focused_entry = NULL;
-}
-
-/* Focus in widget callback*/
-static void
-page_focus_in_widget_cb (GtkObject *obj, GtkWidget *widget, gpointer data)
-{
-
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
-
-	priv->focused_entry = widget;
-}
-/* Page signal callbacks */
-static void
-page_summary_changed_cb (GtkObject *obj, const char *summary, gpointer data)
-{
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
-	GList *l;
-
-	priv = editor->priv;
-
-	for (l = priv->pages; l != NULL; l = l->next)
-		if (obj != l->data)
-			comp_editor_page_set_summary (l->data, summary);
-
-	if (!priv->warned && priv->existing_org && !priv->user_org) {
-		e_notice (priv->notebook, GTK_MESSAGE_INFO,
-			  _("Changes made to this item may be discarded if an update arrives"));
-		priv->warned = TRUE;
-	}
-
-	set_title_from_string (editor, summary);
-}
-
 static void
-page_dates_changed_cb (GtkObject *obj,
+page_dates_changed_cb (CompEditor *editor,
 		       CompEditorPageDates *dates,
-		       gpointer data)
+                       CompEditorPage *page)
 {
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
+	CompEditorPrivate *priv = editor->priv;
 	GList *l;
 
-	priv = editor->priv;
-
 	for (l = priv->pages; l != NULL; l = l->next)
-		if (obj != l->data)
+		if (page != (CompEditorPage *) l->data)
 			comp_editor_page_set_dates (l->data, dates);
 
 	if (!priv->warned && priv->existing_org && !priv->user_org) {
@@ -3024,9 +3287,10 @@
 }
 
 static void
-obj_modified_cb (ECal *client, GList *objects, gpointer data)
+obj_modified_cb (ECal *client,
+                 GList *objects,
+                 CompEditor *editor)
 {
-	CompEditor *editor = COMP_EDITOR (data);
 	CompEditorPrivate *priv;
 	ECalComponent *comp = NULL;
 
@@ -3059,12 +3323,11 @@
 }
 
 static void
-obj_removed_cb (ECal *client, GList *uids, gpointer data)
+obj_removed_cb (ECal *client,
+                GList *uids,
+                CompEditor *editor)
 {
-	CompEditor *editor = COMP_EDITOR (data);
-	CompEditorPrivate *priv;
-
-	priv = editor->priv;
+	CompEditorPrivate *priv = editor->priv;
 
 	if (changed_component_dialog ((GtkWindow *) editor, priv->comp, TRUE, priv->changed))
 		close_dialog (editor);

Modified: branches/kill-bonobo/calendar/gui/dialogs/comp-editor.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/comp-editor.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/comp-editor.h	Tue Jul 15 18:34:59 2008
@@ -22,42 +22,56 @@
 #define COMP_EDITOR_H
 
 #include <gtk/gtk.h>
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
 #include <libecal/e-cal.h>
 #include "../itip-utils.h"
 #include "comp-editor-page.h"
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_COMP_EDITOR \
+	(comp_editor_get_type ())
+#define COMP_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_COMP_EDITOR, CompEditor))
+#define COMP_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_COMP_EDITOR, CompEditorClass))
+#define IS_COMP_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_COMP_EDITOR))
+#define IS_COMP_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), TYPE_COMP_EDITOR))
+#define COMP_EDITOR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_COMP_EDITOR, CompEditorClass))
 
-#define TYPE_COMP_EDITOR            (comp_editor_get_type ())
-#define COMP_EDITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_COMP_EDITOR, CompEditor))
-#define COMP_EDITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_COMP_EDITOR, CompEditorClass))
-#define IS_COMP_EDITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_COMP_EDITOR))
-#define IS_COMP_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_COMP_EDITOR))
+G_BEGIN_DECLS
 
+typedef struct _CompEditor CompEditor;
+typedef struct _CompEditorClass CompEditorClass;
 typedef struct _CompEditorPrivate CompEditorPrivate;
 
-typedef struct {
-	BonoboWindow object;
-
-	/* Private data */
+struct _CompEditor {
+	GtkWindow parent;
 	CompEditorPrivate *priv;
-	BonoboUIComponent *uic;
-} CompEditor;
+};
 
-typedef struct {
-	BonoboWindowClass parent_class;
+struct _CompEditorClass {
+	GtkWindowClass parent_class;
+	const gchar *help_section;
 
 	/* Virtual functions */
-	void (* set_e_cal) (CompEditor *page, ECal *client);
-	void (* edit_comp) (CompEditor *page, ECalComponent *comp);
-	void (* object_created) (CompEditor *page);
-	gboolean (* send_comp) (CompEditor *page, ECalComponentItipMethod method);
-} CompEditorClass;
+	void (*edit_comp) (CompEditor *page, ECalComponent *comp);
+	void (*object_created) (CompEditor *page);
+	gboolean (*send_comp) (CompEditor *page, ECalComponentItipMethod method);
+
+	void (*show_categories) (CompEditor *editor, gboolean visible);
+	void (*show_role) (CompEditor *editor, gboolean visible);
+	void (*show_rsvp) (CompEditor *editor, gboolean visible);
+	void (*show_status) (CompEditor *editor, gboolean visible);
+	void (*show_time_zone) (CompEditor *editor, gboolean visible);
+	void (*show_type) (CompEditor *editor, gboolean visible);
+};
 
 typedef enum {
 	COMP_EDITOR_NEW_ITEM = 1<<0,
@@ -68,55 +82,69 @@
 	COMP_EDITOR_IS_SHARED = 1 << 5
 } CompEditorFlags;
 
-GType         comp_editor_get_type         (void);
-void          comp_editor_set_changed      (CompEditor             *editor,
-					    gboolean                changed);
-gboolean      comp_editor_get_changed      (CompEditor             *editor);
-void          comp_editor_set_needs_send   (CompEditor             *editor,
-					    gboolean                needs_send);
-gboolean      comp_editor_get_needs_send   (CompEditor             *editor);
-void          comp_editor_set_existing_org (CompEditor             *editor,
-					    gboolean                existing_org);
-gboolean      comp_editor_get_existing_org (CompEditor             *editor);
-void          comp_editor_set_user_org     (CompEditor             *editor,
-					    gboolean                user_org);
-gboolean      comp_editor_get_user_org     (CompEditor             *editor);
-void          comp_editor_set_group_item     (CompEditor             *editor,
-					    gboolean                is_group_item);
-gboolean      comp_editor_get_group_item     (CompEditor             *editor);
-void          comp_editor_append_page      (CompEditor             *editor,
-					    CompEditorPage         *page,
-					    const char             *label,
-					    gboolean add);
-void          comp_editor_remove_page      (CompEditor             *editor,
-					    CompEditorPage         *page);
-void          comp_editor_show_page        (CompEditor             *editor,
-					    CompEditorPage         *page);
-void          comp_editor_set_e_cal        (CompEditor             *editor,
-					    ECal              *client);
-void          comp_editor_set_help_section (CompEditor             *editor,
-					    const char             *section);
-ECal         *comp_editor_get_e_cal        (CompEditor             *editor);
-void          comp_editor_edit_comp        (CompEditor             *ee,
-					    ECalComponent           *comp);
-ECalComponent *comp_editor_get_comp        (CompEditor             *editor);
-ECalComponent *comp_editor_get_current_comp (CompEditor            *editor,
-					     gboolean              *correct);
-gboolean      comp_editor_save_comp        (CompEditor             *editor,
-					    gboolean                send);
-void          comp_editor_delete_comp      (CompEditor             *editor);
-gboolean      comp_editor_send_comp        (CompEditor             *editor,
-					    ECalComponentItipMethod  method);
-GSList        *comp_editor_get_mime_attach_list (CompEditor        *editor);
-gboolean      comp_editor_close            (CompEditor             *editor);
-void          comp_editor_focus            (CompEditor             *editor);
-
-void          comp_editor_notify_client_changed (CompEditor *editor, ECal *client);
-
-void comp_editor_sensitize_attachment_bar (CompEditor *editor, gboolean set);
-void comp_editor_set_flags (CompEditor *editor, CompEditorFlags flags);
-CompEditorFlags comp_editor_get_flags (CompEditor *editor);
-
+GType		comp_editor_get_type		(void);
+void		comp_editor_set_changed		(CompEditor *editor,
+						 gboolean changed);
+gboolean	comp_editor_get_changed		(CompEditor *editor);
+void		comp_editor_set_needs_send	(CompEditor *editor,
+						 gboolean needs_send);
+gboolean	comp_editor_get_needs_send	(CompEditor *editor);
+void		comp_editor_set_existing_org	(CompEditor *editor,
+						gboolean existing_org);
+gboolean	comp_editor_get_existing_org	(CompEditor *editor);
+void		comp_editor_set_user_org	(CompEditor *editor,
+						gboolean user_org);
+gboolean	comp_editor_get_user_org	(CompEditor *editor);
+void		comp_editor_set_group_item	(CompEditor *editor,
+						 gboolean is_group_item);
+gboolean	comp_editor_get_group_item	(CompEditor *editor);
+void		comp_editor_set_classification	(CompEditor *editor,
+						 ECalComponentClassification classification);
+ECalComponentClassification
+		comp_editor_get_classification	(CompEditor *editor);
+void		comp_editor_set_summary		(CompEditor *editor,
+						 const gchar *summary);
+const gchar *	comp_editor_get_summary		(CompEditor *editor);
+void		comp_editor_append_page		(CompEditor *editor,
+						 CompEditorPage *page,
+						 const gchar *label,
+						 gboolean add);
+void		comp_editor_remove_page		(CompEditor *editor,
+						 CompEditorPage *page);
+void		comp_editor_show_page		(CompEditor *editor,
+						 CompEditorPage *page);
+void		comp_editor_set_client		(CompEditor *editor,
+						 ECal *client);
+ECal *		comp_editor_get_client		(CompEditor *editor);
+void		comp_editor_edit_comp		(CompEditor *ee,
+						 ECalComponent *comp);
+ECalComponent *	comp_editor_get_comp		(CompEditor *editor);
+ECalComponent *	comp_editor_get_current_comp	(CompEditor *editor,
+						 gboolean *correct);
+gboolean	comp_editor_save_comp		(CompEditor *editor,
+						 gboolean send);
+void		comp_editor_delete_comp		(CompEditor *editor);
+gboolean	comp_editor_send_comp		(CompEditor *editor,
+						 ECalComponentItipMethod method);
+GSList *	comp_editor_get_mime_attach_list(CompEditor *editor);
+gboolean	comp_editor_close		(CompEditor *editor);
+
+
+void		comp_editor_sensitize_attachment_bar
+						(CompEditor *editor,
+						 gboolean set);
+void		comp_editor_set_flags		(CompEditor *editor,
+						 CompEditorFlags flags);
+CompEditorFlags
+		comp_editor_get_flags		(CompEditor *editor);
+GtkUIManager *	comp_editor_get_ui_manager	(CompEditor *editor);
+GtkAction *	comp_editor_get_action		(CompEditor *editor,
+						 const gchar *action_name);
+GtkActionGroup *
+		comp_editor_get_action_group	(CompEditor *editor,
+                                            	 const gchar *group_name);
+GtkWidget *	comp_editor_get_managed_widget	(CompEditor *editor,
+						 const gchar *widget_path);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/event-editor.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/event-editor.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/event-editor.c	Tue Jul 15 18:34:59 2008
@@ -30,16 +30,22 @@
 #include <string.h>
 #include <glade/glade.h>
 #include <glib/gi18n.h>
+
 #include <misc/e-dateedit.h>
 #include <e-util/e-icon-factory.h>
+#include <e-util/e-plugin-ui.h>
 #include <e-util/e-util-private.h>
 #include <evolution-shell-component-utils.h>
+
 #include "event-page.h"
 #include "recurrence-page.h"
 #include "schedule-page.h"
 #include "cancel-comp.h"
 #include "event-editor.h"
-#include "../calendar-config.h"
+
+#define EVENT_EDITOR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_EVENT_EDITOR, EventEditorPrivate))
 
 struct _EventEditorPrivate {
 	EventPage *event_page;
@@ -49,620 +55,465 @@
 	GtkWidget *sched_window;
 
 	EMeetingStore *model;
-	gboolean is_meeting;
 	gboolean meeting_shown;
 	gboolean updating;
 };
 
-
+/* Extends the UI definition in CompEditor */
+static const gchar *ui =
+"<ui>"
+"  <menubar action='main-menu'>"
+"    <menu action='view-menu'>"
+"      <menuitem action='view-type'/>"
+"      <menuitem action='view-status'/>"
+"      <menuitem action='view-role'/>"
+"      <menuitem action='view-rsvp'/>"
+"      <separator/>"
+"      <menuitem action='view-time-zone'/>"
+"      <menuitem action='view-categories'/>"
+"    </menu>"
+"    <menu action='insert-menu'>"
+"      <menuitem action='send-options'/>"
+"    </menu>"
+"    <menu action='options-menu'>"
+"      <menuitem action='alarms'/>"
+"      <menuitem action='show-time-busy'/>"
+"      <menuitem action='all-day-event'/>"
+"      <menu action='classification-menu'>"
+"        <menuitem action='classify-public'/>"
+"        <menuitem action='classify-private'/>"
+"        <menuitem action='classify-confidential'/>"
+"      </menu>"
+"      <menuitem action='recurrence'/>"
+"      <menuitem action='free-busy'/>"
+"    </menu>"
+"  </menubar>"
+"  <toolbar name='main-toolbar'>"
+"    <toolitem action='alarms'/>"
+"    <toolitem action='all-day-event'/>"
+"    <toolitem action='recurrence'/>"
+"    <toolitem action='free-busy'/>"
+"  </toolbar>"
+"</ui>";
 
-static void event_editor_set_e_cal (CompEditor *editor, ECal *client);
 static void event_editor_edit_comp (CompEditor *editor, ECalComponent *comp);
 static gboolean event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static void event_editor_finalize (GObject *object);
-
-static void model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
-static gboolean window_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data);
-static void create_schedule_page (EventEditor *ee);
 
 G_DEFINE_TYPE (EventEditor, event_editor, TYPE_COMP_EDITOR)
 
-/* Class initialization function for the event editor */
 static void
-event_editor_class_init (EventEditorClass *klass)
+create_schedule_page (CompEditor *editor)
 {
-	GObjectClass *gobject_class;
-	CompEditorClass *editor_class;
+	EventEditorPrivate *priv;
+	ENameSelector *name_selector;
+	CompEditorPage *page;
 
-	gobject_class = (GObjectClass *) klass;
-	editor_class = (CompEditorClass *) klass;
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
-	editor_class->set_e_cal = event_editor_set_e_cal;
-	editor_class->edit_comp = event_editor_edit_comp;
-	editor_class->send_comp = event_editor_send_comp;
+	priv->sched_window = gtk_dialog_new_with_buttons (
+		_("Free/Busy"), GTK_WINDOW (editor), GTK_DIALOG_MODAL,
+		GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
+
+	g_signal_connect (
+		priv->sched_window, "response",
+		G_CALLBACK (gtk_widget_hide), NULL);
+	g_signal_connect (
+		priv->sched_window, "delete-event",
+		G_CALLBACK (gtk_widget_hide_on_delete), NULL);
 
-	gobject_class->finalize = event_editor_finalize;
-}
+	priv->sched_page = schedule_page_new (priv->model, editor);
+	page = COMP_EDITOR_PAGE (priv->sched_page);
+	g_object_ref_sink (priv->sched_page);
+	gtk_container_add (
+		GTK_CONTAINER (GTK_DIALOG (priv->sched_window)->vbox),
+		comp_editor_page_get_widget (page));
 
-static void
-init_widgets (EventEditor *ee)
-{
-	EventEditorPrivate *priv;
+	name_selector = event_page_get_name_selector (priv->event_page);
+	schedule_page_set_name_selector (priv->sched_page, name_selector);
 
-	priv = ee->priv;
+	comp_editor_append_page (editor, page, NULL, FALSE);
+	schedule_page_update_free_busy (priv->sched_page);
 
-	g_signal_connect((priv->model), "row_changed",
-			    G_CALLBACK (model_row_change_insert_cb), ee);
-	g_signal_connect((priv->model), "row_inserted",
-			    G_CALLBACK (model_row_change_insert_cb), ee);
-	g_signal_connect((priv->model), "row_deleted",
-			    G_CALLBACK (model_row_delete_cb), ee);
+	gtk_widget_show_all (priv->sched_window);
 }
 
 static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
+action_alarms_cb (GtkAction *action,
+                  EventEditor *editor)
 {
-	//set_menu_sens (EVENT_EDITOR (user_data));
+	event_page_show_alarm (editor->priv->event_page);
 }
 
 static void
-menu_view_role_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+action_all_day_event_cb (GtkToggleAction *action,
+                         EventEditor *editor)
 {
-	EventEditor *ee = (EventEditor *) user_data;
+	gboolean active;
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	event_page_set_view_role (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_role (atoi(state));
+	active = gtk_toggle_action_get_active (action);
+	event_page_set_all_day_event (editor->priv->event_page, active);
 }
 
 static void
-menu_view_status_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+action_free_busy_cb (GtkAction *action,
+                     EventEditor *editor)
 {
-	EventEditor *ee = (EventEditor *) user_data;
-
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-
-	event_page_set_view_status (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_status (atoi(state));
+	if (editor->priv->sched_window == NULL)
+		create_schedule_page (COMP_EDITOR (editor));
+	else
+		gtk_widget_show (editor->priv->sched_window);
 }
 
 static void
-menu_view_type_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+action_recurrence_cb (GtkAction *action,
+                      EventEditor *editor)
 {
-	EventEditor *ee = (EventEditor *) user_data;
-
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	event_page_set_view_type (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_type (atoi(state));
+	gtk_widget_show (editor->priv->recur_window);
 }
 
 static void
-menu_view_rsvp_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+action_send_options_cb (GtkAction *action,
+                        EventEditor *editor)
 {
-	EventEditor *ee = (EventEditor *) user_data;
-
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	event_page_set_view_rsvp (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_rsvp (atoi(state));
+	event_page_sendoptions_clicked_cb (editor->priv->event_page);
 }
 
 static void
-menu_action_alarm_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+action_show_time_busy_cb (GtkToggleAction *action,
+                          EventEditor *editor)
 {
-	EventEditor *ee = (EventEditor *) user_data;
+	gboolean active;
 
-	event_page_show_alarm (ee->priv->event_page);
+	active = gtk_toggle_action_get_active (action);
+	event_page_set_show_time_busy (editor->priv->event_page, active);
 }
 
-static void
-menu_show_time_busy_cb (BonoboUIComponent           *component,
-		        const char                  *path,
-		        Bonobo_UIComponent_EventType type,
-		        const char                  *state,
-		        gpointer                     user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
-
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
+static GtkActionEntry event_entries[] = {
 
-	event_page_set_show_time_busy (ee->priv->event_page, atoi(state));
-}
+	{ "alarms",
+	  "appointment-soon",
+	  N_("_Alarms"),
+	  NULL,
+	  N_("Click here to set or unset alarms for this event"),
+	  G_CALLBACK (action_alarms_cb) },
 
-static void
-menu_all_day_event_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
+	{ "recurrence",
+	  "stock_task-recurring",
+	  N_("_Recurrence"),
+	  NULL,
+	  N_("Make this a recurring event"),
+	  G_CALLBACK (action_recurrence_cb) },
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	event_page_set_all_day_event (ee->priv->event_page, atoi(state));
-}
-
-static void
-menu_show_time_zone_cb (BonoboUIComponent           *component,
-		       const char                  *path,
-		       Bonobo_UIComponent_EventType type,
-		       const char                  *state,
-		       gpointer                     user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
+	{ "send-options",
+	  NULL,
+	  N_("Send Options"),
+	  NULL,
+	  N_("Insert advanced send options"),
+	  G_CALLBACK (action_send_options_cb) }
+};
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	event_page_set_show_timezone (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_timezone (atoi(state));
-}
+static GtkToggleActionEntry event_toggle_entries[] = {
 
-static void
-menu_show_categories_cb (BonoboUIComponent           *component,
-		       const char                  *path,
-		       Bonobo_UIComponent_EventType type,
-		       const char                  *state,
-		       gpointer                     user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
+	{ "all-day-event",
+	  "stock_new-24h-appointment",
+	  N_("All _Day Event"),
+	  NULL,
+	  N_("Toggles whether to have All Day Event"),
+	  G_CALLBACK (action_all_day_event_cb),
+	  FALSE },
+
+	{ "show-time-busy",
+	  NULL,
+	  N_("Show Time as _Busy"),
+	  NULL,
+	  N_("Toggles whether to show time as busy"),
+	  G_CALLBACK (action_show_time_busy_cb),
+	  FALSE }
+};
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
+static GtkActionEntry meeting_entries[] = {
 
-	event_page_set_show_categories (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_categories (atoi(state));
-}
+	{ "free-busy",
+	  "query-free-busy",
+	  N_("_Free/Busy"),
+	  NULL,
+	  N_("Query free / busy information for the attendees"),
+	  G_CALLBACK (action_free_busy_cb) }
+};
 
 static void
-menu_class_public_cb (BonoboUIComponent          *ui_component,
-		     const char                  *path,
-		     Bonobo_UIComponent_EventType type,
-		     const char                  *state,
-		     gpointer			  user_data)
+event_editor_client_changed_cb (EventEditor *ee)
 {
-	EventEditor *ee = (EventEditor *) user_data;
-	if (state[0] == '0')
-		return;
-
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (ee->priv->event_page));
+	ECal *client;
 
-	event_page_set_classification (ee->priv->event_page, E_CAL_COMPONENT_CLASS_PUBLIC);
+	client = comp_editor_get_client (COMP_EDITOR (ee));
+	e_meeting_store_set_e_cal (ee->priv->model, client);
 }
 
 static void
-menu_class_private_cb (BonoboUIComponent          *ui_component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer			   user_data)
+event_editor_model_changed_cb (EventEditor *ee)
 {
-	EventEditor *ee = (EventEditor *) user_data;
-	if (state[0] == '0')
-		return;
-
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (ee->priv->event_page));
-
-	event_page_set_classification (ee->priv->event_page, E_CAL_COMPONENT_CLASS_PRIVATE);
+	if (!ee->priv->updating) {
+		comp_editor_set_changed (COMP_EDITOR (ee), TRUE);
+		comp_editor_set_needs_send (COMP_EDITOR (ee), TRUE);
+	}
 }
 
-static void
-menu_class_confidential_cb (BonoboUIComponent          *ui_component,
-		     	   const char                  *path,
-		     	   Bonobo_UIComponent_EventType type,
-		     	   const char                  *state,
-		     	   gpointer			user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
-	if (state[0] == '0')
-		return;
-
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (ee->priv->event_page));
+static GObject *
+event_editor_constructor (GType type,
+                          guint n_construct_properties,
+                          GObjectConstructParam *construct_properties)
+{
+	GObject *object;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	CompEditorPage *page;
+	EventEditorPrivate *priv;
+	GtkActionGroup *action_group;
+	ECal *client;
+	gboolean is_meeting;
 
-	event_page_set_classification (ee->priv->event_page, E_CAL_COMPONENT_CLASS_CONFIDENTIAL);
-}
+	/* Chain up to parent's constructor() method. */
+	object = G_OBJECT_CLASS (event_editor_parent_class)->constructor (
+		type, n_construct_properties, construct_properties);
 
-static void
-menu_action_recurrence_cb (BonoboUIComponent           *ui_component,
-		     	   const char                  *path,
-		     	   Bonobo_UIComponent_EventType type,
-		     	   const char                  *state,
-		     	   gpointer			user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
+	editor = COMP_EDITOR (object);
+	priv = EVENT_EDITOR_GET_PRIVATE (object);
 
-	gtk_widget_show (ee->priv->recur_window);
-}
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+	action_group = comp_editor_get_action_group (editor, "coordinated");
 
-static void
-menu_action_freebusy_cb	(BonoboUIComponent           *ui_component,
-		     	 const char                  *path,
-		     	 Bonobo_UIComponent_EventType type,
-		     	 const char                  *state,
-		     	 gpointer			user_data)
-{
-	EventEditor *ee = (EventEditor *) user_data;
+	is_meeting = flags & COMP_EDITOR_MEETING;
 
-	if (!ee->priv->sched_window)
-		create_schedule_page (ee);
-	else
-		gtk_widget_show (ee->priv->sched_window);
-}
+	gtk_action_group_set_visible (action_group, is_meeting);
 
-static void
-menu_action_alarm_cmd (BonoboUIComponent *uic,
-		    void *data,
-		    const char *path)
-{
-	EventEditor *ee = (EventEditor *) data;
+	priv->event_page = event_page_new (priv->model, editor);
+	g_object_ref_sink (priv->event_page);
+	comp_editor_append_page (
+		editor, COMP_EDITOR_PAGE (priv->event_page),
+		_("Appoint_ment"), TRUE);
+
+	priv->recur_window = gtk_dialog_new_with_buttons (
+		_("Recurrence"), GTK_WINDOW (editor), GTK_DIALOG_MODAL,
+		GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
+	g_signal_connect (
+		priv->recur_window, "response",
+		G_CALLBACK (gtk_widget_hide), NULL);
+	g_signal_connect (
+		priv->recur_window, "delete-event",
+		G_CALLBACK(gtk_widget_hide_on_delete), NULL);
 
-	event_page_show_alarm (ee->priv->event_page);
-}
+	priv->recur_page = recurrence_page_new (editor);
+	page = COMP_EDITOR_PAGE (priv->recur_page);
+	g_object_ref_sink (priv->recur_page);
+	gtk_container_add (
+		GTK_CONTAINER ((GTK_DIALOG (priv->recur_window)->vbox)),
+		comp_editor_page_get_widget (page));
+	gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (priv->recur_window)));
+	comp_editor_append_page (editor, page, NULL, FALSE);
 
-static void
-menu_all_day_event_cmd (BonoboUIComponent *uic,
-	                void *data,
-		        const char *path)
-{
-	/* TODO
-	EventEditor *ee = (EventEditor *) data;
+	if (is_meeting) {
 
-	event_page_set_all_day_event (ee->priv->event_page, atoi(state));*/
-}
+		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
+			event_page_show_options (priv->event_page);
 
-static void
-menu_show_time_zone_cmd (BonoboUIComponent *uic,
-	                 void *data,
-		         const char *path)
-{
-	/* TODO
-	EventEditor *ee = (EventEditor *) data;
+		comp_editor_set_group_item (editor, TRUE);
+  		if (!((flags & COMP_EDITOR_USER_ORG) || (flags & COMP_EDITOR_DELEGATE)|| (flags & COMP_EDITOR_NEW_ITEM))) {
+			GtkAction *action;
 
-	event_page_set_show_timezone (ee->priv->event_page, atoi(state));
-	calendar_config_set_show_timezone (atoi(state)); */
-}
+			action = comp_editor_get_action (editor, "free-busy");
+			gtk_action_set_visible (action, FALSE);
+		}
 
-static void
-menu_action_recurrence_cmd (BonoboUIComponent *uic,
-		   	   void *data,
-		   	   const char *path)
-{
-	EventEditor *ee = (EventEditor *) data;
+		event_page_set_meeting (priv->event_page, TRUE);
+		priv->meeting_shown=TRUE;
+	}
 
-	gtk_widget_show (ee->priv->recur_window);
+	return object;
 }
 
 static void
-create_schedule_page (EventEditor *ee)
+event_editor_dispose (GObject *object)
 {
-	ENameSelector *name_selector;
 	EventEditorPrivate *priv;
-	ECal *ecal = NULL;
 
-	priv = ee->priv;
+	priv = EVENT_EDITOR_GET_PRIVATE (object);
 
-	priv->sched_window = gtk_dialog_new_with_buttons (_("Free/Busy"),
-			(GtkWindow *) ee, GTK_DIALOG_MODAL,
-			"gtk-close", GTK_RESPONSE_CLOSE,
-			NULL);
-	priv->sched_page = schedule_page_new (priv->model);
-	g_object_ref_sink (priv->sched_page);
-	gtk_container_add (GTK_CONTAINER (GTK_DIALOG(priv->sched_window)->vbox), comp_editor_page_get_widget (COMP_EDITOR_PAGE (priv->sched_page)));
+	if (priv->event_page) {
+ 		g_object_unref (priv->event_page);
+		priv->event_page = NULL;
+	}
 
-	g_signal_connect (priv->sched_window, "response", G_CALLBACK(gtk_widget_hide), NULL);
-	g_signal_connect ((GtkWidget *) priv->sched_window, "delete-event", G_CALLBACK(window_delete_event), NULL);
-	name_selector = event_page_get_name_selector (priv->event_page);
-	schedule_page_set_name_selector (priv->sched_page, name_selector);
+	if (priv->recur_page) {
+		g_object_unref (priv->recur_page);
+		priv->recur_page = NULL;
+	}
 
-	ecal = comp_editor_get_e_cal (COMP_EDITOR (ee));
-	comp_editor_page_set_e_cal (COMP_EDITOR_PAGE (priv->sched_page), ecal);
-	comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->sched_page), NULL, FALSE);
-	schedule_page_update_free_busy (priv->sched_page);
+	if (priv->sched_page) {
+		g_object_unref (priv->sched_page);
+		priv->sched_page = NULL;
+	}
 
-	gtk_widget_show_all (priv->sched_window);
+	if (priv->model) {
+		g_object_unref (priv->model);
+		priv->model = NULL;
+	}
 
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (event_editor_parent_class)->dispose (object);
 }
 
 static void
-menu_action_freebusy_cmd (BonoboUIComponent *uic,
-		   	 void *data,
-		   	 const char *path)
+event_editor_show_categories (CompEditor *editor,
+                              gboolean visible)
 {
-	EventEditor *ee = (EventEditor *) data;
+	EventEditorPrivate *priv;
 
-	if (!ee->priv->sched_window)
-		create_schedule_page (ee);
-	else
-		gtk_widget_show (ee->priv->sched_window);
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
+
+	event_page_set_show_categories (priv->event_page, visible);
 }
 
 static void
-menu_insert_send_options_cmd (BonoboUIComponent *uic,
-		   	 void *data,
-		   	 const char *path)
+event_editor_show_role (CompEditor *editor,
+                        gboolean visible)
 {
-	EventEditor *ee = (EventEditor *) data;
-
-	event_page_sendoptions_clicked_cb (ee->priv->event_page);
-}
+	EventEditorPrivate *priv;
 
-static BonoboUIVerb verbs [] = {
-	BONOBO_UI_VERB ("ActionAlarm", menu_action_alarm_cmd),
-	BONOBO_UI_VERB ("ActionAllDayEvent", menu_all_day_event_cmd),
-	BONOBO_UI_VERB ("ViewTimeZone", menu_show_time_zone_cmd),
-	BONOBO_UI_VERB ("ActionRecurrence", menu_action_recurrence_cmd),
-	BONOBO_UI_VERB ("ActionFreeBusy", menu_action_freebusy_cmd),
-	BONOBO_UI_VERB ("InsertSendOptions", menu_insert_send_options_cmd),
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
-	BONOBO_UI_VERB_END
-};
-
-static EPixmap pixmaps[] = {
-	/* NOTE: If adding removing elements in this array, make sure
-	 * the indexes of the two elements where the pathname to the
-	 * icons is filled in at run-time in event_editor_init() are
-	 * updated, too.
-	 */
-	E_PIXMAP ("/commands/ActionAlarm", "stock_alarm", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/ActionRecurrence", "stock_task-recurring", E_ICON_SIZE_MENU),
-
-	E_PIXMAP ("/Toolbar/ActionAlarm", "stock_alarm", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/ActionAllDayEvent", "stock_new-24h-appointment", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/ViewTimeZone", "stock_timezone", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/ActionRecurrence", "stock_task-recurring", E_ICON_SIZE_LARGE_TOOLBAR),
-
-	/* These two will have an absolute path to the png file filled
-	 * in at run-time, see event_editor_init().
-	 */
-	E_PIXMAP ("/Toolbar/ActionFreeBusy", NULL, E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/commands/ActionFreeBusy", NULL, E_ICON_SIZE_MENU),
-	E_PIXMAP_END
-};
+	event_page_set_view_role (priv->event_page, visible);
+}
 
-/* Object initialization function for the event editor */
 static void
-event_editor_init (EventEditor *ee)
+event_editor_show_rsvp (CompEditor *editor,
+                        gboolean visible)
 {
 	EventEditorPrivate *priv;
-	CompEditor *editor = COMP_EDITOR(ee);
-	gboolean status;
-	char *xmlfile;
-
-	priv = g_new0 (EventEditorPrivate, 1);
-	ee->priv = priv;
-
-	priv->model = E_MEETING_STORE (e_meeting_store_new ());
-	priv->meeting_shown = TRUE;
-	priv->updating = FALSE;
-	priv->is_meeting = FALSE;
 
-	bonobo_ui_component_freeze (editor->uic, NULL);
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
-	bonobo_ui_component_add_verb_list_with_data (editor->uic, verbs, ee);
+	event_page_set_view_rsvp (priv->event_page, visible);
+}
 
-	xmlfile = g_build_filename (EVOLUTION_UIDIR,
-				    "evolution-event-editor.xml",
-				    NULL);
-	bonobo_ui_util_set_ui (editor->uic, PREFIX,
-			       xmlfile,
-			       "evolution-event-editor", NULL);
-	g_free (xmlfile);
-
-	/* Hide send options */
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/InsertSendOptions",
-		"hidden", "1", NULL);
-
-	/* Show hide the status fields */
-	status = calendar_config_get_show_status ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewStatus",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewStatus",
-		menu_view_status_cb, editor);
-
-	/* Show hide the type fields */
-	status = calendar_config_get_show_type ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewType",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewType",
-		menu_view_type_cb, editor);
-
-	/* Show hide the role fields */
-	status = calendar_config_get_show_role ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewRole",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewRole",
-		menu_view_role_cb, editor);
-
-	/* Show hide the rsvp fields */
-	status = calendar_config_get_show_rsvp ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewRSVP",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewRSVP",
-		menu_view_rsvp_cb, editor);
-
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionAlarm",
-		menu_action_alarm_cb, editor);
-
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionAllDayEvent",
-		menu_all_day_event_cb, editor);
-
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionShowTimeBusy",
-		menu_show_time_busy_cb, editor);
-
-	status = calendar_config_get_show_timezone ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewTimeZone",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewTimeZone",
-		menu_show_time_zone_cb, editor);
-
-	status = calendar_config_get_show_categories ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewCategories",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewCategories",
-		menu_show_categories_cb, editor);
-
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ActionClassPublic",
-		"state", "1", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPublic",
-		menu_class_public_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPrivate",
-		menu_class_private_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassConfidential",
-		menu_class_confidential_cb, editor);
-
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionRecurrence",
-		menu_action_recurrence_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionFreeBusy",
-		menu_action_freebusy_cb, editor);
-
-	/* NOTE: Make sure the 6 and 7 below correspond to the correct
-	 * elements in the pixmaps array.
-	 */
-	if (!pixmaps[6].name) {
-		pixmaps[6].name = g_build_filename (EVOLUTION_ICONSDIR, "query-free-busy.png", NULL);
-		pixmaps[7].name = g_build_filename (EVOLUTION_ICONSDIR, "query-free-busy.png", NULL);
-	}
-	e_pixmaps_update (editor->uic, pixmaps);
+static void
+event_editor_show_status (CompEditor *editor,
+                          gboolean visible)
+{
+	EventEditorPrivate *priv;
 
-	bonobo_ui_component_thaw (editor->uic, NULL);
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
-	comp_editor_set_help_section (COMP_EDITOR (ee), "usage-calendar-apts");
+	event_page_set_view_status (priv->event_page, visible);
 }
 
-/* Handler for the delete event. It hides the window without destroying it.
-   Connected to the recur dialog and Free busy dialog */
-static gboolean
-window_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+static void
+event_editor_show_time_zone (CompEditor *editor,
+                             gboolean visible)
 {
-	gtk_widget_hide (widget);
+	EventEditorPrivate *priv;
 
-	return TRUE;
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
+
+	event_page_set_show_timezone (priv->event_page, visible);
 }
 
-EventEditor *
-event_editor_construct (EventEditor *ee, ECal *client)
+static void
+event_editor_show_type (CompEditor *editor,
+                        gboolean visible)
 {
 	EventEditorPrivate *priv;
-	CompEditor *editor = COMP_EDITOR (ee);
-	guint32 flags = comp_editor_get_flags (editor);
 
-	priv = ee->priv;
-
-	priv->event_page = event_page_new (priv->model, client, COMP_EDITOR(ee)->uic);
-	g_object_ref_sink (priv->event_page);
-	comp_editor_append_page (COMP_EDITOR (ee),
-				 COMP_EDITOR_PAGE (priv->event_page),
-				 _("Appoint_ment"), TRUE);
-	g_signal_connect (G_OBJECT (priv->event_page), "client_changed",
-			  G_CALLBACK (client_changed_cb), ee);
-
-	priv->recur_window = gtk_dialog_new_with_buttons (_("Recurrence"),
-							  (GtkWindow *) ee, GTK_DIALOG_MODAL,
-							  "gtk-close", GTK_RESPONSE_CLOSE,
-							  NULL);
-	g_signal_connect (priv->recur_window, "response", G_CALLBACK (gtk_widget_hide), NULL);
-	g_signal_connect ((GtkWidget *) priv->recur_window, "delete-event", G_CALLBACK(window_delete_event), NULL);
-	priv->recur_page = recurrence_page_new ();
-	g_object_ref_sink (priv->recur_page);
-	gtk_container_add ((GtkContainer *) (GTK_DIALOG (priv->recur_window)->vbox),
-			comp_editor_page_get_widget (COMP_EDITOR_PAGE (priv->recur_page)));
-	gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (priv->recur_window)));
-	comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->recur_page), NULL, FALSE);
-	if (priv->is_meeting) {
-
-		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
-			event_page_show_options (priv->event_page);
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
-		comp_editor_set_group_item (COMP_EDITOR (ee), TRUE);
-  		if (!((flags & COMP_EDITOR_USER_ORG) || (flags & COMP_EDITOR_DELEGATE)|| (flags & COMP_EDITOR_NEW_ITEM)))
-			bonobo_ui_component_set_prop (editor->uic, "/commands/ActionFreeBusy", "hidden", "1", NULL);
+	event_page_set_view_type (priv->event_page, visible);
+}
 
-		event_page_set_meeting (priv->event_page, TRUE);
-		priv->meeting_shown=TRUE;
-	} else {
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ActionFreeBusy", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewAttendee", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewRole", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewRSVP", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewType", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewStatus", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/menu/View/AttendeeOptions/timezonesep", "hidden", "1", NULL);
-	}
+static void
+event_editor_class_init (EventEditorClass *class)
+{
+	GObjectClass *object_class;
+	CompEditorClass *editor_class;
 
-	comp_editor_set_e_cal (COMP_EDITOR (ee), client);
+	g_type_class_add_private (class, sizeof (EventEditorPrivate));
 
-	init_widgets (ee);
-	gtk_window_set_default_size (GTK_WINDOW (ee), 300, 225);
+	object_class = G_OBJECT_CLASS (class);
+	object_class->constructor = event_editor_constructor;
+	object_class->dispose = event_editor_dispose;
 
-	return ee;
+	editor_class = COMP_EDITOR_CLASS (class);
+	editor_class->help_section = "usage-calendar-apts";
+	editor_class->edit_comp = event_editor_edit_comp;
+	editor_class->send_comp = event_editor_send_comp;
+	editor_class->show_categories = event_editor_show_categories;
+	editor_class->show_role = event_editor_show_role;
+	editor_class->show_rsvp = event_editor_show_rsvp;
+	editor_class->show_status = event_editor_show_status;;
+	editor_class->show_time_zone = event_editor_show_time_zone;
+	editor_class->show_type = event_editor_show_type;
 }
 
 static void
-event_editor_set_e_cal (CompEditor *editor, ECal *client)
+event_editor_init (EventEditor *ee)
 {
-	EventEditor *ee;
-	EventEditorPrivate *priv;
-
-	ee = EVENT_EDITOR (editor);
-	priv = ee->priv;
-
-	e_meeting_store_set_e_cal (priv->model, client);
+	CompEditor *editor = COMP_EDITOR (ee);
+	GtkUIManager *manager;
+	GtkActionGroup *action_group;
+	GtkAction *action;
+	GError *error = NULL;
+
+	ee->priv = EVENT_EDITOR_GET_PRIVATE (ee);
+	ee->priv->model = E_MEETING_STORE (e_meeting_store_new ());
+	ee->priv->meeting_shown = TRUE;
+	ee->priv->updating = FALSE;
+
+	action_group = comp_editor_get_action_group (editor, "individual");
+	gtk_action_group_add_actions (
+		action_group, event_entries,
+		G_N_ELEMENTS (event_entries), ee);
+	gtk_action_group_add_toggle_actions (
+		action_group, event_toggle_entries,
+		G_N_ELEMENTS (event_toggle_entries), ee);
+
+	action_group = comp_editor_get_action_group (editor, "coordinated");
+	gtk_action_group_add_actions (
+		action_group, meeting_entries,
+		G_N_ELEMENTS (meeting_entries), ee);
+
+	manager = comp_editor_get_ui_manager (editor);
+	gtk_ui_manager_add_ui_from_string (manager, ui, -1, &error);
+	e_plugin_ui_register_manager ("event-editor", manager, ee);
+
+	if (error != NULL) {
+		g_critical ("%s: %s", G_STRFUNC, error->message);
+		g_error_free (error);
+	}
+
+	/* Hide send options. */
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_visible (action, FALSE);
+
+	g_signal_connect (
+		ee, "notify::client",
+		G_CALLBACK (event_editor_client_changed_cb), NULL);
+
+	g_signal_connect_swapped (
+		ee->priv->model, "row_changed",
+		G_CALLBACK (event_editor_model_changed_cb), ee);
+	g_signal_connect_swapped (
+		ee->priv->model, "row_inserted",
+		G_CALLBACK (event_editor_model_changed_cb), ee);
+	g_signal_connect_swapped (
+		ee->priv->model, "row_deleted",
+		G_CALLBACK (event_editor_model_changed_cb), ee);
 
-	if (COMP_EDITOR_CLASS (event_editor_parent_class)->set_e_cal)
-		COMP_EDITOR_CLASS (event_editor_parent_class)->set_e_cal (editor, client);
+	gtk_window_set_default_size (GTK_WINDOW (ee), 300, 225);
 }
 
 static void
 event_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
 {
-	EventEditor *ee;
 	EventEditorPrivate *priv;
 	ECalComponentOrganizer organizer;
 	gboolean delegate;
@@ -670,8 +521,7 @@
 	ECal *client;
 	GSList *attendees = NULL;
 
-	ee = EVENT_EDITOR (editor);
-	priv = ee->priv;
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
 	priv->updating = TRUE;
 	delegate = (comp_editor_get_flags (COMP_EDITOR (editor)) & COMP_EDITOR_DELEGATE);
@@ -689,7 +539,7 @@
 	if (COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp)
 		COMP_EDITOR_CLASS (event_editor_parent_class)->edit_comp (editor, comp);
 
-	client = comp_editor_get_e_cal (COMP_EDITOR (editor));
+	client = comp_editor_get_client (editor);
 
 	/* Get meeting related stuff */
 	e_cal_component_get_organizer (comp, &organizer);
@@ -703,7 +553,10 @@
 		user_email = itip_get_comp_attendee (comp, client);
 
 		if (!priv->meeting_shown) {
-			bonobo_ui_component_set_prop (editor->uic, "/commands/ActionFreeBusy", "hidden", "0", NULL);
+			GtkAction *action;
+
+			action = comp_editor_get_action (editor, "free-busy");
+			gtk_action_set_visible (action, TRUE);
 		}
 
 		if (!(delegate && e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY))) {
@@ -756,7 +609,7 @@
 	}
 	e_cal_component_free_attendee_list (attendees);
 
-	comp_editor_set_needs_send (COMP_EDITOR (ee), priv->meeting_shown && (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)));
+	comp_editor_set_needs_send (editor, priv->meeting_shown && (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)));
 
 	priv->updating = FALSE;
 }
@@ -764,11 +617,10 @@
 static gboolean
 event_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
 {
-	EventEditor *ee = EVENT_EDITOR (editor);
 	EventEditorPrivate *priv;
 	ECalComponent *comp = NULL;
 
-	priv = ee->priv;
+	priv = EVENT_EDITOR_GET_PRIVATE (editor);
 
 	/* Don't cancel more than once or when just publishing */
 	if (method == E_CAL_COMPONENT_METHOD_PUBLISH ||
@@ -785,10 +637,7 @@
 				client, NULL, NULL, NULL);
 		g_object_unref (comp);
 
-		if (!result)
-			return FALSE;
-		else
-			return TRUE;
+		return result;
 	}
 
  parent:
@@ -798,45 +647,6 @@
 	return FALSE;
 }
 
-/* Destroy handler for the event editor */
-static void
-event_editor_finalize (GObject *object)
-{
-	EventEditor *ee;
-	EventEditorPrivate *priv;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_EVENT_EDITOR (object));
-
-	ee = EVENT_EDITOR (object);
-	priv = ee->priv;
-
-	if (priv->event_page) {
- 		g_object_unref (priv->event_page);
-		priv->event_page = NULL;
-	}
-
-	if (priv->recur_page) {
-		g_object_unref (priv->recur_page);
-		priv->recur_page = NULL;
-	}
-
-	if (priv->sched_page) {
-		g_object_unref (priv->sched_page);
-		priv->sched_page = NULL;
-	}
-
-	if (priv->model) {
-		g_object_unref (priv->model);
-		priv->model = NULL;
-	}
-
-	g_free (priv);
-
-	if (G_OBJECT_CLASS (event_editor_parent_class)->finalize)
-		(* G_OBJECT_CLASS (event_editor_parent_class)->finalize) (object);
-}
-
 /**
  * event_editor_new:
  * @client: a ECal
@@ -846,67 +656,40 @@
  * Return value: A newly-created event editor dialog, or NULL if the event
  * editor could not be created.
  **/
-EventEditor *
+CompEditor *
 event_editor_new (ECal *client, CompEditorFlags flags)
 {
-	EventEditor *ee;
+	g_return_val_if_fail (E_IS_CAL (client), NULL);
 
-	ee = EVENT_EDITOR (g_object_new (TYPE_EVENT_EDITOR, NULL));
-	ee->priv->is_meeting = flags & COMP_EDITOR_MEETING;
-	comp_editor_set_flags (COMP_EDITOR (ee), flags);
-	return event_editor_construct (ee, client);
+	return g_object_new (
+		TYPE_EVENT_EDITOR,
+		"flags", flags, "client", client, NULL);
 }
 
-static void
-show_meeting (EventEditor *ee)
+void
+event_editor_show_meeting (EventEditor *ee)
 {
-	EventEditorPrivate *priv;
-	CompEditor *editor = COMP_EDITOR (ee);
-	CompEditorFlags flags = comp_editor_get_flags (editor);
-
-	priv = ee->priv;
-
-	event_page_set_meeting (priv->event_page, TRUE);
-	if (!priv->meeting_shown) {
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ActionFreeBusy", "hidden", "0", NULL);
+	CompEditor *editor;
+	CompEditorFlags flags;
 
-		priv->meeting_shown = TRUE;
+	g_return_if_fail (IS_EVENT_EDITOR (ee));
 
- 		comp_editor_set_changed (COMP_EDITOR (ee), FALSE);
-		comp_editor_set_needs_send (COMP_EDITOR (ee), priv->meeting_shown);
-	}
+	editor = COMP_EDITOR (ee);
+	flags = comp_editor_get_flags (editor);
 
-	if (!(flags & COMP_EDITOR_NEW_ITEM) && !(flags & COMP_EDITOR_USER_ORG))
-		gtk_drag_dest_unset (GTK_WIDGET (editor));
-}
+	event_page_set_meeting (ee->priv->event_page, TRUE);
+	if (!ee->priv->meeting_shown) {
+		GtkAction *action;
 
-void
-event_editor_show_meeting (EventEditor *ee)
-{
-	g_return_if_fail (ee != NULL);
-	g_return_if_fail (IS_EVENT_EDITOR (ee));
+		action = comp_editor_get_action (editor, "free-busy");
+		gtk_action_set_visible (action, TRUE);
 
-	show_meeting (ee);
-}
+		ee->priv->meeting_shown = TRUE;
 
-static void
-model_changed (EventEditor *ee)
-{
-	if (!ee->priv->updating) {
-		comp_editor_set_changed (COMP_EDITOR (ee), TRUE);
-		comp_editor_set_needs_send (COMP_EDITOR (ee), TRUE);
+ 		comp_editor_set_changed (editor, FALSE);
+		comp_editor_set_needs_send (editor, TRUE);
 	}
-}
 
-static void
-model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	model_changed (EVENT_EDITOR (data));
-}
-
-static void
-model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
-{
-	model_changed (EVENT_EDITOR (data));
+	if (!(flags & COMP_EDITOR_NEW_ITEM) && !(flags & COMP_EDITOR_USER_ORG))
+		gtk_drag_dest_unset (GTK_WIDGET (editor));
 }
-

Modified: branches/kill-bonobo/calendar/gui/dialogs/event-editor.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/event-editor.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/event-editor.h	Tue Jul 15 18:34:59 2008
@@ -27,13 +27,26 @@
 #include <gtk/gtk.h>
 #include "comp-editor.h"
 
-
+/* Standard GObject macros */
+#define TYPE_EVENT_EDITOR \
+	(event_editor_get_type ())
+#define EVENT_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_EVENT_EDITOR, EventEditor))
+#define EVENT_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_EVENT_EDITOR, EventEditorClass))
+#define IS_EVENT_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_EVENT_EDITOR))
+#define IS_EVENT_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), TYPE_EVENT_EDITOR))
+#define EVENT_EDITOR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_EVENT_EDITOR, EventEditorClass))
 
-#define TYPE_EVENT_EDITOR            (event_editor_get_type ())
-#define EVENT_EDITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_EDITOR, EventEditor))
-#define EVENT_EDITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_EDITOR,	EventEditorClass))
-#define IS_EVENT_EDITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_EDITOR))
-#define IS_EVENT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_EVENT_EDITOR))
+G_BEGIN_DECLS
 
 typedef struct _EventEditor EventEditor;
 typedef struct _EventEditorClass EventEditorClass;
@@ -41,8 +54,6 @@
 
 struct _EventEditor {
 	CompEditor parent;
-
-	/* Private data */
 	EventEditorPrivate *priv;
 };
 
@@ -50,12 +61,11 @@
 	CompEditorClass parent_class;
 };
 
-GType        event_editor_get_type     (void);
-EventEditor *event_editor_construct    (EventEditor *ee,
-					ECal   *client);
-EventEditor *event_editor_new          (ECal   *client, CompEditorFlags flags);
-void         event_editor_show_meeting (EventEditor *ee);
+GType		event_editor_get_type		(void);
+CompEditor *	event_editor_new		(ECal *client,
+						 CompEditorFlags flags);
+void		event_editor_show_meeting	(EventEditor *ee);
 
-
+G_END_DECLS
 
 #endif /* __EVENT_EDITOR_H__ */

Modified: branches/kill-bonobo/calendar/gui/dialogs/event-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/event-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/event-page.c	Tue Jul 15 18:34:59 2008
@@ -56,16 +56,17 @@
 #include "event-page.h"
 #include "e-send-options-utils.h"
 
-
+#define EVENT_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_EVENT_PAGE, EventPagePrivate))
 
 /* Private part of the EventPage structure */
 struct _EventPagePrivate {
 	/* Glade XML data */
 	GladeXML *xml;
-	/* Widgets from the Glade file */
 
+	/* Widgets from the Glade file */
 	GtkWidget *main;
-	BonoboUIComponent *uic;
 
 	/* Generic informative messages placeholder */
 	GtkWidget *info_hbox;
@@ -107,8 +108,6 @@
 
 	GtkWidget *description;
 
-	ECalComponentClassification classification;
-
 	gboolean  show_time_as_busy;
 
 	GtkWidget *alarm_dialog;
@@ -133,14 +132,12 @@
 
 	/* ListView stuff */
 	EMeetingStore *model;
-	ECal	  *client;
 	EMeetingListView *list_view;
 	gint row;
 
 	/* For handling who the organizer is */
 	gboolean user_org;
 	gboolean existing;
-        gboolean updating;
 
 	EAlarmList *alarm_list_store;
 
@@ -160,16 +157,11 @@
 	GtkWidget *alarm_list_dlg_widget;
 };
 
-
-
-static void event_page_finalize (GObject *object);
-
 static GtkWidget *event_page_get_widget (CompEditorPage *page);
 static void event_page_focus_main_widget (CompEditorPage *page);
 static gboolean event_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
 static gboolean event_page_fill_component (CompEditorPage *page, ECalComponent *comp);
 static gboolean event_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
-static void event_page_set_summary (CompEditorPage *page, const char *summary);
 static void event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
 static void notify_dates_changed (EventPage *epage, struct icaltimetype *start_tt, struct icaltimetype *end_tt);
 static gboolean check_start_before_end (struct icaltimetype *start_tt, icaltimezone *start_zone,
@@ -184,159 +176,92 @@
 
 G_DEFINE_TYPE (EventPage, event_page, TYPE_COMP_EDITOR_PAGE);
 
-/* Class initialization function for the event page */
 static void
-event_page_class_init (EventPageClass *class)
-{
-	CompEditorPageClass *editor_page_class;
-	GObjectClass *object_class;
-
-	editor_page_class = (CompEditorPageClass *) class;
-	object_class = (GObjectClass *) class;
-
-	editor_page_class->get_widget = event_page_get_widget;
-	editor_page_class->focus_main_widget = event_page_focus_main_widget;
-	editor_page_class->fill_widgets = event_page_fill_widgets;
-	editor_page_class->fill_component = event_page_fill_component;
-	editor_page_class->fill_timezones = event_page_fill_timezones;
-	editor_page_class->set_summary = event_page_set_summary;
-	editor_page_class->set_dates = event_page_set_dates;
-
-	object_class->finalize = event_page_finalize;
-}
-
-/* Object initialization function for the event page */
-static void
-event_page_init (EventPage *epage)
+event_page_dispose (GObject *object)
 {
 	EventPagePrivate *priv;
 
-	priv = g_new0 (EventPagePrivate, 1);
-	epage->priv = priv;
-
-	priv->xml = NULL;
-	priv->uic = NULL;
-
-	priv->main = NULL;
-	priv->summary = NULL;
-	priv->summary_label = NULL;
-	priv->location = NULL;
-	priv->location_label = NULL;
-	priv->start_time = NULL;
-	priv->end_time = NULL;
-	priv->start_timezone = NULL;
-	priv->end_timezone = NULL;
-	priv->timezone_label = NULL;
-	priv->all_day_event = FALSE;
-	priv->status_icons = NULL;
-	priv->alarm_icon = NULL;
-	priv->recur_icon = NULL;
-	priv->description = NULL;
-	priv->classification = E_CAL_COMPONENT_CLASS_NONE;
-	priv->show_time_as_busy = FALSE;
-	priv->alarm_dialog = NULL;
-	priv->alarm_time = NULL;
-	priv->alarm_box = NULL;
-	priv->categories_btn = NULL;
-	priv->categories = NULL;
-	priv->sod = NULL;
-
-	priv->info_hbox = NULL;
-	priv->info_icon = NULL;
-	priv->info_string = NULL;
-
-	priv->deleted_attendees = g_ptr_array_new ();
-
-	priv->comp = NULL;
-
-	priv->accounts = NULL;
-	priv->address_strings = NULL;
-	priv->ia = NULL;
-	priv->invite = NULL;
-
-	priv->model = NULL;
-	priv->list_view = NULL;
+	priv = EVENT_PAGE_GET_PRIVATE (object);
 
-	priv->updating = FALSE;
+	if (priv->comp != NULL) {
+		g_object_unref (priv->comp);
+		priv->comp = NULL;
+	}
 
-	priv->alarm_interval =  -1;
+	if (priv->main != NULL) {
+		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
 
-	priv->sendoptions_shown = FALSE;
-	priv->is_meeting = FALSE;
-	priv->sync_timezones = FALSE;
+	if (priv->xml != NULL) {
+		g_object_unref (priv->xml);
+		priv->xml = NULL;
+	}
 
-	priv->alarm_list_dlg_widget = NULL;
-}
+	if (priv->alarm_list_store != NULL) {
+		g_object_unref (priv->alarm_list_store);
+		priv->alarm_list_store = NULL;
+	}
 
-static void
-cleanup_attendees (GPtrArray *attendees)
-{
-	int i;
+	if (priv->sod != NULL) {
+		g_object_unref (priv->sod);
+		priv->sod = NULL;
+	}
 
-	for (i = 0; i < attendees->len; i++)
-		g_object_unref (g_ptr_array_index (attendees, i));
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (event_page_parent_class)->dispose (object);
 }
 
-/* Destroy handler for the event page */
 static void
 event_page_finalize (GObject *object)
 {
-	EventPage *epage;
 	EventPagePrivate *priv;
-	GList *l;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_EVENT_PAGE (object));
 
-	epage = EVENT_PAGE (object);
-	priv = epage->priv;
+	priv = EVENT_PAGE_GET_PRIVATE (object);
 
-	for (l = priv->address_strings; l != NULL; l = l->next)
-		g_free (l->data);
+	g_list_foreach (priv->address_strings, (GFunc) g_free, NULL);
 	g_list_free (priv->address_strings);
 
-	if (priv->comp != NULL)
-		g_object_unref (priv->comp);
-
-	cleanup_attendees (priv->deleted_attendees);
+	g_ptr_array_foreach (
+		priv->deleted_attendees, (GFunc) g_object_unref, NULL);
 	g_ptr_array_free (priv->deleted_attendees, TRUE);
 
-	if (priv->main)
-		g_object_unref (priv->main);
+	g_free (priv->old_summary);
 
-	if (priv->xml) {
-		g_object_unref (priv->xml);
-		priv->xml = NULL;
-	}
+	priv->alarm_list_dlg_widget = NULL;
 
-	if (priv->alarm_list_store) {
-		g_object_unref (priv->alarm_list_store);
-		priv->alarm_list_store = NULL;
-	}
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (event_page_parent_class)->finalize (object);
+}
 
-	if (priv->sod) {
-		g_object_unref (priv->sod);
-		priv->sod = NULL;
-	}
-	g_free (priv->old_summary);
+static void
+event_page_class_init (EventPageClass *class)
+{
+	GObjectClass *object_class;
+	CompEditorPageClass *editor_page_class;
 
-	priv->alarm_list_dlg_widget = NULL;
+	g_type_class_add_private (class, sizeof (EventPagePrivate));
 
-	g_free (priv);
-	epage->priv = NULL;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = event_page_dispose;
+	object_class->finalize = event_page_finalize;
 
-	if (G_OBJECT_CLASS (event_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (event_page_parent_class)->finalize) (object);
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
+	editor_page_class->get_widget = event_page_get_widget;
+	editor_page_class->focus_main_widget = event_page_focus_main_widget;
+	editor_page_class->fill_widgets = event_page_fill_widgets;
+	editor_page_class->fill_component = event_page_fill_component;
+	editor_page_class->fill_timezones = event_page_fill_timezones;
+	editor_page_class->set_dates = event_page_set_dates;
 }
 
-
-
-static const int classification_map[] = {
-	E_CAL_COMPONENT_CLASS_PUBLIC,
-	E_CAL_COMPONENT_CLASS_PRIVATE,
-	E_CAL_COMPONENT_CLASS_CONFIDENTIAL,
-	-1
-};
+static void
+event_page_init (EventPage *epage)
+{
+	epage->priv = EVENT_PAGE_GET_PRIVATE (epage);
+	epage->priv->deleted_attendees = g_ptr_array_new ();
+	epage->priv->alarm_interval = -1;
+}
 
 enum {
 	ALARM_NONE,
@@ -358,62 +283,45 @@
 };
 
 static void
-set_classification_menu (EventPage *epage, gint class)
+set_busy_time_menu (EventPage *epage, gboolean active)
 {
-	bonobo_ui_component_freeze (epage->priv->uic, NULL);
-	switch (class) {
-		case E_CAL_COMPONENT_CLASS_PUBLIC:
-			bonobo_ui_component_set_prop (
-				epage->priv->uic, "/commands/ActionClassPublic",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-			bonobo_ui_component_set_prop (
-				epage->priv->uic, "/commands/ActionClassConfidential",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_PRIVATE:
-			bonobo_ui_component_set_prop (
-				epage->priv->uic, "/commands/ActionClassPrivate",
-				"state", "1", NULL);
-			break;
-	}
-	bonobo_ui_component_thaw (epage->priv->uic, NULL);
-}
+	CompEditor *editor;
+	GtkAction *action;
 
-static void
-set_busy_time_menu (EventPage *epage, gboolean status)
-{
-	bonobo_ui_component_set_prop (
-		epage->priv->uic, "/commands/ActionShowTimeBusy",
-		"state", status ? "1" : "0", NULL);
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	action = comp_editor_get_action (editor, "show-time-busy");
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
 }
 
 static void
-enable_busy_time_menu (EventPage *epage, gboolean state)
+enable_busy_time_menu (EventPage *epage, gboolean sensitive)
 {
-	bonobo_ui_component_set_prop (
-		epage->priv->uic, "/commands/ActionShowTimeBusy",
-		"sensitive", state ? "1" : "0", NULL);
+	CompEditor *editor;
+	GtkAction *action;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	action = comp_editor_get_action (editor, "show-time-busy");
+	gtk_action_set_sensitive (action, sensitive);
 }
 
 static void
-set_all_day_event_menu (EventPage *epage, gboolean status)
+set_all_day_event_menu (EventPage *epage, gboolean active)
 {
-	bonobo_ui_component_set_prop (
-		epage->priv->uic, "/commands/ActionAllDayEvent",
-		"state", status ? "1" : "0", NULL);
+	CompEditor *editor;
+	GtkAction *action;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	action = comp_editor_get_action (editor, "all-day-event");
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), active);
 }
 
 /* get_widget handler for the event page */
 static GtkWidget *
 event_page_get_widget (CompEditorPage *page)
 {
-	EventPage *epage;
 	EventPagePrivate *priv;
 
-	epage = EVENT_PAGE (page);
-	priv = epage->priv;
+	priv = EVENT_PAGE_GET_PRIVATE (page);
 
 	return priv->main;
 }
@@ -422,11 +330,9 @@
 static void
 event_page_focus_main_widget (CompEditorPage *page)
 {
-	EventPage *epage;
 	EventPagePrivate *priv;
 
-	epage = EVENT_PAGE (page);
-	priv = epage->priv;
+	priv = EVENT_PAGE_GET_PRIVATE (page);
 
 	gtk_widget_grab_focus (priv->summary);
 }
@@ -455,12 +361,15 @@
 static void
 update_time (EventPage *epage, ECalComponentDateTime *start_date, ECalComponentDateTime *end_date)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
+	ECal *client;
 	struct icaltimetype *start_tt, *end_tt, implied_tt;
 	icaltimezone *start_zone = NULL, *def_zone = NULL;
 	gboolean all_day_event, homezone=TRUE;
 
-	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
 
 	/* Note that if we are creating a new event, the timezones may not be
 	   on the server, so we try to get the builtin timezone with the TZID
@@ -468,8 +377,7 @@
 	start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
 	if (!start_zone) {
 		/* FIXME: Handle error better. */
-		if (!e_cal_get_timezone (COMP_EDITOR_PAGE (epage)->client,
-					      start_date->tzid, &start_zone, NULL)) {
+		if (!e_cal_get_timezone (client, start_date->tzid, &start_zone, NULL)) {
 			g_warning ("Couldn't get timezone from server: %s",
 				   start_date->tzid ? start_date->tzid : "");
 		}
@@ -545,9 +453,10 @@
 static void
 clear_widgets (EventPage *epage)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
 
-	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
 
 	/* Summary, description */
 	e_dialog_editable_set (priv->summary, NULL);
@@ -568,8 +477,7 @@
 	set_all_day (epage, FALSE);
 
 	/* Classification */
-	priv->classification = E_CAL_COMPONENT_CLASS_PUBLIC;
-	set_classification_menu (epage, priv->classification);
+	comp_editor_set_classification (editor, E_CAL_COMPONENT_CLASS_PUBLIC);
 
 	/* Show Time As (Transparency) */
 	priv->show_time_as_busy = TRUE;
@@ -774,12 +682,6 @@
 	e_meeting_list_view_column_set_visible (priv->list_view, E_MEETING_STORE_RSVP_COL, state);
 }
 
-void
-event_page_set_classification (EventPage *epage, ECalComponentClassification class)
-{
-	epage->priv->classification = class;
-}
-
 static GtkWidget *
 create_image_event_box (const char *image_text, const char *tip_text)
 {
@@ -798,18 +700,27 @@
 static void
 sensitize_widgets (EventPage *epage)
 {
+	ECal *client;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	GtkActionGroup *action_group;
+	GtkAction *action;
 	gboolean read_only, custom, alarm, sens = TRUE, sensitize;
 	EventPagePrivate *priv;
 	gboolean delegate;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
 	priv = epage->priv;
-	if (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_MEETING)
-	 	sens = COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_USER_ORG;
+	if (flags & COMP_EDITOR_MEETING)
+	 	sens = flags & COMP_EDITOR_USER_ORG;
 
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (epage)->client, &read_only, NULL))
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
-	delegate = COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE;
+	delegate = flags & COMP_EDITOR_DELEGATE;
 
 	sensitize = !read_only && sens;
 
@@ -838,7 +749,7 @@
 	gtk_widget_set_sensitive (priv->alarm_time, !read_only);
 	gtk_widget_set_sensitive (priv->categories_btn, !read_only);
 	/*TODO implement the for portion of the end time selector */
-	if ( (COMP_EDITOR_PAGE(epage)->flags) & COMP_EDITOR_PAGE_NEW_ITEM ) {
+	if (flags & COMP_EDITOR_NEW_ITEM) {
 		if (priv->all_day_event)
 			gtk_option_menu_set_history (GTK_OPTION_MENU (priv->end_time_selector), 1);
 		else
@@ -863,28 +774,11 @@
 	gtk_widget_set_sensitive (priv->invite, (!read_only &&  sens) || delegate);
 	gtk_widget_set_sensitive (GTK_WIDGET (priv->list_view), !read_only);
 
-	bonobo_ui_component_set_prop (priv->uic, "/commands/InsertAttachments", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionAllDayEvent", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionShowTimeBusy", "sensitive", !read_only ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionAlarm", "sensitive", !read_only ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPublic", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPrivate", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassConfidential", "sensitive",
-		       	sensitize ? "1" : "0", NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/InsertSendOptions", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionRecurrence", "sensitive", sensitize ? "1" : "0", NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionFreeBusy", "sensitive", sensitize ? "1" : "0", NULL);
-
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ViewCategories", "sensitive", "1", NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ViewTimeZone", "sensitive", "1", NULL);
+	action_group = comp_editor_get_action_group (editor, "individual");
+	gtk_action_group_set_sensitive (action_group, sensitize);
 
+	action = comp_editor_get_action (editor, "free-busy");
+	gtk_action_set_sensitive (action, sensitize);
 
 	if (!priv->is_meeting) {
 		gtk_widget_hide (priv->calendar_label);
@@ -906,19 +800,27 @@
 void
 event_page_hide_options (EventPage *page)
 {
+	CompEditor *editor;
+	GtkAction *action;
+
 	g_return_if_fail (IS_EVENT_PAGE (page));
 
-	bonobo_ui_component_set_prop (page->priv->uic, "/commands/InsertSendOptions", "hidden", "1", NULL);
-	page->priv->sendoptions_shown = FALSE;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_visible (action, FALSE);
 }
 
 void
 event_page_show_options (EventPage *page)
 {
+	CompEditor *editor;
+	GtkAction *action;
+
 	g_return_if_fail (IS_EVENT_PAGE (page));
 
-	bonobo_ui_component_set_prop (page->priv->uic, "/commands/InsertSendOptions", "hidden", "0", NULL);
-	page->priv->sendoptions_shown = TRUE;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_visible (action, TRUE);
 }
 
 void
@@ -976,6 +878,9 @@
 static gboolean
 event_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
 {
+	ECal *client;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	EventPage *epage;
 	EventPagePrivate *priv;
 	ECalComponentText text;
@@ -988,23 +893,25 @@
 	GSList *l;
 	gboolean validated = TRUE;
 
-	g_return_val_if_fail (page->client != NULL, FALSE);
-
 	epage = EVENT_PAGE (page);
 	priv = epage->priv;
 
-	if (!e_cal_component_has_organizer (comp))
-		page->flags |= COMP_EDITOR_PAGE_USER_ORG;
-
-	/* Don't send off changes during this time */
-	priv->updating = TRUE;
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
+	if (!e_cal_component_has_organizer (comp)) {
+		flags |= COMP_EDITOR_USER_ORG;
+		comp_editor_set_flags (editor, flags);
+	}
 
 	/* Clean out old data */
 	if (priv->comp != NULL)
 		g_object_unref (priv->comp);
 	priv->comp = NULL;
 
-	cleanup_attendees (priv->deleted_attendees);
+	g_ptr_array_foreach (
+		priv->deleted_attendees, (GFunc) g_object_unref, NULL);
 	g_ptr_array_set_size (priv->deleted_attendees, 0);
 
 	/* Clean the page */
@@ -1032,13 +939,13 @@
 	}
 	e_cal_component_free_text_list (l);
 
-	e_cal_get_cal_address (COMP_EDITOR_PAGE (epage)->client, &backend_addr, NULL);
+	e_cal_get_cal_address (client, &backend_addr, NULL);
 	set_subscriber_info_string (epage, backend_addr);
 
 	if (priv->is_meeting) {
 		ECalComponentOrganizer organizer;
 
-		priv->user_add = itip_get_comp_attendee (comp, COMP_EDITOR_PAGE (epage)->client);
+		priv->user_add = itip_get_comp_attendee (comp, client);
 
 		/* Organizer strings */
 		event_page_select_organizer (epage, backend_addr);
@@ -1051,14 +958,14 @@
 				gchar *string;
 				GList *list = NULL;
 
-				if (itip_organizer_is_user (comp, page->client) || itip_sentby_is_user (comp)) {
+				if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)) {
 					if (e_cal_get_static_capability (
-								page->client,
+								client,
 								CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
 						priv->user_org = TRUE;
 				} else {
 					if (e_cal_get_static_capability (
-								page->client,
+								client,
 								CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
 					gtk_widget_set_sensitive (priv->invite, FALSE);
 					gtk_widget_set_sensitive (priv->add, FALSE);
@@ -1067,7 +974,7 @@
 					priv->user_org = FALSE;
 				}
 
-				if (e_cal_get_static_capability (COMP_EDITOR_PAGE (epage)->client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE))
+				if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE))
 					string = g_strdup (backend_addr);
 				else if ( organizer.cn != NULL)
 					string = g_strdup_printf ("%s <%s>", organizer.cn, strip);
@@ -1089,9 +996,6 @@
 
 			a = get_current_account (epage);
 			if (a != NULL) {
-				/* Reuse earlier declared *page, or rename this to avoid confusion? */
-				CompEditorPage *page = (CompEditorPage *) epage;
-
 				priv->ia = e_meeting_store_add_attendee_with_defaults (priv->model);
 				g_object_ref (priv->ia);
 
@@ -1103,7 +1007,7 @@
 					e_meeting_attendee_set_sentby (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address));
 				}
 
-				if (page->client && e_cal_get_organizer_must_accept (page->client))
+				if (client && e_cal_get_organizer_must_accept (client))
 					e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_NEEDSACTION);
 				else
 					e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_ACCEPTED);
@@ -1134,17 +1038,7 @@
 	update_end_time_selector (epage);
 	/* Classification */
 	e_cal_component_get_classification (comp, &cl);
-	switch (cl) {
-	case E_CAL_COMPONENT_CLASS_PUBLIC:
-	case E_CAL_COMPONENT_CLASS_PRIVATE:
-	case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-		break;
-	default:
-		cl = E_CAL_COMPONENT_CLASS_PUBLIC;
-		break;
-	}
-	set_classification_menu (epage, cl);
-	priv->classification = cl;
+	comp_editor_set_classification (editor, cl);
 
 	/* Show Time As (Transparency) */
 	e_cal_component_get_transparency (comp, &transparency);
@@ -1160,7 +1054,7 @@
 		break;
 	}
 
-	if (e_cal_get_static_capability (page->client, CAL_STATIC_CAPABILITY_NO_TRANSPARENCY))
+	if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_TRANSPARENCY))
 		enable_busy_time_menu (epage, FALSE);
 	else
 		enable_busy_time_menu (epage, TRUE);
@@ -1201,16 +1095,14 @@
 	/* Source */
 	e_source_combo_box_set_active (
 		E_SOURCE_COMBO_BOX (priv->source_selector),
-		e_cal_get_source (page->client));
+		e_cal_get_source (client));
 
 	e_cal_component_get_uid (comp, &uid);
-	if (!(COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE)
-			&& !(COMP_EDITOR_PAGE (epage)->flags && COMP_EDITOR_PAGE_NEW_ITEM)) {
+	if (!(flags & COMP_EDITOR_DELEGATE)
+			&& !(flags && COMP_EDITOR_NEW_ITEM)) {
 		event_page_hide_options (epage);
 	}
 
-	priv->updating = FALSE;
-
 	sensitize_widgets (epage);
 
 	return validated;
@@ -1220,8 +1112,12 @@
 static gboolean
 event_page_fill_component (CompEditorPage *page, ECalComponent *comp)
 {
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
 	EventPage *epage;
 	EventPagePrivate *priv;
+	ECalComponentClassification classification;
 	ECalComponentDateTime start_date, end_date;
 	struct icaltimetype start_tt, end_tt;
 	gboolean all_day_event, start_date_set, end_date_set, busy;
@@ -1231,6 +1127,11 @@
 
 	epage = EVENT_PAGE (page);
 	priv = epage->priv;
+
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
 	text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
 
 	/* Summary */
@@ -1363,7 +1264,8 @@
 		g_free (str);
 
 	/* Classification */
-	e_cal_component_set_classification (comp, priv->classification);
+	classification = comp_editor_get_classification (editor);
+	e_cal_component_set_classification (comp, classification);
 
 	/* Show Time As (Transparency) */
 	busy = priv->show_time_as_busy;
@@ -1489,7 +1391,7 @@
 			EAccount *a;
 			gchar *backend_addr = NULL, *org_addr = NULL, *sentby = NULL;
 
-			e_cal_get_cal_address (priv->client, &backend_addr, NULL);
+			e_cal_get_cal_address (client, &backend_addr, NULL);
 
 			/* Find the identity for the organizer or sentby field */
 			a = get_current_account (epage);
@@ -1533,7 +1435,7 @@
 		}
 
 
-		if (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE ) {
+		if (flags & COMP_EDITOR_DELEGATE) {
 			GSList *attendee_list, *l;
 			int i;
 			const GPtrArray *attendees = e_meeting_store_get_attendees (priv->model);
@@ -1597,13 +1499,6 @@
 	return TRUE;
 }
 
-/* set_summary handler for the event page */
-static void
-event_page_set_summary (CompEditorPage *page, const char *summary)
-{
-	/* nothing */
-}
-
 static void
 event_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
 {
@@ -1673,13 +1568,13 @@
 void
 static hour_sel_changed (GtkSpinButton *widget, EventPage *epage)
 {
-	hour_minute_changed(epage);
+	hour_minute_changed (epage);
 }
 
 void
 static minute_sel_changed (GtkSpinButton *widget, EventPage *epage)
 {
-	hour_minute_changed ( epage);
+	hour_minute_changed (epage);
 }
 
 void
@@ -1735,11 +1630,16 @@
 static void
 add_clicked_cb (GtkButton *btn, EventPage *epage)
 {
+	CompEditor *editor;
+	CompEditorFlags flags;
 	EMeetingAttendee *attendee;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	flags = comp_editor_get_flags (editor);
+
 	attendee = e_meeting_store_add_attendee_with_defaults (epage->priv->model);
 
-	if (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE) {
+	if (flags & COMP_EDITOR_DELEGATE) {
 		e_meeting_attendee_set_delfrom (attendee, g_strdup_printf ("MAILTO:%s", epage->priv->user_add));
 	}
 
@@ -1785,11 +1685,16 @@
 static void
 remove_attendee (EventPage *epage, EMeetingAttendee *ia)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	int pos = 0;
-	gboolean delegate = (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE);
+	gboolean delegate;
 
-	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	flags = comp_editor_get_flags (editor);
+
+	delegate = (flags & COMP_EDITOR_DELEGATE);
 
 	/* If the user deletes the organizer attendee explicitly,
 	   assume they no longer want the organizer showing up */
@@ -1891,31 +1796,31 @@
 }
 
 static void
-invite_cb (GtkWidget *widget, gpointer data)
+invite_cb (GtkWidget *widget,
+           EventPage *page)
 {
-	EventPage *page;
-	EventPagePrivate *priv;
-
-	page = EVENT_PAGE (data);
-	priv = page->priv;
-
-	e_meeting_list_view_invite_others_dialog (priv->list_view);
+	e_meeting_list_view_invite_others_dialog (page->priv->list_view);
 }
 
 static void
-attendee_added_cb (EMeetingListView *emlv, EMeetingAttendee *ia, gpointer user_data)
+attendee_added_cb (EMeetingListView *emlv,
+                   EMeetingAttendee *ia,
+                   EventPage *epage)
 {
-   EventPage *epage = EVENT_PAGE (user_data);
-   EventPagePrivate *priv;
-   gboolean delegate = (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE);
-
-   priv = epage->priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
 
-   if (delegate) {
+	if (flags & COMP_EDITOR_DELEGATE) {
 	   if (existing_attendee (ia, priv->comp))
 		   e_meeting_store_remove_attendee (priv->model, ia);
 	   else {
-		   if (!e_cal_get_static_capability (COMP_EDITOR_PAGE(epage)->client,
+		   if (!e_cal_get_static_capability (client,
 					   CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) {
 			   const char *delegator_id = e_meeting_attendee_get_delfrom (ia);
 			   EMeetingAttendee *delegator;
@@ -1930,7 +1835,7 @@
 			   gtk_widget_set_sensitive (priv->edit, FALSE);
 		   }
 	   }
-   }
+}
 
 }
 
@@ -1972,7 +1877,9 @@
 static gint
 button_press_event (GtkWidget *widget, GdkEventButton *event, EventPage *epage)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	GtkMenu *menu;
 	EMeetingAttendee *ia;
 	GtkTreePath *path;
@@ -1982,12 +1889,14 @@
 	GSList *menus = NULL;
 	ECalPopup *ep;
 	int i;
-	priv = epage->priv;
 
 	/* only process right-clicks */
 	if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
 		return FALSE;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	flags = comp_editor_get_flags (editor);
+
 	/* only if we right-click on an attendee */
 	if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->list_view), event->x, event->y, &path, NULL, NULL, NULL)) {
 		GtkTreeSelection *selection;
@@ -2011,7 +1920,7 @@
 
 	if (GTK_WIDGET_IS_SENSITIVE(priv->add))
 		disable_mask &= ~ATTENDEE_CAN_ADD;
-	else if (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_USER_ORG)
+	else if (flags & COMP_EDITOR_USER_ORG)
 		disable_mask &= ~ATTENDEE_CAN_ADD;
 
 	ep = e_cal_popup_new("org.gnome.evolution.calendar.meeting.popup");
@@ -2029,14 +1938,19 @@
 static gboolean
 list_view_event (EMeetingListView *list_view, GdkEvent *event, EventPage *epage) {
 
-	EventPagePrivate *priv= epage->priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	flags = comp_editor_get_flags (editor);
 
-	if (event->type == GDK_2BUTTON_PRESS && COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_USER_ORG) {
+	if (event->type == GDK_2BUTTON_PRESS && flags & COMP_EDITOR_USER_ORG) {
 		EMeetingAttendee *attendee;
 
 		attendee = e_meeting_store_add_attendee_with_defaults (priv->model);
 
-		if (COMP_EDITOR_PAGE (epage)->flags & COMP_EDITOR_PAGE_DELEGATE) {
+		if (flags & COMP_EDITOR_DELEGATE) {
 			e_meeting_attendee_set_delfrom (attendee, g_strdup_printf ("MAILTO:%s", epage->priv->user_add));
 		}
 
@@ -2071,8 +1985,12 @@
 	EventPagePrivate *priv = epage->priv;
 	struct icaltimetype start_tt = icaltime_null_time();
 	struct icaltimetype end_tt = icaltime_null_time();
+	CompEditor *editor;
+	GtkAction *action;
 	gboolean date_set;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+
 	epage->priv->all_day_event = all_day;
 	e_date_edit_set_show_time (E_DATE_EDIT (priv->start_time), !all_day);
 	e_date_edit_set_show_time (E_DATE_EDIT (priv->end_time), !all_day);
@@ -2102,9 +2020,10 @@
 	else
 		gtk_option_menu_set_history (GTK_OPTION_MENU (priv->end_time_selector), 0);
 
-	if (all_day) {
-		bonobo_ui_component_set_prop (epage->priv->uic, "/commands/ViewTimeZone", "sensitive", "0", NULL);
+	action = comp_editor_get_action (editor, "view-time-zone");
+	gtk_action_set_sensitive (action, !all_day);
 
+	if (all_day) {
 		/* Round down to the start of the day. */
 		start_tt.hour = 0;
 		start_tt.minute  = 0;
@@ -2121,8 +2040,6 @@
 	} else {
 		icaltimezone *start_zone;
 
-		bonobo_ui_component_set_prop (epage->priv->uic, "/commands/ViewTimeZone", "sensitive", "1", NULL);
-
 		if (end_tt.year == start_tt.year
 		    && end_tt.month == start_tt.month
 		    && end_tt.day == start_tt.day) {
@@ -2169,18 +2086,14 @@
 	/* Notify upstream */
 	notify_dates_changed (epage, &start_tt, &end_tt);
 
-        if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
-
+	comp_editor_page_changed (COMP_EDITOR_PAGE (epage));
 }
 
 void
 event_page_set_show_time_busy (EventPage *epage, gboolean state)
 {
 	epage->priv->show_time_as_busy = state;
-	if (!epage->priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
-
+	comp_editor_page_changed (COMP_EDITOR_PAGE (epage));
 }
 
 void
@@ -2336,47 +2249,19 @@
 		&& priv->description );
 }
 
-/* sets the current focused widget */
-static gboolean
-widget_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	EventPage *epage;
-	epage = EVENT_PAGE (data);
-
-	comp_editor_page_set_focused_widget (COMP_EDITOR_PAGE (epage), widget);
-
-	return FALSE;
-}
-
-/* unset the current focused widget */
-static gboolean
-widget_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	EventPage *epage;
-	epage = EVENT_PAGE (data);
-
-	comp_editor_page_unset_focused_widget (COMP_EDITOR_PAGE (epage), widget);
-
-	return FALSE;
-}
-
-/* Callback used when the summary changes; we emit the notification signal. */
 static void
-summary_changed_cb (GtkEditable *editable, gpointer data)
+summary_changed_cb (GtkEditable *editable,
+                    CompEditorPage *page)
 {
-	EventPage *epage;
-	EventPagePrivate *priv;
+	CompEditor *editor;
 	gchar *summary;
 
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
-
-	if (priv->updating)
+	if (comp_editor_page_get_updating (page))
 		return;
 
+	editor = comp_editor_page_get_editor (page);
 	summary = e_dialog_editable_get (GTK_WIDGET (editable));
-	comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (epage),
-						 summary);
+	comp_editor_set_summary (editor, summary);
 	g_free (summary);
 }
 
@@ -2481,7 +2366,7 @@
 
 	priv = epage->priv;
 
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (epage)))
 		return;
 
 	/* Fetch the start and end times and timezones from the widgets. */
@@ -2565,14 +2450,10 @@
  * start date < end date and we set the "all day event" button as appropriate.
  */
 static void
-start_date_changed_cb (GtkWidget *dedit, gpointer data)
+start_date_changed_cb (GtkWidget *dedit,
+                       EventPage *epage)
 {
-	EventPage *epage;
-
-	epage = EVENT_PAGE (data);
-
 	hour_minute_changed (epage);
-
 	times_updated (epage, TRUE);
 }
 
@@ -2580,12 +2461,9 @@
  * start date < end date and we set the "all day event" button as appropriate.
  */
 static void
-end_date_changed_cb (GtkWidget *dedit, gpointer data)
+end_date_changed_cb (GtkWidget *dedit,
+                     EventPage *epage)
 {
-	EventPage *epage;
-
-	epage = EVENT_PAGE (data);
-
 	times_updated (epage, FALSE);
 }
 
@@ -2594,22 +2472,19 @@
  * labels on the other notebook pages.
  */
 static void
-start_timezone_changed_cb (GtkWidget *widget, gpointer data)
+start_timezone_changed_cb (GtkWidget *widget,
+                           EventPage *epage)
 {
-	EventPage *epage;
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
 	icaltimezone *zone;
 
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
-
 	if (priv->sync_timezones) {
 		zone = e_timezone_entry_get_timezone (E_TIMEZONE_ENTRY (priv->start_timezone));
-		priv->updating = TRUE;
+		comp_editor_page_set_updating (COMP_EDITOR_PAGE (epage), TRUE);
 		/*the earlier method caused an infinite recursion*/
 		priv->end_timezone=priv->start_timezone;
 		gtk_widget_show_all (priv->end_timezone);
-		priv->updating = FALSE;
+		comp_editor_page_set_updating (COMP_EDITOR_PAGE (epage), FALSE);
 	}
 
 	times_updated (epage, TRUE);
@@ -2619,27 +2494,27 @@
  * category list dialog.
  */
 static void
-categories_clicked_cb (GtkWidget *button, gpointer data)
+categories_clicked_cb (GtkWidget *button,
+                       EventPage *epage)
 {
-	EventPage *epage;
-	EventPagePrivate *priv;
-	GtkWidget *entry;
+	GtkEntry *entry;
 
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
-
-	entry = priv->categories;
-	e_categories_config_open_dialog_for_entry (GTK_ENTRY (entry));
+	entry = GTK_ENTRY (epage->priv->categories);
+	e_categories_config_open_dialog_for_entry (entry);
 }
 
 void
 event_page_sendoptions_clicked_cb (EventPage *epage)
 {
 	EventPagePrivate *priv;
+	CompEditor *editor;
 	GtkWidget *toplevel;
 	ESource *source;
+	ECal *client;
 
 	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
 
 	if (!priv->sod) {
 		priv->sod = e_sendoptions_dialog_new ();
@@ -2649,8 +2524,7 @@
 		priv->sod->data->initialized = TRUE;
 	}
 
-	if (e_cal_get_static_capability (COMP_EDITOR_PAGE (epage)->client,
-					 CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) {
+	if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) {
 		e_sendoptions_set_need_general_options (priv->sod, FALSE);
 	}
 
@@ -2658,89 +2532,81 @@
 	e_sendoptions_dialog_run (priv->sod, toplevel, E_ITEM_CALENDAR);
 }
 
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
-	EventPage *epage;
-	EventPagePrivate *priv;
-
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
-
-	if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
-}
-
 static void
 source_changed_cb (ESourceComboBox *source_combo_box, EventPage *epage)
 {
 	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
 	ESource *source;
+	ECal *client;
+
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (epage)))
+		return;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
 	source = e_source_combo_box_get_active (source_combo_box);
 
-	if (!priv->updating) {
-		ECal *client;
+	if (client) {
+		icaltimezone *zone;
 
-		client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
-		if (client) {
-			icaltimezone *zone;
+		zone = calendar_config_get_icaltimezone ();
+		e_cal_set_default_timezone (client, zone, NULL);
+	}
 
-			zone = calendar_config_get_icaltimezone ();
-			e_cal_set_default_timezone (client, zone, NULL);
-		}
+	if (!client || !e_cal_open (client, FALSE, NULL)) {
+		GtkWidget *dialog;
+		ECal *old_client;
 
-		if (!client || !e_cal_open (client, FALSE, NULL)) {
-			GtkWidget *dialog;
+		old_client = comp_editor_get_client (editor);
 
-			if (client)
-				g_object_unref (client);
+		if (client)
+			g_object_unref (client);
 
-			e_source_combo_box_set_active (
-				E_SOURCE_COMBO_BOX (priv->source_selector),
-				e_cal_get_source (COMP_EDITOR_PAGE (epage)->client));
+		e_source_combo_box_set_active (
+			E_SOURCE_COMBO_BOX (priv->source_selector),
+			e_cal_get_source (old_client));
 
-			dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
-							 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
-							 _("Unable to open the calendar '%s'."),
-							 e_source_peek_name (source));
-			gtk_dialog_run (GTK_DIALOG (dialog));
-			gtk_widget_destroy (dialog);
-		} else {
-			comp_editor_notify_client_changed (
-				COMP_EDITOR (gtk_widget_get_toplevel (priv->main)),
-				client);
-			if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_meeting)
-				event_page_show_options (epage);
-			else
-				event_page_hide_options (epage);
+		dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+						 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+						 _("Unable to open the calendar '%s'."),
+						 e_source_peek_name (source));
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+	} else {
+		comp_editor_set_client (editor, client);
+		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_meeting)
+			event_page_show_options (epage);
+		else
+			event_page_hide_options (epage);
 
-			if (client) {
-				gchar *backend_addr = NULL;
+		if (client) {
+			gchar *backend_addr = NULL;
 
-				e_cal_get_cal_address(client, &backend_addr, NULL);
+			e_cal_get_cal_address(client, &backend_addr, NULL);
 
-				if (priv->is_meeting)
-					event_page_select_organizer (epage, backend_addr);
+			if (priv->is_meeting)
+				event_page_select_organizer (epage, backend_addr);
 
-				set_subscriber_info_string (epage, backend_addr);
-				g_free (backend_addr);
-			}
+			set_subscriber_info_string (epage, backend_addr);
+			g_free (backend_addr);
+		}
 
-			sensitize_widgets (epage);
+		sensitize_widgets (epage);
 
-			alarm_list_dialog_set_client (priv->alarm_list_dlg_widget, client);
-		}
+		alarm_list_dialog_set_client (priv->alarm_list_dlg_widget, client);
 	}
 }
 
 static void
 set_subscriber_info_string (EventPage *epage, const char *backend_address)
 {
-	ECal *client = COMP_EDITOR_PAGE (epage)->client;
+	CompEditor *editor;
+	ECal *client;
 	ESource *source;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
 	source = e_cal_get_source (client);
 
 	if (e_source_get_property (source, "subscriber"))
@@ -2753,13 +2619,10 @@
 }
 
 static void
-alarm_changed_cb (GtkWidget *widget, gpointer data)
+alarm_changed_cb (GtkWidget *widget,
+                  EventPage *epage)
 {
-	EventPage *epage;
-	EventPagePrivate *priv;
-
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
+	EventPagePrivate *priv = epage->priv;
 
 	if (e_dialog_option_menu_get (priv->alarm_time, alarm_map) != ALARM_NONE) {
 		ECalComponentAlarm *ca;
@@ -2841,38 +2704,22 @@
 	sensitize_widgets (epage);
 }
 
-static void
-alarm_store_inserted_cb (EAlarmList *alarm_list_store, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	field_changed_cb (NULL, data);
-}
-
-static void
-alarm_store_deleted_cb (EAlarmList *alarm_list_store, GtkTreePath *path, gpointer data)
-{
-	field_changed_cb (NULL, data);
-}
-
-static void
-alarm_store_changed_cb (EAlarmList *alarm_list_store, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	field_changed_cb (NULL, data);
-}
-
 #if 0
 static void
-alarm_custom_clicked_cb (GtkWidget *widget, gpointer data)
+alarm_custom_clicked_cb (GtkWidget *widget,
+                         EventPage *epage)
 {
-	EventPage *epage;
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
 	EAlarmList *temp_list_store;
+	CompEditor *editor;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 	gboolean valid_iter;
 	GtkWidget *toplevel;
+	ECal *client;
 
-	epage = EVENT_PAGE (data);
-	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
 
 	/* Make a copy of the list store in case the user cancels */
 	temp_list_store = e_alarm_list_new ();
@@ -2892,11 +2739,11 @@
 	}
 
 	toplevel = gtk_widget_get_toplevel (priv->main);
-	if (alarm_list_dialog_run (toplevel, COMP_EDITOR_PAGE (epage)->client, temp_list_store)) {
+	if (alarm_list_dialog_run (toplevel, client, temp_list_store)) {
 		g_object_unref (priv->alarm_list_store);
 		priv->alarm_list_store = temp_list_store;
 
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (epage));
+		comp_editor_set_changed (editor, TRUE);
 	} else {
 		g_object_unref (temp_list_store);
 	}
@@ -2912,14 +2759,17 @@
 static gboolean
 init_widgets (EventPage *epage)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
 	GtkTextBuffer *text_buffer;
 	icaltimezone *zone;
 	char *menu_label = NULL;
 	GtkTreeSelection *selection;
 	GtkWidget *cus_item, *menu;
+	ECal *client;
 
-	priv = epage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
 
 	/* Make sure the EDateEdit widgets use our timezones to get the
 	   current time. */
@@ -2936,20 +2786,12 @@
 	/* Summary */
 	g_signal_connect((priv->summary), "changed",
 			    G_CALLBACK (summary_changed_cb), epage);
-	g_signal_connect(priv->summary, "focus-in-event",
-			    G_CALLBACK (widget_focus_in_cb), epage);
-	g_signal_connect(priv->summary, "focus-out-event",
-			    G_CALLBACK (widget_focus_out_cb), epage);
 
 
 	/* Description */
 	text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
 
 	gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->description), GTK_WRAP_WORD);
-	g_signal_connect(priv->description, "focus-in-event",
-			    G_CALLBACK (widget_focus_in_cb), epage);
-	g_signal_connect(priv->description, "focus-out-event",
-			    G_CALLBACK (widget_focus_out_cb), epage);
 
 	/* Start and end times */
 	g_signal_connect((priv->start_time), "changed",
@@ -2966,12 +2808,15 @@
 			    G_CALLBACK (source_changed_cb), epage);
 	/* Alarms */
 	priv->alarm_list_store = e_alarm_list_new ();
-	g_signal_connect((GtkTreeModel *)(priv->alarm_list_store), "row-inserted",
-			    G_CALLBACK (alarm_store_inserted_cb), epage);
-	g_signal_connect((GtkTreeModel *)(priv->alarm_list_store), "row-deleted",
-			    G_CALLBACK (alarm_store_deleted_cb), epage);
-	g_signal_connect((GtkTreeModel *)(priv->alarm_list_store), "row-changed",
- 			    G_CALLBACK (alarm_store_changed_cb), epage);
+	g_signal_connect_swapped (
+		priv->alarm_list_store, "row-inserted",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->alarm_list_store, "row-deleted",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->alarm_list_store, "row-changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
 
 	/* Timezone changed */
 	g_signal_connect((priv->start_timezone), "changed",
@@ -3005,7 +2850,7 @@
 	/* Alarm dialog */
 	g_signal_connect (GTK_DIALOG (priv->alarm_dialog), "response", G_CALLBACK (gtk_widget_hide), priv->alarm_dialog);
 	g_signal_connect (GTK_DIALOG (priv->alarm_dialog), "delete-event", G_CALLBACK (gtk_widget_hide), priv->alarm_dialog);
-	priv->alarm_list_dlg_widget = alarm_list_dialog_peek (priv->client, priv->alarm_list_store);
+	priv->alarm_list_dlg_widget = alarm_list_dialog_peek (client, priv->alarm_list_store);
 	gtk_widget_reparent (priv->alarm_list_dlg_widget, priv->alarm_box);
 	gtk_widget_show_all (priv->alarm_list_dlg_widget);
 	gtk_widget_hide (priv->alarm_dialog);
@@ -3080,35 +2925,38 @@
 	menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->alarm_time));
 	gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), cus_item);
 
-	g_signal_connect (priv->alarm_time, "changed",
-			  G_CALLBACK (field_changed_cb), epage);
-	g_signal_connect (priv->alarm_time, "changed",
-			  G_CALLBACK (alarm_changed_cb), epage);
+	g_signal_connect_swapped (
+		priv->alarm_time, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect (
+		priv->alarm_time, "changed",
+		G_CALLBACK (alarm_changed_cb), epage);
 
 	/* Belongs to priv->description */
-	g_signal_connect((text_buffer), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-
-	g_signal_connect((priv->summary), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-	g_signal_connect((priv->location), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-	g_signal_connect((priv->location), "focus-in-event",
-			    G_CALLBACK (widget_focus_in_cb), epage);
-	g_signal_connect((priv->location), "focus-out-event",
-			    G_CALLBACK (widget_focus_out_cb), epage);
-	g_signal_connect((priv->start_time), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-	g_signal_connect((priv->end_time), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-	g_signal_connect((priv->categories), "changed",
-			    G_CALLBACK (field_changed_cb), epage);
-
-	/* emit signal when the group is changed */
-	g_signal_connect((priv->source_selector),"changed",G_CALLBACK(field_changed_cb),epage);
-
-	/*call the field_changed_cb when the timezone is changed*/
-	g_signal_connect((priv->start_timezone), "changed",G_CALLBACK (field_changed_cb), epage);
+	g_signal_connect_swapped (
+		text_buffer, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->summary, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->location, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->start_time, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->end_time, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->categories, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->source_selector, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
+	g_signal_connect_swapped (
+		priv->start_timezone, "changed",
+		G_CALLBACK (comp_editor_page_changed), epage);
 
 	/* Set the default timezone, so the timezone entry may be hidden. */
 	zone = calendar_config_get_icaltimezone ();
@@ -3125,8 +2973,10 @@
 static void
 event_page_select_organizer (EventPage *epage, const char *backend_address)
 {
-	EventPagePrivate *priv;
+	EventPagePrivate *priv = epage->priv;
+	CompEditor *editor;
 	GList *l;
+	ECal *client;
 	EAccount *def_account;
 	gchar *def_address = NULL;
 	const char *default_address;
@@ -3138,9 +2988,11 @@
 	if (def_account && def_account->enabled)
 		def_address = g_strdup_printf("%s <%s>", def_account->id->name, def_account->id->address);
 
-	priv = epage->priv;
-	if (COMP_EDITOR_PAGE (epage)->client)
-		source = e_cal_get_source (COMP_EDITOR_PAGE (epage)->client);
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (epage));
+	client = comp_editor_get_client (editor);
+
+	if (client)
+		source = e_cal_get_source (client);
 	if (source)
 		user_addr = e_source_get_property (source, "subscriber");
 
@@ -3182,7 +3034,7 @@
  * created.
  **/
 EventPage *
-event_page_construct (EventPage *epage, EMeetingStore *model, ECal *client)
+event_page_construct (EventPage *epage, EMeetingStore *model)
 {
 	EventPagePrivate *priv;
 	EIterator *it;
@@ -3192,7 +3044,6 @@
 	priv = epage->priv;
 	g_object_ref (model);
 	priv->model = model;
-	priv->client = client;
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "event-page.glade",
@@ -3254,18 +3105,16 @@
  * not be created.
  **/
 EventPage *
-event_page_new (EMeetingStore *model, ECal *client, BonoboUIComponent *uic)
+event_page_new (EMeetingStore *model, CompEditor *editor)
 {
 	EventPage *epage;
 
-	epage = g_object_new (TYPE_EVENT_PAGE, NULL);
-	if (!event_page_construct (epage, model, client)) {
+	epage = g_object_new (TYPE_EVENT_PAGE, "editor", editor, NULL);
+	if (!event_page_construct (epage, model)) {
 		g_object_unref (epage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
-	epage->priv->uic = uic;
-
 	return epage;
 }
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/event-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/event-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/event-page.h	Tue Jul 15 18:34:59 2008
@@ -24,62 +24,86 @@
 #ifndef EVENT_PAGE_H
 #define EVENT_PAGE_H
 
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 #include "../e-meeting-attendee.h"
 #include "../e-meeting-store.h"
 #include "../e-meeting-list-view.h"
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_EVENT_PAGE \
+	(event_page_get_type ())
+#define EVENT_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_EVENT_PAGE, EventPage))
+#define EVENT_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_EVENT_PAGE, EventPageClass))
+#define IS_EVENT_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_EVENT_PAGE))
+#define IS_EVENT_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_EVENT_PAGE))
+#define EVENT_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_EVENT_PAGE, EventPageClass))
 
-#define TYPE_EVENT_PAGE            (event_page_get_type ())
-#define EVENT_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_EVENT_PAGE, EventPage))
-#define EVENT_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_EVENT_PAGE, EventPageClass))
-#define IS_EVENT_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_EVENT_PAGE))
-#define IS_EVENT_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_EVENT_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _EventPage EventPage;
+typedef struct _EventPageClass EventPageClass;
 typedef struct _EventPagePrivate EventPagePrivate;
 
-typedef struct {
+struct _EventPage {
 	CompEditorPage page;
-
-	/* Private data */
 	EventPagePrivate *priv;
-} EventPage;
+};
 
-typedef struct {
+struct _EventPageClass {
 	CompEditorPageClass parent_class;
-} EventPageClass;
-
+};
 
-GType      event_page_get_type  (void);
-EventPage *event_page_construct (EventPage *epage, EMeetingStore *model, ECal *client);
-EventPage *event_page_new       (EMeetingStore *model, ECal *client, BonoboUIComponent *uic);
-ECalComponent *event_page_get_cancel_comp (EventPage *page);
-void event_page_show_options (EventPage *page);
-void event_page_hide_options (EventPage *page);
-void event_page_sendoptions_clicked_cb (EventPage *epage);
-void event_page_set_meeting (EventPage *page, gboolean set);
-void event_page_set_show_timezone (EventPage *epage, gboolean state);
-void event_page_set_view_rsvp (EventPage *epage, gboolean state);
-void event_page_set_classification (EventPage *epage, ECalComponentClassification class);
-void event_page_set_delegate (EventPage *page, gboolean set);
-void event_page_set_all_day_event (EventPage *epage, gboolean all_day);
-void event_page_set_show_categories (EventPage *epage, gboolean state);
-void event_page_set_show_time_busy (EventPage *epage, gboolean state);
-void event_page_show_alarm (EventPage *epage);
-void event_page_set_info_string (EventPage *epage, const gchar *icon, const gchar *msg);
-
-void event_page_set_view_role (EventPage *epage, gboolean state);
-void event_page_set_view_status (EventPage *epage, gboolean state);
-void event_page_set_view_type (EventPage *epage, gboolean state);
-void event_page_set_view_rvsp (EventPage *epage, gboolean state);
-ENameSelector *event_page_get_name_selector (EventPage *epage);
-void event_page_add_attendee (EventPage *epage, EMeetingAttendee *attendee);
+GType		event_page_get_type		(void);
+EventPage *	event_page_construct		(EventPage *epage,
+						 EMeetingStore *model);
+EventPage *	event_page_new			(EMeetingStore *model,
+						 CompEditor *editor);
+ECalComponent *	event_page_get_cancel_comp	(EventPage *page);
+void		event_page_show_options		(EventPage *page);
+void		event_page_hide_options		(EventPage *page);
+void		event_page_sendoptions_clicked_cb
+						(EventPage *epage);
+void		event_page_set_meeting		(EventPage *page,
+						 gboolean set);
+void		event_page_set_show_timezone	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_view_rsvp	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_delegate		(EventPage *page,
+						 gboolean set);
+void		event_page_set_all_day_event	(EventPage *epage,
+						 gboolean all_day);
+void		event_page_set_show_categories	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_show_time_busy	(EventPage *epage,
+						 gboolean state);
+void		event_page_show_alarm		(EventPage *epage);
+void		event_page_set_info_string	(EventPage *epage,
+						 const gchar *icon,
+						 const gchar *msg);
+
+void		event_page_set_view_role	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_view_status	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_view_type	(EventPage *epage,
+						 gboolean state);
+void		event_page_set_view_rvsp	(EventPage *epage,
+						 gboolean state);
+ENameSelector *	event_page_get_name_selector	(EventPage *epage);
+void		event_page_add_attendee		(EventPage *epage,
+						 EMeetingAttendee *attendee);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/memo-editor.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/memo-editor.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/memo-editor.c	Tue Jul 15 18:34:59 2008
@@ -32,252 +32,113 @@
 #include <glade/glade.h>
 #include <glib/gi18n.h>
 
-#include <evolution-shell-component-utils.h>
+#include <e-util/e-plugin-ui.h>
 #include <e-util/e-util-private.h>
+#include <evolution-shell-component-utils.h>
+
 #include "memo-page.h"
 #include "cancel-comp.h"
-#include "../calendar-config.h"
 #include "memo-editor.h"
 
+#define MEMO_EDITOR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_MEMO_EDITOR, MemoEditorPrivate))
+
 struct _MemoEditorPrivate {
 	MemoPage *memo_page;
 
 	gboolean updating;
 };
 
-static void memo_editor_set_e_cal (CompEditor *editor, ECal *client);
-static void memo_editor_edit_comp (CompEditor *editor, ECalComponent *comp);
-static gboolean memo_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static void memo_editor_finalize (GObject *object);
+/* Extends the UI definition in CompEditor */
+static const gchar *ui =
+"<ui>"
+"  <menubar action='main-menu'>"
+"    <menu action='view-menu'>"
+"      <menuitem action='view-categories'/>"
+"    </menu>"
+"    <menu action='options-menu'>"
+"      <menu action='classification-menu'>"
+"        <menuitem action='classify-public'/>"
+"        <menuitem action='classify-private'/>"
+"        <menuitem action='classify-confidential'/>"
+"      </menu>"
+"    </menu>"
+"  </menubar>"
+"</ui>";
 
 G_DEFINE_TYPE (MemoEditor, memo_editor, TYPE_COMP_EDITOR)
 
-
-
-/**
- * memo_editor_get_type:
- *
- * Registers the #MemoEditor class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #MemoEditor class.
- **/
-
-/* Class initialization function for the event editor */
 static void
-memo_editor_class_init (MemoEditorClass *klass)
+memo_editor_show_categories (CompEditor *editor,
+                             gboolean visible)
 {
-	GObjectClass *object_class;
-	CompEditorClass *editor_class;
-
-	object_class = (GObjectClass *) klass;
-	editor_class = (CompEditorClass *) klass;
-
-	editor_class->set_e_cal = memo_editor_set_e_cal;
-	editor_class->edit_comp = memo_editor_edit_comp;
-	editor_class->send_comp = memo_editor_send_comp;
-
-	object_class->finalize = memo_editor_finalize;
-}
+	MemoEditorPrivate *priv;
 
-static void
-init_widgets (MemoEditor *me)
-{
-}
+	priv = MEMO_EDITOR_GET_PRIVATE (editor);
 
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-/*	set_menu_sens (MEMO_EDITOR (user_data)); */
+	memo_page_set_show_categories (priv->memo_page, visible);
 }
 
 static void
-menu_show_categories_cb (BonoboUIComponent         	*component,
-		         const char                  	*path,
-		         Bonobo_UIComponent_EventType 	type,
-		         const char                  	*state,
-		         gpointer                     	user_data)
+memo_editor_dispose (GObject *object)
 {
-	MemoEditor *me = (MemoEditor *) user_data;
-
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-
-	memo_page_set_show_categories (me->priv->memo_page, atoi(state));
-	calendar_config_set_show_categories (atoi(state));
-}
+	MemoEditorPrivate *priv;
 
-static void
-menu_class_public_cb (BonoboUIComponent           	*ui_component,
-		      const char                  	*path,
-		      Bonobo_UIComponent_EventType 	type,
-		      const char                  	*state,
-		      gpointer			  	user_data)
-{
-	MemoEditor *me = (MemoEditor *) user_data;
+	priv = MEMO_EDITOR_GET_PRIVATE (object);
 
-	if (state[0] == '0')
-		return;
+	if (priv->memo_page) {
+		g_object_unref (priv->memo_page);
+		priv->memo_page = NULL;
+	}
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (me->priv->memo_page));
-	memo_page_set_classification (me->priv->memo_page, E_CAL_COMPONENT_CLASS_PUBLIC);
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (memo_editor_parent_class)->dispose (object);
 }
 
 static void
-menu_class_private_cb (BonoboUIComponent          	*ui_component,
-		       const char                  	*path,
-		       Bonobo_UIComponent_EventType 	type,
-		       const char                  	*state,
-		       gpointer			  	user_data)
+memo_editor_class_init (MemoEditorClass *class)
 {
-	MemoEditor *me = (MemoEditor *) user_data;
-	if (state[0] == '0')
-		return;
+	GObjectClass *object_class;
+	CompEditorClass *editor_class;
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (me->priv->memo_page));
-	memo_page_set_classification (me->priv->memo_page, E_CAL_COMPONENT_CLASS_PRIVATE);
-}
+	g_type_class_add_private (class, sizeof (MemoEditorPrivate));
 
-static void
-menu_class_confidential_cb (BonoboUIComponent           	*ui_component,
-		     	    const char                  	*path,
-		     	    Bonobo_UIComponent_EventType 	type,
-		     	    const char                  	*state,
-		     	    gpointer				user_data)
-{
-	MemoEditor *me = (MemoEditor *) user_data;
-	if (state[0] == '0')
-		return;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = memo_editor_dispose;
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (me->priv->memo_page));
-	memo_page_set_classification (me->priv->memo_page, E_CAL_COMPONENT_CLASS_CONFIDENTIAL);
+	/* TODO Add a help section for memos. */
+	editor_class = COMP_EDITOR_CLASS (class);
+	/*editor_class->help_section = "usage-calendar-memo";*/
+	editor_class->show_categories = memo_editor_show_categories;
 }
 
 /* Object initialization function for the memo editor */
 static void
 memo_editor_init (MemoEditor *me)
 {
-	MemoEditorPrivate *priv;
-	CompEditor *editor = COMP_EDITOR(me);
-	gboolean status;
-	char *xmlfile;
-
-	priv = g_new0 (MemoEditorPrivate, 1);
-	me->priv = priv;
-
-	priv->updating = FALSE;
-
-	bonobo_ui_component_freeze (editor->uic, NULL);
-
-	xmlfile = g_build_filename (EVOLUTION_UIDIR, "evolution-memo-editor.xml", NULL);
-	bonobo_ui_util_set_ui (editor->uic, PREFIX,
-			       xmlfile,
-			       "evolution-memo-editor", NULL);
-	g_free (xmlfile);
-
-	status = calendar_config_get_show_categories ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewCategories",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewCategories",
-		menu_show_categories_cb, editor);
-
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ActionClassPublic",
-		"state", "1", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPublic",
-		menu_class_public_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPrivate",
-		menu_class_private_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassConfidential",
-		menu_class_confidential_cb, editor);
-
-	bonobo_ui_component_thaw (editor->uic, NULL);
-
-	/* TODO add help stuff */
-/*	comp_editor_set_help_section (COMP_EDITOR (me), "usage-calendar-memo"); */
-}
-
-MemoEditor *
-memo_editor_construct (MemoEditor *me, ECal *client)
-{
-	MemoEditorPrivate *priv;
 	CompEditor *editor = COMP_EDITOR (me);
-	gboolean read_only = FALSE;
-	guint32 flags = comp_editor_get_flags (editor);
-
-	priv = me->priv;
-
-	priv->memo_page = memo_page_new (editor->uic, flags);
-	g_object_ref_sink (priv->memo_page);
-	comp_editor_append_page (COMP_EDITOR (me),
-				 COMP_EDITOR_PAGE (priv->memo_page),
-				 _("Memo"), TRUE);
-	g_signal_connect (G_OBJECT (priv->memo_page), "client_changed",
-			  G_CALLBACK (client_changed_cb), me);
-
-	if (!e_cal_is_read_only (client, &read_only, NULL))
-		read_only = TRUE;
-
-	bonobo_ui_component_set_prop (editor->uic, "/Toolbar/ecal3", "hidden", "1", NULL);
-	comp_editor_set_e_cal (COMP_EDITOR (me), client);
-
-
-
-	init_widgets (me);
-
-	return me;
-}
-
-static void
-memo_editor_set_e_cal (CompEditor *editor, ECal *client)
-{
-	if (COMP_EDITOR_CLASS (memo_editor_parent_class)->set_e_cal)
-		COMP_EDITOR_CLASS (memo_editor_parent_class)->set_e_cal (editor, client);
-}
-
-static void
-memo_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
-{
-	if (COMP_EDITOR_CLASS (memo_editor_parent_class)->edit_comp)
-		COMP_EDITOR_CLASS (memo_editor_parent_class)->edit_comp (editor, comp);
-}
+	GtkUIManager *manager;
+	GError *error = NULL;
 
-static gboolean
-memo_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
-{
-	if (COMP_EDITOR_CLASS (memo_editor_parent_class)->send_comp)
-		return COMP_EDITOR_CLASS (memo_editor_parent_class)->send_comp (editor, method);
-
-	return FALSE;
-}
+	me->priv = MEMO_EDITOR_GET_PRIVATE (me);
+	me->priv->updating = FALSE;
 
-/* Destroy handler for the event editor */
-static void
-memo_editor_finalize (GObject *object)
-{
-	MemoEditor *me;
-	MemoEditorPrivate *priv;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_MEMO_EDITOR (object));
-
-	me = MEMO_EDITOR (object);
-	priv = me->priv;
-
-	if (priv->memo_page) {
-		g_object_unref (priv->memo_page);
-		priv->memo_page = NULL;
+	manager = comp_editor_get_ui_manager (editor);
+	gtk_ui_manager_add_ui_from_string (manager, ui, -1, &error);
+	e_plugin_ui_register_manager ("memo-editor", manager, me);
+
+	if (error != NULL) {
+		g_critical ("%s: %s", G_STRFUNC, error->message);
+		g_error_free (error);
 	}
 
-	g_free (priv);
-
-	if (G_OBJECT_CLASS (memo_editor_parent_class)->finalize)
-		(* G_OBJECT_CLASS (memo_editor_parent_class)->finalize) (object);
+	me->priv->memo_page = memo_page_new (editor);
+	g_object_ref_sink (me->priv->memo_page);
+	comp_editor_append_page (
+		COMP_EDITOR (me),
+		COMP_EDITOR_PAGE (me->priv->memo_page),
+		_("Memo"), TRUE);
 }
 
 /**
@@ -289,13 +150,12 @@
  * Return value: A newly-created event editor dialog, or NULL if the event
  * editor could not be created.
  **/
-MemoEditor *
+CompEditor *
 memo_editor_new (ECal *client, CompEditorFlags flags)
 {
-	MemoEditor *me;
+	g_return_val_if_fail (E_IS_CAL (client), NULL);
 
-	me = g_object_new (TYPE_MEMO_EDITOR, NULL);
-	comp_editor_set_flags (COMP_EDITOR (me), flags);
-	return memo_editor_construct (me, client);
+	return g_object_new (
+		TYPE_MEMO_EDITOR,
+		"flags", flags, "client", client, NULL);
 }
-

Modified: branches/kill-bonobo/calendar/gui/dialogs/memo-editor.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/memo-editor.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/memo-editor.h	Tue Jul 15 18:34:59 2008
@@ -28,12 +28,26 @@
 #include <gtk/gtk.h>
 #include "comp-editor.h"
 
-#define TYPE_MEMO_EDITOR            (memo_editor_get_type ())
-#define MEMO_EDITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MEMO_EDITOR, MemoEditor))
-#define MEMO_EDITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MEMO_EDITOR,	\
-				      MemoEditorClass))
-#define IS_MEMO_EDITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MEMO_EDITOR))
-#define IS_MEMO_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MEMO_EDITOR))
+/* Standard GObject macros */
+#define TYPE_MEMO_EDITOR \
+	(memo_editor_get_type ())
+#define MEMO_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_MEMO_EDITOR, MemoEditor))
+#define MEMO_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_MEMO_EDITOR, MemoEditorClass))
+#define IS_MEMO_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_MEMO_EDITOR))
+#define IS_MEMO_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), TYPE_MEMO_EDITOR))
+#define MEMO_EDITOR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_MEMO_EDITOR, MemoEditorClass))
+
+G_BEGIN_DECLS
 
 typedef struct _MemoEditor MemoEditor;
 typedef struct _MemoEditorClass MemoEditorClass;
@@ -41,8 +55,6 @@
 
 struct _MemoEditor {
 	CompEditor parent;
-
-	/* Private data */
 	MemoEditorPrivate *priv;
 };
 
@@ -50,10 +62,10 @@
 	CompEditorClass parent_class;
 };
 
-GType       memo_editor_get_type       (void);
-MemoEditor *memo_editor_construct      (MemoEditor *te,
-					ECal  *client);
-MemoEditor *memo_editor_new            (ECal  *client, CompEditorFlags flags);
+GType		memo_editor_get_type		(void);
+CompEditor *	memo_editor_new			(ECal *client,
+						 CompEditorFlags flags);
 
+G_END_DECLS
 
 #endif /* __MEMO_EDITOR_H__ */

Modified: branches/kill-bonobo/calendar/gui/dialogs/memo-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/memo-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/memo-page.c	Tue Jul 15 18:34:59 2008
@@ -47,8 +47,11 @@
 #include "e-send-options-utils.h"
 #include "memo-page.h"
 
+#define MEMO_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_MEMO_PAGE, MemoPagePrivate))
 
-/* Private part of the TaskPage structure */
+/* Private part of the MemoPage structure */
 struct _MemoPagePrivate {
 	/* Glade XML data */
 	GladeXML *xml;
@@ -60,11 +63,6 @@
 
 	EAccountList *accounts;
 
-	/* Bonobo Controller for the menu/toolbar */
-	BonoboUIComponent *uic;
-
-	ECalComponentClassification classification;
-
 	/* Generic informative messages placeholder */
 	GtkWidget *info_hbox;
 	GtkWidget *info_icon;
@@ -95,278 +93,100 @@
 	GList *address_strings;
 
 	ENameSelector *name_selector;
-
-	gboolean updating;
-};
-
-static const int classification_map[] = {
-	E_CAL_COMPONENT_CLASS_PUBLIC,
-	E_CAL_COMPONENT_CLASS_PRIVATE,
-	E_CAL_COMPONENT_CLASS_CONFIDENTIAL,
-	-1
 };
 
-
-
-static void memo_page_finalize (GObject *object);
-
-static GtkWidget *memo_page_get_widget (CompEditorPage *page);
-static void memo_page_focus_main_widget (CompEditorPage *page);
-static gboolean memo_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
+static void set_subscriber_info_string (MemoPage *mpage, const gchar *backend_address);
+static const char * get_recipients (ECalComponent *comp);
+static void sensitize_widgets (MemoPage *mpage);
 static gboolean memo_page_fill_component (CompEditorPage *page, ECalComponent *comp);
 static void memo_page_select_organizer (MemoPage *mpage, const char *backend_address);
-static void set_subscriber_info_string (MemoPage *mpage, const char *backend_address);
 
 G_DEFINE_TYPE (MemoPage, memo_page, TYPE_COMP_EDITOR_PAGE)
 
-
-
-/**
- * memo_page_get_type:
- *
- * Registers the #TaskPage class if necessary, and returns the type ID
- * associated to it.
- *
- * Return value: The type ID of the #TaskPage class.
- **/
-
-/* Class initialization function for the memo page */
+/* Fills the widgets with default values */
 static void
-memo_page_class_init (MemoPageClass *klass)
+clear_widgets (MemoPage *mpage)
 {
-	CompEditorPageClass *editor_page_class;
-	GObjectClass *object_class;
+	GtkTextBuffer *buffer;
+	GtkTextView *view;
+	CompEditor *editor;
 
-	editor_page_class = (CompEditorPageClass *) klass;
-	object_class = (GObjectClass *) klass;
+	/* Summary */
+	e_dialog_editable_set (mpage->priv->summary_entry, NULL);
 
-	editor_page_class->get_widget = memo_page_get_widget;
-	editor_page_class->focus_main_widget = memo_page_focus_main_widget;
-	editor_page_class->fill_widgets = memo_page_fill_widgets;
-	editor_page_class->fill_component = memo_page_fill_component;
+	/* Description */
+	view = GTK_TEXT_VIEW (mpage->priv->memo_content);
+	buffer = gtk_text_view_get_buffer (view);
+	gtk_text_buffer_set_text (buffer, "", 0);
 
-	object_class->finalize = memo_page_finalize;
+	/* Classification */
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	comp_editor_set_classification (editor, E_CAL_COMPONENT_CLASS_PRIVATE);
+
+	/* Categories */
+	e_dialog_editable_set (mpage->priv->categories, NULL);
 }
 
-/* Object initialization function for the memo page */
 static void
-memo_page_init (MemoPage *mpage)
+memo_page_dispose (GObject *object)
 {
 	MemoPagePrivate *priv;
 
-	priv = g_new0 (MemoPagePrivate, 1);
-	mpage->priv = priv;
-
-	priv->xml = NULL;
-
-	priv->main = NULL;
-	priv->memo_content = NULL;
-	priv->classification = E_CAL_COMPONENT_CLASS_NONE;
-	priv->categories_btn = NULL;
-	priv->categories = NULL;
+	priv = MEMO_PAGE_GET_PRIVATE (object);
 
-	priv->info_hbox = NULL;
-	priv->info_icon = NULL;
-	priv->info_string = NULL;
-
-	priv->updating = FALSE;
+	g_list_foreach (priv->address_strings, (GFunc) g_free, NULL);
+	g_list_free (priv->address_strings);
 
-	priv->address_strings = NULL;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (memo_page_parent_class)->dispose (object);
 }
 
-/* Destroy handler for the memo page */
 static void
 memo_page_finalize (GObject *object)
 {
-	MemoPage *mpage;
 	MemoPagePrivate *priv;
-	GList *l;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_MEMO_PAGE (object));
-
-	mpage = MEMO_PAGE (object);
-	priv = mpage->priv;
 
-	for (l = priv->address_strings; l != NULL; l = l->next)
-		g_free (l->data);
-	g_list_free (priv->address_strings);
+	priv = MEMO_PAGE_GET_PRIVATE (object);
 
-	if (priv->main)
+	if (priv->main != NULL) {
 		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
 
 	if (priv->xml) {
 		g_object_unref (priv->xml);
 		priv->xml = NULL;
 	}
 
-	g_free (priv);
-	mpage->priv = NULL;
-
-	if (G_OBJECT_CLASS (memo_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (memo_page_parent_class)->finalize) (object);
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (memo_page_parent_class)->finalize (object);
 }
 
-static void
-set_classification_menu (MemoPage *page, gint class)
-{
-	bonobo_ui_component_freeze (page->priv->uic, NULL);
-	switch (class) {
-		case E_CAL_COMPONENT_CLASS_PUBLIC:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassPublic",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassConfidential",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_PRIVATE:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassPrivate",
-				"state", "1", NULL);
-			break;
-	}
-	bonobo_ui_component_thaw (page->priv->uic, NULL);
-}
-
-/* get_widget handler for the task page */
 static GtkWidget *
 memo_page_get_widget (CompEditorPage *page)
 {
-	MemoPage *mpage;
-	MemoPagePrivate *priv;
-
-	mpage = MEMO_PAGE (page);
-	priv = mpage->priv;
+	MemoPagePrivate *priv = MEMO_PAGE_GET_PRIVATE (page);
 
 	return priv->main;
 }
 
-/* focus_main_widget handler for the memo page */
 static void
 memo_page_focus_main_widget (CompEditorPage *page)
 {
-	MemoPage *mpage;
-	MemoPagePrivate *priv;
-
-	mpage = MEMO_PAGE (page);
-	priv = mpage->priv;
+	MemoPagePrivate *priv = MEMO_PAGE_GET_PRIVATE (page);
 
 	gtk_widget_grab_focus (priv->summary_entry);
 }
 
-/* Fills the widgets with default values */
-static void
-clear_widgets (MemoPage *mpage)
-{
-	MemoPagePrivate *priv;
-
-	priv = mpage->priv;
-
-	/* Summary */
-	e_dialog_editable_set (priv->summary_entry, NULL);
-
-	/* memo content */
-	gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->memo_content)), "", 0);
-
-	/* Classification */
-	priv->classification = E_CAL_COMPONENT_CLASS_PRIVATE;
-	set_classification_menu (mpage, priv->classification);
-
-	/* Categories */
-	e_dialog_editable_set (priv->categories, NULL);
-}
-
-void
-memo_page_set_classification (MemoPage *page, ECalComponentClassification class)
-{
-	page->priv->classification = class;
-}
-
-static void
-sensitize_widgets (MemoPage *mpage)
-{
-	gboolean read_only, sens = FALSE, sensitize;
-	MemoPagePrivate *priv;
-
-	priv = mpage->priv;
-
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (mpage)->client, &read_only, NULL))
-		read_only = TRUE;
-
-	if (COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_IS_SHARED)
-	 	sens = COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_PAGE_USER_ORG;
-	else
-		sens = TRUE;
-
-	sensitize = (!read_only && sens);
-
-	priv = mpage->priv;
-
-	/* The list of organizers is set to be non-editable. Otherwise any
- 	* change in the displayed list causes an 'Account not found' error.
- 	*/
-	gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (priv->org_combo)->entry), FALSE);
-
-	gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->memo_content), sensitize);
-	gtk_widget_set_sensitive (priv->start_date, sensitize);
-	gtk_widget_set_sensitive (priv->categories_btn, !read_only);
-	gtk_editable_set_editable (GTK_EDITABLE (priv->categories), !read_only);
-	gtk_editable_set_editable (GTK_EDITABLE (priv->summary_entry), sensitize);
-
-	if (COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_IS_SHARED) {
-		if (priv->to_entry) {
-			gtk_editable_set_editable (GTK_EDITABLE (priv->to_entry), !read_only);
-			gtk_widget_grab_focus (priv->to_entry);
-		}
-	}
-
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPublic", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPrivate", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassConfidential", "sensitive",
-		       	sensitize ? "1" : "0", NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/InsertAttachments", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-}
-
-/* returns empty string rather than NULL because of simplicity of usage */
-static const char *
-get_recipients (ECalComponent *comp)
-{
-	icalcomponent *icalcomp;
-	icalproperty *icalprop;
-
-	g_return_val_if_fail (comp != NULL, "");
-
-	icalcomp = e_cal_component_get_icalcomponent (comp);
-
-	/* first look if we have there such property */
-	for (icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
-	     icalprop;
-	     icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY)) {
-		const char *xname = icalproperty_get_x_name (icalprop);
-
-		if (xname && strcmp (xname, "X-EVOLUTION-RECIPIENTS") == 0)
-			break;
-	}
-
-	if (icalprop)
-		return icalproperty_get_x (icalprop);
-
-	return "";
-}
-
-
-/* fill_widgets handler for the memo page */
 static gboolean
-memo_page_fill_widgets (CompEditorPage *page, ECalComponent *comp)
+memo_page_fill_widgets (CompEditorPage *page,
+                        ECalComponent *comp)
 {
 	MemoPage *mpage;
 	MemoPagePrivate *priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
 	ECalComponentClassification cl;
 	ECalComponentText text;
 	ECalComponentDateTime d;
@@ -377,7 +197,9 @@
 	mpage = MEMO_PAGE (page);
 	priv = mpage->priv;
 
-	priv->updating = TRUE;
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
 
 	/* Clean the screen */
 	clear_widgets (mpage);
@@ -406,41 +228,19 @@
 		e_date_edit_set_date (E_DATE_EDIT (priv->start_date),
 				      start_tt->year, start_tt->month,
 				      start_tt->day);
-	} else if (!(page->flags & COMP_EDITOR_PAGE_NEW_ITEM))
+	} else if (!(flags & COMP_EDITOR_NEW_ITEM))
 		e_date_edit_set_time (E_DATE_EDIT (priv->start_date), -1);
 	e_cal_component_free_datetime (&d);
 
 	/* Classification. */
 	e_cal_component_get_classification (comp, &cl);
-
-	switch (cl) {
-	case E_CAL_COMPONENT_CLASS_PUBLIC:
-		{
-			cl = E_CAL_COMPONENT_CLASS_PUBLIC;
-			break;
-		}
-	case E_CAL_COMPONENT_CLASS_PRIVATE:
-		{
-			cl = E_CAL_COMPONENT_CLASS_PRIVATE;
-			break;
-		}
-	case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-		{
-			cl = E_CAL_COMPONENT_CLASS_CONFIDENTIAL;
-			break;
-		}
-	default:
-		/* default to PUBLIC */
-		cl = E_CAL_COMPONENT_CLASS_PUBLIC;
-                break;
-	}
-	set_classification_menu (mpage, cl);
+	comp_editor_set_classification (editor, cl);
 
 	/* Categories */
 	e_cal_component_get_categories (comp, &categories);
 	e_dialog_editable_set (priv->categories, categories);
 
-	e_cal_get_cal_address (COMP_EDITOR_PAGE (mpage)->client, &backend_addr, NULL);
+	e_cal_get_cal_address (client, &backend_addr, NULL);
 	set_subscriber_info_string (mpage, backend_addr);
 
 	if (e_cal_component_has_organizer (comp)) {
@@ -457,7 +257,7 @@
 			else
 				string = g_strdup (strip);
 
-			if (itip_organizer_is_user (comp, page->client) || itip_sentby_is_user (comp)) {
+			if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)) {
 				gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->org_combo)->entry), string);
 			} else {
 				list = g_list_append (list, string);
@@ -475,18 +275,117 @@
 	/* Source */
 	e_source_combo_box_set_active (
 		E_SOURCE_COMBO_BOX (priv->source_selector),
-		e_cal_get_source (page->client));
+		e_cal_get_source (client));
 
-	if (priv->to_entry && (page->flags & COMP_EDITOR_PAGE_IS_SHARED) && !(page->flags & COMP_EDITOR_PAGE_NEW_ITEM))
+	if (priv->to_entry && (flags & COMP_EDITOR_IS_SHARED) && !(flags & COMP_EDITOR_NEW_ITEM))
 		gtk_entry_set_text (GTK_ENTRY (priv->to_entry), get_recipients (comp));
 
-	priv->updating = FALSE;
-
 	sensitize_widgets (mpage);
 
 	return TRUE;
 }
 
+static void
+memo_page_class_init (MemoPageClass *class)
+{
+	CompEditorPageClass *editor_page_class;
+	GObjectClass *object_class;
+
+	g_type_class_add_private (class, sizeof (MemoPagePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = memo_page_dispose;
+	object_class->finalize = memo_page_finalize;
+
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
+	editor_page_class->get_widget = memo_page_get_widget;
+	editor_page_class->focus_main_widget = memo_page_focus_main_widget;
+	editor_page_class->fill_widgets = memo_page_fill_widgets;
+	editor_page_class->fill_component = memo_page_fill_component;
+}
+
+static void
+memo_page_init (MemoPage *mpage)
+{
+	mpage->priv = MEMO_PAGE_GET_PRIVATE (mpage);
+}
+
+static void
+sensitize_widgets (MemoPage *mpage)
+{
+	GtkActionGroup *action_group;
+	gboolean read_only, sens = FALSE, sensitize;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	MemoPagePrivate *priv;
+	ECal *client;
+
+	priv = mpage->priv;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
+	if (!e_cal_is_read_only (client, &read_only, NULL))
+		read_only = TRUE;
+
+	if (flags & COMP_EDITOR_IS_SHARED)
+	 	sens = flags & COMP_EDITOR_USER_ORG;
+	else
+		sens = TRUE;
+
+	sensitize = (!read_only && sens);
+
+	/* The list of organizers is set to be non-editable. Otherwise any
+ 	* change in the displayed list causes an 'Account not found' error.
+ 	*/
+	gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (priv->org_combo)->entry), FALSE);
+
+	gtk_text_view_set_editable (GTK_TEXT_VIEW (priv->memo_content), sensitize);
+	gtk_widget_set_sensitive (priv->start_date, sensitize);
+	gtk_widget_set_sensitive (priv->categories_btn, !read_only);
+	gtk_editable_set_editable (GTK_EDITABLE (priv->categories), !read_only);
+	gtk_editable_set_editable (GTK_EDITABLE (priv->summary_entry), sensitize);
+
+	if (flags & COMP_EDITOR_IS_SHARED) {
+		if (priv->to_entry) {
+			gtk_editable_set_editable (GTK_EDITABLE (priv->to_entry), !read_only);
+			gtk_widget_grab_focus (priv->to_entry);
+		}
+	}
+
+	action_group = comp_editor_get_action_group (editor, "individual");
+	gtk_action_group_set_sensitive (action_group, sensitize);
+}
+
+/* returns empty string rather than NULL because of simplicity of usage */
+static const char *
+get_recipients (ECalComponent *comp)
+{
+	icalcomponent *icalcomp;
+	icalproperty *icalprop;
+
+	g_return_val_if_fail (comp != NULL, "");
+
+	icalcomp = e_cal_component_get_icalcomponent (comp);
+
+	/* first look if we have there such property */
+	for (icalprop = icalcomponent_get_first_property (icalcomp, ICAL_X_PROPERTY);
+	     icalprop;
+	     icalprop = icalcomponent_get_next_property (icalcomp, ICAL_X_PROPERTY)) {
+		const char *xname = icalproperty_get_x_name (icalprop);
+
+		if (xname && strcmp (xname, "X-EVOLUTION-RECIPIENTS") == 0)
+			break;
+	}
+
+	if (icalprop)
+		return icalproperty_get_x (icalprop);
+
+	return "";
+}
+
+
 static gboolean
 fill_comp_with_recipients (ENameSelector *name_selector, ECalComponent *comp)
 {
@@ -607,12 +506,10 @@
 static EAccount *
 get_current_account (MemoPage *page)
 {
-	MemoPagePrivate *priv;
+	MemoPagePrivate *priv = page->priv;
 	EIterator *it;
 	const char *str;
 
-	priv = page->priv;
-
 	str = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (priv->org_combo)->entry));
 	if (!str)
 		return NULL;
@@ -637,10 +534,15 @@
 
 /* fill_component handler for the memo page */
 static gboolean
-memo_page_fill_component (CompEditorPage *page, ECalComponent *comp)
+memo_page_fill_component (CompEditorPage *page,
+                          ECalComponent *comp)
 {
 	MemoPage *mpage;
 	MemoPagePrivate *priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
+	ECalComponentClassification classification;
 	ECalComponentDateTime start_date;
 	struct icaltimetype start_tt;
 	char *cat, *str;
@@ -650,6 +552,11 @@
 
 	mpage = MEMO_PAGE (page);
 	priv = mpage->priv;
+
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
 	text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->memo_content));
 
 	/* Summary */
@@ -738,7 +645,8 @@
 		e_cal_component_set_dtstart (comp, NULL);
 
 	/* Classification. */
-	e_cal_component_set_classification (comp, priv->classification);
+	classification = comp_editor_get_classification (editor);
+	e_cal_component_set_classification (comp, classification);
 
 	/* Categories */
 	cat = e_dialog_editable_get (priv->categories);
@@ -752,13 +660,13 @@
 		g_free (str);
 
 	/* change recipients only when creating new item, after that no such action is available */
-	if ((page->flags & COMP_EDITOR_PAGE_IS_SHARED) && (page->flags & COMP_EDITOR_PAGE_NEW_ITEM) && fill_comp_with_recipients (priv->name_selector, comp)) {
+	if ((flags & COMP_EDITOR_IS_SHARED) && (flags & COMP_EDITOR_NEW_ITEM) && fill_comp_with_recipients (priv->name_selector, comp)) {
 		ECalComponentOrganizer organizer = {NULL, NULL, NULL, NULL};
 
 		EAccount *a;
 		gchar *backend_addr = NULL, *org_addr = NULL, *sentby = NULL;
 
-		e_cal_get_cal_address (page->client, &backend_addr, NULL);
+		e_cal_get_cal_address (client, &backend_addr, NULL);
 
 		/* Find the identity for the organizer or sentby field */
 		a = get_current_account (mpage);
@@ -789,8 +697,8 @@
 
 		e_cal_component_set_organizer (comp, &organizer);
 
-		if (page->flags & COMP_EDITOR_PAGE_NEW_ITEM)
-			comp_editor_page_notify_needs_send (page);
+		if (flags & COMP_EDITOR_NEW_ITEM)
+			comp_editor_set_needs_send (editor, TRUE);
 
 		g_free (backend_addr);
 		g_free (org_addr);
@@ -893,89 +801,82 @@
  * category list dialog.
  */
 static void
-categories_clicked_cb (GtkWidget *button, gpointer data)
-{
-	MemoPage *mpage;
-	MemoPagePrivate *priv;
-	GtkWidget *entry;
-
-	mpage = MEMO_PAGE (data);
-	priv = mpage->priv;
-
-	entry = priv->categories;
-	e_categories_config_open_dialog_for_entry (GTK_ENTRY (entry));
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
+categories_clicked_cb (GtkWidget *button,
+                       MemoPage *mpage)
 {
-	MemoPage *mpage;
-	MemoPagePrivate *priv;
+	GtkEntry *entry;
 
-	mpage = MEMO_PAGE (data);
-	priv = mpage->priv;
-
-	if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
+	entry = GTK_ENTRY (mpage->priv->categories);
+	e_categories_config_open_dialog_for_entry (entry);
 }
 
 static void
-source_changed_cb (ESourceComboBox *source_combo_box, MemoPage *mpage)
+source_changed_cb (ESourceComboBox *source_combo_box,
+                   MemoPage *mpage)
 {
 	MemoPagePrivate *priv = mpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	ESource *source;
+	ECal *client;
 
-	source = e_source_combo_box_get_active (source_combo_box);
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (mpage)))
+		return;
 
-	if (!priv->updating) {
-		ECal *client;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	flags = comp_editor_get_flags (editor);
 
-		client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL);
-		if (!client || !e_cal_open (client, FALSE, NULL)) {
-			GtkWidget *dialog;
-
-			if (client)
-				g_object_unref (client);
-
-			e_source_combo_box_set_active (
-				E_SOURCE_COMBO_BOX (priv->source_selector),
-				e_cal_get_source (COMP_EDITOR_PAGE (mpage)->client));
-
-			dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
-							 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
-							 _("Unable to open memos in '%s'."),
-							 e_source_peek_name (source));
-			gtk_dialog_run (GTK_DIALOG (dialog));
-			gtk_widget_destroy (dialog);
-		} else {
-			comp_editor_notify_client_changed (
-				COMP_EDITOR (gtk_widget_get_toplevel (priv->main)),
-				client);
+	client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL);
+	source = e_source_combo_box_get_active (source_combo_box);
 
-			if (client) {
-				gchar *backend_addr = NULL;
+	if (!client || !e_cal_open (client, FALSE, NULL)) {
+		GtkWidget *dialog;
+		ECal *old_client;
+
+		old_client = comp_editor_get_client (editor);
+
+		if (client)
+			g_object_unref (client);
+
+		e_source_combo_box_set_active (
+			E_SOURCE_COMBO_BOX (priv->source_selector),
+			e_cal_get_source (old_client));
+
+		dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+						 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+						 _("Unable to open memos in '%s'."),
+						 e_source_peek_name (source));
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+	} else {
+		comp_editor_set_client (editor, client);
 
-				e_cal_get_cal_address(client, &backend_addr, NULL);
+		if (client) {
+			gchar *backend_addr = NULL;
 
-				if (COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_PAGE_IS_SHARED)
-					memo_page_select_organizer (mpage, backend_addr);
+			e_cal_get_cal_address(client, &backend_addr, NULL);
 
-				set_subscriber_info_string (mpage, backend_addr);
-				g_free (backend_addr);
-			}
+			if (flags & COMP_EDITOR_IS_SHARED)
+				memo_page_select_organizer (mpage, backend_addr);
 
-			sensitize_widgets (mpage);
+			set_subscriber_info_string (mpage, backend_addr);
+			g_free (backend_addr);
 		}
+
+		sensitize_widgets (mpage);
 	}
 }
 
 static void
-set_subscriber_info_string (MemoPage *mpage, const char *backend_address)
+set_subscriber_info_string (MemoPage *mpage,
+                            const gchar *backend_address)
 {
-	ECal *client = COMP_EDITOR_PAGE (mpage)->client;
+	CompEditor *editor;
+	ECal *client;
 	ESource *source;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	client = comp_editor_get_client (editor);
 	source = e_cal_get_source (client);
 
 	if (e_source_get_property (source, "subscriber"))
@@ -987,136 +888,106 @@
 		memo_page_set_info_string (mpage, NULL, NULL);
 }
 
-/*sets the current focused widget */
-static gboolean
-widget_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	MemoPage *mpage;
-	mpage = MEMO_PAGE (data);
-
-	comp_editor_page_set_focused_widget (COMP_EDITOR_PAGE (mpage), widget);
-
-	return FALSE;
-}
-
-/*unset the current focused widget */
-static gboolean
-widget_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	MemoPage *mpage;
-	mpage = MEMO_PAGE (data);
-
-	comp_editor_page_unset_focused_widget (COMP_EDITOR_PAGE (mpage), widget);
-
-	return FALSE;
-}
-
-/* Callback used when the summary changes; we emit the notification signal. */
 static void
-summary_changed_cb (GtkEditable *editable, gpointer data)
+summary_changed_cb (GtkEditable *editable,
+                    CompEditorPage *page)
 {
-	MemoPage *mpage;
-	MemoPagePrivate *priv;
+	CompEditor *editor;
 	gchar *summary;
 
-	mpage = MEMO_PAGE (data);
-	priv = mpage->priv;
-
-	if (priv->updating)
+	if (comp_editor_page_get_updating (page))
 		return;
 
+	editor = comp_editor_page_get_editor (page);
 	summary = e_dialog_editable_get (GTK_WIDGET (editable));
-	comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (mpage),
-						 summary);
+	comp_editor_set_summary (editor, summary);
 	g_free (summary);
 }
 
 static void
-to_button_clicked_cb (GtkButton *button, gpointer data)
+to_button_clicked_cb (GtkButton *button,
+                      MemoPage *mpage)
 {
-	MemoPage *page = data;
-	MemoPagePrivate *priv = page->priv;
 	ENameSelectorDialog *name_selector_dialog;
 
-	name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
+	name_selector_dialog = e_name_selector_peek_dialog (
+		mpage->priv->name_selector);
 	gtk_widget_show (GTK_WIDGET (name_selector_dialog));
 }
 
-static void
-response_cb (ENameSelectorDialog *name_selector_dialog, gint response, gpointer user_data)
-{
-	gtk_widget_hide (GTK_WIDGET (name_selector_dialog));
-}
-
 /* Hooks the widget signals */
 static gboolean
 init_widgets (MemoPage *mpage)
 {
-	MemoPagePrivate *priv;
-	GtkTextBuffer *text_buffer;
-
-	priv = mpage->priv;
+	MemoPagePrivate *priv = mpage->priv;
+	GtkTextBuffer *buffer;
+	GtkTextView *view;
 
 	/* Generic informative messages */
 	gtk_widget_hide (priv->info_hbox);
 
 	/* Summary */
-	g_signal_connect((priv->summary_entry), "changed",
-			    G_CALLBACK (summary_changed_cb), mpage);
-	g_signal_connect(priv->summary_entry, "focus-in-event",
-			    G_CALLBACK (widget_focus_in_cb), mpage);
-	g_signal_connect(priv->summary_entry, "focus-out-event",
-			    G_CALLBACK (widget_focus_out_cb), mpage);
+	g_signal_connect (
+		priv->summary_entry, "changed",
+		G_CALLBACK (summary_changed_cb), mpage);
 
 	/* Memo Content */
-	text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->memo_content));
-
-	gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->memo_content), GTK_WRAP_WORD);
-
-	g_signal_connect(priv->memo_content, "focus-in-event",
-		G_CALLBACK (widget_focus_in_cb), mpage);
-	g_signal_connect(priv->memo_content, "focus-out-event",
-		G_CALLBACK (widget_focus_out_cb), mpage);
+	view = GTK_TEXT_VIEW (priv->memo_content);
+	buffer = gtk_text_view_get_buffer (view);
+	gtk_text_view_set_wrap_mode (view, GTK_WRAP_WORD);
 
 	/* Categories button */
-	g_signal_connect((priv->categories_btn), "clicked",
-			    G_CALLBACK (categories_clicked_cb), mpage);
+	g_signal_connect(
+		priv->categories_btn, "clicked",
+		G_CALLBACK (categories_clicked_cb), mpage);
 
 	/* Source selector */
-	g_signal_connect((priv->source_selector), "changed",
-			 G_CALLBACK (source_changed_cb), mpage);
+	g_signal_connect (
+		priv->source_selector, "changed",
+		G_CALLBACK (source_changed_cb), mpage);
 
 	/* Connect the default signal handler to use to make sure the "changed"
 	   field gets set whenever a field is changed. */
 
 	/* Belongs to priv->memo_content */
-	g_signal_connect ((text_buffer), "changed",
-			  G_CALLBACK (field_changed_cb), mpage);
-
-	g_signal_connect((priv->categories), "changed",
-			    G_CALLBACK (field_changed_cb), mpage);
-
-	g_signal_connect((priv->summary_entry), "changed",
-			    G_CALLBACK (field_changed_cb), mpage);
-
-	g_signal_connect((priv->source_selector), "changed",
-			 G_CALLBACK (field_changed_cb), mpage);
-
-	g_signal_connect((priv->start_date), "changed",
-			 G_CALLBACK (field_changed_cb), mpage);
+	g_signal_connect_swapped (
+		buffer, "changed",
+		G_CALLBACK (comp_editor_page_changed), mpage);
+
+	g_signal_connect_swapped (
+		priv->categories, "changed",
+		G_CALLBACK (comp_editor_page_changed), mpage);
+
+	g_signal_connect_swapped (
+		priv->summary_entry, "changed",
+		G_CALLBACK (comp_editor_page_changed), mpage);
+
+	g_signal_connect_swapped (
+		priv->source_selector, "changed",
+		G_CALLBACK (comp_editor_page_changed), mpage);
+
+	g_signal_connect_swapped (
+		priv->start_date, "changed",
+		G_CALLBACK (comp_editor_page_changed), mpage);
 
 	if (priv->name_selector) {
 		ENameSelectorDialog *name_selector_dialog;
 
 		name_selector_dialog = e_name_selector_peek_dialog (priv->name_selector);
 
-		g_signal_connect (name_selector_dialog, "response",
-			  G_CALLBACK (response_cb), mpage);
-		g_signal_connect ((priv->to_button), "clicked", G_CALLBACK (to_button_clicked_cb), mpage);
-		g_signal_connect ((priv->to_entry), "changed", G_CALLBACK (field_changed_cb), mpage);
+		g_signal_connect (
+			name_selector_dialog, "response",
+			G_CALLBACK (gtk_widget_hide), NULL);
+		g_signal_connect (
+			priv->to_button, "clicked",
+			G_CALLBACK (to_button_clicked_cb), mpage);
+		g_signal_connect_swapped (
+			priv->to_entry, "changed",
+			G_CALLBACK (comp_editor_page_changed), mpage);
 	}
 
-	memo_page_set_show_categories (mpage, calendar_config_get_show_categories());
+	memo_page_set_show_categories (
+		mpage, calendar_config_get_show_categories());
 
 	return TRUE;
 }
@@ -1138,7 +1009,10 @@
 memo_page_select_organizer (MemoPage *mpage, const char *backend_address)
 {
 	MemoPagePrivate *priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	GList *l;
+	ECal *client;
 	EAccount *def_account;
 	gchar *def_address = NULL;
 	const char *default_address;
@@ -1151,8 +1025,12 @@
 		def_address = g_strdup_printf("%s <%s>", def_account->id->name, def_account->id->address);
 
 	priv = mpage->priv;
-	if (COMP_EDITOR_PAGE (mpage)->client)
-		source = e_cal_get_source (COMP_EDITOR_PAGE (mpage)->client);
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
+	if (client)
+		source = e_cal_get_source (client);
 	if (source)
 		user_addr = e_source_get_property (source, "subscriber");
 
@@ -1173,7 +1051,7 @@
 		default_address = def_address;
 
 	if (default_address) {
-		if (COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) {
+		if (flags & COMP_EDITOR_NEW_ITEM) {
 			gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (priv->org_combo)->entry), default_address);
 			/* FIXME: Use accessor functions to access private members of a GtkCombo widget */
 			gtk_widget_set_sensitive (GTK_WIDGET (GTK_COMBO (priv->org_combo)->button), !subscribed_cal);
@@ -1196,13 +1074,15 @@
 MemoPage *
 memo_page_construct (MemoPage *mpage)
 {
-	MemoPagePrivate *priv;
+	MemoPagePrivate *priv = mpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	EIterator *it;
 	char *gladefile;
 	EAccount *a;
-	CompEditorPageFlags flags = COMP_EDITOR_PAGE (mpage)->flags;
 
-	priv = mpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (mpage));
+	flags = comp_editor_get_flags (editor);
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "memo-page.glade",
@@ -1222,7 +1102,7 @@
 		return NULL;
 	}
 
-	if (flags & COMP_EDITOR_PAGE_IS_SHARED) {
+	if (flags & COMP_EDITOR_IS_SHARED) {
 		priv->accounts = itip_addresses_get ();
 		for (it = e_list_get_iterator((EList *)priv->accounts);
 				e_iterator_is_valid(it);
@@ -1257,7 +1137,7 @@
 		gtk_widget_show (priv->to_entry);
 		gtk_widget_show (priv->to_button);
 
-		if (!(flags & COMP_EDITOR_PAGE_NEW_ITEM)) {
+		if (!(flags & COMP_EDITOR_NEW_ITEM)) {
 			gtk_widget_set_sensitive (priv->to_button, FALSE);
 			gtk_widget_set_sensitive (priv->to_entry, FALSE);
 		}
@@ -1281,17 +1161,17 @@
  * not be created.
  **/
 MemoPage *
-memo_page_new (BonoboUIComponent *uic, CompEditorPageFlags flags)
+memo_page_new (CompEditor *editor)
 {
 	MemoPage *mpage;
 
-	mpage = g_object_new (TYPE_MEMO_PAGE, NULL);
-	mpage->priv->uic = uic;
-	COMP_EDITOR_PAGE (mpage)->flags = flags;
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+
+	mpage = g_object_new (TYPE_MEMO_PAGE, "editor", editor, NULL);
 
 	if (!memo_page_construct (mpage)) {
 		g_object_unref (mpage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
 	return mpage;
@@ -1302,13 +1182,13 @@
 GtkWidget *
 memo_page_create_date_edit (void)
 {
-	GtkWidget *dedit;
+	GtkWidget *widget;
 
-	dedit = comp_editor_new_date_edit (TRUE, FALSE, TRUE);
-	e_date_edit_set_allow_no_date_set (E_DATE_EDIT (dedit), TRUE);
-	gtk_widget_show (dedit);
+	widget = comp_editor_new_date_edit (TRUE, FALSE, TRUE);
+	e_date_edit_set_allow_no_date_set (E_DATE_EDIT (widget), TRUE);
+	gtk_widget_show (widget);
 
-	return dedit;
+	return widget;
 }
 
 GtkWidget *memo_page_create_source_combo_box (void);
@@ -1316,18 +1196,19 @@
 GtkWidget *
 memo_page_create_source_combo_box (void)
 {
-	GtkWidget   *combo_box;
-	GConfClient *gconf_client;
+	GtkWidget *widget;
+	GConfClient *client;
 	ESourceList *source_list;
 
-	gconf_client = gconf_client_get_default ();
+	client = gconf_client_get_default ();
 	source_list = e_source_list_new_for_gconf (
-		gconf_client, "/apps/evolution/memos/sources");
+		client, "/apps/evolution/memos/sources");
+
+	widget = e_source_combo_box_new (source_list);
+	gtk_widget_show (widget);
 
-	combo_box = e_source_combo_box_new (source_list);
 	g_object_unref (source_list);
-	g_object_unref (gconf_client);
+	g_object_unref (client);
 
-	gtk_widget_show (combo_box);
-	return combo_box;
+	return widget;
 }

Modified: branches/kill-bonobo/calendar/gui/dialogs/memo-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/memo-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/memo-page.h	Tue Jul 15 18:34:59 2008
@@ -24,38 +24,52 @@
 #ifndef MEMO_PAGE_H
 #define MEMO_PAGE_H
 
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 
-G_BEGIN_DECLS
+/* Standard GObject macros */
+#define TYPE_MEMO_PAGE \
+	(memo_page_get_type ())
+#define MEMO_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_MEMO_PAGE, MemoPage))
+#define MEMO_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_MEMO_PAGE, MemoPageClass))
+#define IS_MEMO_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_MEMO_PAGE))
+#define IS_MEMO_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_MEMO_PAGE))
+#define MEMO_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_MEMO_PAGE, MemoPageClass))
 
-#define TYPE_MEMO_PAGE            (memo_page_get_type ())
-#define MEMO_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MEMO_PAGE, MemoPage))
-#define MEMO_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MEMO_PAGE, MemoPageClass))
-#define IS_MEMO_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MEMO_PAGE))
-#define IS_MEMO_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_MEMO_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _MemoPage MemoPage;
+typedef struct _MemoPageClass MemoPageClass;
 typedef struct _MemoPagePrivate MemoPagePrivate;
 
-typedef struct {
+struct _MemoPage {
 	CompEditorPage page;
-
-	/* Private data */
 	MemoPagePrivate *priv;
-} MemoPage;
+};
 
-typedef struct {
+struct _MemoPageClass {
 	CompEditorPageClass parent_class;
-} MemoPageClass;
+};
+
+GType		memo_page_get_type		(void);
+MemoPage *	memo_page_construct		(MemoPage *epage);
+MemoPage *	memo_page_new			(CompEditor *editor);
+void		memo_page_set_show_categories	(MemoPage *page,
+						 gboolean state);
+void		memo_page_set_info_string	(MemoPage *mpage,
+						 const gchar *icon,
+						 const gchar *msg);
 
-GType     memo_page_get_type  (void);
-MemoPage *memo_page_construct (MemoPage *epage);
-MemoPage *memo_page_new       (BonoboUIComponent *uic, CompEditorPageFlags flags);
-void      memo_page_set_classification (MemoPage *page, ECalComponentClassification class);
-void      memo_page_set_show_categories (MemoPage *page, gboolean state);
-void 	  memo_page_set_info_string (MemoPage *mpage, const gchar *icon, const gchar *msg);
 G_END_DECLS
 
 #endif

Modified: branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.c	Tue Jul 15 18:34:59 2008
@@ -45,7 +45,9 @@
 #include "../e-mini-calendar-config.h"
 #include "recurrence-page.h"
 
-
+#define RECURRENCE_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_RECURRENCE_PAGE, RecurrencePagePrivate))
 
 enum month_num_options {
 	MONTH_NUM_FIRST,
@@ -183,146 +185,208 @@
 	/* For the recurrence preview, the actual widget */
 	GtkWidget *preview_calendar;
 	EMiniCalendarConfig *preview_calendar_config;
-
-	gboolean updating;
 };
 
 
 
 static void recurrence_page_finalize (GObject *object);
 
+static gboolean fill_component (RecurrencePage *rpage, ECalComponent *comp);
 static GtkWidget *recurrence_page_get_widget (CompEditorPage *page);
 static void recurrence_page_focus_main_widget (CompEditorPage *page);
 static gboolean recurrence_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
 static gboolean recurrence_page_fill_component (CompEditorPage *page, ECalComponent *comp);
 static void recurrence_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
-static void preview_date_range_changed_cb (ECalendarItem *item, gpointer data);
-static void interval_selection_done_cb (GtkOptionMenu *menu, gpointer data);
-static void ending_selection_done_cb (GtkOptionMenu *menu, gpointer data);
+static void preview_date_range_changed_cb (ECalendarItem *item, RecurrencePage *rpage);
 
-static void field_changed (RecurrencePage *apage);
 static void make_ending_count_special (RecurrencePage *rpage);
 static void make_ending_special (RecurrencePage *rpage);
 
 G_DEFINE_TYPE (RecurrencePage, recurrence_page, TYPE_COMP_EDITOR_PAGE)
 
-/* Class initialization function for the recurrence page */
+/* Re-tags the recurrence preview calendar based on the current information of
+ * the widgets in the recurrence page.
+ */
 static void
-recurrence_page_class_init (RecurrencePageClass *class)
+preview_recur (RecurrencePage *rpage)
 {
-	CompEditorPageClass *editor_page_class;
-	GObjectClass *object_class;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
+	ECal *client;
+	ECalComponent *comp;
+	ECalComponentDateTime cdt;
+	GSList *l;
+	icaltimezone *zone = NULL;
 
-	editor_page_class = (CompEditorPageClass *) class;
-	object_class = (GObjectClass *) class;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	client = comp_editor_get_client (editor);
 
-	editor_page_class->get_widget = recurrence_page_get_widget;
-	editor_page_class->focus_main_widget = recurrence_page_focus_main_widget;
-	editor_page_class->fill_widgets = recurrence_page_fill_widgets;
-	editor_page_class->fill_component = recurrence_page_fill_component;
-	editor_page_class->set_dates = recurrence_page_set_dates;
+	/* If our component has not been set yet through ::fill_widgets(), we
+	 * cannot preview the recurrence.
+	 */
+	if (!priv || !priv->comp || e_cal_component_is_instance (priv->comp))
+		return;
 
-	object_class->finalize = recurrence_page_finalize;
+	/* Create a scratch component with the start/end and
+	 * recurrence/exception information from the one we are editing.
+	 */
+
+	comp = e_cal_component_new ();
+	e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
+
+	e_cal_component_get_dtstart (priv->comp, &cdt);
+	if (cdt.tzid != NULL) {
+		/* FIXME Will e_cal_get_timezone really not return builtin zones? */
+		if (!e_cal_get_timezone (client, cdt.tzid, &zone, NULL))
+			zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid);
+	}
+	e_cal_component_set_dtstart (comp, &cdt);
+	e_cal_component_free_datetime (&cdt);
+
+	e_cal_component_get_dtend (priv->comp, &cdt);
+	e_cal_component_set_dtend (comp, &cdt);
+	e_cal_component_free_datetime (&cdt);
+
+	e_cal_component_get_exdate_list (priv->comp, &l);
+	e_cal_component_set_exdate_list (comp, l);
+	e_cal_component_free_exdate_list (l);
+
+	e_cal_component_get_exrule_list (priv->comp, &l);
+	e_cal_component_set_exrule_list (comp, l);
+	e_cal_component_free_recur_list (l);
+
+	e_cal_component_get_rdate_list (priv->comp, &l);
+	e_cal_component_set_rdate_list (comp, l);
+	e_cal_component_free_period_list (l);
+
+	e_cal_component_get_rrule_list (priv->comp, &l);
+	e_cal_component_set_rrule_list (comp, l);
+	e_cal_component_free_recur_list (l);
+
+	fill_component (rpage, comp);
+
+	tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp,
+			      client, zone, TRUE, FALSE);
+	g_object_unref(comp);
 }
 
-/* Object initialization function for the recurrence page */
-static void
-recurrence_page_init (RecurrencePage *rpage)
+static GObject *
+recurrence_page_constructor (GType type,
+                             guint n_construct_properties,
+                             GObjectConstructParam *construct_properties)
 {
-	RecurrencePagePrivate *priv;
+	GObject *object;
+	CompEditor *editor;
 
-	priv = g_new0 (RecurrencePagePrivate, 1);
-	rpage->priv = priv;
+	/* Chain up to parent's constructor() method. */
+	object = G_OBJECT_CLASS (recurrence_page_parent_class)->constructor (
+		type, n_construct_properties, construct_properties);
 
-	priv->xml = NULL;
+	/* Keep the calendar updated as the user twizzles widgets. */
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (object));
 
-	priv->main = NULL;
-	priv->recurs = NULL;
-	priv->custom = FALSE;
-	priv->params = NULL;
-	priv->interval_value = NULL;
-	priv->interval_unit = NULL;
-	priv->special = NULL;
-	priv->ending_menu = NULL;
-	priv->ending_special = NULL;
-	priv->custom_warning_bin = NULL;
-	priv->weekday_picker = NULL;
-	priv->month_day_menu = NULL;
-	priv->month_num_menu = NULL;
-	priv->ending_date_edit = NULL;
-	priv->ending_count_spin = NULL;
-	priv->exception_list = NULL;
-	priv->exception_add = NULL;
-	priv->exception_modify = NULL;
-	priv->exception_delete = NULL;
-	priv->preview_bin = NULL;
-	priv->preview_calendar = NULL;
+	g_signal_connect_swapped (
+		editor, "notify::changed",
+		G_CALLBACK (preview_recur), object);
 
-	priv->comp = NULL;
+	return object;
 }
 
-/* Destroy handler for the recurrence page */
 static void
-recurrence_page_finalize (GObject *object)
+recurrence_page_dispose (GObject *object)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_RECURRENCE_PAGE (object));
-
-	rpage = RECURRENCE_PAGE (object);
-	priv = rpage->priv;
+	priv = RECURRENCE_PAGE_GET_PRIVATE (object);
 
-	g_signal_handlers_disconnect_matched (E_CALENDAR (priv->preview_calendar)->calitem, G_SIGNAL_MATCH_FUNC,
-			    0, 0, NULL, preview_date_range_changed_cb, NULL);
-
-	g_signal_handlers_disconnect_by_func (GTK_OPTION_MENU (priv->interval_unit), 
-			    G_CALLBACK (interval_selection_done_cb), rpage);
-	g_signal_handlers_disconnect_by_func (GTK_OPTION_MENU (priv->ending_menu), 
-			    G_CALLBACK (ending_selection_done_cb), rpage);
-
-	if (priv->main)
+	if (priv->main != NULL) {
 		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
 
-	if (priv->xml) {
+	if (priv->xml != NULL) {
 		g_object_unref (priv->xml);
 		priv->xml = NULL;
 	}
 
-	if (priv->comp) {
+	if (priv->comp != NULL) {
 		g_object_unref (priv->comp);
 		priv->comp = NULL;
 	}
 
-	if (priv->exception_list_store) {
+	if (priv->exception_list_store != NULL) {
 		g_object_unref (priv->exception_list_store);
 		priv->exception_list_store = NULL;
 	}
 
-	if (priv->preview_calendar_config) {
+	if (priv->preview_calendar_config != NULL) {
 		g_object_unref (priv->preview_calendar_config);
 		priv->preview_calendar_config = NULL;
 	}
 
-	g_free (priv);
-	rpage->priv = NULL;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (recurrence_page_parent_class)->dispose (object);
+}
 
-	if (G_OBJECT_CLASS (recurrence_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (recurrence_page_parent_class)->finalize) (object);
+static void
+recurrence_page_finalize (GObject *object)
+{
+	RecurrencePagePrivate *priv;
+
+	priv = RECURRENCE_PAGE_GET_PRIVATE (object);
+
+	g_signal_handlers_disconnect_matched (
+		E_CALENDAR (priv->preview_calendar)->calitem,
+		G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
+		preview_date_range_changed_cb, NULL);
+
+	g_signal_handlers_disconnect_matched (
+		priv->interval_unit, G_SIGNAL_MATCH_DATA,
+		0, 0, NULL, NULL, object);
+
+	g_signal_handlers_disconnect_matched (
+		priv->ending_menu, G_SIGNAL_MATCH_DATA,
+		0, 0, NULL, NULL, object);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (recurrence_page_parent_class)->finalize (object);
 }
 
-
+static void
+recurrence_page_class_init (RecurrencePageClass *class)
+{
+	GObjectClass *object_class;
+	CompEditorPageClass *editor_page_class;
+
+	g_type_class_add_private (class, sizeof (RecurrencePagePrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->constructor = recurrence_page_constructor;
+	object_class->dispose = recurrence_page_dispose;
+	object_class->finalize = recurrence_page_finalize;
+
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
+	editor_page_class->get_widget = recurrence_page_get_widget;
+	editor_page_class->focus_main_widget = recurrence_page_focus_main_widget;
+	editor_page_class->fill_widgets = recurrence_page_fill_widgets;
+	editor_page_class->fill_component = recurrence_page_fill_component;
+	editor_page_class->set_dates = recurrence_page_set_dates;
+
+}
+
+static void
+recurrence_page_init (RecurrencePage *rpage)
+{
+	rpage->priv = RECURRENCE_PAGE_GET_PRIVATE (rpage);
+}
 
 /* get_widget handler for the recurrence page */
 static GtkWidget *
 recurrence_page_get_widget (CompEditorPage *page)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 
-	rpage = RECURRENCE_PAGE (page);
-	priv = rpage->priv;
+	priv = RECURRENCE_PAGE_GET_PRIVATE (page);
 
 	return priv->main;
 }
@@ -331,11 +395,9 @@
 static void
 recurrence_page_focus_main_widget (CompEditorPage *page)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 
-	rpage = RECURRENCE_PAGE (page);
-	priv = rpage->priv;
+	priv = RECURRENCE_PAGE_GET_PRIVATE (page);
 
 	gtk_widget_grab_focus (priv->recurs);
 }
@@ -468,14 +530,17 @@
 static void
 sensitize_recur_widgets (RecurrencePage *rpage)
 {
-	RecurrencePagePrivate *priv;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	gboolean recurs, sens = TRUE;
 	GtkWidget *label;
 
-	priv = rpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	flags = comp_editor_get_flags (editor);
 
-	if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_MEETING)
-		sens = COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_USER_ORG;
+	if (flags & COMP_EDITOR_MEETING)
+		sens = flags & COMP_EDITOR_USER_ORG;
 
 	recurs = e_dialog_toggle_get (priv->recurs);
 
@@ -512,26 +577,35 @@
 static void
 sensitize_buttons (RecurrencePage *rpage)
 {
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	gboolean read_only, sensitize = TRUE;
 	gint selected_rows;
-	RecurrencePagePrivate *priv;
 	icalcomponent *icalcomp;
+	ECal *client;
 	const char *uid;
 
-	priv = rpage->priv;
-	if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_MEETING)
-		sensitize = COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_USER_ORG;
+	if (priv->comp == NULL)
+		return;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
+	if (flags & COMP_EDITOR_MEETING)
+		sensitize = flags & COMP_EDITOR_USER_ORG;
 
 	selected_rows = gtk_tree_selection_count_selected_rows (
 		gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list)));
 
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL))
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
 	if (!read_only) {
 		e_cal_component_get_uid (priv->comp, &uid);
 
-		if (e_cal_get_static_capability (COMP_EDITOR_PAGE (rpage)->client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object(COMP_EDITOR_PAGE (rpage)->client, uid, NULL, &icalcomp, NULL)) {
+		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_CONV_TO_RECUR) && e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) {
 			read_only = TRUE;
 			icalcomponent_free (icalcomp);
 		}
@@ -540,7 +614,7 @@
 			GList *list;
 
 			/* see if we have detached instances */
-			if (e_cal_get_objects_for_uid (COMP_EDITOR_PAGE (rpage)->client, uid, &list, NULL)) {
+			if (e_cal_get_objects_for_uid (client, uid, &list, NULL)) {
 				if (list && g_list_length (list) > 1)
 					read_only = TRUE;
 
@@ -830,81 +904,6 @@
 	return TRUE;
 }
 
-/* Re-tags the recurrence preview calendar based on the current information of
- * the widgets in the recurrence page.
- */
-static void
-preview_recur (RecurrencePage *rpage)
-{
-	RecurrencePagePrivate *priv;
-	ECalComponent *comp;
-	ECalComponentDateTime cdt;
-	GSList *l;
-	icaltimezone *zone = NULL;
-
-	priv = rpage->priv;
-
-	/* If our component has not been set yet through ::fill_widgets(), we
-	 * cannot preview the recurrence.
-	 */
-	if (!priv || !priv->comp || e_cal_component_is_instance (priv->comp))
-		return;
-
-	/* Create a scratch component with the start/end and
-	 * recurrence/exception information from the one we are editing.
-	 */
-
-	comp = e_cal_component_new ();
-	e_cal_component_set_new_vtype (comp, E_CAL_COMPONENT_EVENT);
-
-	e_cal_component_get_dtstart (priv->comp, &cdt);
-	if (cdt.tzid != NULL) {
-		/* FIXME Will e_cal_get_timezone really not return builtin zones? */
-		if (!e_cal_get_timezone (COMP_EDITOR_PAGE (rpage)->client, cdt.tzid, &zone, NULL))
-			zone = icaltimezone_get_builtin_timezone_from_tzid (cdt.tzid);
-	}
-	e_cal_component_set_dtstart (comp, &cdt);
-	e_cal_component_free_datetime (&cdt);
-
-	e_cal_component_get_dtend (priv->comp, &cdt);
-	e_cal_component_set_dtend (comp, &cdt);
-	e_cal_component_free_datetime (&cdt);
-
-	e_cal_component_get_exdate_list (priv->comp, &l);
-	e_cal_component_set_exdate_list (comp, l);
-	e_cal_component_free_exdate_list (l);
-
-	e_cal_component_get_exrule_list (priv->comp, &l);
-	e_cal_component_set_exrule_list (comp, l);
-	e_cal_component_free_recur_list (l);
-
-	e_cal_component_get_rdate_list (priv->comp, &l);
-	e_cal_component_set_rdate_list (comp, l);
-	e_cal_component_free_period_list (l);
-
-	e_cal_component_get_rrule_list (priv->comp, &l);
-	e_cal_component_set_rrule_list (comp, l);
-	e_cal_component_free_recur_list (l);
-
-	fill_component (rpage, comp);
-
-	tag_calendar_by_comp (E_CALENDAR (priv->preview_calendar), comp,
-			      COMP_EDITOR_PAGE (rpage)->client, zone, TRUE, FALSE);
-	g_object_unref(comp);
-}
-
-/* Callback used when the recurrence weekday picker changes */
-static void
-weekday_picker_changed_cb (WeekdayPicker *wp, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-
-	field_changed (rpage);
-	preview_recur (rpage);
-}
-
 /* Creates the special contents for weekly recurrences */
 static void
 make_weekly_special (RecurrencePage *rpage)
@@ -941,9 +940,9 @@
 	weekday_picker_set_week_start_day (wp, calendar_config_get_week_start_day ());
 	weekday_picker_set_days (wp, priv->weekday_day_mask);
 
-	g_signal_connect((wp), "changed",
-			    G_CALLBACK (weekday_picker_changed_cb),
-			    rpage);
+	g_signal_connect_swapped (
+		wp, "changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
 }
 
 
@@ -1111,14 +1110,13 @@
 }
 
 static void
-month_num_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
+month_num_menu_selection_done_cb (GtkMenuShell *menu_shell,
+                                  RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	enum month_num_options month_num;
 	enum month_day_options month_day;
 
-	rpage = RECURRENCE_PAGE (data);
 	priv = rpage->priv;
 
 	month_num = e_dialog_option_menu_get (priv->month_num_menu,
@@ -1150,8 +1148,8 @@
 		e_dialog_option_menu_set (priv->month_day_menu,
 					  MONTH_DAY_MON,
 					  month_num_options_map);
-	field_changed (rpage);
-	preview_recur (rpage);
+
+	comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 }
 
 /* Callback used when the monthly day selection menu changes.  We need
@@ -1159,14 +1157,13 @@
  * are 1-31 while a Sunday is the 1st through 5th.
  */
 static void
-month_day_menu_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
+month_day_menu_selection_done_cb (GtkMenuShell *menu_shell,
+                                  RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	enum month_num_options month_num;
 	enum month_day_options month_day;
 
-	rpage = RECURRENCE_PAGE (data);
 	priv = rpage->priv;
 
 	month_num = e_dialog_option_menu_get (priv->month_num_menu,
@@ -1181,20 +1178,8 @@
 		e_dialog_option_menu_set (priv->month_num_menu,
 					  MONTH_NUM_FIRST,
 					  month_num_options_map);
-	field_changed (rpage);
-	preview_recur (rpage);
-}
 
-/* Callback used when the month index value changes. */
-static void
-month_index_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-
-	field_changed (rpage);
-	preview_recur (rpage);
+	comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 }
 
 /* Creates the special contents for monthly recurrences */
@@ -1243,8 +1228,9 @@
 				  priv->month_day,
 				  month_day_options_map);
 
-	g_signal_connect((adj), "value_changed",			    G_CALLBACK (month_index_value_changed_cb),
-			    rpage);
+	g_signal_connect_swapped (
+		adj, "value-changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
 
 	menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->month_num_menu));
 	g_signal_connect((menu), "selection_done",
@@ -1321,30 +1307,22 @@
 	return i;
 }
 
-/* Callback used when the ending-until date editor changes */
-static void
-ending_until_changed_cb (EDateEdit *de, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-	field_changed (rpage);
-	preview_recur (rpage);
-}
-
 /* Creates the special contents for "ending until" (end date) recurrences */
 static void
 make_ending_until_special (RecurrencePage *rpage)
 {
-	RecurrencePagePrivate *priv;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	EDateEdit *de;
 	ECalComponentDateTime dt_start;
 
-	priv = rpage->priv;
-
 	g_return_if_fail (GTK_BIN (priv->ending_special)->child == NULL);
 	g_return_if_fail (priv->ending_date_edit == NULL);
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	flags = comp_editor_get_flags (editor);
+
 	/* Create the widget */
 
 	priv->ending_date_edit = comp_editor_new_date_edit (TRUE, FALSE,
@@ -1357,7 +1335,7 @@
 
 	/* Set the value */
 
-  if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) {
+	if (flags & COMP_EDITOR_NEW_ITEM) {
 		e_cal_component_get_dtstart (priv->comp, &dt_start);
 		/* Setting the default until time to 2 weeks */
 		icaltime_adjust (dt_start.value, 14, 0, 0, 0);
@@ -1367,8 +1345,9 @@
 		e_date_edit_set_date (de, priv->ending_date_tt.year, priv->ending_date_tt.month, priv->ending_date_tt.day);
 	}
 
-	g_signal_connect((de), "changed",
-			    G_CALLBACK (ending_until_changed_cb), rpage);
+	g_signal_connect_swapped (
+		de, "changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
 
 	/* Make sure the EDateEdit widget uses our timezones to get the
 	   current time. */
@@ -1377,17 +1356,6 @@
 					   rpage, NULL);
 }
 
-/* Callback used when the ending-count value changes */
-static void
-ending_count_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-	field_changed (rpage);
-	preview_recur (rpage);
-}
-
 /* Creates the special contents for the occurrence count case */
 static void
 make_ending_count_special (RecurrencePage *rpage)
@@ -1422,9 +1390,9 @@
 
 	e_dialog_spin_set (priv->ending_count_spin, priv->ending_count);
 
-	g_signal_connect((adj), "value_changed",
-			    G_CALLBACK (ending_count_value_changed_cb),
-			    rpage);
+	g_signal_connect_swapped (
+		adj, "value-changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
 }
 
 /* Changes the recurrence-ending-special widget to match the ending date option
@@ -1477,10 +1445,13 @@
 static void
 fill_ending_date (RecurrencePage *rpage, struct icalrecurrencetype *r)
 {
-	RecurrencePagePrivate *priv;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
 	GtkWidget *menu;
+	ECal *client;
 
-	priv = rpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	client = comp_editor_get_client (editor);
 
 	menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (priv->ending_menu));
 	g_signal_handlers_block_matched (menu, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, rpage);
@@ -1496,7 +1467,6 @@
 			/* Ending date */
 
 			if (!r->until.is_date) {
-				ECal *client = COMP_EDITOR_PAGE (rpage)->client;
 				ECalComponentDateTime dt;
 				icaltimezone *from_zone, *to_zone;
 
@@ -1552,6 +1522,8 @@
 	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	ECalComponentText text;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	CompEditorPageDates dates;
 	GSList *rrule_list;
 	int len;
@@ -1565,6 +1537,9 @@
 	rpage = RECURRENCE_PAGE (page);
 	priv = rpage->priv;
 
+	editor = comp_editor_page_get_editor (page);
+	flags = comp_editor_get_flags (editor);
+
 	/* Keep a copy of the component so that we can expand the recurrence
 	 * set for the preview.
 	 */
@@ -1574,11 +1549,10 @@
 
 	priv->comp = e_cal_component_clone (comp);
 
-	if (!e_cal_component_has_organizer (comp))
-		 page->flags |= COMP_EDITOR_PAGE_USER_ORG;
-
-	/* Don't send off changes during this time */
-	priv->updating = TRUE;
+	if (!e_cal_component_has_organizer (comp)) {
+		flags |= COMP_EDITOR_USER_ORG;
+		comp_editor_set_flags (editor, flags);
+	}
 
 	/* Clean the page */
 	clear_widgets (rpage);
@@ -1609,7 +1583,6 @@
 		sensitize_buttons (rpage);
 		preview_recur (rpage);
 
-		priv->updating = FALSE;
 		return TRUE;
 	}
 
@@ -1896,8 +1869,6 @@
 	e_cal_component_free_recur_list (rrule_list);
 	preview_recur (rpage);
 
-	priv->updating = FALSE;
-
 	return TRUE;
 }
 
@@ -1918,12 +1889,17 @@
 	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	ECalComponentDateTime dt;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	struct icaltimetype icaltime;
 	guint8 mask;
 
 	rpage = RECURRENCE_PAGE (page);
 	priv = rpage->priv;
 
+	editor = comp_editor_page_get_editor (page);
+	flags = comp_editor_get_flags (editor);
+
 	/* Copy the dates to our component */
 
 	if (!priv->comp)
@@ -1957,7 +1933,7 @@
 		}
 	}
 
-	if (COMP_EDITOR_PAGE (rpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) {
+	if (flags & COMP_EDITOR_NEW_ITEM) {
 		ECalendar *ecal;
 		GDate *start, *end;
 
@@ -2044,11 +2020,9 @@
  * calendar changes.
  */
 static void
-preview_date_range_changed_cb (ECalendarItem *item, gpointer data)
+preview_date_range_changed_cb (ECalendarItem *item,
+                               RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
 	preview_recur (rpage);
 }
 
@@ -2056,23 +2030,22 @@
  * enable or disable the recurrence parameters.
  */
 static void
-type_toggled_cb (GtkToggleButton *toggle, gpointer data)
+type_toggled_cb (GtkToggleButton *toggle,
+                 RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
-	RecurrencePagePrivate *priv;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
+	ECal *client;
 	gboolean read_only;
 
-	rpage = RECURRENCE_PAGE (data);
-
-	priv = rpage->priv;
-
-	field_changed (rpage);
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
+	client = comp_editor_get_client (editor);
 
+	comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 	sensitize_buttons (rpage);
-	preview_recur (rpage);
 
 	/* enable/disable the 'Add' button */
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (rpage)->client, &read_only, NULL))
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
 	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->recurs)) || read_only)
@@ -2081,47 +2054,6 @@
 		gtk_widget_set_sensitive (priv->exception_add, TRUE);
 }
 
-/* Callback used when the recurrence interval value spin button changes. */
-static void
-interval_value_changed_cb (GtkAdjustment *adj, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-
-	field_changed (rpage);
-	preview_recur (rpage);
-}
-
-/* Callback used when the recurrence interval option menu changes.  We need to
- * change the contents of the recurrence special widget.
- */
-static void
-interval_selection_done_cb (GtkOptionMenu *menu, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-
-	field_changed (rpage);
-	make_recurrence_special (rpage);
-	preview_recur (rpage);
-}
-
-/* Callback used when the recurrence ending option menu changes.  We need to
- * change the contents of the ending special widget.
- */
-static void
-ending_selection_done_cb (GtkOptionMenu *menu, gpointer data)
-{
-	RecurrencePage *rpage;
-
-	rpage = RECURRENCE_PAGE (data);
-	field_changed (rpage);
-	make_ending_special (rpage);
-	preview_recur (rpage);
-}
-
 static GtkWidget *
 create_exception_dialog (RecurrencePage *rpage, const char *title, GtkWidget **date_edit)
 {
@@ -2146,22 +2078,18 @@
 
 /* Callback for the "add exception" button */
 static void
-exception_add_cb (GtkWidget *widget, gpointer data)
+exception_add_cb (GtkWidget *widget,
+                  RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	GtkWidget *dialog, *date_edit;
 	gboolean date_set;
 
-	rpage = RECURRENCE_PAGE (data);
-
 	dialog = create_exception_dialog (rpage, _("Add exception"), &date_edit);
 
 	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
 		ECalComponentDateTime dt;
 		struct icaltimetype icaltime = icaltime_null_time ();
 
-		field_changed (rpage);
-
 		dt.value = &icaltime;
 
 		/* We use DATE values for exceptions, so we don't need a TZID. */
@@ -2175,7 +2103,8 @@
 		g_return_if_fail (date_set);
 
 		append_exception (rpage, &dt);
-		preview_recur (rpage);
+
+		comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 	}
 
 	gtk_widget_destroy (dialog);
@@ -2183,16 +2112,15 @@
 
 /* Callback for the "modify exception" button */
 static void
-exception_modify_cb (GtkWidget *widget, gpointer data)
+exception_modify_cb (GtkWidget *widget,
+                     RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	GtkWidget *dialog, *date_edit;
 	const ECalComponentDateTime *current_dt;
 	GtkTreeSelection *selection;
 	GtkTreeIter iter;
 
-	rpage = RECURRENCE_PAGE (data);
 	priv = rpage->priv;
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list));
@@ -2212,8 +2140,6 @@
 		struct icaltimetype icaltime = icaltime_null_time ();
 		struct icaltimetype *tt;
 
-		field_changed (rpage);
-
 		dt.value = &icaltime;
 		tt = dt.value;
 		e_date_edit_get_date (E_DATE_EDIT (date_edit),
@@ -2227,7 +2153,8 @@
 		dt.tzid = NULL;
 
 		e_date_time_list_set_date_time (priv->exception_list_store, &iter, &dt);
-		preview_recur (rpage);
+
+		comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 	}
 
 	gtk_widget_destroy (dialog);
@@ -2235,16 +2162,15 @@
 
 /* Callback for the "delete exception" button */
 static void
-exception_delete_cb (GtkWidget *widget, gpointer data)
+exception_delete_cb (GtkWidget *widget,
+                     RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	GtkTreeSelection *selection;
 	GtkTreeIter iter;
 	GtkTreePath *path;
 	gboolean valid_iter;
 
-	rpage = RECURRENCE_PAGE (data);
 	priv = rpage->priv;
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->exception_list));
@@ -2253,8 +2179,6 @@
 		return;
 	}
 
-	field_changed (rpage);
-
 	path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->exception_list_store), &iter);
 	e_date_time_list_remove (priv->exception_list_store, &iter);
 
@@ -2269,7 +2193,8 @@
 		gtk_tree_selection_select_iter (selection, &iter);
 
 	gtk_tree_path_free (path);
-	preview_recur (rpage);
+
+	comp_editor_page_changed (COMP_EDITOR_PAGE (rpage));
 }
 
 /* Callback used when a row is selected in the list of exception
@@ -2277,13 +2202,12 @@
  * exception's value.
  */
 static void
-exception_selection_changed_cb (GtkTreeSelection *selection, gpointer data)
+exception_selection_changed_cb (GtkTreeSelection *selection,
+                                RecurrencePage *rpage)
 {
-	RecurrencePage *rpage;
 	RecurrencePagePrivate *priv;
 	GtkTreeIter iter;
 
-	rpage = RECURRENCE_PAGE (data);
 	priv = rpage->priv;
 
 	if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
@@ -2296,18 +2220,6 @@
 	gtk_widget_set_sensitive (priv->exception_delete, TRUE);
 }
 
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed (RecurrencePage *rpage)
-{
-	RecurrencePagePrivate *priv;
-
-	priv = rpage->priv;
-
-	if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (rpage));
-}
-
 /* Hooks the widget signals */
 static void
 init_widgets (RecurrencePage *rpage)
@@ -2344,20 +2256,27 @@
 	/* Recurrence interval */
 
 	adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (priv->interval_value));
-	g_signal_connect((adj), "value_changed",
-			    G_CALLBACK (interval_value_changed_cb),
-			    rpage);
+	g_signal_connect_swapped (
+		adj, "value-changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
 
 	/* Recurrence units */
 
-	g_signal_connect(GTK_OPTION_MENU (priv->interval_unit), "changed",
-			    G_CALLBACK (interval_selection_done_cb),
-			    rpage);
+	g_signal_connect_swapped (
+		priv->interval_unit, "changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
+	g_signal_connect_swapped (
+		priv->interval_unit, "changed",
+		G_CALLBACK (make_recurrence_special), rpage);
 
 	/* Recurrence ending */
 
-	g_signal_connect(GTK_OPTION_MENU (priv->ending_menu), "changed",
-			    G_CALLBACK (ending_selection_done_cb), rpage);
+	g_signal_connect_swapped (
+		priv->ending_menu, "changed",
+		G_CALLBACK (comp_editor_page_changed), rpage);
+	g_signal_connect_swapped (
+		priv->ending_menu, "changed",
+		G_CALLBACK (make_ending_special), rpage);
 
 	/* Exception buttons */
 
@@ -2390,16 +2309,6 @@
 			  G_CALLBACK (exception_selection_changed_cb), rpage);
 }
 
-
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-	RecurrencePage *rpage = RECURRENCE_PAGE (page);
-
-	sensitize_buttons (rpage);
-}
-
 /**
  * recurrence_page_construct:
  * @rpage: A recurrence page.
@@ -2412,10 +2321,11 @@
 RecurrencePage *
 recurrence_page_construct (RecurrencePage *rpage)
 {
-	RecurrencePagePrivate *priv;
+	RecurrencePagePrivate *priv = rpage->priv;
+	CompEditor *editor;
 	char *gladefile;
 
-	priv = rpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (rpage));
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "recurrence-page.glade",
@@ -2437,8 +2347,9 @@
 
 	init_widgets (rpage);
 
-	g_signal_connect_after (G_OBJECT (rpage), "client_changed",
-				G_CALLBACK (client_changed_cb), NULL);
+	g_signal_connect_swapped (
+		editor, "notify::client",
+		G_CALLBACK (sensitize_buttons), rpage);
 
 	return rpage;
 }
@@ -2452,14 +2363,16 @@
  * be created.
  **/
 RecurrencePage *
-recurrence_page_new (void)
+recurrence_page_new (CompEditor *editor)
 {
 	RecurrencePage *rpage;
 
-	rpage = g_object_new (TYPE_RECURRENCE_PAGE, NULL);
+	g_return_val_if_fail (IS_COMP_EDITOR (editor), NULL);
+
+	rpage = g_object_new (TYPE_RECURRENCE_PAGE, "editor", editor, NULL);
 	if (!recurrence_page_construct (rpage)) {
 		g_object_unref (rpage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
 	return rpage;

Modified: branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/recurrence-page.h	Tue Jul 15 18:34:59 2008
@@ -25,38 +25,47 @@
 #ifndef RECURRENCE_PAGE_H
 #define RECURRENCE_PAGE_H
 
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_RECURRENCE_PAGE \
+	(recurrence_page_get_type ())
+#define RECURRENCE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_RECURRENCE_PAGE, RecurrencePage))
+#define RECURRENCE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_RECURRENCE_PAGE, RecurrencePageClass))
+#define IS_RECURRENCE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_RECURRENCE_PAGE))
+#define IS_RECURRENCE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_RECURRENCE_PAGE))
+#define RECURRENCE_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_RECURRENCE_PAGE, RecurrencePageClass))
 
-#define TYPE_RECURRENCE_PAGE            (recurrence_page_get_type ())
-#define RECURRENCE_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_RECURRENCE_PAGE, RecurrencePage))
-#define RECURRENCE_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_RECURRENCE_PAGE, RecurrencePageClass))
-#define IS_RECURRENCE_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_RECURRENCE_PAGE))
-#define IS_RECURRENCE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_RECURRENCE_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _RecurrencePage RecurrencePage;
+typedef struct _RecurrencePageClass RecurrencePageClass;
 typedef struct _RecurrencePagePrivate RecurrencePagePrivate;
 
-typedef struct {
+struct _RecurrencePage {
 	CompEditorPage page;
-
-	/* Private data */
 	RecurrencePagePrivate *priv;
-} RecurrencePage;
+};
 
-typedef struct {
+struct _RecurrencePageClass {
 	CompEditorPageClass parent_class;
-} RecurrencePageClass;
-
-
-GType           recurrence_page_get_type  (void);
-RecurrencePage *recurrence_page_construct (RecurrencePage *rpage);
-RecurrencePage *recurrence_page_new       (void);
+};
 
-
+GType		recurrence_page_get_type	(void);
+RecurrencePage *recurrence_page_construct	(RecurrencePage *rpage);
+RecurrencePage *recurrence_page_new		(CompEditor *editor);
 
 G_END_DECLS
 
-#endif
+#endif /* RECURRENCE_PAGE_H */

Modified: branches/kill-bonobo/calendar/gui/dialogs/schedule-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/schedule-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/schedule-page.c	Tue Jul 15 18:34:59 2008
@@ -39,7 +39,9 @@
 #include "e-delegate-dialog.h"
 #include "schedule-page.h"
 
-
+#define SCHEDULE_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_SCHEDULE_PAGE, SchedulePagePrivate))
 
 /* Private part of the SchedulePage structure */
 struct _SchedulePagePrivate {
@@ -59,93 +61,68 @@
 	   start and end date. We convert the end date if it is passed in in
 	   another timezone. */
 	icaltimezone *zone;
-
-	gboolean updating;
 };
 
-
-
-static void schedule_page_finalize (GObject *object);
-
 static GtkWidget *schedule_page_get_widget (CompEditorPage *page);
 static void schedule_page_focus_main_widget (CompEditorPage *page);
 static gboolean schedule_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
 static gboolean schedule_page_fill_component (CompEditorPage *page, ECalComponent *comp);
 static void schedule_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
 
-static void times_changed_cb (GtkWidget *widget, gpointer data);
+static void times_changed_cb (GtkWidget *widget, SchedulePage *spage);
 
 G_DEFINE_TYPE (SchedulePage, schedule_page, TYPE_COMP_EDITOR_PAGE)
 
-/* Class initialization function for the schedule page */
 static void
-schedule_page_class_init (SchedulePageClass *class)
-{
-	CompEditorPageClass *editor_page_class;
-	GObjectClass *object_class;
-
-	editor_page_class = (CompEditorPageClass *) class;
-	object_class = (GObjectClass *) class;
-
-	editor_page_class->get_widget = schedule_page_get_widget;
-	editor_page_class->focus_main_widget = schedule_page_focus_main_widget;
-	editor_page_class->fill_widgets = schedule_page_fill_widgets;
-	editor_page_class->fill_component = schedule_page_fill_component;
-	editor_page_class->set_summary = NULL;
-	editor_page_class->set_dates = schedule_page_set_dates;
-
-	object_class->finalize = schedule_page_finalize;
-}
-
-/* Object initialization function for the schedule page */
-static void
-schedule_page_init (SchedulePage *spage)
+schedule_page_dispose (GObject *object)
 {
 	SchedulePagePrivate *priv;
 
-	priv = g_new0 (SchedulePagePrivate, 1);
-	spage->priv = priv;
+	priv = SCHEDULE_PAGE_GET_PRIVATE (object);
 
-	priv->xml = NULL;
+	if (priv->main != NULL) {
+		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
 
-	priv->main = NULL;
+	if (priv->xml != NULL) {
+		g_object_unref (priv->xml);
+		priv->xml = NULL;
+	}
 
-	priv->zone = NULL;
+	if (priv->model != NULL) {
+		g_object_unref (priv->model);
+		priv->model = NULL;
+	}
 
-	priv->updating = FALSE;
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (schedule_page_parent_class)->dispose (object);
 }
 
-/* Destroy handler for the schedule page */
 static void
-schedule_page_finalize (GObject *object)
+schedule_page_class_init (SchedulePageClass *class)
 {
-	SchedulePage *spage;
-	SchedulePagePrivate *priv;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_SCHEDULE_PAGE (object));
-
-	spage = SCHEDULE_PAGE (object);
-	priv = spage->priv;
-
-	if (priv->main)
-		g_object_unref (priv->main);
-
-	if (priv->xml) {
-		g_object_unref (priv->xml);
-		priv->xml = NULL;
-	}
+	GObjectClass *object_class;
+	CompEditorPageClass *editor_page_class;
 
-	g_object_unref(priv->model);
+	g_type_class_add_private (class, sizeof (SchedulePagePrivate));
 
-	g_free (priv);
-	spage->priv = NULL;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = schedule_page_dispose;
 
-	if (G_OBJECT_CLASS (schedule_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (schedule_page_parent_class)->finalize) (object);
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
+	editor_page_class->get_widget = schedule_page_get_widget;
+	editor_page_class->focus_main_widget = schedule_page_focus_main_widget;
+	editor_page_class->fill_widgets = schedule_page_fill_widgets;
+	editor_page_class->fill_component = schedule_page_fill_component;
+	editor_page_class->set_dates = schedule_page_set_dates;
 }
 
-
+static void
+schedule_page_init (SchedulePage *spage)
+{
+	spage->priv = SCHEDULE_PAGE_GET_PRIVATE (spage);
+}
 
 /* get_widget handler for the schedule page */
 static GtkWidget *
@@ -176,41 +153,40 @@
 static void
 sensitize_widgets (SchedulePage *spage)
 {
-	gboolean read_only;
 	SchedulePagePrivate *priv = spage->priv;
+	CompEditor *editor;
+	ECal *client;
+	gboolean read_only;
 
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (spage)->client, &read_only, NULL))
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
+	client = comp_editor_get_client (editor);
+
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
 	e_meeting_time_selector_set_read_only (priv->sel, read_only);
 }
 
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-	SchedulePage *spage = SCHEDULE_PAGE (page);
-
-	sensitize_widgets (spage);
-}
-
 /* Set date/time */
 static void
 update_time (SchedulePage *spage, ECalComponentDateTime *start_date, ECalComponentDateTime *end_date)
 {
-	SchedulePagePrivate *priv;
+	SchedulePagePrivate *priv = spage->priv;
+	CompEditor *editor;
 	struct icaltimetype start_tt, end_tt;
 	icaltimezone *start_zone = NULL, *end_zone = NULL;
+	ECal *client;
 	gboolean all_day;
 
-	priv = spage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
+	client = comp_editor_get_client (editor);
 
 	/* Note that if we are creating a new event, the timezones may not be
 	   on the server, so we try to get the builtin timezone with the TZID
 	   first. */
 	start_zone = icaltimezone_get_builtin_timezone_from_tzid (start_date->tzid);
 	if (!start_zone) {
-		if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client,
-					      start_date->tzid, &start_zone, NULL)) {
+		if (!e_cal_get_timezone (client, start_date->tzid, &start_zone, NULL)) {
 			/* FIXME: Handle error better. */
 			g_warning ("Couldn't get timezone from server: %s",
 				   start_date->tzid ? start_date->tzid : "");
@@ -219,8 +195,7 @@
 
 	end_zone = icaltimezone_get_builtin_timezone_from_tzid (end_date->tzid);
 	if (!end_zone) {
-		if (!e_cal_get_timezone (COMP_EDITOR_PAGE (spage)->client,
-					      end_date->tzid, &end_zone, NULL)) {
+		if (!e_cal_get_timezone (client, end_date->tzid, &end_zone, NULL)) {
 			/* FIXME: Handle error better. */
 			g_warning ("Couldn't get timezone from server: %s",
 				   end_date->tzid ? end_date->tzid : "");
@@ -283,8 +258,6 @@
 	spage = SCHEDULE_PAGE (page);
 	priv = spage->priv;
 
-	priv->updating = TRUE;
-
 	/* Clean the screen */
 	clear_widgets (spage);
 
@@ -301,8 +274,6 @@
 	e_cal_component_free_datetime (&start_date);
 	e_cal_component_free_datetime (&end_date);
 
-	priv->updating = FALSE;
-
 	sensitize_widgets (spage);
 
 	return validated;
@@ -324,11 +295,9 @@
 	spage = SCHEDULE_PAGE (page);
 	priv = spage->priv;
 
-	priv->updating = TRUE;
-
+	comp_editor_page_set_updating (page, TRUE);
 	update_time (spage, dates->start, dates->end);
-
-	priv->updating = FALSE;
+	comp_editor_page_set_updating (page, FALSE);
 }
 
 
@@ -413,10 +382,11 @@
 SchedulePage *
 schedule_page_construct (SchedulePage *spage, EMeetingStore *ems)
 {
-	SchedulePagePrivate *priv;
+	SchedulePagePrivate *priv = spage->priv;
+	CompEditor *editor;
 	char *gladefile;
 
-	priv = spage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "schedule-page.glade",
@@ -457,8 +427,10 @@
 		return NULL;
 	}
 
-	g_signal_connect_after (G_OBJECT (spage), "client_changed",
-				G_CALLBACK (client_changed_cb), NULL);
+	g_signal_connect_swapped (
+		editor, "notify::client",
+		G_CALLBACK (sensitize_widgets), spage);
+
 	return spage;
 }
 
@@ -471,14 +443,15 @@
  * not be created.
  **/
 SchedulePage *
-schedule_page_new (EMeetingStore *ems)
+schedule_page_new (EMeetingStore *ems,
+                   CompEditor *editor)
 {
 	SchedulePage *spage;
 
-	spage = g_object_new (TYPE_SCHEDULE_PAGE, NULL);
+	spage = g_object_new (TYPE_SCHEDULE_PAGE, "editor", editor, NULL);
 	if (!schedule_page_construct (spage, ems)) {
 		g_object_unref (spage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
 	return spage;
@@ -511,20 +484,23 @@
 }
 
 static void
-times_changed_cb (GtkWidget *widget, gpointer data)
+times_changed_cb (GtkWidget *widget,
+                  SchedulePage *spage)
 {
-	SchedulePage *spage = data;
 	SchedulePagePrivate *priv;
 	CompEditorPageDates dates;
+	CompEditor *editor;
 	ECalComponentDateTime start_dt, end_dt;
 	struct icaltimetype start_tt = icaltime_null_time ();
 	struct icaltimetype end_tt = icaltime_null_time ();
 
 	priv = spage->priv;
 
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (spage)))
 		return;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (spage));
+
 	e_date_edit_get_date (E_DATE_EDIT (priv->sel->start_date_edit),
 			      &start_tt.year,
 			      &start_tt.month,
@@ -563,5 +539,5 @@
 	dates.complete = NULL;
 
 	comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (spage), &dates);
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (spage));
+	comp_editor_set_changed (editor, TRUE);
 }

Modified: branches/kill-bonobo/calendar/gui/dialogs/schedule-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/schedule-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/schedule-page.h	Tue Jul 15 18:34:59 2008
@@ -22,41 +22,57 @@
 #define SCHEDULE_PAGE_H
 
 #include "../e-meeting-store.h"
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 #include <libedataserverui/e-name-selector.h>
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_SCHEDULE_PAGE \
+	(schedule_page_get_type ())
+#define SCHEDULE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_SCHEDULE_PAGE, SchedulePage))
+#define SCHEDULE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_SCHEDULE_PAGE, SchedulePageClass))
+#define IS_SCHEDULE_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_SCHEDULE_PAGE))
+#define IS_SCHEDULE_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_SCHEDULE_PAGE))
+#define SCHEDULE_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_SCHEDULE_PAGE, SchedulePageClass))
 
-#define TYPE_SCHEDULE_PAGE            (schedule_page_get_type ())
-#define SCHEDULE_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SCHEDULE_PAGE, SchedulePage))
-#define SCHEDULE_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SCHEDULE_PAGE, SchedulePageClass))
-#define IS_SCHEDULE_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SCHEDULE_PAGE))
-#define IS_SCHEDULE_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_SCHEDULE_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _SchedulePage SchedulePage;
+typedef struct _SchedulePageClass SchedulePageClass;
 typedef struct _SchedulePagePrivate SchedulePagePrivate;
 
-typedef struct {
+struct _SchedulePage {
 	CompEditorPage page;
-
-	/* Private data */
 	SchedulePagePrivate *priv;
-} SchedulePage;
+};
 
-typedef struct {
+struct _SchedulePageClass {
 	CompEditorPageClass parent_class;
-} SchedulePageClass;
+};
 
 
-GType        schedule_page_get_type  (void);
-SchedulePage *schedule_page_construct (SchedulePage *mpage, EMeetingStore *ems);
-SchedulePage *schedule_page_new       (EMeetingStore *ems);
-void schedule_page_set_name_selector (SchedulePage *spage, ENameSelector *name_selector);
-void schedule_page_set_meeting_time (SchedulePage *spage, icaltimetype *start_tt, icaltimetype *end_tt);
-void schedule_page_update_free_busy (SchedulePage *spage);
-
+GType		schedule_page_get_type		(void);
+SchedulePage *	schedule_page_construct		(SchedulePage *mpage,
+						 EMeetingStore *ems);
+SchedulePage *	schedule_page_new		(EMeetingStore *ems,
+						 CompEditor *editor);
+void		schedule_page_set_name_selector	(SchedulePage *spage,
+						 ENameSelector *name_selector);
+void		schedule_page_set_meeting_time	(SchedulePage *spage,
+						 icaltimetype *start_tt,
+						 icaltimetype *end_tt);
+void		schedule_page_update_free_busy	(SchedulePage *spage);
 
 G_END_DECLS
 
-#endif
+#endif /* SCHEDULE_PAGE_H */

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-details-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-details-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-details-page.c	Tue Jul 15 18:34:59 2008
@@ -37,9 +37,10 @@
 #include "comp-editor-util.h"
 #include "task-details-page.h"
 
-
+#define TASK_DETAILS_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPagePrivate))
 
-/* Private part of the TaskDetailsPage structure */
 struct _TaskDetailsPagePrivate {
 	/* Glade XML data */
 	GladeXML *xml;
@@ -57,8 +58,6 @@
 	GtkWidget *url_label;
 	GtkWidget *url_entry;
 	GtkWidget *url;
-
-	gboolean updating;
 };
 
 /* Note that these two arrays must match. */
@@ -85,10 +84,6 @@
 	-1
 };
 
-
-
-static void task_details_page_finalize (GObject *object);
-
 static GtkWidget *task_details_page_get_widget (CompEditorPage *page);
 static void task_details_page_focus_main_widget (CompEditorPage *page);
 static gboolean task_details_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
@@ -97,82 +92,52 @@
 
 G_DEFINE_TYPE (TaskDetailsPage, task_details_page, TYPE_COMP_EDITOR_PAGE)
 
-/* Class initialization function for the task page */
+static void
+task_details_page_dispose (GObject *object)
+{
+	TaskDetailsPagePrivate *priv;
+
+	priv = TASK_DETAILS_PAGE_GET_PRIVATE (object);
+
+	if (priv->main != NULL) {
+		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
+
+	if (priv->xml != NULL) {
+		g_object_unref (priv->xml);
+		priv->xml = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (task_details_page_parent_class)->dispose (object);
+}
+
 static void
 task_details_page_class_init (TaskDetailsPageClass *class)
 {
-	CompEditorPageClass *editor_page_class;
 	GObjectClass *object_class;
+	CompEditorPageClass *editor_page_class;
+
+	g_type_class_add_private (class, sizeof (TaskDetailsPagePrivate));
 
-	editor_page_class = (CompEditorPageClass *) class;
-	object_class = (GObjectClass *) class;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = task_details_page_dispose;
 
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
 	editor_page_class->get_widget = task_details_page_get_widget;
 	editor_page_class->focus_main_widget = task_details_page_focus_main_widget;
 	editor_page_class->fill_widgets = task_details_page_fill_widgets;
 	editor_page_class->fill_component = task_details_page_fill_component;
 	editor_page_class->fill_timezones = task_details_page_fill_timezones;
-
-	object_class->finalize = task_details_page_finalize;
 }
 
-/* Object initialization function for the task page */
 static void
 task_details_page_init (TaskDetailsPage *tdpage)
 {
-	TaskDetailsPagePrivate *priv;
-
-	priv = g_new0 (TaskDetailsPagePrivate, 1);
-	tdpage->priv = priv;
-
-	priv->xml = NULL;
-
-	priv->main = NULL;
-
-	priv->status = NULL;
-	priv->priority = NULL;
-	priv->percent_complete = NULL;
-
-	priv->date_completed_label = NULL;
-	priv->completed_date = NULL;
-
-	priv->url_label = NULL;
-	priv->url_entry = NULL;
-	priv->url = NULL;
-
-	priv->updating = FALSE;
+	tdpage->priv = TASK_DETAILS_PAGE_GET_PRIVATE (tdpage);
 }
 
-/* Destroy handler for the task page */
-static void
-task_details_page_finalize (GObject *object)
-{
-	TaskDetailsPage *tdpage;
-	TaskDetailsPagePrivate *priv;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_TASK_DETAILS_PAGE (object));
-
-	tdpage = TASK_DETAILS_PAGE (object);
-	priv = tdpage->priv;
-
-	if (priv->main)
-		g_object_unref (priv->main);
-
-	if (priv->xml) {
-		g_object_unref (priv->xml);
-		priv->xml = NULL;
-	}
-
-	g_free (priv);
-	tdpage->priv = NULL;
-
-	if (G_OBJECT_CLASS (task_details_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (task_details_page_parent_class)->finalize) (object);
-}
-
-
-
 /* get_widget handler for the task page */
 static GtkWidget *
 task_details_page_get_widget (CompEditorPage *page)
@@ -261,12 +226,15 @@
 static void
 sensitize_widgets (TaskDetailsPage *tdpage)
 {
+	TaskDetailsPagePrivate *priv = tdpage->priv;
+	CompEditor *editor;
+	ECal *client;
 	gboolean read_only;
-	TaskDetailsPagePrivate *priv;
 
-	priv = tdpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tdpage));
+	client = comp_editor_get_client (editor);
 
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (tdpage)->client, &read_only, NULL))
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
 	gtk_widget_set_sensitive (priv->status, !read_only);
@@ -292,8 +260,6 @@
 	tdpage = TASK_DETAILS_PAGE (page);
 	priv = tdpage->priv;
 
-	priv->updating = TRUE;
-
 	/* Clean the screen */
 	clear_widgets (tdpage);
 
@@ -361,8 +327,6 @@
 	e_cal_component_get_url (comp, &url);
 	e_dialog_editable_set (priv->url, url);
 
-	priv->updating = FALSE;
-
 	sensitize_widgets (tdpage);
 
 	return TRUE;
@@ -549,22 +513,19 @@
 }
 
 static void
-date_changed_cb (EDateEdit *dedit, gpointer data)
+date_changed_cb (EDateEdit *dedit,
+                 TaskDetailsPage *tdpage)
 {
-	TaskDetailsPage *tdpage;
-	TaskDetailsPagePrivate *priv;
+	TaskDetailsPagePrivate *priv = tdpage->priv;
 	CompEditorPageDates dates = {NULL, NULL, NULL, NULL};
 	struct icaltimetype completed_tt = icaltime_null_time ();
 	icalproperty_status status;
 	gboolean date_set;
 
-	tdpage = TASK_DETAILS_PAGE (data);
-	priv = tdpage->priv;
-
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tdpage)))
 		return;
 
-	priv->updating = TRUE;
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), TRUE);
 
 	date_set = e_date_edit_get_date (E_DATE_EDIT (priv->completed_date),
 					 &completed_tt.year,
@@ -593,7 +554,7 @@
 		e_dialog_spin_set (priv->percent_complete, 100);
 	}
 
-	priv->updating = FALSE;
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), FALSE);
 
 	/* Notify upstream */
 	dates.complete = &completed_tt;
@@ -605,14 +566,17 @@
 {
 	TaskDetailsPagePrivate *priv;
 	icalproperty_status status;
+	CompEditor *editor;
 	time_t ctime = -1;
 
 	priv = tdpage->priv;
 
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tdpage)))
 		return;
 
-	priv->updating = TRUE;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tdpage));
+
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), TRUE);
 
 	status = e_dialog_option_menu_get (priv->status, status_map);
 	if (status == ICAL_STATUS_NONE) {
@@ -633,9 +597,9 @@
 		complete_date_changed (tdpage, ctime, TRUE);
 	}
 
-	priv->updating = FALSE;
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), FALSE);
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
+	comp_editor_set_changed (editor, TRUE);
 }
 
 static void
@@ -644,15 +608,18 @@
 	TaskDetailsPagePrivate *priv;
 	gint percent;
 	icalproperty_status status;
+	CompEditor *editor;
 	gboolean complete;
 	time_t ctime = -1;
 
 	priv = tdpage->priv;
 
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tdpage)))
 		return;
 
-	priv->updating = TRUE;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tdpage));
+
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), TRUE);
 
 	percent = e_dialog_spin_get_int (priv->percent_complete);
 	if (percent == 100) {
@@ -672,23 +639,9 @@
 	e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
 	complete_date_changed (tdpage, ctime, complete);
 
-	priv->updating = FALSE;
+	comp_editor_page_set_updating (COMP_EDITOR_PAGE (tdpage), FALSE);
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
-}
-
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
-	TaskDetailsPage *tdpage;
-	TaskDetailsPagePrivate *priv;
-
-	tdpage = TASK_DETAILS_PAGE (data);
-	priv = tdpage->priv;
-
-	if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage));
+	comp_editor_set_changed (editor, TRUE);
 }
 
 /* Hooks the widget signals */
@@ -721,27 +674,22 @@
 			    G_CALLBACK (percent_complete_changed), tdpage);
 
 	/* Priority */
-	g_signal_connect((GTK_OPTION_MENU (priv->priority)->menu),
-			    "deactivate",
-			    G_CALLBACK (field_changed_cb), tdpage);
+	g_signal_connect_swapped (
+		GTK_OPTION_MENU (priv->priority)->menu, "deactivate",
+		G_CALLBACK (comp_editor_page_changed), tdpage);
 
 	/* Completed Date */
-	g_signal_connect((priv->completed_date), "changed",
-			    G_CALLBACK (date_changed_cb), tdpage);
-	g_signal_connect (priv->completed_date, "changed",
-			    G_CALLBACK (field_changed_cb), tdpage);
+	g_signal_connect (
+		priv->completed_date, "changed",
+		G_CALLBACK (date_changed_cb), tdpage);
+	g_signal_connect_swapped (
+		priv->completed_date, "changed",
+		G_CALLBACK (comp_editor_page_changed), tdpage);
 
 	/* URL */
-	g_signal_connect((priv->url), "changed",
-			    G_CALLBACK (field_changed_cb), tdpage);
-}
-
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-	TaskDetailsPage *tdpage = TASK_DETAILS_PAGE (page);
-
-	sensitize_widgets (tdpage);
+	g_signal_connect_swapped (
+		priv->url, "changed",
+		G_CALLBACK (comp_editor_page_changed), tdpage);
 }
 
 /**
@@ -756,10 +704,11 @@
 TaskDetailsPage *
 task_details_page_construct (TaskDetailsPage *tdpage)
 {
-	TaskDetailsPagePrivate *priv;
+	TaskDetailsPagePrivate *priv = tdpage->priv;
+	CompEditor *editor;
 	char *gladefile;
 
-	priv = tdpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tdpage));
 
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "task-details-page.glade",
@@ -781,8 +730,9 @@
 
 	init_widgets (tdpage);
 
-	g_signal_connect_after (G_OBJECT (tdpage), "client_changed",
-				G_CALLBACK (client_changed_cb), NULL);
+	g_signal_connect_swapped (
+		editor, "notify::client",
+		G_CALLBACK (sensitize_widgets), tdpage);
 
 	return tdpage;
 }
@@ -796,14 +746,14 @@
  * not be created.
  **/
 TaskDetailsPage *
-task_details_page_new (void)
+task_details_page_new (CompEditor *editor)
 {
 	TaskDetailsPage *tdpage;
 
-	tdpage = g_object_new (TYPE_TASK_DETAILS_PAGE, NULL);
+	tdpage = g_object_new (TYPE_TASK_DETAILS_PAGE, "editor", editor, NULL);
 	if (!task_details_page_construct (tdpage)) {
 		g_object_unref (tdpage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
 	return tdpage;

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-details-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-details-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-details-page.h	Tue Jul 15 18:34:59 2008
@@ -24,38 +24,47 @@
 #ifndef TASK_DETAILS_PAGE_H
 #define TASK_DETAILS_PAGE_H
 
+#include "comp-editor.h"
 #include "comp-editor-page.h"
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_TASK_DETAILS_PAGE \
+	(task_details_page_get_type ())
+#define TASK_DETAILS_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPage))
+#define TASK_DETAILS_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_TASK_DETAILS_PAGE, TaskDetailsPageClass))
+#define IS_TASK_DETAILS_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_TASK_DETAILS_PAGE))
+#define IS_TASK_DETAILS_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_TASK_DETAILS_PAGE))
+#define TASK_DETAILS_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPageClass))
 
-#define TYPE_TASK_DETAILS_PAGE            (task_details_page_get_type ())
-#define TASK_DETAILS_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_DETAILS_PAGE, TaskDetailsPage))
-#define TASK_DETAILS_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_DETAILS_PAGE, TaskDetailsPageClass))
-#define IS_TASK_DETAILS_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
-#define IS_TASK_DETAILS_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_TASK_DETAILS_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _TaskDetailsPage TaskDetailsPage;
+typedef struct _TaskDetailsPageClass TaskDetailsPageClass;
 typedef struct _TaskDetailsPagePrivate TaskDetailsPagePrivate;
 
-typedef struct {
+struct _TaskDetailsPage {
 	CompEditorPage page;
-
-	/* Private data */
 	TaskDetailsPagePrivate *priv;
-} TaskDetailsPage;
+};
 
-typedef struct {
+struct _TaskDetailsPageClass {
 	CompEditorPageClass parent_class;
-} TaskDetailsPageClass;
-
-
-GType            task_details_page_get_type        (void);
-TaskDetailsPage *task_details_page_construct       (TaskDetailsPage *tdpage);
-TaskDetailsPage *task_details_page_new             (void);
+};
 
-
+GType		 task_details_page_get_type	(void);
+TaskDetailsPage *task_details_page_construct	(TaskDetailsPage *tdpage);
+TaskDetailsPage *task_details_page_new		(CompEditor *editor);
 
 G_END_DECLS
 
-#endif
+#endif /* TASK_DETAILS_PAGE_H */

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-editor.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-editor.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-editor.c	Tue Jul 15 18:34:59 2008
@@ -32,476 +32,359 @@
 #include <glib/gi18n.h>
 
 #include <e-util/e-icon-factory.h>
+#include <e-util/e-plugin-ui.h>
 #include <e-util/e-util-private.h>
 #include <evolution-shell-component-utils.h>
 
 #include "task-page.h"
 #include "task-details-page.h"
 #include "cancel-comp.h"
-#include "../calendar-config.h"
 #include "task-editor.h"
 
+#define TASK_EDITOR_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_TASK_EDITOR, TaskEditorPrivate))
+
 struct _TaskEditorPrivate {
 	TaskPage *task_page;
 	TaskDetailsPage *task_details_page;
-
 	GtkWidget *task_details_window;
-	EMeetingStore *model;
 
+	EMeetingStore *model;
 	gboolean assignment_shown;
-	gboolean is_assigned;
 	gboolean updating;
 };
 
-
+/* Extends the UI definition in CompEditor */
+static const gchar *ui =
+"<ui>"
+"  <menubar action='main-menu'>"
+"    <menu action='view-menu'>"
+"      <menuitem action='view-type'/>"
+"      <menuitem action='view-status'/>"
+"      <menuitem action='view-role'/>"
+"      <menuitem action='view-rsvp'/>"
+"      <separator/>"
+"      <menuitem action='view-time-zone'/>"
+"      <menuitem action='view-categories'/>"
+"    </menu>"
+"    <menu action='insert-menu'>"
+"      <menuitem action='send-options'/>"
+"    </menu>"
+"    <menu action='options-menu'>"
+"      <menu action='classification-menu'>"
+"        <menuitem action='classify-public'/>"
+"        <menuitem action='classify-private'/>"
+"        <menuitem action='classify-confidential'/>"
+"      </menu>"
+"      <menuitem action='option-status'/>"
+"    </menu>"
+"  </menubar>"
+"  <toolbar name='main-toolbar'>"
+"    <toolitem action='view-time-zone'/>"
+"    <toolitem action='option-status'/>"
+"  </toolbar>"
+"</ui>";
 
-static void task_editor_set_e_cal (CompEditor *editor, ECal *client);
 static void task_editor_edit_comp (CompEditor *editor, ECalComponent *comp);
 static gboolean task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method);
-static void task_editor_finalize (GObject *object);
-
-static void model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data);
-static void model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data);
 
 G_DEFINE_TYPE (TaskEditor, task_editor, TYPE_COMP_EDITOR)
 
-/* Class initialization function for the event editor */
 static void
-task_editor_class_init (TaskEditorClass *klass)
+action_option_status_cb (GtkAction *action,
+                         TaskEditor *editor)
 {
-	GObjectClass *object_class;
-	CompEditorClass *editor_class;
-
-	object_class = (GObjectClass *) klass;
-	editor_class = (CompEditorClass *) klass;
-
-	editor_class->set_e_cal = task_editor_set_e_cal;
-	editor_class->edit_comp = task_editor_edit_comp;
-	editor_class->send_comp = task_editor_send_comp;
-
-	object_class->finalize = task_editor_finalize;
+	gtk_widget_show (editor->priv->task_details_window);
 }
 
 static void
-init_widgets (TaskEditor *te)
+action_send_options_cb (GtkAction *action,
+                        TaskEditor *editor)
 {
-	TaskEditorPrivate *priv;
+	task_page_sendoptions_clicked_cb (editor->priv->task_page);
+}
 
-	priv = te->priv;
+static GtkActionEntry task_entries[] = {
 
-	g_signal_connect((priv->model), "row_changed",
-			    G_CALLBACK (model_row_change_insert_cb), te);
-	g_signal_connect((priv->model), "row_inserted",
-			    G_CALLBACK (model_row_change_insert_cb), te);
-	g_signal_connect((priv->model), "row_deleted",
-			    G_CALLBACK (model_row_delete_cb), te);
-}
+	{ "option-status",
+	  "stock_view-details",
+	  N_("_Status Details"),
+	  "<Control>t",
+	  N_("Click to change or view the status details of the task"),
+	  G_CALLBACK (action_option_status_cb) }
+};
 
-static void
-client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data)
-{
-//	set_menu_sens (TASK_EDITOR (user_data));
-}
+static GtkActionEntry assigned_task_entries[] = {
+
+	{ "send-options",
+	  NULL,
+	  N_("_Send Options"),
+	  NULL,
+	  N_("Insert advanced send options"),
+	  G_CALLBACK (action_send_options_cb) }
+};
 
 static void
-menu_view_role_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+task_editor_client_changed_cb (TaskEditor *te)
 {
-	TaskEditor *te = (TaskEditor *) user_data;
+	ECal *client;
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	task_page_set_view_role (te->priv->task_page, atoi(state));
-	calendar_config_set_show_role (atoi(state));
+	client = comp_editor_get_client (COMP_EDITOR (te));
+	e_meeting_store_set_e_cal (te->priv->model, client);
 }
 
 static void
-menu_view_status_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
+task_editor_model_changed_cb (TaskEditor *te)
 {
-	TaskEditor *te = (TaskEditor *) user_data;
+	if (!te->priv->updating) {
+		comp_editor_set_changed (COMP_EDITOR (te), TRUE);
+		comp_editor_set_needs_send (COMP_EDITOR (te), TRUE);
+	}
+}
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
+static GObject *
+task_editor_constructor (GType type,
+                         guint n_construct_properties,
+                         GObjectConstructParam *construct_properties)
+{
+	GObject *object;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	TaskEditorPrivate *priv;
+	GtkActionGroup *action_group;
+	ECal *client;
+	gboolean is_assigned;
 
-	task_page_set_view_status (te->priv->task_page, atoi(state));
-	calendar_config_set_show_status (atoi(state));
-}
+	/* Chain up to parent's constructor() method. */
+	object = G_OBJECT_CLASS (task_editor_parent_class)->constructor (
+		type, n_construct_properties, construct_properties);
 
-static void
-menu_view_type_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
-{
-	TaskEditor *te = (TaskEditor *) user_data;
+	editor = COMP_EDITOR (object);
+	priv = TASK_EDITOR_GET_PRIVATE (object);
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	task_page_set_view_type (te->priv->task_page, atoi(state));
-	calendar_config_set_show_type (atoi(state));
-}
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+	action_group = comp_editor_get_action_group (editor, "coordinated");
 
-static void
-menu_view_rsvp_cb (BonoboUIComponent           *component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer                     user_data)
-{
-	TaskEditor *te = (TaskEditor *) user_data;
+	is_assigned = flags & COMP_EDITOR_IS_ASSIGNED;
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	task_page_set_view_rsvp (te->priv->task_page, atoi(state));
-	calendar_config_set_show_rsvp (atoi(state));
-}
+	task_page_set_assignment (priv->task_page, is_assigned);
+	gtk_action_group_set_visible (action_group, is_assigned);
 
-static void
-menu_show_time_zone_cb (BonoboUIComponent           *component,
-		       const char                  *path,
-		       Bonobo_UIComponent_EventType type,
-		       const char                  *state,
-		       gpointer                     user_data)
-{
-	TaskEditor *te = (TaskEditor *) user_data;
+	if (is_assigned) {
+		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
+			task_page_show_options (priv->task_page);
+		comp_editor_set_group_item (editor, TRUE);
+	}
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
-	task_page_set_show_timezone (te->priv->task_page, atoi(state));
-	calendar_config_set_show_timezone (atoi(state));
+	return object;
 }
 
 static void
-menu_show_categories_cb (BonoboUIComponent           *component,
-		       const char                  *path,
-		       Bonobo_UIComponent_EventType type,
-		       const char                  *state,
-		       gpointer                     user_data)
+task_editor_dispose (GObject *object)
 {
-	TaskEditor *te = (TaskEditor *) user_data;
+	TaskEditorPrivate *priv;
 
-	if (type != Bonobo_UIComponent_STATE_CHANGED)
-		return;
+	priv = TASK_EDITOR_GET_PRIVATE (object);
 
-	task_page_set_show_categories (te->priv->task_page, atoi(state));
-	calendar_config_set_show_categories (atoi(state));
-}
+	if (priv->task_page) {
+		g_object_unref (priv->task_page);
+		priv->task_page = NULL;
+	}
 
-static void
-menu_class_public_cb (BonoboUIComponent          *ui_component,
-		     const char                  *path,
-		     Bonobo_UIComponent_EventType type,
-		     const char                  *state,
-		     gpointer			  user_data)
-{
-	TaskEditor *te = (TaskEditor *) user_data;
+	if (priv->task_details_page) {
+		g_object_unref (priv->task_details_page);
+		priv->task_details_page = NULL;
+	}
 
-	if (state[0] == '0')
-		return;
+	if (priv->model) {
+		g_object_unref (priv->model);
+		priv->model = NULL;
+	}
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (te->priv->task_page));
-	task_page_set_classification (te->priv->task_page, E_CAL_COMPONENT_CLASS_PUBLIC);
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (task_editor_parent_class)->dispose (object);
 }
 
 static void
-menu_class_private_cb (BonoboUIComponent          *ui_component,
-		      const char                  *path,
-		      Bonobo_UIComponent_EventType type,
-		      const char                  *state,
-		      gpointer			   user_data)
+task_editor_show_categories (CompEditor *editor,
+                             gboolean visible)
 {
-	TaskEditor *te = (TaskEditor *) user_data;
-	if (state[0] == '0')
-		return;
-
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (te->priv->task_page));
-	task_page_set_classification (te->priv->task_page, E_CAL_COMPONENT_CLASS_PRIVATE);
-}
+	TaskEditorPrivate *priv;
 
-static void
-menu_class_confidential_cb (BonoboUIComponent          *ui_component,
-		     	   const char                  *path,
-		     	   Bonobo_UIComponent_EventType type,
-		     	   const char                  *state,
-		     	   gpointer			user_data)
-{
-	TaskEditor *te = (TaskEditor *) user_data;
-	if (state[0] == '0')
-		return;
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
-	comp_editor_page_notify_changed (COMP_EDITOR_PAGE (te->priv->task_page));
-	task_page_set_classification (te->priv->task_page, E_CAL_COMPONENT_CLASS_CONFIDENTIAL);
+	task_page_set_show_categories (priv->task_page, visible);
 }
 
-
 static void
-menu_option_status_cb (BonoboUIComponent           *ui_component,
-		       const char                  *path,
-		       Bonobo_UIComponent_EventType type,
-		       const char                  *state,
-		       gpointer			user_data)
+task_editor_show_role (CompEditor *editor,
+                       gboolean visible)
 {
-	TaskEditor *te = (TaskEditor *) user_data;
+	TaskEditorPrivate *priv;
+
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
-	gtk_widget_show (te->priv->task_details_window);
+	task_page_set_view_role (priv->task_page, visible);
 }
 
 static void
-menu_insert_send_options_cmd (BonoboUIComponent *uic,
-		   	 void *data,
-		   	 const char *path)
+task_editor_show_rsvp (CompEditor *editor,
+                       gboolean visible)
 {
-	TaskEditor *te = (TaskEditor *) data;
-
-	task_page_sendoptions_clicked_cb (te->priv->task_page);
-}
+	TaskEditorPrivate *priv;
 
-static void
-menu_show_time_zone_cmd (BonoboUIComponent *uic,
-		   	 void *data,
-		   	 const char *path)
-{	/* TODO implement it
-	TaskEditor *te = (TaskEditor *) data;
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
-	task_page_set_show_timezone (te->priv->task_page, atoi(state));
-	calendar_config_set_show_timezone (atoi(state)); */
+	task_page_set_view_rsvp (priv->task_page, visible);
 }
 
 static void
-menu_option_status_cmd (BonoboUIComponent *uic,
-		     void *data,
-		     const char *path)
+task_editor_show_status (CompEditor *editor,
+                         gboolean visible)
 {
-	TaskEditor *te = (TaskEditor *) data;
-
-	gtk_widget_show (te->priv->task_details_window);
-}
-
-static BonoboUIVerb verbs [] = {
-
-	BONOBO_UI_VERB ("ViewTimeZone", menu_show_time_zone_cmd),
-	BONOBO_UI_VERB ("OptionStatus", menu_option_status_cmd),
-	BONOBO_UI_VERB ("InsertSendOptions", menu_insert_send_options_cmd),
-	BONOBO_UI_VERB_END
-};
-
-static EPixmap pixmaps[] = {
-	E_PIXMAP ("/commands/OptionStatus", "stock_view-details", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/ViewTimeZone", "stock_timezone", E_ICON_SIZE_MENU),
-
-	E_PIXMAP ("/Toolbar/ViewTimeZone", "stock_timezone", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/OptionStatus", "stock_view-details", E_ICON_SIZE_LARGE_TOOLBAR),
+	TaskEditorPrivate *priv;
 
-	E_PIXMAP_END
-};
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
+	task_page_set_view_status (priv->task_page, visible);
+}
 
-/* Object initialization function for the task editor */
 static void
-task_editor_init (TaskEditor *te)
+task_editor_show_time_zone (CompEditor *editor,
+                            gboolean visible)
 {
 	TaskEditorPrivate *priv;
-	CompEditor *editor = COMP_EDITOR(te);
-	gboolean status;
-	char *xmlfile;
-
-	priv = g_new0 (TaskEditorPrivate, 1);
-	te->priv = priv;
-
-	priv->model = E_MEETING_STORE (e_meeting_store_new ());
-	priv->assignment_shown = TRUE;
-	priv->updating = FALSE;
-	priv->is_assigned = FALSE;
 
-	bonobo_ui_component_freeze (editor->uic, NULL);
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
-	bonobo_ui_component_add_verb_list_with_data (editor->uic, verbs, te);
-
-	xmlfile = g_build_filename (EVOLUTION_UIDIR,
-				    "evolution-task-editor.xml",
-				    NULL);
-	bonobo_ui_util_set_ui (editor->uic, PREFIX,
-			       xmlfile,
-			       "evolution-task-editor", NULL);
-	g_free (xmlfile);
-
-	/* Show hide the status fields */
-	status = calendar_config_get_show_status ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewStatus",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewStatus",
-		menu_view_status_cb, editor);
-
-	/* Show hide the type fields */
-	status = calendar_config_get_show_type ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewType",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewType",
-		menu_view_type_cb, editor);
-
-	/* Show hide the role fields */
-	status = calendar_config_get_show_role ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewRole",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewRole",
-		menu_view_role_cb, editor);
-
-	/* Show hide the rsvp fields */
-	status = calendar_config_get_show_rsvp ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewRSVP",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewRSVP",
-		menu_view_rsvp_cb, editor);
-
-	status = calendar_config_get_show_timezone ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewTimeZone",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewTimeZone",
-		menu_show_time_zone_cb, editor);
-
-	status = calendar_config_get_show_categories ();
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ViewCategories",
-		"state", status ? "1" : "0", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ViewCategories",
-		menu_show_categories_cb, editor);
-
-	bonobo_ui_component_set_prop (
-		editor->uic, "/commands/ActionClassPublic",
-		"state", "1", NULL);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPublic",
-		menu_class_public_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassPrivate",
-		menu_class_private_cb, editor);
-	bonobo_ui_component_add_listener (
-		editor->uic, "ActionClassConfidential",
-		menu_class_confidential_cb, editor);
-
-	bonobo_ui_component_add_listener (
-		editor->uic, "OptionStatus",
-		menu_option_status_cb, editor);
-
-	e_pixmaps_update (editor->uic, pixmaps);
-
-	bonobo_ui_component_thaw (editor->uic, NULL);
-
-
-	comp_editor_set_help_section (COMP_EDITOR (te), "usage-calendar-todo");
+	task_page_set_show_timezone (priv->task_page, visible);
 }
 
-TaskEditor *
-task_editor_construct (TaskEditor *te, ECal *client)
+static void
+task_editor_show_type (CompEditor *editor,
+                       gboolean visible)
 {
 	TaskEditorPrivate *priv;
-	gboolean read_only = FALSE;
-	CompEditor *editor = COMP_EDITOR (te);
-
-	priv = te->priv;
-
-	priv->task_page = task_page_new (priv->model, client, editor->uic);
-	g_object_ref_sink (priv->task_page);
-	comp_editor_append_page (COMP_EDITOR (te),
-				 COMP_EDITOR_PAGE (priv->task_page),
-				 _("_Task"), TRUE);
-	g_signal_connect (G_OBJECT (priv->task_page), "client_changed",
-			  G_CALLBACK (client_changed_cb), te);
-
-	priv->task_details_window = gtk_dialog_new_with_buttons (_("Task Details"),
-								(GtkWindow *) te, GTK_DIALOG_MODAL,
-							  	"gtk-close", GTK_RESPONSE_CLOSE,
-							  	NULL);
-	g_signal_connect (priv->task_details_window, "response", G_CALLBACK(gtk_widget_hide), NULL);
-	g_signal_connect (priv->task_details_window, "delete-event", G_CALLBACK(gtk_widget_hide), NULL);
-
-	priv->task_details_page = task_details_page_new ();
-	g_object_ref_sink (priv->task_details_page);
-	gtk_container_add ((GtkContainer *) GTK_DIALOG(priv->task_details_window)->vbox,
-		           comp_editor_page_get_widget ((CompEditorPage *)priv->task_details_page));
-	gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (priv->task_details_window) ) );
-	/* gtk_widget_hide (priv->task_details_window); */
-	comp_editor_append_page (editor, COMP_EDITOR_PAGE (priv->task_details_page), NULL, FALSE);
 
-	if (!e_cal_is_read_only (client, &read_only, NULL))
-			read_only = TRUE;
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
-	if (priv->is_assigned) {
-		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS))
-			task_page_show_options (priv->task_page);
+	task_page_set_view_type (priv->task_page, visible);
+}
 
-		task_page_set_assignment (priv->task_page, TRUE);
-		comp_editor_set_group_item (COMP_EDITOR (te), TRUE);
-	} else {
-		task_page_set_assignment (priv->task_page, FALSE);
-
-		bonobo_ui_component_set_prop (editor->uic, "/commands/InsertSendOptions", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewRole", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewRSVP", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewType", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/commands/ViewStatus", "hidden", "1", NULL);
-		bonobo_ui_component_set_prop (editor->uic, "/menu/View/AttendeeOptions/timezonesep", "hidden", "1", NULL);
-	}
+static void
+task_editor_class_init (TaskEditorClass *class)
+{
+	GObjectClass *object_class;
+	CompEditorClass *editor_class;
 
-	comp_editor_set_e_cal (COMP_EDITOR (te), client);
+	g_type_class_add_private (class, sizeof (TaskEditorPrivate));
 
-	init_widgets (te);
+	object_class = G_OBJECT_CLASS (class);
+	object_class->constructor = task_editor_constructor;
+	object_class->dispose = task_editor_dispose;
 
-	return te;
+	editor_class = COMP_EDITOR_CLASS (class);
+	editor_class->help_section = "usage-calendar-todo";
+	editor_class->edit_comp = task_editor_edit_comp;
+	editor_class->send_comp = task_editor_send_comp;
+	editor_class->show_categories = task_editor_show_categories;
+	editor_class->show_role = task_editor_show_role;
+	editor_class->show_rsvp = task_editor_show_rsvp;
+	editor_class->show_status = task_editor_show_status;
+	editor_class->show_time_zone = task_editor_show_time_zone;
+	editor_class->show_type = task_editor_show_type;
 }
 
 static void
-task_editor_set_e_cal (CompEditor *editor, ECal *client)
+task_editor_init (TaskEditor *te)
 {
-	TaskEditor *te;
-	TaskEditorPrivate *priv;
-
-	te = TASK_EDITOR (editor);
-	priv = te->priv;
-
-	e_meeting_store_set_e_cal (priv->model, client);
+	CompEditor *editor = COMP_EDITOR (te);
+	GtkUIManager *manager;
+	GtkActionGroup *action_group;
+	GError *error = NULL;
+
+	te->priv = TASK_EDITOR_GET_PRIVATE (te);
+	te->priv->model = E_MEETING_STORE (e_meeting_store_new ());
+	te->priv->assignment_shown = TRUE;
+	te->priv->updating = FALSE;
+
+	te->priv->task_page = task_page_new (te->priv->model, editor);
+	g_object_ref_sink (te->priv->task_page);
+	comp_editor_append_page (
+		editor, COMP_EDITOR_PAGE (te->priv->task_page),
+		_("_Task"), TRUE);
+
+	te->priv->task_details_window = gtk_dialog_new_with_buttons (
+		_("Task Details"), GTK_WINDOW (te), GTK_DIALOG_MODAL,
+		GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
+	g_signal_connect (
+		te->priv->task_details_window, "response",
+		G_CALLBACK (gtk_widget_hide), NULL);
+	g_signal_connect (
+		te->priv->task_details_window, "delete-event",
+		G_CALLBACK(gtk_widget_hide), NULL);
+
+	te->priv->task_details_page = task_details_page_new (editor);
+	g_object_ref_sink (te->priv->task_details_page);
+	gtk_container_add (
+		GTK_CONTAINER (GTK_DIALOG (te->priv->task_details_window)->vbox),
+		comp_editor_page_get_widget ((CompEditorPage *) te->priv->task_details_page));
+	gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (te->priv->task_details_window)));
+	comp_editor_append_page (
+		editor, COMP_EDITOR_PAGE (te->priv->task_details_page), NULL, FALSE);
+
+	action_group = comp_editor_get_action_group (editor, "individual");
+	gtk_action_group_add_actions (
+		action_group, task_entries,
+		G_N_ELEMENTS (task_entries), te);
+
+	action_group = comp_editor_get_action_group (editor, "coordinated");
+	gtk_action_group_add_actions (
+		action_group, assigned_task_entries,
+		G_N_ELEMENTS (assigned_task_entries), te);
+
+	manager = comp_editor_get_ui_manager (editor);
+	gtk_ui_manager_add_ui_from_string (manager, ui, -1, &error);
+	e_plugin_ui_register_manager ("task-editor", manager, te);
+
+	if (error != NULL) {
+		g_critical ("%s: %s", G_STRFUNC, error->message);
+		g_error_free (error);
+	}
 
-	if (COMP_EDITOR_CLASS (task_editor_parent_class)->set_e_cal)
-		COMP_EDITOR_CLASS (task_editor_parent_class)->set_e_cal (editor, client);
+	g_signal_connect (
+		te, "notify::client",
+		G_CALLBACK (task_editor_client_changed_cb), NULL);
+
+	g_signal_connect_swapped (
+		te->priv->model, "row_changed",
+		G_CALLBACK (task_editor_model_changed_cb), te);
+	g_signal_connect_swapped (
+		te->priv->model, "row_inserted",
+		G_CALLBACK (task_editor_model_changed_cb), te);
+	g_signal_connect_swapped (
+		te->priv->model, "row_deleted",
+		G_CALLBACK (task_editor_model_changed_cb), te);
 }
 
 static void
 task_editor_edit_comp (CompEditor *editor, ECalComponent *comp)
 {
-	TaskEditor *te;
 	TaskEditorPrivate *priv;
 	ECalComponentOrganizer organizer;
 	ECal *client;
 	GSList *attendees = NULL;
 
-	te = TASK_EDITOR (editor);
-	priv = te->priv;
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
 	priv->updating = TRUE;
 
 	if (COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp)
 		COMP_EDITOR_CLASS (task_editor_parent_class)->edit_comp (editor, comp);
 
-	client = comp_editor_get_e_cal (COMP_EDITOR (editor));
+	client = comp_editor_get_client (editor);
 
 	/* Get meeting related stuff */
 	e_cal_component_get_organizer (comp, &organizer);
@@ -553,12 +436,12 @@
 		}
 
 
-		comp_editor_set_group_item (COMP_EDITOR (te), TRUE);
+		comp_editor_set_group_item (editor, TRUE);
 		priv->assignment_shown = TRUE;
 	}
 	e_cal_component_free_attendee_list (attendees);
 
-	comp_editor_set_needs_send (COMP_EDITOR (te), priv->assignment_shown && itip_organizer_is_user (comp, client));
+	comp_editor_set_needs_send (editor, priv->assignment_shown && itip_organizer_is_user (comp, client));
 
 	priv->updating = FALSE;
 }
@@ -566,11 +449,10 @@
 static gboolean
 task_editor_send_comp (CompEditor *editor, ECalComponentItipMethod method)
 {
-	TaskEditor *te = TASK_EDITOR (editor);
 	TaskEditorPrivate *priv;
 	ECalComponent *comp = NULL;
 
-	priv = te->priv;
+	priv = TASK_EDITOR_GET_PRIVATE (editor);
 
 	/* Don't cancel more than once or when just publishing */
 	if (method == E_CAL_COMPONENT_METHOD_PUBLISH ||
@@ -598,40 +480,6 @@
 	return FALSE;
 }
 
-/* Destroy handler for the event editor */
-static void
-task_editor_finalize (GObject *object)
-{
-	TaskEditor *te;
-	TaskEditorPrivate *priv;
-
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_TASK_EDITOR (object));
-
-	te = TASK_EDITOR (object);
-	priv = te->priv;
-
-	if (priv->task_page) {
-		g_object_unref (priv->task_page);
-		priv->task_page = NULL;
-	}
-
-	if (priv->task_details_page) {
-		g_object_unref (priv->task_details_page);
-		priv->task_details_page = NULL;
-	}
-
-	if (priv->model) {
-		g_object_unref (priv->model);
-		priv->model = NULL;
-	}
-
-	g_free (priv);
-
-	if (G_OBJECT_CLASS (task_editor_parent_class)->finalize)
-		(* G_OBJECT_CLASS (task_editor_parent_class)->finalize) (object);
-}
-
 /**
  * task_editor_new:
  * @client: a ECal
@@ -641,61 +489,31 @@
  * Return value: A newly-created event editor dialog, or NULL if the event
  * editor could not be created.
  **/
-TaskEditor *
+CompEditor *
 task_editor_new (ECal *client, CompEditorFlags flags)
 {
-	TaskEditor *te;
-
-	te = g_object_new (TYPE_TASK_EDITOR, NULL);
-	te->priv->is_assigned = flags & COMP_EDITOR_IS_ASSIGNED;
-	comp_editor_set_flags (COMP_EDITOR (te), flags);
-
-	return task_editor_construct (te, client);
-}
-
-static void
-show_assignment (TaskEditor *te)
-{
-	TaskEditorPrivate *priv;
-
-	priv = te->priv;
-
-	task_page_set_assignment (priv->task_page, TRUE);
-	if (!priv->assignment_shown) {
-		priv->assignment_shown = TRUE;
-
-		comp_editor_set_needs_send (COMP_EDITOR (te), priv->assignment_shown);
-		comp_editor_set_changed (COMP_EDITOR (te), FALSE);
-	}
+	g_return_val_if_fail (E_IS_CAL (client), NULL);
 
+	return g_object_new (
+		TYPE_TASK_EDITOR,
+		"flags", flags, "client", client, NULL);
 }
 
 void
 task_editor_show_assignment (TaskEditor *te)
 {
-	g_return_if_fail (te != NULL);
+	CompEditor *editor;
+
 	g_return_if_fail (IS_TASK_EDITOR (te));
 
-	show_assignment (te);
-}
+	editor = COMP_EDITOR (te);
 
-static void
-model_changed (TaskEditor *te)
-{
-	if (!te->priv->updating) {
-		comp_editor_set_changed (COMP_EDITOR (te), TRUE);
-		comp_editor_set_needs_send (COMP_EDITOR (te), TRUE);
+	task_page_set_assignment (te->priv->task_page, TRUE);
+	if (!te->priv->assignment_shown) {
+		te->priv->assignment_shown = TRUE;
+		comp_editor_set_needs_send (editor, TRUE);
+		comp_editor_set_changed (editor, FALSE);
 	}
-}
 
-static void
-model_row_change_insert_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-	model_changed (TASK_EDITOR (data));
 }
 
-static void
-model_row_delete_cb (GtkTreeModel *model, GtkTreePath *path, gpointer data)
-{
-	model_changed (TASK_EDITOR (data));
-}

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-editor.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-editor.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-editor.h	Tue Jul 15 18:34:59 2008
@@ -27,14 +27,26 @@
 #include <gtk/gtk.h>
 #include "comp-editor.h"
 
-
+/* Standard GObject macros */
+#define TYPE_TASK_EDITOR \
+	(task_editor_get_type ())
+#define TASK_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_TASK_EDITOR, TaskEditor))
+#define TASK_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_TASK_EDITOR, TaskEditorClass))
+#define IS_TASK_EDITOR(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_TASK_EDITOR))
+#define IS_TASK_EDITOR_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), TYPE_TASK_EDITOR))
+#define TASK_EDITOR_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_TASK_EDITOR, TaskEditorClass))
 
-#define TYPE_TASK_EDITOR            (task_editor_get_type ())
-#define TASK_EDITOR(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_EDITOR, TaskEditor))
-#define TASK_EDITOR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_EDITOR,	\
-				      TaskEditorClass))
-#define IS_TASK_EDITOR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_EDITOR))
-#define IS_TASK_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TASK_EDITOR))
+G_BEGIN_DECLS
 
 typedef struct _TaskEditor TaskEditor;
 typedef struct _TaskEditorClass TaskEditorClass;
@@ -42,8 +54,6 @@
 
 struct _TaskEditor {
 	CompEditor parent;
-
-	/* Private data */
 	TaskEditorPrivate *priv;
 };
 
@@ -51,11 +61,11 @@
 	CompEditorClass parent_class;
 };
 
-GType       task_editor_get_type       (void);
-TaskEditor *task_editor_construct      (TaskEditor *te,
-					ECal  *client);
-TaskEditor *task_editor_new            (ECal  *client, CompEditorFlags flags);
-void        task_editor_show_assignment(TaskEditor *te);
-
+GType		task_editor_get_type		(void);
+CompEditor *	task_editor_new			(ECal *client,
+						 CompEditorFlags flags);
+void		task_editor_show_assignment	(TaskEditor *te);
+
+G_END_DECLS
 
 #endif /* __TASK_EDITOR_H__ */

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-page.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-page.c	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-page.c	Tue Jul 15 18:34:59 2008
@@ -49,16 +49,16 @@
 #include "../e-meeting-store.h"
 #include "../e-meeting-list-view.h"
 #include "../e-cal-popup.h"
-
+
+#define TASK_PAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), TYPE_TASK_PAGE, TaskPagePrivate))
 
 /* Private part of the TaskPage structure */
 struct _TaskPagePrivate {
 	/* Glade XML data */
 	GladeXML *xml;
 
-	/* Bonobo Controller for the menu/toolbar */
-	BonoboUIComponent *uic;
-
 	/* Widgets from the Glade file */
 	GtkWidget *main;
 
@@ -91,8 +91,6 @@
 
 	GtkWidget *description;
 
-	ECalComponentClassification classification;
-
 	GtkWidget *categories_btn;
 	GtkWidget *categories;
 
@@ -118,7 +116,6 @@
 	gboolean user_org;
 	gboolean existing;
 
-	gboolean updating;
 	gboolean sendoptions_shown;
 	gboolean is_assignment;
 
@@ -141,159 +138,87 @@
 static gboolean task_page_fill_widgets (CompEditorPage *page, ECalComponent *comp);
 static gboolean task_page_fill_component (CompEditorPage *page, ECalComponent *comp);
 static gboolean task_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
-static void task_page_set_summary (CompEditorPage *page, const char *summary);
-static void task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates);
 static void task_page_select_organizer (TaskPage *tpage, const char *backend_address);
 static void set_subscriber_info_string (TaskPage *tpage, const char *backend_address);
 
 G_DEFINE_TYPE (TaskPage, task_page, TYPE_COMP_EDITOR_PAGE)
 
-/* Class initialization function for the task page */
 static void
-task_page_class_init (TaskPageClass *class)
-{
-	CompEditorPageClass *editor_page_class;
-	GObjectClass *object_class;
-
-	editor_page_class = (CompEditorPageClass *) class;
-	object_class = (GObjectClass *) class;
-
-	editor_page_class->get_widget = task_page_get_widget;
-	editor_page_class->focus_main_widget = task_page_focus_main_widget;
-	editor_page_class->fill_widgets = task_page_fill_widgets;
-	editor_page_class->fill_component = task_page_fill_component;
-	editor_page_class->fill_timezones = task_page_fill_timezones;
-	editor_page_class->set_summary = task_page_set_summary;
-	editor_page_class->set_dates = task_page_set_dates;
-
-	object_class->finalize = task_page_finalize;
-}
-
-/* Object initialization function for the task page */
-static void
-task_page_init (TaskPage *tpage)
+task_page_dispose (GObject *object)
 {
 	TaskPagePrivate *priv;
 
-	priv = g_new0 (TaskPagePrivate, 1);
-	tpage->priv = priv;
-
-	priv->xml = NULL;
-	priv->uic = NULL;
-
-	priv->main = NULL;
-	priv->summary = NULL;
-	priv->summary_label = NULL;
-	priv->due_date = NULL;
-	priv->start_date = NULL;
-	priv->timezone = NULL;
-	priv->description = NULL;
-	priv->classification = E_CAL_COMPONENT_CLASS_NONE;
-	priv->categories_btn = NULL;
-	priv->categories = NULL;
-	priv->sendoptions_shown = FALSE;
-	priv->sod = NULL;
-
-	priv->info_hbox = NULL;
-	priv->info_icon = NULL;
-	priv->info_string = NULL;
-
-	priv->updating = FALSE;
-	priv->sendoptions_shown = FALSE;
-	priv->is_assignment = FALSE;
+	priv = TASK_PAGE_GET_PRIVATE (object);
 
-	priv->deleted_attendees = g_ptr_array_new ();
-
-	priv->comp = NULL;
+	if (priv->main != NULL) {
+		g_object_unref (priv->main);
+		priv->main = NULL;
+	}
 
-	priv->accounts = NULL;
-	priv->address_strings = NULL;
-	priv->ia = NULL;
-	priv->invite = NULL;
+	if (priv->xml != NULL) {
+		g_object_unref (priv->xml);
+		priv->xml = NULL;
+	}
 
-	priv->model = NULL;
-	priv->list_view = NULL;
-}
+	if (priv->sod != NULL) {
+		g_object_unref (priv->sod);
+		priv->sod = NULL;
+	}
 
-static void
-cleanup_attendees (GPtrArray *attendees)
-{
-	int i;
+	if (priv->comp != NULL) {
+		g_object_unref (priv->comp);
+		priv->comp = NULL;
+	}
 
-	for (i = 0; i < attendees->len; i++)
-		g_object_unref (g_ptr_array_index (attendees, i));
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (task_page_parent_class)->dispose (object);
 }
 
-/* Destroy handler for the task page */
 static void
 task_page_finalize (GObject *object)
 {
-	TaskPage *tpage;
 	TaskPagePrivate *priv;
-	GList *l;
 
-	g_return_if_fail (object != NULL);
-	g_return_if_fail (IS_TASK_PAGE (object));
-
-	tpage = TASK_PAGE (object);
-	priv = tpage->priv;
+	priv = TASK_PAGE_GET_PRIVATE (object);
 
-	for (l = priv->address_strings; l != NULL; l = l->next)
-		g_free (l->data);
+	g_list_foreach (priv->address_strings, (GFunc) g_free, NULL);
 	g_list_free (priv->address_strings);
 
-	if (priv->main)
-		g_object_unref (priv->main);
-
-	if (priv->xml) {
-		g_object_unref (priv->xml);
-		priv->xml = NULL;
-	}
+	g_ptr_array_foreach (
+		priv->deleted_attendees, (GFunc) g_object_unref, NULL);
+	g_ptr_array_free (priv->deleted_attendees, TRUE);
 
-	if (priv->sod) {
-		g_object_unref (priv->sod);
-		priv->sod = NULL;
-	}
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (task_page_parent_class)->finalize (object);
+}
 
-	if (priv->comp != NULL)
-		g_object_unref (priv->comp);
+static void
+task_page_class_init (TaskPageClass *class)
+{
+	GObjectClass *object_class;
+	CompEditorPageClass *editor_page_class;
 
-	cleanup_attendees (priv->deleted_attendees);
-	g_ptr_array_free (priv->deleted_attendees, TRUE);
+	g_type_class_add_private (class, sizeof (TaskPagePrivate));
 
-	g_free (priv);
-	tpage->priv = NULL;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->dispose = task_page_dispose;
+	object_class->finalize = task_page_finalize;
 
-	if (G_OBJECT_CLASS (task_page_parent_class)->finalize)
-		(* G_OBJECT_CLASS (task_page_parent_class)->finalize) (object);
+	editor_page_class = COMP_EDITOR_PAGE_CLASS (class);
+	editor_page_class->get_widget = task_page_get_widget;
+	editor_page_class->focus_main_widget = task_page_focus_main_widget;
+	editor_page_class->fill_widgets = task_page_fill_widgets;
+	editor_page_class->fill_component = task_page_fill_component;
+	editor_page_class->fill_timezones = task_page_fill_timezones;
 }
 
 static void
-set_classification_menu (TaskPage *page, gint class)
-{
-	bonobo_ui_component_freeze (page->priv->uic, NULL);
-	switch (class) {
-		case E_CAL_COMPONENT_CLASS_PUBLIC:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassPublic",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassConfidential",
-				"state", "1", NULL);
-			break;
-		case E_CAL_COMPONENT_CLASS_PRIVATE:
-			bonobo_ui_component_set_prop (
-				page->priv->uic, "/commands/ActionClassPrivate",
-				"state", "1", NULL);
-			break;
-	}
-	bonobo_ui_component_thaw (page->priv->uic, NULL);
+task_page_init (TaskPage *tpage)
+{
+	tpage->priv = TASK_PAGE_GET_PRIVATE (tpage);
+	tpage->priv->deleted_attendees = g_ptr_array_new ();
 }
 
-
-
 /* get_widget handler for the task page */
 static GtkWidget *
 task_page_get_widget (CompEditorPage *page)
@@ -324,9 +249,10 @@
 static void
 clear_widgets (TaskPage *tpage)
 {
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = tpage->priv;
+	CompEditor *editor;
 
-	priv = tpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
 
 	/* Summary, description */
 	e_dialog_editable_set (priv->summary, NULL);
@@ -337,8 +263,7 @@
 	e_date_edit_set_time (E_DATE_EDIT (priv->due_date), 0);
 
 	/* Classification */
-	priv->classification = E_CAL_COMPONENT_CLASS_PUBLIC;
-	set_classification_menu (tpage, priv->classification);
+	comp_editor_set_classification (editor, E_CAL_COMPONENT_CLASS_PUBLIC);
 
 	/* Categories */
 	e_dialog_editable_set (priv->categories, NULL);
@@ -376,25 +301,26 @@
 	e_meeting_list_view_column_set_visible (priv->list_view, E_MEETING_STORE_RSVP_COL, state);
 }
 
-void
-task_page_set_classification (TaskPage *page, ECalComponentClassification class)
-{
-	page->priv->classification = class;
-}
-
 static void
 sensitize_widgets (TaskPage *tpage)
 {
+	TaskPagePrivate *priv = tpage->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
+	GtkActionGroup *action_group;
+	GtkAction *action;
 	gboolean read_only, sens = TRUE, sensitize;
-	TaskPagePrivate *priv;
 
-	priv = tpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
 
-	if (!e_cal_is_read_only (COMP_EDITOR_PAGE (tpage)->client, &read_only, NULL))
+	if (!e_cal_is_read_only (client, &read_only, NULL))
 		read_only = TRUE;
 
-	if (COMP_EDITOR_PAGE (tpage)->flags & COMP_EDITOR_IS_ASSIGNED)
-	 	sens = COMP_EDITOR_PAGE (tpage)->flags & COMP_EDITOR_PAGE_USER_ORG;
+	if (flags & COMP_EDITOR_IS_ASSIGNED)
+	 	sens = flags & COMP_EDITOR_USER_ORG;
 
 	sensitize = (!read_only && sens);
 
@@ -419,23 +345,11 @@
 	gtk_widget_set_sensitive (priv->invite, (!read_only &&  sens));
 	gtk_widget_set_sensitive (GTK_WIDGET (priv->list_view), !read_only);
 
-	bonobo_ui_component_set_prop (priv->uic, "/commands/InsertAttachments", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ViewTimeZone", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPublic", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassPrivate", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ActionClassConfidential", "sensitive",
-		       	sensitize ? "1" : "0", NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/ViewCategories", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/InsertSendOptions", "sensitive", sensitize ? "1" : "0"
-			, NULL);
-	bonobo_ui_component_set_prop (priv->uic, "/commands/OptionStatus", "sensitive", sensitize ? "1" : "0"
-			, NULL);
+	action_group = comp_editor_get_action_group (editor, "individual");
+	gtk_action_group_set_sensitive (action_group, sensitize);
 
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_sensitive (action, sensitize);
 
 	if (!priv->is_assignment) {
 		gtk_widget_hide (priv->calendar_label);
@@ -458,20 +372,27 @@
 void
 task_page_hide_options (TaskPage *page)
 {
-	g_return_if_fail (IS_TASK_PAGE (page));
-
+	CompEditor *editor;
+	GtkAction *action;
 
-	bonobo_ui_component_set_prop (page->priv->uic, "/commands/InsertSendOptions", "hidden", "1", NULL);
-	page->priv->sendoptions_shown = FALSE;
+	g_return_if_fail (IS_TASK_PAGE (page));
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_visible (action, FALSE);
 }
+
 void
 task_page_show_options (TaskPage *page)
 {
+	CompEditor *editor;
+	GtkAction *action;
+
 	g_return_if_fail (IS_TASK_PAGE (page));
 
-	bonobo_ui_component_set_prop (page->priv->uic, "/commands/InsertSendOptions", "hidden", "0", NULL);
-	page->priv->sendoptions_shown = TRUE;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	action = comp_editor_get_action (editor, "send-options");
+	gtk_action_set_visible (action, TRUE);
 }
 
 void
@@ -523,6 +444,9 @@
 	ECalComponentText text;
 	ECalComponentDateTime d;
 	ECalComponentClassification cl;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
 	GSList *l;
 	icalcomponent *icalcomp;
 	const char *categories, *uid;
@@ -532,14 +456,17 @@
 	tpage = TASK_PAGE (page);
 	priv = tpage->priv;
 
-	priv->updating = TRUE;
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
 
 	/* Clean out old data */
 	if (priv->comp != NULL)
 		g_object_unref (priv->comp);
 	priv->comp = NULL;
 
-	cleanup_attendees (priv->deleted_attendees);
+	g_ptr_array_foreach (
+		priv->deleted_attendees, (GFunc) g_object_unref, NULL);
 	g_ptr_array_set_size (priv->deleted_attendees, 0);
 
 	/* Component for cancellation */
@@ -548,7 +475,7 @@
 	/* Clean the screen */
 	clear_widgets (tpage);
 
-	priv->user_add = itip_get_comp_attendee (comp, page->client);
+	priv->user_add = itip_get_comp_attendee (comp, client);
 
         /* Summary, description(s) */
 	e_cal_component_get_summary (comp, &text);
@@ -598,7 +525,7 @@
 	   on the server, so we try to get the builtin timezone with the TZID
 	   first. */
 	if (!zone && d.tzid) {
-		if (!e_cal_get_timezone (page->client, d.tzid, &zone, NULL))
+		if (!e_cal_get_timezone (client, d.tzid, &zone, NULL))
 			/* FIXME: Handle error better. */
 			g_warning ("Couldn't get timezone from server: %s",
 				   d.tzid ? d.tzid : "");
@@ -608,10 +535,12 @@
 				       zone ? zone : default_zone);
 	task_page_set_show_timezone (tpage, calendar_config_get_show_timezone());
 
-	if (!(COMP_EDITOR_PAGE (tpage)->flags & COMP_EDITOR_PAGE_NEW_ITEM) && !zone) {
-			task_page_set_show_timezone (tpage, FALSE);
-			bonobo_ui_component_set_prop (priv->uic, "/commands/ViewTimeZone",
-					"state", "0", NULL);
+	if (!(flags & COMP_EDITOR_NEW_ITEM) && !zone) {
+		GtkAction *action;
+
+		task_page_set_show_timezone (tpage, FALSE);
+		action = comp_editor_get_action (editor, "view-time-zone");
+		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
 	}
 
 	e_cal_component_free_datetime (&d);
@@ -646,22 +575,10 @@
 
 	/* Classification. */
 	e_cal_component_get_classification (comp, &cl);
-
-	switch (cl) {
-	case E_CAL_COMPONENT_CLASS_PUBLIC:
-	case E_CAL_COMPONENT_CLASS_PRIVATE:
-	case E_CAL_COMPONENT_CLASS_CONFIDENTIAL:
-		break;
-	default:
-		/* default to PUBLIC */
-		cl = E_CAL_COMPONENT_CLASS_PUBLIC;
-                break;
-	}
-	set_classification_menu (tpage, cl);
-	priv->classification = cl;
+	comp_editor_set_classification (editor, cl);
 
 	e_cal_component_get_uid (comp, &uid);
-	if (e_cal_get_object (COMP_EDITOR_PAGE (tpage)->client, uid, NULL, &icalcomp, NULL)) {
+	if (e_cal_get_object (client, uid, NULL, &icalcomp, NULL)) {
 		icalcomponent_free (icalcomp);
 		task_page_hide_options (tpage);
 	}
@@ -673,15 +590,15 @@
 	/* Source */
 	e_source_combo_box_set_active (
 		E_SOURCE_COMBO_BOX (priv->source_selector),
-		e_cal_get_source (page->client));
+		e_cal_get_source (client));
 
-	e_cal_get_cal_address (COMP_EDITOR_PAGE (tpage)->client, &backend_addr, NULL);
+	e_cal_get_cal_address (client, &backend_addr, NULL);
 	set_subscriber_info_string (tpage, backend_addr);
 
 	if (priv->is_assignment) {
 		ECalComponentOrganizer organizer;
 
-		priv->user_add = itip_get_comp_attendee (comp, COMP_EDITOR_PAGE (tpage)->client);
+		priv->user_add = itip_get_comp_attendee (comp, client);
 
 		/* Organizer strings */
 		task_page_select_organizer (tpage, backend_addr);
@@ -694,14 +611,14 @@
 				gchar *string;
 				GList *list = NULL;
 
-				if (itip_organizer_is_user (comp, page->client) || itip_sentby_is_user (comp)) {
+				if (itip_organizer_is_user (comp, client) || itip_sentby_is_user (comp)) {
 					if (e_cal_get_static_capability (
-								page->client,
+								client,
 								CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
 						priv->user_org = TRUE;
 				} else {
 					if (e_cal_get_static_capability (
-								page->client,
+								client,
 								CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
 						gtk_widget_set_sensitive (priv->invite, FALSE);
 					gtk_widget_set_sensitive (priv->add, FALSE);
@@ -710,7 +627,7 @@
 					priv->user_org = FALSE;
 				}
 
-				if (e_cal_get_static_capability (COMP_EDITOR_PAGE (tpage)->client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (COMP_EDITOR_PAGE (tpage)->flags & COMP_EDITOR_PAGE_DELEGATE))
+				if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER) && (flags & COMP_EDITOR_DELEGATE))
 					string = g_strdup (priv->user_add);
 				else if ( organizer.cn != NULL)
 					string = g_strdup_printf ("%s <%s>", organizer.cn, strip);
@@ -732,9 +649,6 @@
 
 			a = get_current_account (tpage);
 			if (a != NULL) {
-				/* Reuse *page declared further up? */
-				CompEditorPage *page = (CompEditorPage *) tpage;
-
 				priv->ia = e_meeting_store_add_attendee_with_defaults (priv->model);
 				g_object_ref (priv->ia);
 
@@ -746,7 +660,7 @@
 					e_meeting_attendee_set_sentby (priv->ia, g_strdup_printf ("MAILTO:%s", a->id->address));
 				}
 
-				if (page->client && e_cal_get_organizer_must_accept (page->client))
+				if (client && e_cal_get_organizer_must_accept (client))
 					e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_NEEDSACTION);
 				else
 					e_meeting_attendee_set_status (priv->ia, ICAL_PARTSTAT_ACCEPTED);
@@ -758,8 +672,6 @@
 	if (backend_addr)
 		g_free (backend_addr);
 
-	priv->updating = FALSE;
-
 	sensitize_widgets (tpage);
 
 	return TRUE;
@@ -795,7 +707,11 @@
 {
 	TaskPage *tpage;
 	TaskPagePrivate *priv;
+	ECalComponentClassification classification;
 	ECalComponentDateTime date;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
 	struct icaltimetype start_tt, due_tt;
 	char *cat, *str;
 	gboolean start_date_set, due_date_set, time_set;
@@ -808,6 +724,10 @@
 	priv = tpage->priv;
 	text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->description));
 
+	editor = comp_editor_page_get_editor (page);
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
+
 	/* Summary. */
 
 	str = e_dialog_editable_get (priv->summary);
@@ -912,7 +832,8 @@
 	}
 
 	/* Classification. */
-	e_cal_component_set_classification (comp, priv->classification);
+	classification = comp_editor_get_classification (editor);
+	e_cal_component_set_classification (comp, classification);
 
 	/* send options */
 	if (priv->sendoptions_shown && priv->sod)
@@ -936,7 +857,7 @@
 			EAccount *a;
 			gchar *backend_addr = NULL, *org_addr = NULL, *sentby = NULL;
 
-			e_cal_get_cal_address (page->client, &backend_addr, NULL);
+			e_cal_get_cal_address (client, &backend_addr, NULL);
 
 			/* Find the identity for the organizer or sentby field */
 			a = get_current_account (tpage);
@@ -979,7 +900,7 @@
 		}
 
 
-		if (COMP_EDITOR_PAGE (tpage)->flags & COMP_EDITOR_PAGE_DELEGATE ) {
+		if (flags & COMP_EDITOR_DELEGATE ) {
 			GSList *attendee_list, *l;
 			int i;
 			const GPtrArray *attendees = e_meeting_store_get_attendees (priv->model);
@@ -1019,10 +940,15 @@
 add_clicked_cb (GtkButton *btn, TaskPage *page)
 {
 	EMeetingAttendee *attendee;
+	CompEditor *editor;
+	CompEditorFlags flags;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	flags = comp_editor_get_flags (editor);
 
 	attendee = e_meeting_store_add_attendee_with_defaults (page->priv->model);
 
-	if (COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_DELEGATE) {
+	if (flags & COMP_EDITOR_DELEGATE) {
 		e_meeting_attendee_set_delfrom (attendee, g_strdup_printf ("MAILTO:%s", page->priv->user_add));
 	}
 
@@ -1085,11 +1011,13 @@
 static void
 remove_attendee (TaskPage *page, EMeetingAttendee *ia)
 {
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = page->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	int pos = 0;
-	gboolean delegate = (COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_DELEGATE);
 
-	priv = page->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	flags = comp_editor_get_flags (editor);
 
 	/* If the user deletes the organizer attendee explicitly,
 	   assume they no longer want the organizer showing up */
@@ -1106,7 +1034,7 @@
 		if (ib != NULL) {
 			e_meeting_attendee_set_delto (ib, NULL);
 
-			if (!delegate)
+			if (!(flags & COMP_EDITOR_DELEGATE))
 				e_meeting_attendee_set_edit_level (ib,  E_MEETING_ATTENDEE_EDIT_FULL);
 		}
 	}
@@ -1191,46 +1119,45 @@
 }
 
 static void
-invite_cb (GtkWidget *widget, gpointer data)
+invite_cb (GtkWidget *widget,
+           TaskPage *page)
 {
-	TaskPage *page;
-	TaskPagePrivate *priv;
-
-	page = TASK_PAGE (data);
-	priv = page->priv;
-
-	e_meeting_list_view_invite_others_dialog (priv->list_view);
+	e_meeting_list_view_invite_others_dialog (page->priv->list_view);
 }
 
 static void
-attendee_added_cb (EMeetingListView *emlv, EMeetingAttendee *ia, gpointer user_data)
+attendee_added_cb (EMeetingListView *emlv,
+                   EMeetingAttendee *ia,
+                   TaskPage *page)
 {
-   TaskPage *page = TASK_PAGE (user_data);
-   TaskPagePrivate *priv;
-   gboolean delegate = (COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_DELEGATE);
-
-   priv = page->priv;
-
-   if (delegate) {
-	   if (existing_attendee (ia, priv->comp))
-		   e_meeting_store_remove_attendee (priv->model, ia);
-	   else {
-		   if (!e_cal_get_static_capability (COMP_EDITOR_PAGE(page)->client,
-					   CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) {
-			   const char *delegator_id = e_meeting_attendee_get_delfrom (ia);
-			   EMeetingAttendee *delegator;
-
-			   delegator = e_meeting_store_find_attendee (priv->model, delegator_id, NULL);
-			   e_meeting_attendee_set_delto (delegator,
-					   g_strdup (e_meeting_attendee_get_address (ia)));
+	TaskPagePrivate *priv = page->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+	ECal *client;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	client = comp_editor_get_client (editor);
+	flags = comp_editor_get_flags (editor);
 
-			   gtk_widget_set_sensitive (priv->invite, FALSE);
-			   gtk_widget_set_sensitive (priv->add, FALSE);
-			   gtk_widget_set_sensitive (priv->edit, FALSE);
-		   }
-	   }
-   }
+	if (!(flags & COMP_EDITOR_DELEGATE))
+		return;
 
+	if (existing_attendee (ia, priv->comp))
+		e_meeting_store_remove_attendee (priv->model, ia);
+	else {
+		if (!e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY)) {
+			const char *delegator_id = e_meeting_attendee_get_delfrom (ia);
+			EMeetingAttendee *delegator;
+
+			delegator = e_meeting_store_find_attendee (priv->model, delegator_id, NULL);
+			e_meeting_attendee_set_delto (delegator,
+				   g_strdup (e_meeting_attendee_get_address (ia)));
+
+			gtk_widget_set_sensitive (priv->invite, FALSE);
+			gtk_widget_set_sensitive (priv->add, FALSE);
+			gtk_widget_set_sensitive (priv->edit, FALSE);
+		}
+	}
 }
 
 /* Callbacks for list view*/
@@ -1271,7 +1198,9 @@
 static gint
 button_press_event (GtkWidget *widget, GdkEventButton *event, TaskPage *page)
 {
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = page->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
 	GtkMenu *menu;
 	EMeetingAttendee *ia;
 	GtkTreePath *path;
@@ -1282,12 +1211,13 @@
 	ECalPopup *ep;
 	int i;
 
-	priv = page->priv;
-
 	/* only process right-clicks */
 	if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
 		return FALSE;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	flags = comp_editor_get_flags (editor);
+
 	/* only if we right-click on an attendee */
 	if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->list_view), event->x, event->y, &path, NULL, NULL, NULL)) {
 		GtkTreeSelection *selection;
@@ -1311,7 +1241,7 @@
 
 	if (GTK_WIDGET_IS_SENSITIVE(priv->add))
 		disable_mask &= ~ATTENDEE_CAN_ADD;
-	else if (COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_USER_ORG)
+	else if (flags & COMP_EDITOR_USER_ORG)
 		disable_mask &= ~ATTENDEE_CAN_ADD;
 
 	ep = e_cal_popup_new("org.gnome.evolution.calendar.task.popup");
@@ -1330,13 +1260,18 @@
 list_view_event (EMeetingListView *list_view, GdkEvent *event, TaskPage *page) {
 
 	TaskPagePrivate *priv= page->priv;
+	CompEditor *editor;
+	CompEditorFlags flags;
+
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (page));
+	flags = comp_editor_get_flags (editor);
 
-	if (event->type == GDK_2BUTTON_PRESS && COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_USER_ORG) {
+	if (event->type == GDK_2BUTTON_PRESS && flags & COMP_EDITOR_USER_ORG) {
 		EMeetingAttendee *attendee;
 
 		attendee = e_meeting_store_add_attendee_with_defaults (priv->model);
 
-		if (COMP_EDITOR_PAGE (page)->flags & COMP_EDITOR_PAGE_DELEGATE) {
+		if (flags & COMP_EDITOR_DELEGATE) {
 			e_meeting_attendee_set_delfrom (attendee, g_strdup_printf ("MAILTO:%s", page->priv->user_add));
 		}
 
@@ -1428,28 +1363,6 @@
 		gtk_widget_hide (priv->info_hbox);
 }
 
-/* set_summary handler for the task page */
-static void
-task_page_set_summary (CompEditorPage *page, const char *summary)
-{
-	/* nothing */
-}
-
-static void
-task_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates)
-{
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
-
-	tpage = TASK_PAGE (page);
-	priv = tpage->priv;
-
-	if (priv->updating)
-	        return;
-}
-
-
-
 /* Gets the widgets from the XML file and returns if they are all available. */
 static gboolean
 get_widgets (TaskPage *tpage)
@@ -1539,23 +1452,19 @@
 		);
 }
 
-/* Callback used when the summary changes; we emit the notification signal. */
 static void
-summary_changed_cb (GtkEditable *editable, gpointer data)
+summary_changed_cb (GtkEditable *editable,
+                    CompEditorPage *page)
 {
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
+	CompEditor *editor;
 	gchar *summary;
 
-	tpage = TASK_PAGE (data);
-	priv = tpage->priv;
-
-	if (priv->updating)
+	if (comp_editor_page_get_updating (page))
 		return;
 
+	editor = comp_editor_page_get_editor (page);
 	summary = e_dialog_editable_get (GTK_WIDGET (editable));
-	comp_editor_page_notify_summary_changed (COMP_EDITOR_PAGE (tpage),
-						 summary);
+	comp_editor_set_summary (editor, summary);
 	g_free (summary);
 }
 
@@ -1563,20 +1472,17 @@
  * other pages in the task editor, so they can update any labels.
  */
 static void
-date_changed_cb (EDateEdit *dedit, gpointer data)
+date_changed_cb (EDateEdit *dedit,
+                 TaskPage *tpage)
 {
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = tpage->priv;
 	CompEditorPageDates dates;
 	gboolean date_set, time_set;
 	ECalComponentDateTime start_dt, due_dt;
 	struct icaltimetype start_tt = icaltime_null_time();
 	struct icaltimetype due_tt = icaltime_null_time();
 
-	tpage = TASK_PAGE (data);
-	priv = tpage->priv;
-
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
 		return;
 
 	date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_date),
@@ -1632,68 +1538,24 @@
 }
 
 static void
-timezone_changed_cb (EDateEdit *dedit, gpointer data)
+timezone_changed_cb (EDateEdit *dedit,
+                     TaskPage *tpage)
 {
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
-
-	tpage = TASK_PAGE (data);
-	priv = tpage->priv;
-
-	date_changed_cb ((EDateEdit *) priv->start_date, tpage);
-	date_changed_cb ((EDateEdit *) priv->due_date, tpage);
+	date_changed_cb ((EDateEdit *) tpage->priv->start_date, tpage);
+	date_changed_cb ((EDateEdit *) tpage->priv->due_date, tpage);
 }
 
 /* Callback used when the categories button is clicked; we must bring up the
  * category list dialog.
  */
 static void
-categories_clicked_cb (GtkWidget *button, gpointer data)
+categories_clicked_cb (GtkWidget *button,
+                       TaskPage *tpage)
 {
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
-	GtkWidget *entry;
+	GtkEntry *entry;
 
-	tpage = TASK_PAGE (data);
-	priv = tpage->priv;
-
-	entry = priv->categories;
-	e_categories_config_open_dialog_for_entry (GTK_ENTRY (entry));
-}
-/* sets the current focused widget */
-static gboolean
-widget_focus_in_cb (GtkWidget *widget,  GdkEventFocus *event, gpointer data)
-{
-	TaskPage *tpage;
-	tpage = TASK_PAGE  (data);
-
-	comp_editor_page_set_focused_widget (COMP_EDITOR_PAGE(tpage), widget);
-
-	return FALSE;
-}
-/* unsets the current focused widget */
-static gboolean
-widget_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	TaskPage *tpage;
-	tpage = TASK_PAGE (data);
-
-	comp_editor_page_unset_focused_widget (COMP_EDITOR_PAGE(tpage), widget);
-
-	return FALSE;
-}
-/* This is called when any field is changed; it notifies upstream. */
-static void
-field_changed_cb (GtkWidget *widget, gpointer data)
-{
-	TaskPage *tpage;
-	TaskPagePrivate *priv;
-
-	tpage = TASK_PAGE (data);
-	priv = tpage->priv;
-
-	if (!priv->updating)
-		comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tpage));
+	entry = GTK_ENTRY (tpage->priv->categories);
+	e_categories_config_open_dialog_for_entry (entry);
 }
 
 static gboolean
@@ -1758,7 +1620,7 @@
 
 	priv = tpage->priv;
 
-	if (priv->updating)
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
 		return;
 
 	date_set = e_date_edit_get_date (E_DATE_EDIT (priv->start_date),
@@ -1821,99 +1683,90 @@
 }
 
 static void
-start_date_changed_cb (GtkWidget *widget, gpointer data)
+start_date_changed_cb (TaskPage *tpage)
 {
-	TaskPage *tpage;
-
-	tpage = TASK_PAGE (data);
-
-	if (!tpage->priv->updating) {
-		field_changed_cb (widget, data);
-		times_updated (tpage, TRUE);
-	}
+	times_updated (tpage, TRUE);
 }
 
 static void
-due_date_changed_cb (GtkWidget *widget, gpointer data)
+due_date_changed_cb (TaskPage *tpage)
 {
-	TaskPage *tpage;
-
-	tpage = TASK_PAGE (data);
-
-	if (!tpage->priv->updating) {
-		field_changed_cb (widget, data);
-		times_updated (tpage, FALSE);
-	}
+	times_updated (tpage, FALSE);
 }
 
 static void
 source_changed_cb (ESourceComboBox *source_combo_box, TaskPage *tpage)
 {
 	TaskPagePrivate *priv = tpage->priv;
+	CompEditor *editor;
 	ESource *source;
+	ECal *client;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
 	source = e_source_combo_box_get_active (source_combo_box);
 
-	if (!priv->updating) {
-		ECal *client;
+	if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
+		return;
 
-		client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
-		if (client) {
-			icaltimezone *zone;
+	client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_TODO);
+	if (client) {
+		icaltimezone *zone;
 
-			zone = calendar_config_get_icaltimezone ();
-			e_cal_set_default_timezone (client, zone, NULL);
-		}
+		zone = calendar_config_get_icaltimezone ();
+		e_cal_set_default_timezone (client, zone, NULL);
+	}
 
-		if (!client || !e_cal_open (client, FALSE, NULL)) {
-			GtkWidget *dialog;
+	if (!client || !e_cal_open (client, FALSE, NULL)) {
+		GtkWidget *dialog;
 
-			if (client)
-				g_object_unref (client);
+		if (client)
+			g_object_unref (client);
 
-			e_source_combo_box_set_active (
-				E_SOURCE_COMBO_BOX (priv->source_selector),
-				e_cal_get_source (COMP_EDITOR_PAGE (tpage)->client));
-
-			dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
-							 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
-							 _("Unable to open tasks in '%s'."),
-							 e_source_peek_name (source));
-			gtk_dialog_run (GTK_DIALOG (dialog));
-			gtk_widget_destroy (dialog);
-		} else {
-			comp_editor_notify_client_changed (
-				COMP_EDITOR (gtk_widget_get_toplevel (priv->main)),
-				client);
-			field_changed_cb (GTK_WIDGET (source_combo_box), tpage);
-			if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_assignment)
-				task_page_show_options (tpage);
-			else
-				task_page_hide_options (tpage);
-
-			if (client) {
-				gchar *backend_addr = NULL;
+		client = comp_editor_get_client (editor);
 
-				e_cal_get_cal_address(client, &backend_addr, NULL);
+		e_source_combo_box_set_active (
+			E_SOURCE_COMBO_BOX (priv->source_selector),
+			e_cal_get_source (client));
 
-				if (priv->is_assignment)
-					task_page_select_organizer (tpage, backend_addr);
+		dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+						 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+						 _("Unable to open tasks in '%s'."),
+						 e_source_peek_name (source));
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+	} else {
+		comp_editor_set_client (editor, client);
+		comp_editor_page_changed (COMP_EDITOR_PAGE (tpage));
+		if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_REQ_SEND_OPTIONS) && priv->is_assignment)
+			task_page_show_options (tpage);
+		else
+			task_page_hide_options (tpage);
 
-				set_subscriber_info_string (tpage, backend_addr);
-				g_free (backend_addr);
-			}
+		if (client) {
+			gchar *backend_addr = NULL;
+
+			e_cal_get_cal_address(client, &backend_addr, NULL);
 
-			sensitize_widgets (tpage);
+			if (priv->is_assignment)
+				task_page_select_organizer (tpage, backend_addr);
+
+			set_subscriber_info_string (tpage, backend_addr);
+			g_free (backend_addr);
 		}
+
+		sensitize_widgets (tpage);
 	}
 }
 
 static void
 set_subscriber_info_string (TaskPage *tpage, const char *backend_address)
 {
-	ECal *client = COMP_EDITOR_PAGE (tpage)->client;
+	CompEditor *editor;
+	ECal *client;
 	ESource *source;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+	client = comp_editor_get_client (editor);
 	source = e_cal_get_source (client);
 
 	if (e_source_get_property (source, "subscriber"))
@@ -1928,11 +1781,14 @@
 void
 task_page_sendoptions_clicked_cb (TaskPage *tpage)
 {
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = tpage->priv;
+	CompEditor *editor;
 	GtkWidget *toplevel;
 	ESource *source;
+	ECal *client;
 
-	priv = tpage->priv;
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+	client = comp_editor_get_client (editor);
 
 	if (!priv->sod) {
 		priv->sod = e_sendoptions_dialog_new ();
@@ -1942,8 +1798,7 @@
 		e_sendoptions_utils_set_default_data (priv->sod, source, "task");
 	}
 
-	if (e_cal_get_static_capability (COMP_EDITOR_PAGE (tpage)->client,
-					 CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) {
+	if (e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_NO_GEN_OPTIONS)) {
 		e_sendoptions_set_need_general_options (priv->sod, FALSE);
 	}
 
@@ -2001,35 +1856,41 @@
 	/* Connect the default signal handler to use to make sure the "changed"
 	   field gets set whenever a field is changed. */
 
-	/* Set the current focus entry */
-	g_signal_connect (priv->summary, "focus-in-event",
-			  G_CALLBACK (widget_focus_in_cb), tpage);
-	g_signal_connect (priv->summary, "focus-out-event",
-			  G_CALLBACK (widget_focus_out_cb), tpage);
-
-	g_signal_connect (priv->description, "focus-in-event",
-			  G_CALLBACK (widget_focus_in_cb), tpage);
-	g_signal_connect (priv->description, "focus-out-event",
-			  G_CALLBACK (widget_focus_out_cb), tpage);
-
-
 	/* Belongs to priv->description */
-	g_signal_connect ((text_buffer), "changed",
-			  G_CALLBACK (field_changed_cb), tpage);
-
-	g_signal_connect((priv->summary), "changed",
-			    G_CALLBACK (field_changed_cb), tpage);
-	g_signal_connect (priv->start_date, "changed",
-			  G_CALLBACK (start_date_changed_cb), tpage);
-	g_signal_connect (priv->due_date, "changed",
-			  G_CALLBACK (due_date_changed_cb), tpage);
-	g_signal_connect((priv->timezone), "changed",
-			    G_CALLBACK (field_changed_cb), tpage);
-	g_signal_connect((priv->categories), "changed",
-			    G_CALLBACK (field_changed_cb), tpage);
-	g_signal_connect (G_OBJECT (priv->list_view), "button_press_event", G_CALLBACK (button_press_event), tpage);
-	g_signal_connect (G_OBJECT (priv->list_view), "event", G_CALLBACK (list_view_event), tpage);
-	g_signal_connect (priv->list_view, "key_press_event", G_CALLBACK (list_key_press), tpage);
+	g_signal_connect_swapped (
+		text_buffer, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+	g_signal_connect_swapped (
+		priv->summary, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+	g_signal_connect_swapped (
+		priv->start_date, "changed",
+		G_CALLBACK (start_date_changed_cb), tpage);
+	g_signal_connect_swapped (
+		priv->start_date, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+	g_signal_connect_swapped (
+		priv->due_date, "changed",
+		G_CALLBACK (due_date_changed_cb), tpage);
+	g_signal_connect_swapped (
+		priv->due_date, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+	g_signal_connect_swapped (
+		priv->timezone, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+	g_signal_connect_swapped (
+		priv->categories, "changed",
+		G_CALLBACK (comp_editor_page_changed), tpage);
+
+	g_signal_connect (
+		priv->list_view, "button_press_event",
+		G_CALLBACK (button_press_event), tpage);
+	g_signal_connect (
+		priv->list_view, "event",
+		G_CALLBACK (list_view_event), tpage);
+	g_signal_connect (
+		priv->list_view, "key_press_event",
+		G_CALLBACK (list_key_press), tpage);
 
 	/* Add attendee button */
 	g_signal_connect (priv->add, "clicked", G_CALLBACK (add_clicked_cb), tpage);
@@ -2068,22 +1929,26 @@
 static void
 task_page_select_organizer (TaskPage *tpage, const char *backend_address)
 {
-	TaskPagePrivate *priv;
+	TaskPagePrivate *priv = tpage->priv;
+	CompEditor *editor;
 	GList *l;
 	EAccount *def_account;
 	gchar *def_address = NULL;
 	const char *default_address;
 	gboolean subscribed_cal = FALSE;
 	ESource *source = NULL;
+	ECal *client;
 	const char *user_addr = NULL;
 
+	editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+	client = comp_editor_get_client (editor);
+
 	def_account = itip_addresses_get_default();
 	if (def_account && def_account->enabled)
 		def_address = g_strdup_printf("%s <%s>", def_account->id->name, def_account->id->address);
 
-	priv = tpage->priv;
-	if (COMP_EDITOR_PAGE (tpage)->client)
-		source = e_cal_get_source (COMP_EDITOR_PAGE (tpage)->client);
+	if (client)
+		source = e_cal_get_source (client);
 	if (source)
 		user_addr = e_source_get_property (source, "subscriber");
 
@@ -2197,18 +2062,18 @@
  * not be created.
  **/
 TaskPage *
-task_page_new (EMeetingStore *model, ECal *client, BonoboUIComponent *uic)
+task_page_new (EMeetingStore *model, CompEditor *editor)
 {
 	TaskPage *tpage;
+	ECal *client;
 
-	tpage = g_object_new (TYPE_TASK_PAGE, NULL);
+	tpage = g_object_new (TYPE_TASK_PAGE, "editor", editor, NULL);
+	client = comp_editor_get_client (editor);
 	if (!task_page_construct (tpage, model, client)) {
 		g_object_unref (tpage);
-		return NULL;
+		g_return_val_if_reached (NULL);
 	}
 
-	tpage->priv->uic = uic;
-
 	return tpage;
 }
 

Modified: branches/kill-bonobo/calendar/gui/dialogs/task-page.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/dialogs/task-page.h	(original)
+++ branches/kill-bonobo/calendar/gui/dialogs/task-page.h	Tue Jul 15 18:34:59 2008
@@ -24,55 +24,75 @@
 #ifndef TASK_PAGE_H
 #define TASK_PAGE_H
 
-#include <bonobo/bonobo-window.h>
-#include <bonobo/bonobo-ui-util.h>
-#include <bonobo/bonobo-widget.h>
- #include "comp-editor-page.h"
+#include "comp-editor.h"
+#include "comp-editor-page.h"
 #include "../e-meeting-attendee.h"
 #include "../e-meeting-store.h"
 #include "../e-meeting-list-view.h"
 
-G_BEGIN_DECLS
-
-
+/* Standard GObject macros */
+#define TYPE_TASK_PAGE \
+	(task_page_get_type ())
+#define TASK_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), TYPE_TASK_PAGE, TaskPage))
+#define TASK_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), TYPE_TASK_PAGE, TaskPageClass))
+#define IS_TASK_PAGE(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), TYPE_TASK_PAGE))
+#define IS_TASK_PAGE_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((obj), TYPE_TASK_PAGE))
+#define TASK_PAGE_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), TYPE_TASK_PAGE, TaskPageClass))
 
-#define TYPE_TASK_PAGE            (task_page_get_type ())
-#define TASK_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TASK_PAGE, TaskPage))
-#define TASK_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TASK_PAGE, TaskPageClass))
-#define IS_TASK_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TASK_PAGE))
-#define IS_TASK_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), TYPE_TASK_PAGE))
+G_BEGIN_DECLS
 
+typedef struct _TaskPage TaskPage;
+typedef struct _TaskPageClass TaskPageClass;
 typedef struct _TaskPagePrivate TaskPagePrivate;
 
-typedef struct {
+struct _TaskPage {
 	CompEditorPage page;
-
-	/* Private data */
 	TaskPagePrivate *priv;
-} TaskPage;
+};
 
-typedef struct {
+struct _TaskPageClass {
 	CompEditorPageClass parent_class;
-} TaskPageClass;
+};
 
-GType     task_page_get_type  (void);
-TaskPage *task_page_construct (TaskPage *epage, EMeetingStore *model, ECal *client);
-TaskPage *task_page_new       (EMeetingStore *model, ECal *client, BonoboUIComponent *uic);
-ECalComponent * task_page_get_cancel_comp (TaskPage *page);
-void task_page_show_options (TaskPage *page);
-void task_page_hide_options (TaskPage *page);
-void task_page_set_assignment (TaskPage *page, gboolean set);
-void task_page_sendoptions_clicked_cb (TaskPage *tpage);
-void task_page_set_view_role (TaskPage *page, gboolean state);
-void task_page_set_view_status (TaskPage *page, gboolean state);
-void task_page_set_view_type (TaskPage *page, gboolean state);
-void task_page_set_view_rsvp (TaskPage *page, gboolean state);
-void task_page_set_classification (TaskPage *page, ECalComponentClassification class);
-void task_page_set_show_timezone (TaskPage *page, gboolean state);
-void task_page_set_show_categories (TaskPage *page, gboolean state);
-void task_page_set_info_string (TaskPage *tpage, const gchar *icon, const gchar *msg);
-void task_page_add_attendee (TaskPage *tpage, EMeetingAttendee *attendee);
-
+GType		task_page_get_type		(void);
+TaskPage *	task_page_construct		(TaskPage *epage,
+						 EMeetingStore *model,
+						 ECal *client);
+TaskPage *	task_page_new			(EMeetingStore *model,
+						 CompEditor *editor);
+ECalComponent *	task_page_get_cancel_comp	(TaskPage *page);
+void		task_page_show_options		(TaskPage *page);
+void		task_page_hide_options		(TaskPage *page);
+void		task_page_set_assignment	(TaskPage *page,
+						 gboolean set);
+void		task_page_sendoptions_clicked_cb(TaskPage *tpage);
+void		task_page_set_view_role		(TaskPage *page,
+						 gboolean state);
+void		task_page_set_view_status	(TaskPage *page,
+						 gboolean state);
+void		task_page_set_view_type		(TaskPage *page,
+						 gboolean state);
+void		task_page_set_view_rsvp		(TaskPage *page,
+						 gboolean state);
+void		task_page_set_show_timezone	(TaskPage *page,
+						 gboolean state);
+void		task_page_set_show_categories	(TaskPage *page,
+						 gboolean state);
+void		task_page_set_info_string	(TaskPage *tpage,
+						 const gchar *icon,
+						 const gchar *msg);
+void		task_page_add_attendee		(TaskPage *tpage,
+						 EMeetingAttendee *attendee);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/calendar/gui/e-cal-popup.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-cal-popup.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-cal-popup.c	Tue Jul 15 18:34:59 2008
@@ -775,7 +775,7 @@
 	ECalPopupTargetAttachments *t = e_popup_target_new(&ecp->popup, E_CAL_POPUP_TARGET_ATTACHMENTS, sizeof(*t));
 	guint32 mask = ~0;
 	int len = g_slist_length(attachments);
-	ECal *client = comp_editor_get_e_cal (editor);
+	ECal *client = comp_editor_get_client (editor);
 	CompEditorFlags flags = comp_editor_get_flags (editor);
 	gboolean read_only = FALSE;
 	GError *error = NULL;

Modified: branches/kill-bonobo/calendar/gui/e-calendar-table.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-calendar-table.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-calendar-table.c	Tue Jul 15 18:34:59 2008
@@ -1075,7 +1075,7 @@
 				flags |= COMP_EDITOR_USER_ORG;
 		}
 
-		tedit = COMP_EDITOR (task_editor_new (client, flags));
+		tedit = task_editor_new (client, flags);
 		comp_editor_edit_comp (tedit, comp);
 		g_object_unref (comp);
 
@@ -1084,7 +1084,7 @@
 
 		e_comp_editor_registry_add (comp_editor_registry, tedit, FALSE);
 	}
-	comp_editor_focus (tedit);
+	gtk_window_present (GTK_WINDOW (tedit));
 }
 
 /* Opens the task in the specified row */

Modified: branches/kill-bonobo/calendar/gui/e-calendar-view.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-calendar-view.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-calendar-view.c	Tue Jul 15 18:34:59 2008
@@ -1966,7 +1966,7 @@
 static void
 object_created_cb (CompEditor *ce, ECalendarView *cal_view)
 {
-	gnome_calendar_emit_user_created_signal (cal_view, e_calendar_view_get_calendar (cal_view), comp_editor_get_e_cal (ce));
+	gnome_calendar_emit_user_created_signal (cal_view, e_calendar_view_get_calendar (cal_view), comp_editor_get_client (ce));
 }
 
 static void
@@ -1981,10 +1981,7 @@
 
 	ce = e_comp_editor_registry_find (comp_editor_registry, uid);
 	if (!ce) {
-		EventEditor *ee;
-
-		ee = event_editor_new (client, flags);
-		ce = COMP_EDITOR (ee);
+		ce = event_editor_new (client, flags);
 
 		g_signal_connect (ce, "object_created", G_CALLBACK (object_created_cb), cal_view);
 
@@ -1992,14 +1989,14 @@
 		e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (icalcomp));
 		comp_editor_edit_comp (ce, comp);
 		if (flags & COMP_EDITOR_MEETING)
-			event_editor_show_meeting (ee);
+			event_editor_show_meeting (EVENT_EDITOR (ce));
 
 		e_comp_editor_registry_add (comp_editor_registry, ce, FALSE);
 
 		g_object_unref (comp);
 	}
 
-	comp_editor_focus (ce);
+	gtk_window_present (GTK_WINDOW (ce));
 
 }
 

Modified: branches/kill-bonobo/calendar/gui/e-comp-editor-registry.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-comp-editor-registry.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-comp-editor-registry.c	Tue Jul 15 18:34:59 2008
@@ -173,7 +173,7 @@
 
 	g_signal_handlers_block_matched (rdata->editor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, data);
 
-	comp_editor_focus (rdata->editor);
+	gtk_window_present (GTK_WINDOW (rdata->editor));
 	if (!comp_editor_close (rdata->editor)) {
 		g_signal_handlers_unblock_matched (rdata->editor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, data);
 		return FALSE;

Modified: branches/kill-bonobo/calendar/gui/e-memo-table.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-memo-table.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-memo-table.c	Tue Jul 15 18:34:59 2008
@@ -763,7 +763,7 @@
 		if (itip_organizer_is_user (comp, comp_data->client))
 			flags |= COMP_EDITOR_USER_ORG;
 
-		medit = COMP_EDITOR (memo_editor_new (comp_data->client, flags));
+		medit = memo_editor_new (comp_data->client, flags);
 
 		comp_editor_edit_comp (medit, comp);
 		g_object_unref (comp);
@@ -771,7 +771,7 @@
 		e_comp_editor_registry_add (comp_editor_registry, medit, FALSE);
 	}
 
-	comp_editor_focus (medit);
+	gtk_window_present (GTK_WINDOW (medit));
 }
 
 /* Opens the task in the specified row */

Modified: branches/kill-bonobo/calendar/gui/e-tasks.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/e-tasks.c	(original)
+++ branches/kill-bonobo/calendar/gui/e-tasks.c	Tue Jul 15 18:34:59 2008
@@ -1071,7 +1071,7 @@
 e_tasks_new_task			(ETasks		*tasks)
 {
 	ETasksPrivate *priv;
-	TaskEditor *tedit;
+	CompEditor *editor;
 	ECalComponent *comp;
 	const char *category;
 	ECal *ecal;
@@ -1093,11 +1093,11 @@
 	category = cal_search_bar_get_category (CAL_SEARCH_BAR (priv->search_bar));
 	e_cal_component_set_categories (comp, category);
 
-	tedit = task_editor_new (ecal, flags);
-	comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
+	editor = task_editor_new (ecal, flags);
+	comp_editor_edit_comp (editor, comp);
 	g_object_unref (comp);
 
-	comp_editor_focus (COMP_EDITOR (tedit));
+	gtk_window_present (GTK_WINDOW (editor));
 }
 
 void

Modified: branches/kill-bonobo/calendar/gui/gnome-cal.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/gnome-cal.c	(original)
+++ branches/kill-bonobo/calendar/gui/gnome-cal.c	Tue Jul 15 18:34:59 2008
@@ -3263,7 +3263,7 @@
 	GnomeCalendarPrivate *priv;
 	ECal *ecal;
 	ECalModel *model;
-	TaskEditor *tedit;
+	CompEditor *editor;
 	ECalComponent *comp;
 	icalcomponent *icalcomp;
 	const char *category;
@@ -3281,7 +3281,7 @@
 		return;
 
 	flags |= COMP_EDITOR_NEW_ITEM;
-	tedit = task_editor_new (ecal, flags);
+	editor = task_editor_new (ecal, flags);
 
 	icalcomp = e_cal_model_create_component_with_defaults (model);
 	comp = e_cal_component_new ();
@@ -3306,10 +3306,10 @@
 	if (dtstart || dtend)
 		e_cal_component_commit_sequence (comp);
 
-	comp_editor_edit_comp (COMP_EDITOR (tedit), comp);
+	comp_editor_edit_comp (editor, comp);
 	g_object_unref (comp);
 
-	comp_editor_focus (COMP_EDITOR (tedit));
+	gtk_window_present (GTK_WINDOW (editor));
 }
 
 

Modified: branches/kill-bonobo/calendar/gui/memos-component.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/memos-component.c	(original)
+++ branches/kill-bonobo/calendar/gui/memos-component.c	Tue Jul 15 18:34:59 2008
@@ -988,7 +988,7 @@
 {
 	g_return_if_fail (memo_table != NULL);
 
-	memo_table->user_created_cal = comp_editor_get_e_cal (ce);
+	memo_table->user_created_cal = comp_editor_get_client (ce);
 	g_signal_emit_by_name (memo_table, "user_created");
 	memo_table->user_created_cal = NULL;
 }
@@ -998,7 +998,7 @@
 {
 	ECal *ecal;
 	ECalComponent *comp;
-	MemoEditor *editor;
+	CompEditor *editor;
 	CompEditorFlags flags = 0;
 
 	ecal = setup_create_ecal (memo_component, component_view);
@@ -1017,10 +1017,10 @@
 	if (component_view)
 		g_signal_connect (editor, "object_created", G_CALLBACK (object_created_cb), e_memos_get_calendar_table (component_view->memos));
 
-	comp_editor_edit_comp (COMP_EDITOR (editor), comp);
-	comp_editor_focus (COMP_EDITOR (editor));
+	comp_editor_edit_comp (editor, comp);
+	gtk_window_present (GTK_WINDOW (editor));
 
-	e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE);
+	e_comp_editor_registry_add (comp_editor_registry, editor, TRUE);
 
 	return TRUE;
 }

Modified: branches/kill-bonobo/calendar/gui/tasks-component.c
==============================================================================
--- branches/kill-bonobo/calendar/gui/tasks-component.c	(original)
+++ branches/kill-bonobo/calendar/gui/tasks-component.c	Tue Jul 15 18:34:59 2008
@@ -976,7 +976,7 @@
 {
 	g_return_if_fail (cal_table != NULL);
 
-	cal_table->user_created_cal = comp_editor_get_e_cal (ce);
+	cal_table->user_created_cal = comp_editor_get_client (ce);
 	g_signal_emit_by_name (cal_table, "user_created");
 	cal_table->user_created_cal = NULL;
 }
@@ -986,7 +986,7 @@
 {
 	ECal *ecal;
 	ECalComponent *comp;
-	TaskEditor *editor;
+	CompEditor *editor;
 	guint32 flags = 0;
 
 	ecal = setup_create_ecal (task_component, component_view);
@@ -1004,12 +1004,12 @@
 	if (component_view)
 		g_signal_connect (editor, "object_created", G_CALLBACK (object_created_cb), e_tasks_get_calendar_table (component_view->tasks));
 
-	comp_editor_edit_comp (COMP_EDITOR (editor), comp);
+	comp_editor_edit_comp (editor, comp);
 	if (is_assigned)
-		task_editor_show_assignment (editor);
-	comp_editor_focus (COMP_EDITOR (editor));
+		task_editor_show_assignment (TASK_EDITOR (editor));
+	gtk_window_present (GTK_WINDOW (editor));
 
-	e_comp_editor_registry_add (comp_editor_registry, COMP_EDITOR (editor), TRUE);
+	e_comp_editor_registry_add (comp_editor_registry, editor, TRUE);
 
 	return TRUE;
 }

Modified: branches/kill-bonobo/data/icons/Makefile.am
==============================================================================
--- branches/kill-bonobo/data/icons/Makefile.am	(original)
+++ branches/kill-bonobo/data/icons/Makefile.am	Tue Jul 15 18:34:59 2008
@@ -27,6 +27,7 @@
 	hicolor_actions_22x22_view-calendar-week.png \
 	hicolor_actions_22x22_view-calendar-workweek.png \
  	hicolor_actions_24x24_go-today.png \
+	hicolor_actions_24x24_query-free-busy.png \
 	hicolor_actions_24x24_view-calendar-day.png \
 	hicolor_actions_24x24_view-calendar-list.png \
 	hicolor_actions_24x24_view-calendar-month.png \

Modified: branches/kill-bonobo/mail/em-filter-i18n.h
==============================================================================
--- branches/kill-bonobo/mail/em-filter-i18n.h	(original)
+++ branches/kill-bonobo/mail/em-filter-i18n.h	Tue Jul 15 18:34:59 2008
@@ -49,7 +49,6 @@
 char *s = N_("Move to Folder");
 char *s = N_("Pipe to Program");
 char *s = N_("Play Sound");
-/* Translators: "Read" as in "has been read" (em-filter-i18n.h) */
 char *s = N_("Read");
 char *s = N_("Recipients");
 char *s = N_("Regex Match");

Modified: branches/kill-bonobo/ui/Makefile.am
==============================================================================
--- branches/kill-bonobo/ui/Makefile.am	(original)
+++ branches/kill-bonobo/ui/Makefile.am	Tue Jul 15 18:34:59 2008
@@ -7,10 +7,6 @@
 	evolution-mail-global.xml		\
 	evolution-mail-messagedisplay.xml	\
 	evolution-memos.xml			\
-	evolution-event-editor.xml		\
-	evolution-memo-editor.xml		\
-	evolution-task-editor.xml		\
-	evolution-editor.xml			\
 	evolution-tasks.xml
 
 evolutionui_DATA = $(XML_FILES)

Modified: branches/kill-bonobo/ui/evolution-editor.xml
==============================================================================
--- branches/kill-bonobo/ui/evolution-editor.xml	(original)
+++ branches/kill-bonobo/ui/evolution-editor.xml	Tue Jul 15 18:34:59 2008
@@ -1,66 +0,0 @@
-<Root>
-  <commands>
-	  <cmd name="FileSave" _tip="Click here to save the current window" accel="*Control*s" pixtype="pixbuf"/>
-	  <cmd name="FileClose" _tip="Click here to close the current window" accel="*Control*w" pixtype="pixbuf"/>
-	  
-    	  <cmd name="EditCut" _tip="Cut selected text to the clipboard" accel="*Control*x" pixtype="pixbuf"/>
-	  <cmd name="EditCopy" _tip="Copy selected text to the clipboard" accel="*Control*c" pixtype="pixbuf"/>
-	  <cmd name="EditPaste" _tip="Paste text from the clipboard" accel="*Control*v" pixtype="pixbuf"/>
-	  <cmd name="EditSelectAll" _tip="Select all text" accel="*Control*a"/>
-
-	  <cmd name="InsertAttachments" _tip="Click here to attach a file" accel="*Control*m" pixtype="pixbuf"/>
-	  <cmd name="Help" _tip="Click here to view help available" accel="F1" pixtype="pixbuf"/>
-	  
-	  
-  </commands>
-
-  <menu>
-    <submenu name="File" _label="_File">
-      <placeholder name="FileOps">
-        <menuitem name="FileSave" verb="" _label="_Save"/>
-      </placeholder>
-      <placeholder name="FileWindow">
-	<menuitem name="FileClose" verb="" _label="_Close"/>
-      </placeholder>
-    </submenu>
-
-    <submenu name="Edit" _label="_Edit">
-	<placeholder name="EditCutCopyPaste">
-          <menuitem name="EditCut" verb="" _label="Cu_t"/>
-          <menuitem name="EditCopy" verb="" _label="_Copy"/>
-          <menuitem name="EditPaste" verb="" _label="_Paste"/>
-          <separator/>
-	  <menuitem name="EditSelectAll" verb="" _label="Select _All"/>
-        </placeholder>
-    </submenu>
-
-    <submenu name="View" _label="_View">
-    </submenu>
-
-    <submenu name="Insert" _label="I_nsert">
-      <placeholder name="Attachments">
-	      <menuitem name="InsertAttachments" verb="" _label="_Attachment..."/>
-      </placeholder>
-      <placeholder f="" name="RecentDocsPlaceholder"/>
-     </submenu>
-
-    <submenu name="Options" _label="_Options">
-    </submenu>
-
-    <submenu name="Help" _label="_Help">
-	<menuitem name="Help" verb="" _label="_Help"/>
-    </submenu>
-  </menu>
-
-  <dockitem name="Toolbar">
-  
-    <toolitem name="FileSave" verb="" _label="Save" pixtype="pixbuf"/>
-    <toolitem name="FileClose" verb="" _label="Close" pixtype="pixbuf"/>
-    <separator f="" name="editor1"/>
-
-    <toolitem name="InsertAttachments" verb="" _label="Attach" pixtype="pixbuf"/>
-    <separator f="" name="ecal3"/>
-
-  </dockitem>
-
-</Root>

Modified: branches/kill-bonobo/ui/evolution-event-editor.xml
==============================================================================
--- branches/kill-bonobo/ui/evolution-event-editor.xml	(original)
+++ branches/kill-bonobo/ui/evolution-event-editor.xml	Tue Jul 15 18:34:59 2008
@@ -1,96 +0,0 @@
-<Root>
-	<commands>
-                <cmd name="ViewRole" _label="R_ole Field"
-		_tip="Toggles whether the Role field is displayed"
-		type="toggle" state="0"/>
-		
-		<cmd name="ViewRSVP" _label="_RSVP"
-		_tip="Toggles whether the RSVP field is displayed"
-		type="toggle" state="0"/>
-			    
-		<cmd name="ViewType" _label="_Type Field"
-		_tip="Toggles whether the Attendee Type field is displayed"
-		type="toggle" state="0"/>		
-
-		<cmd name="ViewStatus" _label="_Status Field"
-		_tip="Toggles whether the Status field is displayed"
-		type="toggle" state="0"/>
-
-		<cmd name="ViewTimeZone" _label="Time _Zone"
-		_tip="Toggles whether the time zone is displayed"
-		type="toggle" state="0" pixtype="pixbuf"/>	
-	
-		<cmd name="ActionShowTimeBusy" _label="Show time as _busy"
-		_tip="Toggles whether to show time as busy"
-		type="toggle" state="0"/>	
-	
-		<cmd name="ActionAllDayEvent" _label="All _Day Event"
-		_tip="Toggles whether to have All Day Event"
-		type="toggle" state="0" pixtype="pixbuf"/>	
-
-		<cmd name="ViewCategories" _label="_Categories"
-		_tip="Toggles whether to display categories"
-		type="toggle" state="0"/>
-
-    		<cmd name="ActionClassPublic" _label="Pu_blic" 
-      		type="radio" group="class" _tip="Classify as public"/>
-
- 	 	<cmd name="ActionClassPrivate" _label="_Private" 
-      		type="radio" group="class" _tip="Classify as Private"/>
-
-    		<cmd name="ActionClassConfidential" _label="_Confidential" 
-		type="radio" group="class" _tip="Classify as Confidential"/>
-
-		<cmd name="ActionRecurrence" _label="_Recurrence"
-		_tip="Make this a recurring event" pixtype="pixbuf"/>
-
-		<cmd name="ActionFreeBusy" _label="_Free/Busy"
-		_tip="Query free / busy information for the attendees"
-		pixtype="pixbuf"/>
-
-		<cmd name="InsertSendOptions" _label="Send Options"
-		_tip="Insert advanced send options"/>
-
-		<cmd name="ActionAlarm" _label="_Alarms"
-		_tip="Click here to set or unset alarms for this event"
-		pixtype="pixbuf"/>
-	</commands>
-	
-
-  <menu>
-    <submenu name="View">
-      <placeholder name="AttendeeOptions">
-      	<menuitem name="ViewType" verb="" />
-	<menuitem name="ViewStatus" verb="" />
-      	<menuitem name="ViewRole" verb="" />
-	<menuitem name="ViewRSVP" verb="" />
-        <separator f="" name="timezonesep"/>	
-	<menuitem name="ViewTimeZone" verb=""/>
-	<menuitem name="ViewCategories" verb=""/>	
-      </placeholder>
-    </submenu>
-    <submenu  name="Insert">
-	    <menuitem name="InsertSendOptions" verb="" _label="Send _Options"/>	    
-    </submenu>
-    <submenu name="Options">
-	    <menuitem name="ActionAlarm" verb="" _label="_Alarms"/>
-	    <menuitem name="ActionShowTimeBusy" verb="" _label="Show time as _busy"/>
-	    <menuitem name="ActionAllDayEvent" verb="" _label="All _Day Event"/>
-	    <submenu name="Classification" _label="_Classification">
-		    <menuitem name="ActionClassPublic" id="ActionClassPublic" verb=""/>
-		    <menuitem name="ActionClassPrivate" id="ActionClassPrivate" verb=""/>
-		    <menuitem name="ActionClassConfidential" id="ActionClassConfidential" verb=""/>
-	    </submenu>
-	    <menuitem name="ActionRecurrence" verb="" _label="_Recurrence"/>
-	    <menuitem name="ActionFreeBusy" verb="" _label="_Free/Busy"/>	    
-    </submenu>
-  </menu>
-
-  <dockitem name="Toolbar">
-	  <toolitem name="ActionAlarm" verb="" _label="Alarms" pixtype="pixbuf" />
-	  <toolitem name="ActionAllDayEvent" verb="" _label="All Day Event" pixtype="pixbuf"/>
-	  <toolitem name="ActionRecurrence" verb="" _label="Recurrence" pixtype="pixbuf"/>	
-	  <toolitem name="ActionFreeBusy" verb="" _label="Free/Busy" pixtype="pixbuf"/>	  	  	  
-  </dockitem>
-
-</Root>

Modified: branches/kill-bonobo/ui/evolution-memo-editor.xml
==============================================================================
--- branches/kill-bonobo/ui/evolution-memo-editor.xml	(original)
+++ branches/kill-bonobo/ui/evolution-memo-editor.xml	Tue Jul 15 18:34:59 2008
@@ -1,32 +0,0 @@
-<Root>
-	<commands>
-		<cmd name="ViewCategories" _label="_Categories"
-		_tip="Toggles whether to display categories"
-		type="toggle" state="0"/>
-
-    		<cmd name="ActionClassPublic" _label="Pu_blic" 
-      		type="radio" group="class" _tip="Classify as public"/>
-
- 	 	<cmd name="ActionClassPrivate" _label="_Private" 
-      		type="radio" group="class" _tip="Classify as Private"/>
-
-    		<cmd name="ActionClassConfidential" _label="_Confidential" 
-		type="radio" group="class" _tip="Classify as Confidential"/>
-		
-	</commands>
-
-  <menu>
-    <submenu name="View">
-	<menuitem name="ViewCategories" verb=""/>	
-    </submenu>
-    
-    <submenu name="Options">
-	    <submenu name="Classification" _label="_Classification">
-		    <menuitem name="ActionClassPublic" id="ActionClassPublic" verb=""/>
-		    <menuitem name="ActionClassPrivate" id="ActionClassPrivate" verb=""/>
-		    <menuitem name="ActionClassConfidential" id="ActionClassConfidential" verb=""/>
-	    </submenu>
-    </submenu>
-  </menu>
-
-</Root>

Modified: branches/kill-bonobo/ui/evolution-task-editor.xml
==============================================================================
--- branches/kill-bonobo/ui/evolution-task-editor.xml	(original)
+++ branches/kill-bonobo/ui/evolution-task-editor.xml	Tue Jul 15 18:34:59 2008
@@ -1,73 +0,0 @@
-<Root>
-	<commands>
-                <cmd name="ViewRole" _label="R_ole Field"
-		_tip="Toggles whether the Role field is displayed"
-		type="toggle" state="0"/>
-		
-		<cmd name="ViewRSVP" _label="_RSVP"
-		_tip="Toggles whether the RSVP field is displayed"
-		type="toggle" state="0"/>
-			    
-		<cmd name="ViewType" _label="_Type Field"
-		_tip="Toggles whether the Attendee Type field is displayed"
-		type="toggle" state="0"/>		
-
-		<cmd name="ViewStatus" _label="_Status Field"
-		_tip="Toggles whether the Status field is displayed"
-		type="toggle" state="0"/>
-
-		<cmd name="ViewTimeZone" _label="Time _Zone"
-		_tip="Toggles whether the time zone is displayed"
-		type="toggle" state="0" pixtype="pixbuf"/>
-
-		<cmd name="ViewCategories" _label="_Categories"
-		_tip="Toggles whether to display categories"
-		type="toggle" state="0"/>
-
-    		<cmd name="ActionClassPublic" _label="Pu_blic" 
-      		type="radio" group="class" _tip="Classify as public"/>
-
- 	 	<cmd name="ActionClassPrivate" _label="_Private" 
-      		type="radio" group="class" _tip="Classify as Private"/>
-
-    		<cmd name="ActionClassConfidential" _label="_Confidential" 
-		type="radio" group="class" _tip="Classify as Confidential"/>
-		
-		<cmd name="OptionStatus" 
-			_tip="Click change / view the status details of the task" accel="*Control*t" pixtype="pixbuf"/>
-		<cmd name="InsertSendOptions" _label="_Send Options"
-		_tip="Insert advanced send options"/>
-	
-	</commands>
-
-  <menu>
-    <submenu name="View">
-      <placeholder name="AttendeeOptions">
-      	<menuitem name="ViewType" verb="" />
-	<menuitem name="ViewStatus" verb="" />
-      	<menuitem name="ViewRole" verb="" />
-	<menuitem name="ViewRSVP" verb="" />
-        <separator f="" name="timezonesep"/>	
-	<menuitem name="ViewTimeZone" verb=""/>
-	<menuitem name="ViewCategories" verb=""/>	
-      </placeholder>
-    </submenu>
-    <submenu  name="Insert">
-	    <menuitem name="InsertSendOptions" verb="" _label="Send Options"/>	    
-    </submenu>
-    <submenu name="Options">
-	    <submenu name="Classification" _label="_Classification">
-		    <menuitem name="ActionClassPublic" id="ActionClassPublic" verb=""/>
-		    <menuitem name="ActionClassPrivate" id="ActionClassPrivate" verb=""/>
-		    <menuitem name="ActionClassConfidential" id="ActionClassConfidential" verb=""/>
-	    </submenu>
-	      <menuitem name="OptionStatus" verb="" _label="_Status Details"/>	    
-    </submenu>
-  </menu>
-
-  <dockitem name="Toolbar">
-	  <toolitem name="ViewTimeZone" verb="" _label="Time Zone" pixtype="pixbuf"/>	  
- 	  <toolitem name="OptionStatus" verb="" _label="Status Details" pixtype="pixbuf"/>
-  </dockitem>
-
-</Root>



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