evolution r36795 - in branches/kill-bonobo: addressbook/gui/widgets calendar/gui calendar/modules doc/reference/shell doc/reference/shell/tmpl e-util mail shell



Author: mbarnes
Date: Wed Nov 19 01:39:19 2008
New Revision: 36795
URL: http://svn.gnome.org/viewvc/evolution?rev=36795&view=rev

Log:
Progress update:

  - Tighter integration of GalViewInstance and EShellView.

  - EBinding.  Stolen from ExoBinding.  Lets you bind GObject properties
    together to automatically keep their values in sync.  This is a godsend.
    Added to e-util, but might even deserve a place in libedataserver.

  - EShellSettings.  This is the concept I blogged about.  Already
    started ripping apart em-mailer-prefs.c.  Others to follow.  Any
    place where we're monitoring GConf keys is a target.

  - Incremental progress on the calender and mailer.  Got EMFolderView
    somewhat working, but I think I'll be killing off EMFolderBrowser.




Added:
   branches/kill-bonobo/e-util/e-binding.c
   branches/kill-bonobo/e-util/e-binding.h
   branches/kill-bonobo/shell/e-shell-settings.c
   branches/kill-bonobo/shell/e-shell-settings.h
Modified:
   branches/kill-bonobo/addressbook/gui/widgets/e-addressbook-view.c
   branches/kill-bonobo/calendar/gui/gnome-cal.c
   branches/kill-bonobo/calendar/gui/gnome-cal.h
   branches/kill-bonobo/calendar/modules/e-cal-shell-content.c
   branches/kill-bonobo/calendar/modules/e-memo-shell-content.c
   branches/kill-bonobo/calendar/modules/e-task-shell-content.c
   branches/kill-bonobo/doc/reference/shell/Makefile.am
   branches/kill-bonobo/doc/reference/shell/tmpl/e-shell.sgml
   branches/kill-bonobo/e-util/Makefile.am
   branches/kill-bonobo/mail/Makefile.am
   branches/kill-bonobo/mail/e-mail-shell-content.c
   branches/kill-bonobo/mail/e-mail-shell-content.h
   branches/kill-bonobo/mail/e-mail-shell-module.c
   branches/kill-bonobo/mail/e-mail-shell-module.h
   branches/kill-bonobo/mail/e-mail-shell-view-actions.c
   branches/kill-bonobo/mail/e-mail-shell-view-private.c
   branches/kill-bonobo/mail/em-folder-view.c
   branches/kill-bonobo/mail/em-folder-view.h
   branches/kill-bonobo/mail/em-mailer-prefs.c
   branches/kill-bonobo/mail/em-mailer-prefs.h
   branches/kill-bonobo/mail/em-message-browser.c
   branches/kill-bonobo/mail/mail-component.c
   branches/kill-bonobo/mail/mail-folder-cache.c
   branches/kill-bonobo/mail/message-list.h
   branches/kill-bonobo/shell/Makefile.am
   branches/kill-bonobo/shell/e-shell-view.c
   branches/kill-bonobo/shell/e-shell-view.h
   branches/kill-bonobo/shell/e-shell.c
   branches/kill-bonobo/shell/e-shell.h

Modified: branches/kill-bonobo/addressbook/gui/widgets/e-addressbook-view.c
==============================================================================
--- branches/kill-bonobo/addressbook/gui/widgets/e-addressbook-view.c	(original)
+++ branches/kill-bonobo/addressbook/gui/widgets/e-addressbook-view.c	Wed Nov 19 01:39:19 2008
@@ -365,19 +365,6 @@
 }
 
 static void
-addressbook_view_changed_cb (EAddressbookView *view,
-                             GalViewInstance *view_instance)
-{
-	EShellView *shell_view;
-	gchar *view_id;
-
-	shell_view = e_addressbook_view_get_shell_view (view);
-	view_id = gal_view_instance_get_current_view_id (view_instance);
-	e_shell_view_set_view_id (shell_view, view_id);
-	g_free (view_id);
-}
-
-static void
 addressbook_view_display_view_cb (EAddressbookView *view,
                                   GalView *gal_view)
 {
@@ -608,24 +595,16 @@
 addressbook_view_constructed (GObject *object)
 {
 	EAddressbookView *view = E_ADDRESSBOOK_VIEW (object);
-	EShellView *shell_view;
-	EShellViewClass *shell_view_class;
-	GalViewCollection *view_collection;
 	GalViewInstance *view_instance;
+	EShellView *shell_view;
 	ESource *source;
 	gchar *uri;
 
 	shell_view = e_addressbook_view_get_shell_view (view);
-	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
-	view_collection = shell_view_class->view_collection;
-
 	source = e_addressbook_view_get_source (view);
 	uri = e_source_get_uri (source);
 
-	view_instance = gal_view_instance_new (view_collection, uri);
-	g_signal_connect_swapped (
-		view_instance, "changed",
-		G_CALLBACK (addressbook_view_changed_cb), view);
+	view_instance = e_shell_view_new_view_instance (shell_view, uri);
 	g_signal_connect_swapped (
 		view_instance, "display-view",
 		G_CALLBACK (addressbook_view_display_view_cb), view);

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	Wed Nov 19 01:39:19 2008
@@ -96,9 +96,9 @@
 struct _GnomeCalendarPrivate {
 	/* The clients for display */
 
-	GHashTable *clients[E_CAL_SOURCE_TYPE_LAST];
-	GList *clients_list[E_CAL_SOURCE_TYPE_LAST];
-	ECal *default_client[E_CAL_SOURCE_TYPE_LAST];
+	GHashTable *clients;
+	GList *clients_list;
+	ECal *default_client;
 
 	/*
 	 * Fields for the calendar view
@@ -186,9 +186,6 @@
 enum {
 	DATES_SHOWN_CHANGED,
 	CALENDAR_SELECTION_CHANGED,
-	MEMOPAD_SELECTION_CHANGED,
-	CALENDAR_FOCUS_CHANGE,
-	MEMOPAD_FOCUS_CHANGE,
 	GOTO_DATE,
 	SOURCE_ADDED,
 	SOURCE_REMOVED,
@@ -292,16 +289,6 @@
 				g_cclosure_marshal_VOID__VOID,
 				G_TYPE_NONE, 0);
 
-	gnome_calendar_signals[CALENDAR_FOCUS_CHANGE] =
-		g_signal_new ("calendar_focus_change",
-				G_TYPE_FROM_CLASS (object_class),
-				G_SIGNAL_RUN_FIRST,
-				G_STRUCT_OFFSET (GnomeCalendarClass, calendar_focus_change),
-				NULL, NULL,
-				g_cclosure_marshal_VOID__BOOLEAN,
-				G_TYPE_NONE, 1,
-				G_TYPE_BOOLEAN);
-
 	gnome_calendar_signals[SOURCE_ADDED] =
 		g_signal_new ("source_added",
 			      G_TYPE_FROM_CLASS (object_class),
@@ -309,9 +296,8 @@
 			      G_STRUCT_OFFSET (GnomeCalendarClass, source_added),
 			      NULL, NULL,
 			      e_calendar_marshal_VOID__INT_OBJECT,
-			      G_TYPE_NONE,
-			      2,
-			      G_TYPE_INT, G_TYPE_OBJECT);
+			      G_TYPE_NONE, 1,
+			      G_TYPE_OBJECT);
 
 	gnome_calendar_signals[SOURCE_REMOVED] =
 		g_signal_new ("source_removed",
@@ -320,9 +306,8 @@
 			      G_STRUCT_OFFSET (GnomeCalendarClass, source_removed),
 			      NULL, NULL,
 			      e_calendar_marshal_VOID__INT_OBJECT,
-			      G_TYPE_NONE,
-			      2,
-			      G_TYPE_INT, G_TYPE_OBJECT);
+			      G_TYPE_NONE, 1,
+			      G_TYPE_OBJECT);
 
 	gnome_calendar_signals[GOTO_DATE] =
 		g_signal_new ("goto_date",
@@ -350,7 +335,6 @@
 
 	class->dates_shown_changed = NULL;
 	class->calendar_selection_changed = NULL;
-	class->calendar_focus_change = NULL;
 	class->source_added = NULL;
 	class->source_removed = NULL;
 	class->goto_date = gnome_calendar_goto_date;
@@ -758,7 +742,7 @@
 	}
 	
 	/* create queries for each loaded client */
-	for (l = priv->clients_list[E_CAL_SOURCE_TYPE_EVENT]; l != NULL; l = l->next) {
+	for (l = priv->clients_list; l != NULL; l = l->next) {
 		GError *error = NULL;
 		gint tries = 0;
 
@@ -981,60 +965,6 @@
 }
 
 
-static gint
-calendar_focus_change_cb (GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-	GnomeCalendar *gcal;
-
-	gcal = GNOME_CALENDAR (data);
-
-	g_signal_emit (gcal, gnome_calendar_signals [CALENDAR_FOCUS_CHANGE], 0,
-		       event->in ? TRUE : FALSE);
-
-	return FALSE;
-}
-
-/* Connects to the focus change signals of a day view widget */
-static void
-connect_day_view_focus (GnomeCalendar *gcal, EDayView *dv)
-{
-	g_signal_connect_after (dv->top_canvas, "focus_in_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-	g_signal_connect_after (dv->top_canvas, "focus_out_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-
-	g_signal_connect_after (dv->main_canvas, "focus_in_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-	g_signal_connect_after (dv->main_canvas, "focus_out_event",
-				G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
-/* Connects to the focus change signals of a week view widget */
-static void
-connect_week_view_focus (GnomeCalendar *gcal, EWeekView *wv)
-{
-	if (!E_IS_WEEK_VIEW (wv))
-		return;
-
-	g_signal_connect (wv->main_canvas, "focus_in_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-	g_signal_connect (wv->main_canvas, "focus_out_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
-static void
-connect_list_view_focus (GnomeCalendar *gcal, ECalListView *lv)
-{
-	ETable *etable;
-
-	etable = e_table_scrolled_get_table (lv->table_scrolled);
-
-	g_signal_connect (etable->table_canvas, "focus_in_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-	g_signal_connect (etable->table_canvas, "focus_out_event",
-			  G_CALLBACK (calendar_focus_change_cb), gcal);
-}
-
 static void
 set_week_start (GnomeCalendar *calendar)
 {
@@ -1087,29 +1017,25 @@
 set_timezone (GnomeCalendar *calendar)
 {
 	GnomeCalendarPrivate *priv;
-	int i;
+	GList *l;
 
 	priv = calendar->priv;
 
 	priv->zone = calendar_config_get_icaltimezone ();
 
-	for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
-		GList *l;
-
-		for (l = priv->clients_list[i]; l != NULL; l = l->next) {
-			ECal *client = l->data;
-
-			if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
-				/* FIXME Error checking */
-				e_cal_set_default_timezone (client, priv->zone, NULL);
-		}
+	for (l = priv->clients_list; l != NULL; l = l->next) {
+		ECal *client = l->data;
 
-		if (priv->default_client[i]
-		    && e_cal_get_load_state (priv->default_client[i]) == E_CAL_LOAD_LOADED)
+		if (e_cal_get_load_state (client) == E_CAL_LOAD_LOADED)
 			/* FIXME Error checking */
-			e_cal_set_default_timezone (priv->default_client[i], priv->zone, NULL);
+			e_cal_set_default_timezone (client, priv->zone, NULL);
 	}
 
+	if (priv->default_client[i]
+	    && e_cal_get_load_state (priv->default_client[i]) == E_CAL_LOAD_LOADED)
+		/* FIXME Error checking */
+		e_cal_set_default_timezone (priv->default_client[i], priv->zone, NULL);
+
 	if (priv->views [priv->current_view_type])
 		e_calendar_view_set_timezone (priv->views [priv->current_view_type], priv->zone);
 }
@@ -1473,7 +1399,6 @@
 	e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->day_view), priv->zone);
 	g_signal_connect (priv->day_view, "selection_changed",
 			  G_CALLBACK (view_selection_changed_cb), gcal);
-	connect_day_view_focus (gcal, E_DAY_VIEW (priv->day_view));
 
 	/* The Work Week View. */
 	priv->work_week_view = e_day_view_new (cal_model);
@@ -1482,7 +1407,6 @@
 	e_day_view_set_days_shown (E_DAY_VIEW (priv->work_week_view), 5);
 	e_calendar_view_set_calendar (E_CALENDAR_VIEW (priv->work_week_view), gcal);
 	e_calendar_view_set_timezone (E_CALENDAR_VIEW (priv->work_week_view), priv->zone);
-	connect_day_view_focus (gcal, E_DAY_VIEW (priv->work_week_view));
 
 	/* The Marcus Bains line */
 	priv->update_marcus_bains_line_timeout = g_timeout_add_full (G_PRIORITY_LOW, 60000, (GSourceFunc) update_marcus_bains_line_cb, gcal, NULL);
@@ -1494,8 +1418,6 @@
 	g_signal_connect (priv->week_view, "selection_changed",
 			  G_CALLBACK (view_selection_changed_cb), gcal);
 
-	connect_week_view_focus (gcal, E_WEEK_VIEW (priv->week_view));
-
 	adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->week_view)->vscrollbar));
 	g_signal_connect (adjustment, "value_changed",
 			  G_CALLBACK (week_view_adjustment_changed_cb),
@@ -1515,8 +1437,6 @@
 	g_signal_connect (priv->month_view, "selection_changed",
 			  G_CALLBACK (view_selection_changed_cb), gcal);
 
-	connect_week_view_focus (gcal, E_WEEK_VIEW (priv->month_view));
-
 	adjustment = gtk_range_get_adjustment (GTK_RANGE (E_WEEK_VIEW (priv->month_view)->vscrollbar));
 	g_signal_connect (adjustment, "value_changed",
 			  G_CALLBACK (month_view_adjustment_changed_cb),
@@ -1530,8 +1450,6 @@
 	g_signal_connect (priv->list_view, "selection_changed",
 			  G_CALLBACK (view_selection_changed_cb), gcal);
 
-	connect_list_view_focus (gcal, E_CAL_LIST_VIEW (priv->list_view));
-
 	priv->views[GNOME_CAL_DAY_VIEW] = E_CALENDAR_VIEW (priv->day_view);
 	priv->configs[GNOME_CAL_DAY_VIEW] = G_OBJECT (e_day_view_config_new (E_DAY_VIEW (priv->views[GNOME_CAL_DAY_VIEW])));
 	priv->views[GNOME_CAL_WORK_WEEK_VIEW] = E_CALENDAR_VIEW (priv->work_week_view);
@@ -1571,13 +1489,11 @@
 gnome_calendar_init (GnomeCalendar *gcal)
 {
 	GnomeCalendarPrivate *priv;
-	int i;
 
 	priv = g_new0 (GnomeCalendarPrivate, 1);
 	gcal->priv = priv;
 
-	for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++)
-		priv->clients[i] = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
+	priv->clients = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 
 	if (non_intrusive_error_table == NULL)
 		non_intrusive_error_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
@@ -1626,26 +1542,24 @@
 		e_categories_unregister_change_listener (G_CALLBACK (categories_changed_cb), gcal);
 
 		/* Clean up the clients */
-		for (i = 0; i < E_CAL_SOURCE_TYPE_LAST; i++) {
-			for (l = priv->clients_list[i]; l != NULL; l = l->next) {
-				g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA,
-								      0, 0, NULL, NULL, gcal);
-			}
+		for (l = priv->clients_list; l != NULL; l = l->next) {
+			g_signal_handlers_disconnect_matched (l->data, G_SIGNAL_MATCH_DATA,
+							      0, 0, NULL, NULL, gcal);
+		}
 
-			g_hash_table_destroy (priv->clients[i]);
-			g_list_free (priv->clients_list[i]);
+		g_hash_table_destroy (priv->clients);
+		g_list_free (priv->clients_list);
 
-			priv->clients[i] = NULL;
-			priv->clients_list[i] = NULL;
+		priv->clients = NULL;
+		priv->clients_list = NULL;
 
-			if (priv->default_client[i]) {
-				g_signal_handlers_disconnect_matched (priv->default_client[i],
-								      G_SIGNAL_MATCH_DATA,
-								      0, 0, NULL, NULL, gcal);
-				g_object_unref (priv->default_client[i]);
-			}
-			priv->default_client[i] = NULL;
+		if (priv->default_client) {
+			g_signal_handlers_disconnect_matched (priv->default_client,
+							      G_SIGNAL_MATCH_DATA,
+							      0, 0, NULL, NULL, gcal);
+			g_object_unref (priv->default_client);
 		}
+		priv->default_client = NULL;
 
 		for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
 			if (priv->configs[i]) 
@@ -2178,7 +2092,6 @@
 client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal)
 {
 	GnomeCalendarPrivate *priv;
-	ECalSourceType source_type;
 	ESource *source;
 	ECalModel *model;
 	ECalLoadState state;
@@ -2188,19 +2101,10 @@
 
 	priv = gcal->priv;
 
-	source_type = e_cal_get_source_type (ecal);
 	source = e_cal_get_source (ecal);
 	state = e_cal_get_load_state (ecal);
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT:
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
-		break;
-	default:
-		break;
-	}
-
-	if (status == E_CALENDAR_STATUS_AUTHENTICATION_FAILED && source_type == E_CAL_SOURCE_TYPE_EVENT)
+	if (status == E_CALENDAR_STATUS_AUTHENTICATION_FAILED)
 		auth_cal_forget_password (ecal);
 
 	switch (status) {
@@ -2238,30 +2142,27 @@
 			return;
 		}
 	case E_CALENDAR_STATUS_REPOSITORY_OFFLINE:
-		if (source_type == E_CAL_SOURCE_TYPE_EVENT)
-		{
-			/* check to see if we have dialog already running for this operation */
-			id = g_strdup ("calendar:unable-to-load-the-calendar");
+		/* check to see if we have dialog already running for this operation */
+		id = g_strdup ("calendar:unable-to-load-the-calendar");
 
-			if (g_hash_table_lookup(non_intrusive_error_table, id)) {
-				/* We already have it */
-				g_message("Error occurred while existing dialog active:\n");
-				return;
-			}
-
-			w = e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:unable-to-load-the-calendar", e_cal_get_error_message (status), NULL);
-			e_calendar_utils_show_error_silent (w);
-			g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(w));
-			g_signal_connect(w, "destroy", G_CALLBACK(non_intrusive_error_remove), id);
+		if (g_hash_table_lookup(non_intrusive_error_table, id)) {
+			/* We already have it */
+			g_message("Error occurred while existing dialog active:\n");
+			return;
 		}
+
+		w = e_error_new(GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))), "calendar:unable-to-load-the-calendar", e_cal_get_error_message (status), NULL);
+		e_calendar_utils_show_error_silent (w);
+		g_hash_table_insert (non_intrusive_error_table, id, g_object_ref(w));
+		g_signal_connect(w, "destroy", G_CALLBACK(non_intrusive_error_remove), id);
 	default:
 		/* Make sure the source doesn't disappear on us */
 		g_object_ref (source);
 
-		priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
-		g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
+		priv->clients_list = g_list_remove (priv->clients_list, ecal);
+		g_hash_table_remove (priv->clients, e_source_peek_uid (source));
 
-		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source);
+		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source);
 		g_object_unref (source);
 
 		g_warning ("Unable to load the calendar %s \n", e_cal_get_error_message (status));
@@ -2271,49 +2172,32 @@
 
 	g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, client_cal_opened_cb, NULL);
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT :
-		msg = g_strdup_printf (_("Loading appointments at %s"), e_cal_get_uri (ecal));
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1);
-		g_free (msg);
-
-		/* add client to the views */
-		model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
-		add_mclient (model, ecal);
+	msg = g_strdup_printf (_("Loading appointments at %s"), e_cal_get_uri (ecal));
+	e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1);
+	g_free (msg);
 
-		/* update date navigator query */
-		update_query (gcal);
+	/* add client to the views */
+	model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
+	add_mclient (model, ecal);
 
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
-		break;
+	/* update date navigator query */
+	update_query (gcal);
 
-	default:
-		g_return_if_reached ();
-	}
+	e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
 }
 
 static void
 default_client_cal_opened_cb (ECal *ecal, ECalendarStatus status, GnomeCalendar *gcal)
 {
 	GnomeCalendarPrivate *priv;
-	ECalSourceType source_type;
 	ESource *source;
 	ECalLoadState state;
 
 	priv = gcal->priv;
 
-	source_type = e_cal_get_source_type (ecal);
 	source = e_cal_get_source (ecal);
 	state = e_cal_get_load_state (ecal);
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT:
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
-		break;
-	default:
-		break;
-	}
-
 	switch (status) {
 	case E_CALENDAR_STATUS_OK:
 		break;
@@ -2329,15 +2213,15 @@
 		g_object_ref (source);
 
 		/* FIXME should we do this to prevent multiple error dialogs? */
-		priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
-		g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
+		priv->clients_list = g_list_remove (priv->clients_list, ecal);
+		g_hash_table_remove (priv->clients, e_source_peek_uid (source));
 
 		/* FIXME Is there a better way to handle this? */
-		if (priv->default_client[source_type]) 
-			g_object_unref (priv->default_client[source_type]);
-		priv->default_client[source_type] = NULL;
+		if (priv->default_client) 
+			g_object_unref (priv->default_client);
+		priv->default_client = NULL;
 
-		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source);
+		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source);
 		g_object_unref (source);
 
 		g_warning ("Unable to load the calendar %s \n", e_cal_get_error_message (status));
@@ -2348,16 +2232,10 @@
 	g_signal_handlers_disconnect_matched (ecal, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, default_client_cal_opened_cb, NULL);
 
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT:
-			e_cal_model_set_default_client (
-				e_calendar_view_get_model (E_CALENDAR_VIEW (priv->views[priv->current_view_type])),
-				ecal);
-		break;
-
-	default:
-		break;
-        }
+	e_cal_model_set_default_client (
+		e_calendar_view_get_model (
+		E_CALENDAR_VIEW (priv->views[priv->current_view_type])),
+		ecal);
 }
 
 typedef void (*open_func) (ECal *, ECalendarStatus, GnomeCalendar *);
@@ -2375,14 +2253,7 @@
 	e_cal_set_default_timezone (cal, zone, NULL);
 
 	msg = g_strdup_printf (_("Opening %s"), e_cal_get_uri (cal));
-	switch (e_cal_get_source_type (cal)) {
-	case E_CAL_SOURCE_TYPE_EVENT :
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1);
-		break;
-	default:
-		g_free (msg);
-		g_return_val_if_reached (FALSE);
-	}
+	e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), msg, -1);
 
 	g_free (msg);
 
@@ -2427,7 +2298,6 @@
 {
 	GnomeCalendar *gcal;
 	GnomeCalendarPrivate *priv;
-	ECalSourceType source_type;
 	ESource *source;
 	const char *id;
 	GtkWidget *w = NULL;
@@ -2438,24 +2308,16 @@
 	/* FIXME What about default sources? */
 
 	/* Make sure the source doesn't go away on us since we use it below */
-	source_type = e_cal_get_source_type (ecal);
 	source = g_object_ref (e_cal_get_source (ecal));
 
-	priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], ecal);
-	g_hash_table_remove (priv->clients[source_type], e_source_peek_uid (source));
+	priv->clients_list = g_list_remove (priv->clients_list, ecal);
+	g_hash_table_remove (priv->clients, e_source_peek_uid (source));
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT:
-		id = g_strdup ("calendar:calendar-crashed");
+	id = g_strdup ("calendar:calendar-crashed");
 
-		e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
+	e_calendar_view_set_status_message (E_CALENDAR_VIEW (priv->week_view), NULL, -1);
 
-		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source);
-		break;
-
-	default:
-		g_return_if_reached ();
-	}
+	g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source);
 
 	g_object_unref (source);
 
@@ -2547,7 +2409,7 @@
  * Returns: TRUE if successful, FALSE if error.
  */
 gboolean
-gnome_calendar_add_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
+gnome_calendar_add_source (GnomeCalendar *gcal, ESource *source)
 {
 	GnomeCalendarPrivate *priv;
 	ECal *client;
@@ -2558,7 +2420,7 @@
 
 	priv = gcal->priv;
 
-	client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source));
+	client = g_hash_table_lookup (priv->clients, e_source_peek_uid (source));
 	if (client) {
 		/* We already have it */
 
@@ -2566,18 +2428,18 @@
 	} else {
 		ESource *default_source;
 
-		if (priv->default_client[source_type]) {
-			default_source = e_cal_get_source (priv->default_client[source_type]);
+		if (priv->default_client) {
+			default_source = e_cal_get_source (priv->default_client);
 
 			g_message ("Check if default client matches (%s %s)", e_source_peek_uid (default_source), e_source_peek_uid (source));
 			/* We don't have it but the default client is it */
 			if (!strcmp (e_source_peek_uid (default_source), e_source_peek_uid (source)))
-				client = g_object_ref (priv->default_client[source_type]);
+				client = g_object_ref (priv->default_client);
 		}
 
 		/* Create a new one */
 		if (!client) {
-			client = auth_new_cal_from_source (source, source_type);
+			client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
 			if (!client)
 				return FALSE;
 		}
@@ -2587,10 +2449,10 @@
 	g_signal_connect (G_OBJECT (client), "backend_died", G_CALLBACK (backend_died_cb), gcal);
 
 	/* add the client to internal structure */
-	g_hash_table_insert (priv->clients[source_type], g_strdup (e_source_peek_uid (source)), client);
-	priv->clients_list[source_type] = g_list_prepend (priv->clients_list[source_type], client);
+	g_hash_table_insert (priv->clients, g_strdup (e_source_peek_uid (source)), client);
+	priv->clients_list = g_list_prepend (priv->clients_list, client);
 
-	g_signal_emit (gcal, gnome_calendar_signals[SOURCE_ADDED], 0, source_type, source);
+	g_signal_emit (gcal, gnome_calendar_signals[SOURCE_ADDED], 0, source);
 
 	open_ecal (gcal, client, FALSE, client_cal_opened_cb);
 
@@ -2608,7 +2470,7 @@
  * Returns: TRUE if successful, FALSE otherwise.
  */
 gboolean
-gnome_calendar_remove_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
+gnome_calendar_remove_source (GnomeCalendar *gcal, ESource *source)
 {
 	gboolean result;
 
@@ -2616,15 +2478,15 @@
 	g_return_val_if_fail (GNOME_IS_CALENDAR (gcal), FALSE);
 	g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
 
-	result = gnome_calendar_remove_source_by_uid (gcal, source_type, e_source_peek_uid (source));
+	result = gnome_calendar_remove_source_by_uid (gcal, e_source_peek_uid (source));
 	if (result)
-		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source_type, source);
+		g_signal_emit (gcal, gnome_calendar_signals[SOURCE_REMOVED], 0, source);
 
 	return result;
 }
 
 gboolean
-gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, ECalSourceType source_type, const char *uid)
+gnome_calendar_remove_source_by_uid (GnomeCalendar *gcal, const char *uid)
 {
 	GnomeCalendarPrivate *priv;
 	ECal *client;
@@ -2637,41 +2499,34 @@
 
 	priv = gcal->priv;
 
-	client = g_hash_table_lookup (priv->clients[source_type], uid);
+	client = g_hash_table_lookup (priv->clients, uid);
 	if (!client)
 		return TRUE;
 
-	priv->clients_list[source_type] = g_list_remove (priv->clients_list[source_type], client);
+	priv->clients_list = g_list_remove (priv->clients_list, client);
 	g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA,
 					      0, 0, NULL, NULL, gcal);
 
-	switch (source_type) {
-	case E_CAL_SOURCE_TYPE_EVENT:
-		/* remove the query for this client */
-		for (l = priv->dn_queries; l != NULL; l = l->next) {
-			ECalView *query = l->data;
+	/* remove the query for this client */
+	for (l = priv->dn_queries; l != NULL; l = l->next) {
+		ECalView *query = l->data;
 
-			if (query && (client == e_cal_view_get_client (query))) {
-				g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA,
-								      0, 0, NULL, NULL, gcal);
-				priv->dn_queries = g_list_remove (priv->dn_queries, query);
-				g_object_unref (query);
-				break;
-			}
+		if (query && (client == e_cal_view_get_client (query))) {
+			g_signal_handlers_disconnect_matched (query, G_SIGNAL_MATCH_DATA,
+							      0, 0, NULL, NULL, gcal);
+			priv->dn_queries = g_list_remove (priv->dn_queries, query);
+			g_object_unref (query);
+			break;
 		}
+	}
 
-		model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
-		e_cal_model_remove_client (model, client);
-
-		/* update date navigator query */
-		update_query (gcal);
-		break;
+	model = e_calendar_view_get_model (priv->views[priv->current_view_type]);
+	e_cal_model_remove_client (model, client);
 
-	default:
-		g_return_val_if_reached (TRUE);
-	}
+	/* update date navigator query */
+	update_query (gcal);
 
-	g_hash_table_remove (priv->clients[source_type], uid);
+	g_hash_table_remove (priv->clients, uid);
 
 	return TRUE;
 }
@@ -2689,7 +2544,7 @@
  * otherwise
  **/
 gboolean
-gnome_calendar_set_default_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source)
+gnome_calendar_set_default_source (GnomeCalendar *gcal, ESource *source)
 {
 	GnomeCalendarPrivate *priv;
 	ECal *client;
@@ -2700,21 +2555,21 @@
 
 	priv = gcal->priv;
 
-	client = g_hash_table_lookup (priv->clients[source_type], e_source_peek_uid (source));
+	client = g_hash_table_lookup (priv->clients, e_source_peek_uid (source));
 
-	if (priv->default_client[source_type])
-		g_object_unref (priv->default_client[source_type]);
+	if (priv->default_client)
+		g_object_unref (priv->default_client);
 
 	if (client) {
-		priv->default_client[source_type] = g_object_ref (client);
+		priv->default_client = g_object_ref (client);
 	} else {
-		priv->default_client[source_type] = auth_new_cal_from_source (source, source_type);
-		if (!priv->default_client[source_type])
+		priv->default_client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_EVENT);
+		if (!priv->default_client)
 			return FALSE;
 	}
 
 
-	open_ecal (gcal, priv->default_client[source_type], FALSE, default_client_cal_opened_cb);
+	open_ecal (gcal, priv->default_client, FALSE, default_client_cal_opened_cb);
 
 	return TRUE;
 }

Modified: branches/kill-bonobo/calendar/gui/gnome-cal.h
==============================================================================
--- branches/kill-bonobo/calendar/gui/gnome-cal.h	(original)
+++ branches/kill-bonobo/calendar/gui/gnome-cal.h	Wed Nov 19 01:39:19 2008
@@ -87,17 +87,13 @@
 	void (* dates_shown_changed)    (GnomeCalendar *gcal);
 
 	void (* calendar_selection_changed) (GnomeCalendar *gcal);
-	void (* taskpad_selection_changed) (GnomeCalendar *gcal);
-	void (* memopad_selection_changed) (GnomeCalendar *gcal);
 
 	void (* calendar_focus_change)  (GnomeCalendar *gcal, gboolean in);
-	void (* taskpad_focus_change)   (GnomeCalendar *gcal, gboolean in);
-	void (* memopad_focus_change)   (GnomeCalendar *gcal, gboolean in);
- 	void (* change_view) (GnomeCalendar *gcal,
- 			       GnomeCalendarViewType view_type);
+	void (* change_view) (GnomeCalendar *gcal,
+			       GnomeCalendarViewType view_type);
 
-        void (* source_added)           (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-        void (* source_removed)         (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
+        void (* source_added)           (GnomeCalendar *gcal, ESource *source);
+        void (* source_removed)         (GnomeCalendar *gcal, ESource *source);
 
 	/* Action signals */
         void (* goto_date)              (GnomeCalendar *gcal, GnomeCalendarGotoDateType date);
@@ -114,10 +110,10 @@
 ECalModel *gnome_calendar_get_calendar_model    (GnomeCalendar *gcal);
 ECal *gnome_calendar_get_default_client    (GnomeCalendar *gcal);
 
-gboolean   gnome_calendar_add_source      (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-gboolean   gnome_calendar_remove_source   (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
-gboolean   gnome_calendar_remove_source_by_uid   (GnomeCalendar *gcal, ECalSourceType source_type, const char *uid);
-gboolean   gnome_calendar_set_default_source (GnomeCalendar *gcal, ECalSourceType source_type, ESource *source);
+gboolean   gnome_calendar_add_source      (GnomeCalendar *gcal, ESource *source);
+gboolean   gnome_calendar_remove_source   (GnomeCalendar *gcal, ESource *source);
+gboolean   gnome_calendar_remove_source_by_uid   (GnomeCalendar *gcal, const char *uid);
+gboolean   gnome_calendar_set_default_source (GnomeCalendar *gcal, ESource *source);
 
 void       gnome_calendar_next             	(GnomeCalendar *gcal);
 void       gnome_calendar_previous         	(GnomeCalendar *gcal);

Modified: branches/kill-bonobo/calendar/modules/e-cal-shell-content.c
==============================================================================
--- branches/kill-bonobo/calendar/modules/e-cal-shell-content.c	(original)
+++ branches/kill-bonobo/calendar/modules/e-cal-shell-content.c	Wed Nov 19 01:39:19 2008
@@ -81,24 +81,10 @@
 static gpointer parent_class;
 
 static void
-cal_shell_content_changed_cb (ECalShellContent *cal_shell_content,
-                              GalViewInstance *view_instance)
-{
-	EShellView *shell_view;
-	EShellContent *shell_content;
-	gchar *view_id;
-
-	shell_content = E_SHELL_CONTENT (cal_shell_content);
-	shell_view = e_shell_content_get_shell_view (shell_content);
-	view_id = gal_view_instance_get_current_view_id (view_instance);
-	e_shell_view_set_view_id (shell_view, view_id);
-	g_free (view_id);
-}
-
-static void
 cal_shell_content_display_view_cb (ECalShellContent *cal_shell_content,
                                    GalView *gal_view)
 {
+	/* FIXME */
 }
 
 static void
@@ -343,10 +329,8 @@
 	EShellModule *shell_module;
 	EShellView *shell_view;
 	EShellWindow *shell_window;
-	EShellViewClass *shell_view_class;
 	EShellContent *foreign_content;
 	EShellView *foreign_view;
-	GalViewCollection *view_collection;
 	GalViewInstance *view_instance;
 	GConfBridge *bridge;
 	GtkWidget *container;
@@ -365,8 +349,6 @@
 	shell_content = E_SHELL_CONTENT (object);
 	shell_view = e_shell_content_get_shell_view (shell_content);
 	shell_window = e_shell_view_get_shell_window (shell_view);
-	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
-	view_collection = shell_view_class->view_collection;
 
 	shell_module = e_shell_view_get_shell_module (shell_view);
 	config_dir = e_shell_module_get_config_dir (shell_module);
@@ -557,11 +539,7 @@
 
 	/* Load the view instance. */
 
-	view_instance = gal_view_instance_new (view_collection, NULL);
-	g_signal_connect_swapped (
-		view_instance, "changed",
-		G_CALLBACK (cal_shell_content_changed_cb),
-		object);
+	view_instance = e_shell_view_new_view_instance (shell_view, NULL);
 	g_signal_connect_swapped (
 		view_instance, "display-view",
 		G_CALLBACK (cal_shell_content_display_view_cb),

Modified: branches/kill-bonobo/calendar/modules/e-memo-shell-content.c
==============================================================================
--- branches/kill-bonobo/calendar/modules/e-memo-shell-content.c	(original)
+++ branches/kill-bonobo/calendar/modules/e-memo-shell-content.c	Wed Nov 19 01:39:19 2008
@@ -75,21 +75,6 @@
 static gpointer parent_class;
 
 static void
-memo_shell_content_changed_cb (EMemoShellContent *memo_shell_content,
-                               GalViewInstance *view_instance)
-{
-	EShellView *shell_view;
-	EShellContent *shell_content;
-	gchar *view_id;
-
-	shell_content = E_SHELL_CONTENT (memo_shell_content);
-	shell_view = e_shell_content_get_shell_view (shell_content);
-	view_id = gal_view_instance_get_current_view_id (view_instance);
-	e_shell_view_set_view_id (shell_view, view_id);
-	g_free (view_id);
-}
-
-static void
 memo_shell_content_display_view_cb (EMemoShellContent *memo_shell_content,
                                     GalView *gal_view)
 {
@@ -309,8 +294,6 @@
 	EMemoShellContentPrivate *priv;
 	EShellContent *shell_content;
 	EShellView *shell_view;
-	EShellViewClass *shell_view_class;
-	GalViewCollection *view_collection;
 	GalViewInstance *view_instance;
 	ETable *table;
 	GConfBridge *bridge;
@@ -325,8 +308,6 @@
 
 	shell_content = E_SHELL_CONTENT (object);
 	shell_view = e_shell_content_get_shell_view (shell_content);
-	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
-	view_collection = shell_view_class->view_collection;
 
 	/* Build content widgets. */
 
@@ -405,11 +386,7 @@
 
 	/* Load the view instance. */
 
-	view_instance = gal_view_instance_new (view_collection, NULL);
-	g_signal_connect_swapped (
-		view_instance, "changed",
-		G_CALLBACK (memo_shell_content_changed_cb),
-		object);
+	view_instance = e_shell_view_new_view_instance (shell_view, NULL);
 	g_signal_connect_swapped (
 		view_instance, "display-view",
 		G_CALLBACK (memo_shell_content_display_view_cb),

Modified: branches/kill-bonobo/calendar/modules/e-task-shell-content.c
==============================================================================
--- branches/kill-bonobo/calendar/modules/e-task-shell-content.c	(original)
+++ branches/kill-bonobo/calendar/modules/e-task-shell-content.c	Wed Nov 19 01:39:19 2008
@@ -76,21 +76,6 @@
 static gpointer parent_class;
 
 static void
-task_shell_content_changed_cb (ETaskShellContent *task_shell_content,
-                               GalViewInstance *view_instance)
-{
-	EShellView *shell_view;
-	EShellContent *shell_content;
-	gchar *view_id;
-
-	shell_content = E_SHELL_CONTENT (task_shell_content);
-	shell_view = e_shell_content_get_shell_view (shell_content);
-	view_id = gal_view_instance_get_current_view_id (view_instance);
-	e_shell_view_set_view_id (shell_view, view_id);
-	g_free (view_id);
-}
-
-static void
 task_shell_content_display_view_cb (ETaskShellContent *task_shell_content,
                                     GalView *gal_view)
 {
@@ -308,8 +293,6 @@
 	ETaskShellContentPrivate *priv;
 	EShellContent *shell_content;
 	EShellView *shell_view;
-	EShellViewClass *shell_view_class;
-	GalViewCollection *view_collection;
 	GalViewInstance *view_instance;
 	ETable *table;
 	GConfBridge *bridge;
@@ -324,8 +307,6 @@
 
 	shell_content = E_SHELL_CONTENT (object);
 	shell_view = e_shell_content_get_shell_view (shell_content);
-	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
-	view_collection = shell_view_class->view_collection;
 
 	/* Build content widgets. */
 
@@ -404,11 +385,7 @@
 
 	/* Load the view instance. */
 
-	view_instance = gal_view_instance_new (view_collection, NULL);
-	g_signal_connect_swapped (
-		view_instance, "changed",
-		G_CALLBACK (task_shell_content_changed_cb),
-		object);
+	view_instance = e_shell_view_new_view_instance (shell_view, NULL);
 	g_signal_connect_swapped (
 		view_instance, "display-view",
 		G_CALLBACK (task_shell_content_display_view_cb),

Modified: branches/kill-bonobo/doc/reference/shell/Makefile.am
==============================================================================
--- branches/kill-bonobo/doc/reference/shell/Makefile.am	(original)
+++ branches/kill-bonobo/doc/reference/shell/Makefile.am	Wed Nov 19 01:39:19 2008
@@ -74,6 +74,7 @@
 	$(top_builddir)/shell/es-event.o				\
 	$(top_builddir)/shell/.libs/e-shell-content.o			\
 	$(top_builddir)/shell/.libs/e-shell-module.o			\
+	$(top_builddir)/shell/.libs/e-shell-settings.o			\
 	$(top_builddir)/shell/.libs/e-shell-sidebar.o			\
 	$(top_builddir)/shell/.libs/e-shell-switcher.o			\
 	$(top_builddir)/shell/.libs/e-shell-taskbar.o			\

Modified: branches/kill-bonobo/doc/reference/shell/tmpl/e-shell.sgml
==============================================================================
--- branches/kill-bonobo/doc/reference/shell/tmpl/e-shell.sgml	(original)
+++ branches/kill-bonobo/doc/reference/shell/tmpl/e-shell.sgml	Wed Nov 19 01:39:19 2008
@@ -69,6 +69,11 @@
 
 </para>
 
+<!-- ##### ARG EShell:settings ##### -->
+<para>
+
+</para>
+
 <!-- ##### ENUM EShellLineStatus ##### -->
 <para>
 

Modified: branches/kill-bonobo/e-util/Makefile.am
==============================================================================
--- branches/kill-bonobo/e-util/Makefile.am	(original)
+++ branches/kill-bonobo/e-util/Makefile.am	Wed Nov 19 01:39:19 2008
@@ -41,6 +41,7 @@
 
 eutilinclude_HEADERS = 				\
 	e-bconf-map.h				\
+	e-binding.h				\
 	e-categories-config.h			\
 	e-config.h				\
 	e-config-listener.h			\
@@ -82,6 +83,7 @@
 libeutil_la_SOURCES =				\
 	$(eutilinclude_HEADERS)			\
 	e-bconf-map.c				\
+	e-binding.c				\
 	e-categories-config.c			\
 	e-config-listener.c			\
 	e-config.c				\

Added: branches/kill-bonobo/e-util/e-binding.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/e-util/e-binding.c	Wed Nov 19 01:39:19 2008
@@ -0,0 +1,482 @@
+/*
+ * e-binding.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "e-binding.h"
+
+static gboolean
+e_binding_transform_negate (const GValue *src_value,
+                            GValue *dst_value)
+{
+	if (!g_value_transform (src_value, dst_value))
+		return FALSE;
+
+	g_value_set_boolean (dst_value, !g_value_get_boolean (dst_value));
+
+	return TRUE;
+}
+
+static void
+e_bind_properties_transfer (GObject *src_object,
+                            GParamSpec *src_pspec,
+                            GObject *dst_object,
+                            GParamSpec *dst_pspec,
+                            EBindingTransform  transform,
+                            gpointer user_data)
+{
+	const gchar *src_name;
+	const gchar *dst_name;
+	gboolean result;
+	GValue src_value = { 0, };
+	GValue dst_value = { 0, };
+
+	src_name = g_param_spec_get_name (src_pspec);
+	dst_name = g_param_spec_get_name (dst_pspec);
+
+	g_value_init (&src_value, G_PARAM_SPEC_VALUE_TYPE (src_pspec));
+	g_object_get_property (src_object, src_name, &src_value);
+
+	g_value_init (&dst_value, G_PARAM_SPEC_VALUE_TYPE (dst_pspec));
+	result = (*transform) (&src_value, &dst_value, user_data);
+
+	g_value_unset (&src_value);
+
+	g_return_if_fail (result);
+
+	g_param_value_validate (dst_pspec, &dst_value);
+	g_object_set_property (dst_object, dst_name, &dst_value);
+	g_value_unset (&dst_value);
+}
+
+static void
+e_bind_properties_notify (GObject *src_object,
+                          GParamSpec *src_pspec,
+                          gpointer data)
+{
+	EBindingLink *link = data;
+
+	/* Block the destination handler for mutual bindings,
+	 * so we don't recurse here. */
+	if (link->dst_handler != 0)
+		g_signal_handler_block (link->dst_object, link->dst_handler);
+
+	e_bind_properties_transfer (
+		src_object, src_pspec,
+		link->dst_object, link->dst_pspec,
+		link->transform, link->user_data);
+
+	/* Unblock destination handler. */
+	if (link->dst_handler != 0)
+		g_signal_handler_unblock (link->dst_object, link->dst_handler);
+}
+
+static void
+e_binding_on_dst_object_destroy (gpointer  data,
+                                 GObject  *object)
+{
+	EBinding *binding = data;
+
+	binding->link.dst_object = NULL;
+
+	/* Calls e_binding_on_disconnect() */
+	g_signal_handler_disconnect (
+		binding->src_object, binding->link.handler);
+}
+
+static void
+e_binding_on_disconnect (gpointer data,
+                         GClosure *closure)
+{
+	EBindingLink *link = data;
+	EBinding *binding;
+
+	binding = (EBinding *)
+		(((gchar *) link) - G_STRUCT_OFFSET (EBinding, link));
+
+	if (binding->base.destroy != NULL)
+		binding->base.destroy (link->user_data);
+
+	if (link->dst_object != NULL)
+		g_object_weak_unref (
+			link->dst_object,
+			e_binding_on_dst_object_destroy, binding);
+
+	g_slice_free (EBinding, binding);
+}
+
+/* Recursively calls e_mutual_binding_on_disconnect_object2() */
+static void
+e_mutual_binding_on_disconnect_object1 (gpointer data,
+                                        GClosure *closure)
+{
+	EMutualBinding *binding;
+	EBindingLink *link = data;
+	GObject *object2;
+
+	binding = (EMutualBinding *)
+		(((gchar *) link) - G_STRUCT_OFFSET (EMutualBinding, direct));
+	binding->reverse.dst_object = NULL;
+
+	object2 = binding->direct.dst_object;
+	if (object2 != NULL) {
+		if (binding->base.destroy != NULL)
+			binding->base.destroy (binding->direct.user_data);
+		binding->direct.dst_object = NULL;
+		g_signal_handler_disconnect (object2, binding->reverse.handler);
+		g_slice_free (EMutualBinding, binding);
+	}
+}
+
+/* Recursively calls e_mutual_binding_on_disconnect_object1() */
+static void
+e_mutual_binding_on_disconnect_object2 (gpointer data,
+                                        GClosure *closure)
+{
+	EMutualBinding *binding;
+	EBindingLink *link = data;
+	GObject *object1;
+
+	binding = (EMutualBinding *)
+		(((gchar *) link) - G_STRUCT_OFFSET (EMutualBinding, reverse));
+	binding->direct.dst_object = NULL;
+
+	object1 = binding->reverse.dst_object;
+	if (object1 != NULL) {
+		binding->reverse.dst_object = NULL;
+		g_signal_handler_disconnect (object1, binding->direct.handler);
+	}
+}
+
+static void
+e_binding_link_init (EBindingLink *link,
+                     GObject *src_object,
+                     const gchar *src_property,
+                     GObject *dst_object,
+                     GParamSpec *dst_pspec,
+                     EBindingTransform transform,
+                     GClosureNotify destroy_notify,
+                     gpointer user_data)
+{
+	gchar *signal_name;
+
+	link->dst_object = dst_object;
+	link->dst_pspec = dst_pspec;
+	link->dst_handler = 0;
+	link->transform = transform;
+	link->user_data = user_data;
+
+	signal_name = g_strconcat ("notify::", src_property, NULL);
+	link->handler = g_signal_connect_data (
+		src_object, signal_name,
+		G_CALLBACK (e_bind_properties_notify),
+		link, destroy_notify, 0);
+	g_free (signal_name);
+}
+
+/**
+ * e_binding_new:
+ * @src_object: The source #GObject.
+ * @src_property: The name of the property to bind from.
+ * @dst_object: The destination #GObject.
+ * @dst_property: The name of the property to bind to.
+ *
+ * One-way binds @src_property in @src_object to @dst_property
+ * in @dst_object.
+ *
+ * Before binding the value of @dst_property is set to the
+ * value of @src_property.
+ *
+ * Returns: The descriptor of the binding. It is automatically
+ *          removed if one of the objects is finalized.
+ **/
+EBinding *
+e_binding_new (GObject *src_object,
+               const gchar *src_property,
+               GObject *dst_object,
+               const gchar *dst_property)
+{
+	return e_binding_new_full (
+		src_object, src_property,
+		dst_object, dst_property,
+		NULL, NULL, NULL);
+}
+
+/**
+ * e_binding_new_full:
+ * @src_object: The source #GObject.
+ * @src_property: The name of the property to bind from.
+ * @dst_object: The destination #GObject.
+ * @dst_property: The name of the property to bind to.
+ * @transform: Transformation function or %NULL.
+ * @destroy_notify: Callback function that is called on
+ *                  disconnection with @user_data or %NULL.
+ * @user_data: User data associated with the binding.
+ *
+ * One-way binds @src_property in @src_object to @dst_property
+ * in @dst_object.
+ *
+ * Before binding the value of @dst_property is set to the
+ * value of @src_property.
+ *
+ * Returns: The descriptor of the binding. It is automatically
+ *          removed if one of the objects is finalized.
+ **/
+EBinding *
+e_binding_new_full (GObject *src_object,
+                    const gchar *src_property,
+                    GObject *dst_object,
+                    const gchar *dst_property,
+                    EBindingTransform transform,
+                    GDestroyNotify destroy_notify,
+                    gpointer user_data)
+{
+	EBinding *binding;
+	GParamSpec *src_pspec;
+	GParamSpec *dst_pspec;
+
+	g_return_val_if_fail (G_IS_OBJECT (src_object), NULL);
+	g_return_val_if_fail (G_IS_OBJECT (dst_object), NULL);
+
+	src_pspec = g_object_class_find_property (
+		G_OBJECT_GET_CLASS (src_object), src_property);
+	dst_pspec = g_object_class_find_property (
+		G_OBJECT_GET_CLASS (dst_object), dst_property);
+
+	if (transform == NULL)
+		transform = (EBindingTransform) g_value_transform;
+
+	e_bind_properties_transfer (
+		src_object, src_pspec,
+		dst_object, dst_pspec,
+		transform, user_data);
+
+	binding = g_slice_new (EBinding);
+	binding->src_object = src_object;
+	binding->base.destroy = destroy_notify;
+
+	e_binding_link_init (
+		&binding->link, src_object, src_property, dst_object,
+		dst_pspec, transform, e_binding_on_disconnect, user_data);
+
+	g_object_weak_ref (
+		dst_object, e_binding_on_dst_object_destroy, binding);
+
+	return binding;
+}
+
+/**
+ * e_binding_new_with_negation:
+ * @src_object: The source #GObject.
+ * @src_property: The name of the property to bind from.
+ * @dst_object: The destination #GObject.
+ * @dst_property: The name of the property to bind to.
+ *
+ * Convenience function for binding with boolean negation of value.
+ *
+ * Return: The descriptor of the binding. It is automatically
+ *         removed if one of the objects is finalized.
+ **/
+EBinding *
+e_binding_new_with_negation (GObject *src_object,
+                             const gchar *src_property,
+                             GObject *dst_object,
+                             const gchar *dst_property)
+{
+	EBindingTransform transform;
+
+	transform = (EBindingTransform) e_binding_transform_negate;
+
+	return e_binding_new_full (
+		src_object, src_property,
+		dst_object, dst_property,
+		transform, NULL, NULL);
+}
+
+/**
+ * e_binding_unbind:
+ * @binding: An #EBinding to unbind.
+ *
+ * Disconnects the binding between two properties. Should be
+ * rarely used by applications.
+ *
+ * This functions also calls the @destroy_notify function that
+ * was specified when @binding was created.
+ **/
+void
+e_binding_unbind (EBinding *binding)
+{
+	g_signal_handler_disconnect (
+		binding->src_object, binding->link.handler);
+}
+
+/**
+ * e_mutual_binding_new:
+ * @object1 : The first #GObject.
+ * @property1: The first property to bind.
+ * @object2 : The second #GObject.
+ * @property2: The second property to bind.
+ *
+ * Mutually binds values of two properties.
+ *
+ * Before binding the value of @property2 is set to the value
+ * of @property1.
+ *
+ * Returns: The descriptor of the binding. It is automatically
+ *          removed if one of the objects is finalized.
+ **/
+EMutualBinding *
+e_mutual_binding_new (GObject *object1,
+                      const gchar *property1,
+                      GObject *object2,
+                      const gchar *property2)
+{
+	return e_mutual_binding_new_full (
+		object1, property1,
+		object2, property2,
+		NULL, NULL, NULL, NULL);
+}
+
+/**
+ * e_mutual_binding_new_full:
+ * @object1: The first #GObject.
+ * @property1: The first property to bind.
+ * @object2: The second #GObject.
+ * @property2: The second property to bind.
+ * @transform: Transformation function or %NULL.
+ * @reverse_transform: The inverse transformation function or %NULL.
+ * @destroy_notify: Callback function called on disconnection with
+ *                  @user_data as argument or %NULL.
+ * @user_data: User data associated with the binding.
+ *
+ * Mutually binds values of two properties.
+ *
+ * Before binding the value of @property2 is set to the value of
+ * @property1.
+ *
+ * Both @transform and @reverse_transform should simultaneously be
+ * %NULL or non-%NULL. If they are non-%NULL, they should be reverse
+ * in each other.
+ *
+ * Returns: The descriptor of the binding. It is automatically
+ *          removed if one of the objects is finalized.
+ **/
+EMutualBinding *
+e_mutual_binding_new_full (GObject *object1,
+                           const gchar *property1,
+                           GObject *object2,
+                           const gchar *property2,
+                           EBindingTransform transform,
+                           EBindingTransform reverse_transform,
+                           GDestroyNotify destroy_notify,
+                           gpointer user_data)
+{
+	EMutualBinding *binding;
+	GParamSpec *pspec1;
+	GParamSpec *pspec2;
+
+	g_return_val_if_fail (G_IS_OBJECT (object1), NULL);
+	g_return_val_if_fail (G_IS_OBJECT (object2), NULL);
+
+	pspec1 = g_object_class_find_property (
+		G_OBJECT_GET_CLASS (object1), property1);
+	pspec2 = g_object_class_find_property (
+		G_OBJECT_GET_CLASS (object2), property2);
+
+	if (transform == NULL)
+		transform = (EBindingTransform) g_value_transform;
+
+	if (reverse_transform == NULL)
+		reverse_transform = (EBindingTransform) g_value_transform;
+
+	e_bind_properties_transfer (
+		object1, pspec1, object2,
+		pspec2, transform, user_data);
+
+	binding = g_slice_new (EMutualBinding);
+	binding->base.destroy = destroy_notify;
+
+	e_binding_link_init (
+		&binding->direct,
+		object1, property1, object2, pspec2, transform,
+		e_mutual_binding_on_disconnect_object1, user_data);
+
+	e_binding_link_init (
+		&binding->reverse,
+		object2, property2, object1, pspec1, reverse_transform,
+		e_mutual_binding_on_disconnect_object2, user_data);
+
+	/* Tell each link about the reverse link for mutual bindings,
+	 * to make sure that we do not ever recurse in notify (yeah,
+	 * the GObject notify dispatching is really weird!). */
+	binding->direct.dst_handler = binding->reverse.handler;
+	binding->reverse.dst_handler = binding->direct.handler;
+
+	return binding;
+}
+
+/**
+ * e_mutual_binding_new_with_negation:
+ * @object1: The first #GObject.
+ * @property1: The first property to bind.
+ * @object2: The second #GObject.
+ * @property2: The second property to bind.
+ *
+ * Convenience function for binding with boolean negation of value.
+ *
+ * Returns: The descriptor of the binding. It is automatically removed
+ *          if one of the objects if finalized.
+ **/
+EMutualBinding*
+e_mutual_binding_new_with_negation (GObject *object1,
+                                    const gchar *property1,
+                                    GObject *object2,
+                                    const gchar *property2)
+{
+	EBindingTransform transform;
+
+	transform = (EBindingTransform) e_binding_transform_negate;
+
+	return e_mutual_binding_new_full (
+		object1, property1,
+		object2, property2,
+		transform, transform,
+		NULL, NULL);
+}
+
+/**
+ * e_mutual_binding_unbind:
+ * @binding: An #EMutualBinding to unbind.
+ *
+ * Disconnects the binding between two properties. Should be
+ * rarely used by applications.
+ *
+ * This functions also calls the @destroy_notify function that
+ * was specified when @binding was created.
+ **/
+void
+e_mutual_binding_unbind (EMutualBinding *binding)
+{
+	g_signal_handler_disconnect (
+		binding->reverse.dst_object, binding->direct.handler);
+}

Added: branches/kill-bonobo/e-util/e-binding.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/e-util/e-binding.h	Wed Nov 19 01:39:19 2008
@@ -0,0 +1,107 @@
+/*
+ * e-binding.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+/* This is a direct rip-off of Xfce's excellent ExoBinding API,
+ * which binds two GObject properties together.  ExoBinding was
+ * written by Benedikt Meurer <benny xfce org>. */
+
+#ifndef E_BINDING_H
+#define E_BINDING_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+typedef struct _EBinding EBinding;
+typedef struct _EBindingBase EBindingBase;
+typedef struct _EBindingLink EBindingLink;
+typedef struct _EMutualBinding EMutualBinding;
+
+typedef gboolean	(*EBindingTransform)	(const GValue *src_value,
+						 GValue *dst_value,
+						 gpointer user_data);
+
+struct _EBindingBase {
+	GDestroyNotify destroy;
+};
+
+struct _EBindingLink {
+	GObject *dst_object;
+	GParamSpec *dst_pspec;
+	gulong dst_handler; /* only set for mutual bindings */
+	gulong handler;
+	EBindingTransform transform;
+	gpointer user_data;
+};
+
+struct _EBinding {
+	/*< private >*/
+	GObject *src_object;
+	EBindingBase base;
+	EBindingLink link;
+};
+
+struct _EMutualBinding {
+	/*< private >*/
+	EBindingBase  base;
+	EBindingLink  direct;
+	EBindingLink  reverse;
+};
+
+EBinding *	e_binding_new			(GObject *src_object,
+						 const gchar *src_property,
+						 GObject *dst_object,
+						 const gchar *dst_property);
+EBinding *	e_binding_new_full		(GObject *src_object,
+						 const gchar *src_property,
+						 GObject *dst_object,
+						 const gchar *dst_property,
+						 EBindingTransform transform,
+						 GDestroyNotify destroy_notify,
+						 gpointer user_data);
+EBinding *	e_binding_new_with_negation	(GObject *src_object,
+						 const gchar *src_property,
+						 GObject *dst_object,
+						 const gchar *dst_property);
+void		e_binding_unbind		(EBinding *binding);
+
+EMutualBinding *e_mutual_binding_new		(GObject *object1,
+						 const gchar *property1,
+						 GObject *object2,
+						 const gchar *property2);
+EMutualBinding *e_mutual_binding_new_full	(GObject *object1,
+						 const gchar *property1,
+						 GObject *object2,
+						 const gchar *property2,
+						 EBindingTransform transform,
+						 EBindingTransform reverse_transform,
+						 GDestroyNotify destroy_notify,
+						 gpointer user_data);
+EMutualBinding *e_mutual_binding_new_with_negation
+						(GObject *object1,
+						 const gchar *property1,
+						 GObject *object2,
+						 const gchar *property2);
+void		e_mutual_binding_unbind		(EMutualBinding *binding);
+
+G_END_DECLS
+
+#endif /* E_BINDING_H */

Modified: branches/kill-bonobo/mail/Makefile.am
==============================================================================
--- branches/kill-bonobo/mail/Makefile.am	(original)
+++ branches/kill-bonobo/mail/Makefile.am	Wed Nov 19 01:39:19 2008
@@ -85,6 +85,8 @@
 	em-folder-tree.h				\
 	em-folder-tree-model.c				\
 	em-folder-tree-model.h				\
+	em-folder-view.c				\
+	em-folder-view.h				\
 	em-folder-utils.c				\
 	em-folder-utils.h				\
 	em-format.c					\
@@ -109,6 +111,10 @@
 	em-junk-hook.h					\
 	em-mailer-prefs.c				\
 	em-mailer-prefs.h				\
+	em-menu.c					\
+	em-menu.h					\
+	em-message-browser.c				\
+	em-message-browser.h				\
 	em-network-prefs.c				\
 	em-network-prefs.h				\
 	em-popup.c					\
@@ -149,6 +155,8 @@
 	mail-tools.h					\
 	mail-vfolder.c					\
 	mail-vfolder.h					\
+	message-list.c					\
+	message-list.h					\
 	message-tag-editor.c				\
 	message-tag-editor.h				\
 	message-tag-followup.c				\

Modified: branches/kill-bonobo/mail/e-mail-shell-content.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-content.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-content.c	Wed Nov 19 01:39:19 2008
@@ -22,11 +22,16 @@
 #include "e-mail-shell-content.h"
 
 #include <glib/gi18n.h>
+#include <libedataserver/e-data-server-util.h>
 
 #include "e-util/gconf-bridge.h"
+#include "widgets/menus/gal-view-etable.h"
+#include "widgets/menus/gal-view-instance.h"
 
-#include "em-folder-browser.h"
+#include "em-folder-view.h"
 #include "em-search-context.h"
+#include "em-utils.h"
+#include "mail-config.h"
 
 #define E_MAIL_SHELL_CONTENT_GET_PRIVATE(obj) \
 	(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -34,9 +39,11 @@
 
 struct _EMailShellContentPrivate {
 	GtkWidget *paned;
-	GtkWidget *msglist;
+	GtkWidget *folder_view;
 	GtkWidget *preview;
 
+	GalViewInstance *view_instance;
+
 	guint paned_binding_id;
 
 	guint preview_visible	: 1;
@@ -52,6 +59,20 @@
 static gpointer parent_class;
 
 static void
+mail_shell_content_display_view_cb (EMailShellContent *mail_shell_content,
+                                    GalView *gal_view)
+{
+	EMFolderView *folder_view;
+
+	folder_view = e_mail_shell_content_get_folder_view (mail_shell_content);
+
+	if (GAL_IS_VIEW_ETABLE (gal_view))
+		gal_view_etable_attach_tree (
+			GAL_VIEW_ETABLE (gal_view),
+			folder_view->list->tree);
+}
+
+static void
 mail_shell_content_set_property (GObject *object,
                                  guint property_id,
                                  const GValue *value,
@@ -110,9 +131,9 @@
 		priv->paned = NULL;
 	}
 
-	if (priv->msglist != NULL) {
-		g_object_unref (priv->msglist);
-		priv->msglist = NULL;
+	if (priv->folder_view != NULL) {
+		g_object_unref (priv->folder_view);
+		priv->folder_view = NULL;
 	}
 
 	if (priv->preview != NULL) {
@@ -120,6 +141,11 @@
 		priv->preview = NULL;
 	}
 
+	if (priv->view_instance != NULL) {
+		g_object_unref (priv->view_instance);
+		priv->view_instance = NULL;
+	}
+
 	/* Chain up to parent's dispose() method. */
 	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -139,9 +165,13 @@
 mail_shell_content_constructed (GObject *object)
 {
 	EMailShellContentPrivate *priv;
+	EShellContent *shell_content;
+	EShellView *shell_view;
+	EShellViewClass *shell_view_class;
 	GConfBridge *bridge;
 	GtkWidget *container;
 	GtkWidget *widget;
+	GalViewCollection *view_collection;
 	const gchar *key;
 
 	priv = E_MAIL_SHELL_CONTENT_GET_PRIVATE (object);
@@ -149,6 +179,11 @@
 	/* Chain up to parent's constructed() method. */
 	G_OBJECT_CLASS (parent_class)->constructed (object);
 
+	shell_content = E_SHELL_CONTENT (object);
+	shell_view = e_shell_content_get_shell_view (shell_content);
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
+	view_collection = shell_view_class->view_collection;
+
 	/* Build content widgets. */
 
 	container = GTK_WIDGET (object);
@@ -160,10 +195,9 @@
 
 	container = widget;
 
-	/*widget = em_folder_browser_new ();*/
-	widget = gtk_label_new ("Message List");
+	widget = em_folder_view_new ();
 	gtk_paned_add1 (GTK_PANED (container), widget);
-	priv->msglist = g_object_ref (widget);
+	priv->folder_view = g_object_ref (widget);
 	gtk_widget_show (widget);
 
 	widget = gtk_scrolled_window_new (NULL, NULL);
@@ -175,6 +209,11 @@
 	gtk_paned_add2 (GTK_PANED (container), widget);
 	gtk_widget_show (widget);
 
+	/* Load the view instance. */
+
+	e_mail_shell_content_update_view_instance (
+		E_MAIL_SHELL_CONTENT (object));
+
 	/* Bind GObject properties to GConf keys. */
 
 	bridge = gconf_bridge_get ();
@@ -190,6 +229,8 @@
 	EMailShellContent *mail_shell_content;
 	guint32 state = 0;
 
+	/* FIXME */
+
 	mail_shell_content = E_MAIL_SHELL_CONTENT (shell_content);
 
 	return state;
@@ -284,6 +325,15 @@
 		"shell-view", shell_view, NULL);
 }
 
+EMFolderView *
+e_mail_shell_content_get_folder_view (EMailShellContent *mail_shell_content)
+{
+	g_return_val_if_fail (
+		E_IS_MAIL_SHELL_CONTENT (mail_shell_content), NULL);
+
+	return EM_FOLDER_VIEW (mail_shell_content->priv->folder_view);
+}
+
 gboolean
 e_mail_shell_content_get_preview_visible (EMailShellContent *mail_shell_content)
 {
@@ -378,3 +428,140 @@
 
 	g_object_notify (G_OBJECT (mail_shell_content), "vertical-view");
 }
+
+void
+e_mail_shell_content_update_view_instance (EMailShellContent *mail_shell_content)
+{
+	EShellContent *shell_content;
+	EShellView *shell_view;
+	EShellViewClass *shell_view_class;
+	GalViewCollection *view_collection;
+	GalViewInstance *view_instance;
+	EMFolderView *folder_view;
+	gboolean outgoing_folder;
+	gboolean show_vertical_view;
+	gchar *view_id;
+
+	g_return_if_fail (E_IS_MAIL_SHELL_CONTENT (mail_shell_content));
+
+	shell_content = E_SHELL_CONTENT (mail_shell_content);
+	shell_view = e_shell_content_get_shell_view (shell_content);
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
+	view_collection = shell_view_class->view_collection;
+
+	folder_view = e_mail_shell_content_get_folder_view (mail_shell_content);
+	g_return_if_fail (folder_view->folder != NULL);
+	g_return_if_fail (folder_view->folder_uri != NULL);
+
+	if (mail_shell_content->priv->view_instance != NULL) {
+		g_object_unref (mail_shell_content->priv->view_instance);
+		mail_shell_content->priv->view_instance = NULL;
+	}
+
+	/* TODO: Should this go through the mail-config API? */
+	view_id = mail_config_folder_to_safe_url (folder_view->folder);
+	view_instance = e_shell_view_new_view_instance (shell_view, view_id);
+	mail_shell_content->priv->view_instance = view_instance;
+
+	show_vertical_view = folder_view->list_active &&
+		e_mail_shell_content_get_vertical_view (mail_shell_content);
+
+	if (show_vertical_view) {
+		gchar *filename;
+		gchar *safe_view_id;
+
+		/* Force the view instance into vertical view. */
+
+		g_free (view_instance->custom_filename);
+		g_free (view_instance->current_view_filename);
+
+		safe_view_id = g_strdup (view_id);
+		e_filename_make_safe (safe_view_id);
+
+		filename = g_strdup_printf (
+			"custom_wide_view-%s.xml", safe_view_id);
+		view_instance->custom_filename = g_build_filename (
+			view_collection->local_dir, filename, NULL);
+		g_free (filename);
+
+		filename = g_strdup_printf (
+			"current_wide_view-%s.xml", safe_view_id);
+		view_instance->current_view_filename = g_build_filename (
+			view_collection->local_dir, filename, NULL);
+		g_free (filename);
+
+		g_free (safe_view_id);
+	}
+
+	g_free (view_id);
+
+	outgoing_folder =
+		em_utils_folder_is_drafts (
+			folder_view->folder, folder_view->folder_uri) ||
+		em_utils_folder_is_outbox (
+			folder_view->folder, folder_view->folder_uri) ||
+		em_utils_folder_is_sent (
+			folder_view->folder, folder_view->folder_uri);
+
+	if (outgoing_folder) {
+		if (show_vertical_view)
+			gal_view_instance_set_default_view (
+				view_instance, "Wide_View_Sent");
+		else
+			gal_view_instance_set_default_view (
+				view_instance, "As_Sent_Folder");
+	} else if (show_vertical_view) {
+		gal_view_instance_set_default_view (
+			view_instance, "Wide_View_Normal");
+	}
+
+	gal_view_instance_load (view_instance);
+
+	if (!gal_view_instance_exists (view_instance)) {
+		gchar *state_filename;
+
+		state_filename = mail_config_folder_to_cachename (
+			folder_view->folder, "et-header-");
+
+		if (g_file_test (state_filename, G_FILE_TEST_IS_REGULAR)) {
+			ETableSpecification *spec;
+			ETableState *state;
+			GalView *view;
+			gchar *spec_filename;
+
+			spec = e_table_specification_new ();
+			spec_filename = g_build_filename (
+				EVOLUTION_ETSPECDIR,
+				"message-list.etspec",
+				NULL);
+			e_table_specification_load_from_file (
+				spec, spec_filename);
+			g_free (spec_filename);
+
+			state = e_table_state_new ();
+			view = gal_view_etable_new (spec, "");
+
+			e_table_state_load_from_file (
+				state, state_filename);
+			gal_view_etable_set_state (
+				GAL_VIEW_ETABLE (view), state);
+			gal_view_instance_set_custom_view (
+				view_instance, view);
+
+			g_object_unref (state);
+			g_object_unref (view);
+			g_object_unref (spec);
+		}
+
+		g_free (state_filename);
+	}
+
+	g_signal_connect (
+		view_instance, "display-view",
+		G_CALLBACK (mail_shell_content_display_view_cb),
+		mail_shell_content);
+
+	mail_shell_content_display_view_cb (
+		mail_shell_content,
+		gal_view_instance_get_current_view (view_instance));
+}

Modified: branches/kill-bonobo/mail/e-mail-shell-content.h
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-content.h	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-content.h	Wed Nov 19 01:39:19 2008
@@ -25,6 +25,8 @@
 #include <shell/e-shell-content.h>
 #include <shell/e-shell-view.h>
 
+#include "em-folder-view.h"
+
 /* Standard GObject macros */
 #define E_TYPE_MAIL_SHELL_CONTENT \
 	(e_mail_shell_content_get_type ())
@@ -83,6 +85,8 @@
 
 GType		e_mail_shell_content_get_type	(void);
 GtkWidget *	e_mail_shell_content_new	(EShellView *shell_view);
+EMFolderView *	e_mail_shell_content_get_folder_view
+						(EMailShellContent *mail_shell_content);
 gboolean	e_mail_shell_content_get_preview_visible
 						(EMailShellContent *mail_shell_content);
 void		e_mail_shell_content_set_preview_visible
@@ -93,6 +97,8 @@
 void		e_mail_shell_content_set_vertical_view
 						(EMailShellContent *mail_shell_content,
 						 gboolean vertical_view);
+void		e_mail_shell_content_update_view_instance
+						(EMailShellContent *mail_shell_content);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/mail/e-mail-shell-module.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-module.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-module.c	Wed Nov 19 01:39:19 2008
@@ -373,15 +373,14 @@
 }
 
 static void
-mail_shell_module_new_mail_cb (EShellWindow *shell_window)
+mail_shell_module_mail_icon_cb (EShellWindow *shell_window,
+                                const gchar *icon_name)
 {
 	GtkAction *action;
 
 	action = e_shell_window_get_shell_view_action (
 		shell_window, MODULE_NAME);
-	g_object_set (action, "icon-name", "mail-unread", NULL);
-
-	g_print ("Shell Event: new-mail\n");
+	g_object_set (action, "icon-name", icon_name, NULL);
 }
 
 static void
@@ -419,7 +418,7 @@
 };
 
 static void
-mail_shell_module_init_preferences (void)
+mail_shell_module_init_preferences (EShell *shell)
 {
 	GtkWidget *preferences_window;
 
@@ -438,7 +437,7 @@
 		"mail",
 		"preferences-mail",
 		_("Mail Preferences"),
-		em_mailer_prefs_new (),
+		em_mailer_prefs_new (shell),
 		300);
 
 	e_preferences_window_add_page (
@@ -458,6 +457,267 @@
 		500);
 }
 
+static void
+mail_shell_module_init_settings (EShell *shell)
+{
+	EShellSettings *shell_settings;
+
+	shell_settings = e_shell_get_settings (shell);
+
+	/* XXX Default values should match the GConf schema.
+	 *     Yes it's redundant, but we're stuck with GConf. */
+
+	/*** Mail Preferences ***/
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-address-compress",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"mail-address-count",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_string (
+			"mail-citation-color",
+			NULL,
+			NULL,
+			"#737373",
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-check-for-junk",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-confirm-expunge",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-confirm-unwanted-html",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-empty-trash-on-exit",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-enable-search-folders",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_string (
+			"mail-font-monospace",
+			NULL,
+			NULL,
+			"",
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_string (
+			"mail-font-variable",
+			NULL,
+			NULL,
+			"",
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-force-message-limit",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-magic-spacebar",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-mark-citations",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-mark-seen",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"mail-mark-seen-timeout",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"mail-message-text-part-limit",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-only-local-photos",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-show-animated-images",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-show-sender-photo",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"mail-use-custom-fonts",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	/* Bind shell settings to GConf keys. */
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-address-compress",
+		"/apps/evolution/mail/display/address_compress");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-address-count",
+		"/apps/evolution/mail/display/address_count");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-citation-color",
+		"/apps/evolution/mail/display/citation_colour");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-check-for-junk",
+		"/apps/evolution/mail/junk/check_incoming");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-confirm-expunge",
+		"/apps/evolution/mail/prompts/expunge");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-confirm-unwanted-html",
+		"/apps/evolution/mail/prompts/unwanted_html");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-empty-trash-on-exit",
+		"/apps/evolution/mail/trash/empty_on_exit");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-enable-search-folders",
+		"/apps/evolution/mail/display/enable_vfolders");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-font-monospace",
+		"/apps/evolution/mail/display/fonts/monospace");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-font-variable",
+		"/apps/evolution/mail/display/fonts/variable");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-force-message-limit",
+		"/apps/evolution/mail/display/force_message_limit");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-magic-spacebar",
+		"/apps/evolution/mail/display/magic_spacebar");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-mark-citations",
+		"/apps/evolution/mail/display/mark_citations");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-mark-seen",
+		"/apps/evolution/mail/display/mark_seen");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-mark-seen-timeout",
+		"/apps/evolution/mail/display/mark_seen_timeout");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-message-text-part-limit",
+		"/apps/evolution/mail/display/message_text_part_limit");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-only-local-photos",
+		"/apps/evolution/mail/display/photo_local");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-show-animated-images",
+		"/apps/evolution/mail/display/animated_images");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-show-sender-photo",
+		"/apps/evolution/mail/display/sender_photo");
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "mail-use-custom-fonts",
+		"/apps/evolution/mail/display/fonts/use_custom");
+}
+
 static gboolean
 mail_shell_module_handle_uri_cb (EShell *shell,
                                  const gchar *uri,
@@ -472,7 +732,7 @@
                                          GObject *where_the_object_was)
 {
 	g_signal_handlers_disconnect_by_func (
-		shell, mail_shell_module_new_mail_cb,
+		shell, mail_shell_module_mail_icon_cb,
 		where_the_object_was);
 }
 
@@ -494,8 +754,8 @@
 		source_entries, G_N_ELEMENTS (source_entries));
 
 	g_signal_connect_swapped (
-		shell, "event::new-mail",
-		G_CALLBACK (mail_shell_module_new_mail_cb), shell_window);
+		shell, "event::mail-icon",
+		G_CALLBACK (mail_shell_module_mail_icon_cb), shell_window);
 
 	g_object_weak_ref (
 		G_OBJECT (shell_window), (GWeakNotify)
@@ -560,7 +820,11 @@
 
 	mail_shell_module_init_local_store (shell_module);
 	mail_shell_module_load_accounts (shell_module);
-	mail_shell_module_init_preferences ();
+
+	/* Initialize settings before initializing preferences,
+	 * since the preferences bind to the shell settings. */
+	mail_shell_module_init_settings (shell);
+	mail_shell_module_init_preferences (shell);
 }
 
 /******************************** Public API *********************************/
@@ -665,3 +929,20 @@
 {
 	/* FIXME */
 }
+
+void
+e_mail_shell_module_stores_foreach (EShellModule *shell_module,
+                                    GHFunc func,
+                                    gpointer user_data)
+{
+	GHashTableIter iter;
+	gpointer key, value;
+
+	g_return_if_fail (E_IS_SHELL_MODULE (shell_module));
+	g_return_if_fail (func != NULL);
+
+	g_hash_table_iter_init (&iter, store_hash);
+
+	while (g_hash_table_iter_next (&iter, &key, &value))
+		func (key, ((StoreInfo *) value)->name, user_data);
+}

Modified: branches/kill-bonobo/mail/e-mail-shell-module.h
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-module.h	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-module.h	Wed Nov 19 01:39:19 2008
@@ -69,6 +69,10 @@
 void		e_mail_shell_module_remove_store_by_uri
 						(EShellModule *shell_module,
 						 const gchar *uri);
+void		e_mail_shell_module_stores_foreach
+						(EShellModule *shell_module,
+						 GHFunc func,
+						 gpointer user_data);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/mail/e-mail-shell-view-actions.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-view-actions.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-view-actions.c	Wed Nov 19 01:39:19 2008
@@ -1788,16 +1788,21 @@
 
 	bridge = gconf_bridge_get ();
 
+	object = G_OBJECT (ACTION (MAIL_CARET_MODE));
+	key = "/apps/evolution/mail/display/caret_mode";
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
 	object = G_OBJECT (ACTION (MAIL_PREVIEW));
 	key = "/apps/evolution/mail/display/show_preview";
 	gconf_bridge_bind_property (bridge, key, object, "active");
 
-	/* XXX This is ugly.  We're binding an integer property to a
-	 *     boolean GConf key.  But since there's only two possible
-	 *     mail views (for now, anyway), it happens to work. */
-	object = G_OBJECT (ACTION (MAIL_VIEW_CLASSIC));
+	object = G_OBJECT (ACTION (MAIL_VIEW_VERTICAL));
 	key = "/apps/evolution/mail/display/show_wide";
-	gconf_bridge_bind_property (bridge, key, object, "current-value");
+	gconf_bridge_bind_property (bridge, key, object, "active");
+
+	object = G_OBJECT (ACTION (MAIL_THREADS_GROUP_BY));
+	key = "/apps/evolution/mail/display/thread_list";
+	gconf_bridge_bind_property (bridge, key, object, "active");
 
 	/* Fine tuning. */
 

Modified: branches/kill-bonobo/mail/e-mail-shell-view-private.c
==============================================================================
--- branches/kill-bonobo/mail/e-mail-shell-view-private.c	(original)
+++ branches/kill-bonobo/mail/e-mail-shell-view-private.c	Wed Nov 19 01:39:19 2008
@@ -24,6 +24,32 @@
 #include <widgets/menus/gal-view-factory-etable.h>
 
 static void
+mail_shell_view_folder_tree_selected_cb (EMailShellView *mail_shell_view,
+                                         const gchar *full_name,
+                                         const gchar *uri,
+                                         guint32 flags,
+                                         EMFolderTree *folder_tree)
+{
+	EMailShellContent *mail_shell_content;
+	EMFolderView *folder_view;
+
+	mail_shell_content = mail_shell_view->priv->mail_shell_content;
+	folder_view = e_mail_shell_content_get_folder_view (mail_shell_content);
+
+	if ((flags & CAMEL_FOLDER_NOSELECT) || full_name == NULL)
+		em_folder_view_set_folder (folder_view, NULL, NULL);
+	else {
+		EMFolderTreeModel *model;
+
+		model = em_folder_tree_get_model (folder_tree);
+		em_folder_tree_model_set_selected (model, uri);
+		em_folder_tree_model_save_state (model);
+
+		em_folder_view_set_folder_uri (folder_view, uri);
+	}
+}
+
+static void
 mail_shell_view_folder_tree_popup_event_cb (EShellView *shell_view,
                                             GdkEventButton *event)
 {
@@ -121,6 +147,11 @@
 	folder_tree = e_mail_shell_sidebar_get_folder_tree (mail_shell_sidebar);
 
 	g_signal_connect_swapped (
+		folder_tree, "folder-selected",
+		G_CALLBACK (mail_shell_view_folder_tree_selected_cb),
+		mail_shell_view);
+
+	g_signal_connect_swapped (
 		folder_tree, "popup-event",
 		G_CALLBACK (mail_shell_view_folder_tree_popup_event_cb),
 		mail_shell_view);

Modified: branches/kill-bonobo/mail/em-folder-view.c
==============================================================================
--- branches/kill-bonobo/mail/em-folder-view.c	(original)
+++ branches/kill-bonobo/mail/em-folder-view.c	Wed Nov 19 01:39:19 2008
@@ -27,6 +27,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
+#include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <gdk/gdkkeysyms.h>
 #include <libgnome/gnome-util.h>
@@ -57,13 +58,6 @@
 #include <camel/camel-offline-store.h>
 #include <camel/camel-vee-store.h>
 
-#include <bonobo/bonobo-main.h>
-#include <bonobo/bonobo-object.h>
-#include <bonobo/bonobo-generic-factory.h>
-#include <bonobo/bonobo-control.h>
-#include <bonobo/bonobo-ui-component.h>
-#include <bonobo/bonobo-ui-util.h>
-
 #include <gtkhtml/gtkhtml.h>
 #include <gtkhtml/gtkhtml-embedded.h>
 #include <gtkhtml/gtkhtml-stream.h>
@@ -74,10 +68,8 @@
 #include "menus/gal-view-etable.h"
 #include "menus/gal-view-factory-etable.h"
 #include "menus/gal-view-instance.h"
-#include "menus/gal-view-menus.h"
 
 #include "misc/e-charset-picker.h"
-#include <misc/e-filter-bar.h>
 #include <misc/e-spinner.h>
 
 #include "e-util/e-error.h"
@@ -87,6 +79,7 @@
 #include "e-util/e-profile-event.h"
 #include "e-util/e-util-private.h"
 #include "e-util/e-util-labels.h"
+#include "shell/e-shell.h"
 
 #include "filter/filter-rule.h"
 
@@ -101,20 +94,17 @@
 #include "message-list.h"
 #include "em-utils.h"
 #include "em-composer-utils.h"
-#include "em-marshal.h"
 #include "em-menu.h"
 #include "em-event.h"
+#include "e-mail-shell-module.h"
 
 #include "mail-mt.h"
 #include "mail-ops.h"
 #include "mail-config.h"
 #include "mail-autofilter.h"
 #include "mail-vfolder.h"
-#include "mail-component.h"
 #include "mail-tools.h"
 
-#include "evolution-shell-component-utils.h" /* Pixmap stuff, sigh */
-
 #ifdef HAVE_XFREE
 #include <X11/XF86keysym.h>
 #endif
@@ -231,9 +221,6 @@
 	GtkWidget *invisible;
 	char *selection_uri;
 
-	GalViewInstance *view_instance;
-	GalViewMenus *view_menus;
-
 	char *selected_uid;
 };
 
@@ -415,7 +402,7 @@
 					     G_SIGNAL_RUN_LAST,
 					     G_STRUCT_OFFSET (EMFolderViewClass, on_url),
 					     NULL, NULL,
-					     em_marshal_VOID__STRING_STRING,
+					     e_marshal_VOID__STRING_STRING,
 					     G_TYPE_NONE,
 					     2, G_TYPE_STRING, G_TYPE_STRING);
 
@@ -573,157 +560,6 @@
 	return i;
 }
 
-/* ******************************************************************************** */
-static void
-emfv_list_display_view(GalViewInstance *instance, GalView *view, EMFolderView *emfv)
-{
-	if (GAL_IS_VIEW_ETABLE(view))
-		gal_view_etable_attach_tree(GAL_VIEW_ETABLE(view), emfv->list->tree);
-}
-
-static void
-emfv_setup_view_instance(EMFolderView *emfv)
-{
-	static GalViewCollection *collection = NULL;
-	struct _EMFolderViewPrivate *p = emfv->priv;
-	gboolean outgoing, show_wide=FALSE;
-	char *id;
-
-	g_return_if_fail (emfv->folder);
-	g_return_if_fail (emfv->folder_uri);
-
-	if (collection == NULL) {
-		ETableSpecification *spec;
-		GalViewFactory *factory;
-		const char *evolution_dir;
-		char *dir;
-		char *galviewsmaildir;
-		char *etspecfile;
-
-		collection = gal_view_collection_new ();
-
-		gal_view_collection_set_title (collection, _("Mail"));
-
-		evolution_dir = mail_component_peek_base_directory (mail_component_peek ());
-		galviewsmaildir = g_build_filename (EVOLUTION_GALVIEWSDIR,
-						    "mail",
-						    NULL);
-		dir = g_build_filename (evolution_dir, "views", NULL);
-		gal_view_collection_set_storage_directories (collection, galviewsmaildir, dir);
-		g_free (dir);
-		g_free (galviewsmaildir);
-
-		spec = e_table_specification_new ();
-		etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
-					       "message-list.etspec",
-					       NULL);
-		if (!e_table_specification_load_from_file (spec, etspecfile))
-			g_error ("Unable to load ETable specification file "
-				 "for mail");
-		g_free (etspecfile);
-
-		factory = gal_view_factory_etable_new (spec);
-		g_object_unref (spec);
-		gal_view_collection_add_factory (collection, factory);
-		g_object_unref (factory);
-
-		gal_view_collection_load (collection);
-	}
-
-	if (p->view_instance) {
-		g_object_unref(p->view_instance);
-		p->view_instance = NULL;
-	}
-
-	if (p->view_menus) {
-		g_object_unref(p->view_menus);
-		p->view_menus = NULL;
-	}
-
-	/* TODO: should this go through mail-config api? */
-	id = mail_config_folder_to_safe_url (emfv->folder);
-	p->view_instance = gal_view_instance_new (collection, id);
-
-	show_wide = emfv->list_active ? em_folder_browser_get_wide ((EMFolderBrowser *) emfv):FALSE;
-	if (show_wide) {
-		char *safe_id, *filename;
-
-		/* Force to use the wide view */
-		g_free (p->view_instance->custom_filename);
-		g_free (p->view_instance->current_view_filename);
-		safe_id = g_strdup (id);
-		e_filename_make_safe (safe_id);
-		filename = g_strdup_printf ("custom_wide_view-%s.xml", safe_id);
-		p->view_instance->custom_filename = g_build_filename (collection->local_dir, filename, NULL);
-		g_free (filename);
-		filename = g_strdup_printf ("current_wide_view-%s.xml", safe_id);
-		p->view_instance->current_view_filename = g_build_filename (collection->local_dir, filename, NULL);
-		g_free (filename);
-		g_free (safe_id);
-	}
-	g_free (id);
-
-	outgoing = em_utils_folder_is_drafts (emfv->folder, emfv->folder_uri)
-		|| em_utils_folder_is_sent (emfv->folder, emfv->folder_uri)
-		|| em_utils_folder_is_outbox (emfv->folder, emfv->folder_uri);
-
-	if (outgoing) {
-		if (show_wide)
-			gal_view_instance_set_default_view(p->view_instance, "Wide_View_Sent");
-		else
-			gal_view_instance_set_default_view(p->view_instance, "As_Sent_Folder");
-	} else if (show_wide) {
-		gal_view_instance_set_default_view(p->view_instance, "Wide_View_Normal");
-	}
-
-	gal_view_instance_load(p->view_instance);
-
-	if (!gal_view_instance_exists(p->view_instance)) {
-		struct stat st;
-		char *path;
-
-		path = mail_config_folder_to_cachename (emfv->folder, "et-header-");
-		if (path && g_stat (path, &st) == 0 && st.st_size > 0 && S_ISREG (st.st_mode)) {
-			ETableSpecification *spec;
-			ETableState *state;
-			GalView *view;
-			char *etspecfile;
-
-			spec = e_table_specification_new ();
-			etspecfile = g_build_filename (EVOLUTION_ETSPECDIR,
-						       "message-list.etspec",
-						       NULL);
-			e_table_specification_load_from_file (spec, etspecfile);
-			g_free (etspecfile);
-			view = gal_view_etable_new (spec, "");
-			g_object_unref (spec);
-
-			state = e_table_state_new ();
-			e_table_state_load_from_file (state, path);
-			gal_view_etable_set_state (GAL_VIEW_ETABLE (view), state);
-			g_object_unref (state);
-
-			gal_view_instance_set_custom_view(p->view_instance, view);
-			g_object_unref (view);
-		}
-
-		g_free (path);
-	}
-
-	g_signal_connect(p->view_instance, "display_view", G_CALLBACK(emfv_list_display_view), emfv);
-	emfv_list_display_view(p->view_instance, gal_view_instance_get_current_view(p->view_instance), emfv);
-
-	if (emfv->list_active && emfv->uic) {
-		p->view_menus = gal_view_menus_new(p->view_instance);
-		gal_view_menus_apply(p->view_menus, emfv->uic, NULL);
-	}
-}
-
-void em_folder_view_setup_view_instance (EMFolderView *emfv)
-{
-	emfv_setup_view_instance (emfv);
-}
-
 /* ********************************************************************** */
 
 static void
@@ -757,7 +593,9 @@
 	if (folder) {
 		/* We need to set this up to get the right view options for the message-list,
 		 * even if we're not showing it */
+#if 0  /* KILL-BONOBO */
 		emfv_setup_view_instance(emfv);
+#endif
 		camel_object_ref(folder);
 	}
 
@@ -1567,7 +1405,8 @@
 static void
 emfv_prepare_offline(BonoboUIComponent *uid, void *data, const char *path)
 {
-	mail_component_stores_foreach(mail_component_peek(), prepare_offline, NULL);
+	e_mail_shell_module_stores_foreach (
+		mail_shell_module, prepare_offline, NULL);
 }
 
 static void
@@ -1820,6 +1659,7 @@
 static void
 emfv_message_search(BonoboUIComponent *uic, void *data, const char *path)
 {
+#if 0  /* KILL-BONOBO */
 	EMFolderView *emfv = data;
 
 	if (!emfv->list_active) /* We are in new mail window */
@@ -1829,6 +1669,7 @@
 		gtk_widget_grab_focus (((ESearchBar *)((EMFolderBrowser *) emfv)->search)->entry);
 		gtk_option_menu_set_history (GTK_OPTION_MENU (((ESearchBar *)((EMFolderBrowser *) emfv)->search)->scopeoption), 3);
 	}
+#endif
 }
 
 static void
@@ -2108,52 +1949,6 @@
 
 	BONOBO_UI_VERB_END
 };
-static EPixmap emfv_message_pixmaps[] = {
-
-	E_PIXMAP ("/commands/EditCopy", "edit-copy", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/EditCut", "edit-cut", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/EditPaste", "edit-paste", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MailCompose", "mail-message-new", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageApplyFilters", "stock_mail-filters-apply", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageCopy", "mail-copy", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageDelete", "user-trash", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageFilterJunk", "mail-mark-junk", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageFollowUpFlag", "stock_mail-flag-for-followup", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageForward", "mail-forward", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMarkAsImportant", "mail-mark-important", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMarkAsJunk", "mail-mark-junk", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMarkAsNotJunk", "mail-mark-notjunk", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMarkAsRead", "mail-mark-read", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMarkAsUnRead", "mail-mark-unread", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageMove", "mail-move", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageReplyAll", "mail-reply-all", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageReplySender", "mail-reply-sender", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageSaveAs", "document-save-as", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/MessageSearch", "edit-find", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/PrintMessage", "document-print", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/PrintPreviewMessage", "document-print-preview", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/TextZoomIn", "zoom-in", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/TextZoomOut", "zoom-out", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/TextZoomReset", "zoom-original", E_ICON_SIZE_MENU),
-	E_PIXMAP ("/commands/ViewLoadImages", "image-x-generic", E_ICON_SIZE_MENU),
-
-	E_PIXMAP ("/menu/MessagePlaceholder/Message/MessageNavigation/GoTo", "go-jump", E_ICON_SIZE_MENU),
-
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageReplySender", "mail-reply-sender", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageReplyAll", "mail-reply-all", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageForward", "mail-forward", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/PrintMessage", "document-print", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageMove", "mail-move", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageCopy", "mail-copy", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageDelete", "edit-delete", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageMarkAsJunk", "mail-mark-junk", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailMessageToolbar/MessageMarkAsNotJunk", "mail-mark-notjunk", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailNextButtons/MailNext", "go-next", E_ICON_SIZE_LARGE_TOOLBAR),
-	E_PIXMAP ("/Toolbar/MailNextButtons/MailPrevious", "go-previous", E_ICON_SIZE_LARGE_TOOLBAR),
-
-	E_PIXMAP_END
-};
-
 
 static void
 emfv_enable_menus(EMFolderView *emfv)
@@ -2262,7 +2057,6 @@
 static void
 emfv_activate(EMFolderView *emfv, BonoboUIComponent *uic, int act)
 {
-	struct _EMFolderViewPrivate *p = emfv->priv;
 
 	if (act) {
 		em_format_mode_t style;
@@ -2275,8 +2069,6 @@
 			bonobo_ui_util_set_ui(uic, PREFIX, (char *)l->data, emfv->ui_app_name, NULL);
 
 		bonobo_ui_component_add_verb_list_with_data(uic, emfv_message_verbs, emfv);
-		e_pixmaps_update(uic, emfv_message_pixmaps);
-
 		/* must do plugin menu's after main ones because of bonobo bustedness */
 		if (emfv->menu)
 			e_menu_activate((EMenu *)emfv->menu, uic, act);
@@ -2302,8 +2094,10 @@
 			bonobo_ui_component_set_translate (uic, "/", "<status><item name=\"main\"/></status>", NULL);
 
 		/* We need to set this up to get the right view options for the message-list, even if we're not showing it */
+#if 0  /* KILL-BONOBO */
 		if (emfv->folder)
 			emfv_setup_view_instance(emfv);
+#endif
 	} else {
 		const BonoboUIVerb *v;
 
@@ -2314,16 +2108,6 @@
 		for (v = &emfv_message_verbs[0]; v->cname; v++)
 			bonobo_ui_component_remove_verb(uic, v->cname);
 
-		if (p->view_instance) {
-			g_object_unref(p->view_instance);
-			p->view_instance = NULL;
-		}
-
-		if (p->view_menus) {
-			g_object_unref(p->view_menus);
-			p->view_menus = NULL;
-		}
-
 		if (emfv->folder)
 			mail_sync_folder(emfv->folder, NULL, NULL);
 
@@ -2464,6 +2248,7 @@
 	EMFolderView *emfv = data;
 	EMEvent *eme;
 	EMEventTargetMessage *target;
+	EShell *shell;
 
 	if (emfv->preview == NULL) {
 		emfv->priv->nomarkseen = FALSE;
@@ -2475,7 +2260,8 @@
 
 	e_profile_event_emit("goto.loaded", emfv->displayed_uid, 0);
 
-	mail_indicate_new_mail (FALSE);
+	shell = e_shell_module_get_shell (mail_shell_module);
+	e_shell_event (shell, "mail-icon", "evolution-mail");
 
 	/** @Event: message.reading
 	 * @Title: Viewing a message
@@ -3056,6 +2842,7 @@
 static void
 emfv_setting_notify(GConfClient *gconf, guint cnxn_id, GConfEntry *entry, EMFolderView *emfv)
 {
+#if 0  /* KILL-BONOBO */
 	GConfValue *value;
 	char *tkey;
 
@@ -3223,6 +3010,7 @@
 		gtk_paned_set_position (GTK_PANED (emfb->vpane), paned_size);
 		break; }
 	}
+#endif
 }
 
 static void

Modified: branches/kill-bonobo/mail/em-folder-view.h
==============================================================================
--- branches/kill-bonobo/mail/em-folder-view.h	(original)
+++ branches/kill-bonobo/mail/em-folder-view.h	Wed Nov 19 01:39:19 2008
@@ -25,6 +25,7 @@
 
 #include <gtk/gtk.h>
 #include "mail/em-popup.h"
+#include "message-list.h"
 
 /* Standard GObject macros */
 #define EM_TYPE_FOLDER_VIEW \
@@ -47,7 +48,6 @@
 
 G_BEGIN_DECLS
 
-struct _MessageList;
 struct _EMFormatHTMLDisplay;
 struct _CamelFolder;
 struct _CamelMedium;
@@ -80,7 +80,7 @@
 
 	struct _EMFolderViewPrivate *priv;
 
-	struct _MessageList *list;
+	MessageList *list;
 
 	struct _EMFormatHTMLDisplay *preview;
 

Modified: branches/kill-bonobo/mail/em-mailer-prefs.c
==============================================================================
--- branches/kill-bonobo/mail/em-mailer-prefs.c	(original)
+++ branches/kill-bonobo/mail/em-mailer-prefs.c	Wed Nov 19 01:39:19 2008
@@ -41,6 +41,7 @@
 
 #include "libedataserverui/e-cell-renderer-color.h"
 
+#include "e-util/e-binding.h"
 #include "e-util/e-util-private.h"
 #include "e-util/e-util-labels.h"
 
@@ -51,7 +52,8 @@
 
 static void em_mailer_prefs_class_init (EMMailerPrefsClass *class);
 static void em_mailer_prefs_init       (EMMailerPrefs *dialog);
-static void em_mailer_prefs_finalise   (GObject *obj);
+static void em_mailer_prefs_dispose    (GObject *object);
+static void em_mailer_prefs_finalize   (GObject *object);
 
 static GtkVBoxClass *parent_class = NULL;
 
@@ -127,7 +129,8 @@
 	object_class = (GObjectClass *) klass;
 	parent_class = g_type_class_ref (gtk_vbox_get_type ());
 
-	object_class->finalize = em_mailer_prefs_finalise;
+	object_class->dispose = em_mailer_prefs_dispose;
+	object_class->finalize = em_mailer_prefs_finalize;
 }
 
 static void
@@ -137,7 +140,21 @@
 }
 
 static void
-em_mailer_prefs_finalise (GObject *obj)
+em_mailer_prefs_dispose (GObject *object)
+{
+	EMMailerPrefs *prefs = (EMMailerPrefs *) object;
+
+	if (prefs->shell != NULL) {
+		g_object_unref (prefs->shell);
+		prefs->shell = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+em_mailer_prefs_finalize (GObject *obj)
 {
 	EMMailerPrefs *prefs = (EMMailerPrefs *) obj;
 
@@ -152,29 +169,64 @@
         ((GObjectClass *)(parent_class))->finalize (obj);
 }
 
+static gboolean
+mark_seen_timeout_transform (const GValue *src_value,
+                             GValue *dst_value,
+                             gpointer user_data)
+{
+	gdouble v_double;
+
+	/* Shell Settings (int) -> Spin Button (double) */
+	v_double = (gdouble) g_value_get_int (src_value);
+	g_value_set_double (dst_value, v_double / 1000.0);
 
-static void
-color_button_set_color (GtkColorButton *color_button, const gchar *spec)
-{
-	GdkColor color;
+	return TRUE;
+}
 
-	if (gdk_color_parse (spec, &color))
-		gtk_color_button_set_color (color_button, &color);
+static gboolean
+mark_seen_timeout_reverse_transform (const GValue *src_value,
+                                     GValue *dst_value,
+                                     gpointer user_data)
+{
+	gdouble v_double;
+
+	/* Spin Button (double) -> Shell Settings (int) */
+	v_double = g_value_get_double (src_value);
+	g_value_set_int (dst_value, v_double * 1000);
+
+	return TRUE;
 }
 
-static void
-citation_color_set (GtkColorButton *color_button, EMMailerPrefs *prefs)
+static gboolean
+transform_color_to_string (const GValue *src_value,
+                           GValue *dst_value,
+                           gpointer user_data)
+{
+	const GdkColor *color;
+	gchar *string;
+
+	color = g_value_get_boxed (src_value);
+	string = gdk_color_to_string (color);
+	g_value_set_string (dst_value, string);
+	g_free (string);
+
+	return TRUE;
+}
+
+static gboolean
+transform_string_to_color (const GValue *src_value,
+                           GValue *dst_value,
+                           gpointer user_data)
 {
 	GdkColor color;
-	gchar spec[16];
+	const gchar *string;
+	gboolean success;
 
-	gtk_color_button_get_color (color_button, &color);
-	g_snprintf (spec, sizeof (spec), "#%04x%04x%04x",
-		color.red, color.green, color.blue);
-
-	gconf_client_set_string (prefs->gconf,
-		"/apps/evolution/mail/display/citation_colour",
-		spec, NULL);
+	string = g_value_get_string (src_value);
+	if (gdk_color_parse (string, &color))
+		g_value_set_boxed (dst_value, &color);
+
+	return success;
 }
 
 enum {
@@ -718,80 +770,6 @@
 }
 
 static void
-mark_seen_timeout_changed (GtkSpinButton *spin, EMMailerPrefs *prefs)
-{
-	int timeout;
-
-	timeout = (int) (gtk_spin_button_get_value (prefs->timeout) * 1000.0);
-	gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/display/mark_seen_timeout", timeout, NULL);
-}
-
-static void
-address_compress_count_changed (GtkSpinButton *spin, EMMailerPrefs *prefs)
-{
-	int count;
-
-	count = (int) gtk_spin_button_get_value (prefs->address_count);
-
-	gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/display/address_count", count, NULL);
-}
-
-static void
-mlimit_count_changed (GtkSpinButton *spin, EMMailerPrefs *prefs)
-{
-	int count;
-
-	count = (int) gtk_spin_button_get_value (prefs->mlimit_count);
-
-	gconf_client_set_int (prefs->gconf, "/apps/evolution/mail/display/message_text_part_limit", count, NULL);
-}
-
-static void
-spin_button_init (EMMailerPrefs *prefs, GtkSpinButton *spin, const char *key, float div, GCallback value_changed)
-{
-	GError *err = NULL;
-	double min, max;
-	char *mkey, *p;
-	int val;
-
-	gtk_spin_button_get_range (spin, &min, &max);
-
-	mkey = g_alloca (strlen (key) + 5);
-	p = g_stpcpy (mkey, key);
-	*p++ = '_';
-
-	/* see if the admin locked down the min value */
-	strcpy (p, "min");
-	val = gconf_client_get_int (prefs->gconf, mkey, &err);
-	if (err == NULL)
-		g_clear_error (&err);
-	else
-		min = (1.0 * val) / div;
-
-	/* see if the admin locked down the max value */
-	strcpy (p, "max");
-	val = gconf_client_get_int (prefs->gconf, mkey, &err);
-	if (err == NULL)
-		g_clear_error (&err);
-	else
-		max = (1.0 * val) / div;
-
-	gtk_spin_button_set_range (spin, min, max);
-
-	/* get the value */
-	val = gconf_client_get_int (prefs->gconf, key, NULL);
-	gtk_spin_button_set_value (spin, (1.0 * val) / div);
-
-	if (value_changed) {
-		g_object_set_data ((GObject *) spin, "key", (void *) key);
-		g_signal_connect (spin, "value-changed", value_changed, prefs);
-	}
-
-	if (!gconf_client_key_is_writable (prefs->gconf, key, NULL))
-		gtk_widget_set_sensitive ((GtkWidget *) spin, FALSE);
-}
-
-static void
 toggle_button_toggled (GtkToggleButton *toggle, EMMailerPrefs *prefs)
 {
 	const char *key;
@@ -801,16 +779,6 @@
 }
 
 static void
-photo_toggle_changed (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
-	toggle_button_toggled (toggle, prefs);
-	if (gtk_toggle_button_get_active (toggle))
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->photo_local, TRUE);
-	else
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->photo_local, FALSE);
-}
-
-static void
 junk_book_lookup_button_toggled (GtkToggleButton *toggle, EMMailerPrefs *prefs)
 {
 	toggle_button_toggled (toggle, prefs);
@@ -834,42 +802,6 @@
 
 }
 
-#if 0
-// not used at the moment, commenting out
-static void
-toggle_button_toggled_not (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
-	const char *key;
-
-	key = g_object_get_data ((GObject *) toggle, "key");
-	gconf_client_set_bool (prefs->gconf, key, !gtk_toggle_button_get_active (toggle), NULL);
-}
-#endif
-
-static void
-custom_font_changed (GtkToggleButton *toggle, EMMailerPrefs *prefs)
-{
-	gboolean use_custom;
-
-	use_custom = !gtk_toggle_button_get_active (toggle);
-
-	gtk_widget_set_sensitive (GTK_WIDGET (prefs->font_fixed), use_custom);
-	gtk_widget_set_sensitive (GTK_WIDGET (prefs->font_variable), use_custom);
-
-	gconf_client_set_bool (prefs->gconf, "/apps/evolution/mail/display/fonts/use_custom", use_custom, NULL);
-}
-
-static void
-font_changed (GtkFontButton *font_button, EMMailerPrefs *prefs)
-{
-	const gchar *key;
-	const gchar *font_name;
-
-	key = g_object_get_data (G_OBJECT (font_button), "key");
-	font_name = gtk_font_button_get_font_name (font_button);
-	gconf_client_set_string (prefs->gconf, key, font_name, NULL);
-}
-
 static void
 toggle_button_init (EMMailerPrefs *prefs, GtkToggleButton *toggle, int not, const char *key, GCallback toggled)
 {
@@ -939,10 +871,6 @@
 	int locked, days, hist = 0, i;
 	GtkWidget *menu, *item;
 
-	toggle_button_init (prefs, prefs->empty_trash, FALSE,
-			    "/apps/evolution/mail/trash/empty_on_exit",
-			    G_CALLBACK (toggle_button_toggled));
-
 	days = gconf_client_get_int(prefs->gconf, "/apps/evolution/mail/trash/empty_on_exit_days", NULL);
 	menu = gtk_menu_new();
 	for (i = 0; i < G_N_ELEMENTS (empty_trash_frequency); i++) {
@@ -1160,15 +1088,17 @@
 }
 
 static void
-em_mailer_prefs_construct (EMMailerPrefs *prefs)
+em_mailer_prefs_construct (EMMailerPrefs *prefs,
+                           EShell *shell)
 {
 	GSList *header_config_list, *header_add_list, *p;
+	EShellSettings *shell_settings;
 	GHashTable *default_header_hash;
 	GtkWidget *toplevel;
+	GtkWidget *widget;
 	GtkTreeSelection *selection;
 	GtkCellRenderer *renderer;
 	GtkTreeIter iter;
-	char *font, *buf;
 	GladeXML *gui;
 	gboolean locked;
 	int val, i;
@@ -1177,6 +1107,9 @@
 	GSList *l;
 	char *gladefile;
 
+	prefs->shell = g_object_ref (shell);
+	shell_settings = e_shell_get_settings (shell);
+
 	gladefile = g_build_filename (EVOLUTION_GLADEDIR,
 				      "mail-config.glade",
 				      NULL);
@@ -1202,96 +1135,119 @@
 	/* General tab */
 
 	/* Message Display */
-	prefs->timeout_toggle = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkMarkTimeout"));
-	toggle_button_init (prefs, prefs->timeout_toggle, FALSE,
-			    "/apps/evolution/mail/display/mark_seen",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->timeout = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "spinMarkTimeout"));
-	spin_button_init (prefs, prefs->timeout,
-			  "/apps/evolution/mail/display/mark_seen_timeout",
-			  1000.0, G_CALLBACK (mark_seen_timeout_changed));
-
-	prefs->mlimit_toggle = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "mlimit_checkbutton"));
-	toggle_button_init (prefs, prefs->mlimit_toggle, FALSE,
-			    "/apps/evolution/mail/display/force_message_limit",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->magic_spacebar = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "magic_spacebar_checkbox"));
-	toggle_button_init (prefs, prefs->magic_spacebar, FALSE,
-			    "/apps/evolution/mail/display/magic_spacebar",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->mlimit_count = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "mlimit_spin"));
-	spin_button_init (prefs, prefs->mlimit_count,
-			  "/apps/evolution/mail/display/message_text_part_limit",
-			  1, G_CALLBACK (mlimit_count_changed));
-
-	prefs->address_toggle = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "address_checkbox"));
-	toggle_button_init (prefs, prefs->address_toggle, FALSE,
-			    "/apps/evolution/mail/display/address_compress",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->address_count = GTK_SPIN_BUTTON (glade_xml_get_widget (gui, "address_spin"));
-	spin_button_init (prefs, prefs->address_count,
-			  "/apps/evolution/mail/display/address_count",
-			  1, G_CALLBACK (address_compress_count_changed));
+	widget = glade_xml_get_widget (gui, "chkMarkTimeout");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-mark-seen",
+		G_OBJECT (widget), "active");
+
+	/* The "mark seen" timeout requires special transform functions
+	 * because we display the timeout value to the user in seconds
+	 * but store the settings value in milliseconds. */
+	widget = glade_xml_get_widget (gui, "spinMarkTimeout");
+	prefs->timeout = GTK_SPIN_BUTTON (widget);
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-mark-seen",
+		G_OBJECT (widget), "sensitive");
+	e_mutual_binding_new_full (
+		G_OBJECT (shell_settings), "mail-mark-seen-timeout",
+		G_OBJECT (widget), "value",
+		mark_seen_timeout_transform,
+		mark_seen_timeout_reverse_transform,
+		NULL, NULL);
+
+	widget = glade_xml_get_widget (gui, "mlimit_checkbutton");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-force-message-limit",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "mlimit_spin");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-force-message-limit",
+		G_OBJECT (widget), "sensitive");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-message-text-part-limit",
+		G_OBJECT (widget), "value");
+
+	widget = glade_xml_get_widget (gui, "address_checkbox");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-address-compress",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "address_spin");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-address-compress",
+		G_OBJECT (widget), "sensitive");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-address-count",
+		G_OBJECT (widget), "value");
+
+	widget = glade_xml_get_widget (gui, "magic_spacebar_checkbox");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-magic-spacebar",
+		G_OBJECT (widget), "active");
 
 	prefs->charset = GTK_OPTION_MENU (glade_xml_get_widget (gui, "omenuCharset"));
 	charset_menu_init (prefs);
 
-	prefs->citation_highlight = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkHighlightCitations"));
-	toggle_button_init (prefs, prefs->citation_highlight, FALSE,
-			    "/apps/evolution/mail/display/mark_citations",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->citation_color = GTK_COLOR_BUTTON (glade_xml_get_widget (gui, "colorButtonHighlightCitations"));
-	buf = gconf_client_get_string (prefs->gconf, "/apps/evolution/mail/display/citation_colour", NULL);
-	color_button_set_color (prefs->citation_color, buf ? buf : "#737373");
-	g_signal_connect (prefs->citation_color, "color-set", G_CALLBACK (citation_color_set), prefs);
-	if (!gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/citation_colour", NULL))
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->citation_color, FALSE);
-	g_free (buf);
-
-	prefs->enable_search_folders = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkEnableSearchFolders"));
-	toggle_button_init (prefs, prefs->enable_search_folders, FALSE,
-			    "/apps/evolution/mail/display/enable_vfolders",
-			    G_CALLBACK (toggle_button_toggled));
+	widget = glade_xml_get_widget (gui, "chkHighlightCitations");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-mark-citations",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "colorButtonHighlightCitations");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-mark-citations",
+		G_OBJECT (widget), "sensitive");
+	e_mutual_binding_new_full (
+		G_OBJECT (shell_settings), "mail-citation-color",
+		G_OBJECT (widget), "color",
+		transform_string_to_color,
+		transform_color_to_string,
+		NULL, NULL);
+
+	widget = glade_xml_get_widget (gui, "chkEnableSearchFolders");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-enable-search-folders",
+		G_OBJECT (widget), "active");
 
 	/* Deleting Mail */
-	prefs->empty_trash = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkEmptyTrashOnExit"));
+	widget = glade_xml_get_widget (gui, "chkEmptyTrashOnExit");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-empty-trash-on-exit",
+		G_OBJECT (widget), "active");
+
 	prefs->empty_trash_days = GTK_OPTION_MENU (glade_xml_get_widget (gui, "omenuEmptyTrashDays"));
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-empty-trash-on-exit",
+		G_OBJECT (prefs->empty_trash_days), "sensitive");
 	emmp_empty_trash_init (prefs);
 
-	prefs->confirm_expunge = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkConfirmExpunge"));
-	toggle_button_init (prefs, prefs->confirm_expunge, FALSE,
-			    "/apps/evolution/mail/prompts/expunge",
-			    G_CALLBACK (toggle_button_toggled));
-
-	/* Mail  Fonts */
-	font = gconf_client_get_string (prefs->gconf, "/apps/evolution/mail/display/fonts/monospace", NULL);
-	prefs->font_fixed = GTK_FONT_BUTTON (glade_xml_get_widget (gui, "FontFixed"));
-	gtk_font_button_set_font_name (prefs->font_fixed, font);
-	g_free (font);
-	g_object_set_data ((GObject *) prefs->font_fixed, "key", "/apps/evolution/mail/display/fonts/monospace");
-	g_signal_connect (prefs->font_fixed, "font-set", G_CALLBACK (font_changed), prefs);
-	if (!gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/fonts/monospace", NULL))
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->font_fixed, FALSE);
-
-	font = gconf_client_get_string (prefs->gconf, "/apps/evolution/mail/display/fonts/variable", NULL);
-	prefs->font_variable = GTK_FONT_BUTTON (glade_xml_get_widget (gui, "FontVariable"));
-	gtk_font_button_set_font_name (prefs->font_variable, font);
-	g_free (font);
-	g_object_set_data ((GObject *) prefs->font_variable, "key", "/apps/evolution/mail/display/fonts/variable");
-	g_signal_connect (prefs->font_variable, "font-set", G_CALLBACK (font_changed), prefs);
-	if (!gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/fonts/variable", NULL))
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->font_variable, FALSE);
-
-	prefs->font_share = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "radFontUseSame"));
-	toggle_button_init (prefs, prefs->font_share, TRUE,
-			    "/apps/evolution/mail/display/fonts/use_custom",
-			    G_CALLBACK (custom_font_changed));
-	custom_font_changed (prefs->font_share, prefs);
+	widget = glade_xml_get_widget (gui, "chkConfirmExpunge");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-confirm-expunge",
+		G_OBJECT (widget), "active");
+
+	/* Mail Fonts */
+	widget = glade_xml_get_widget (gui, "radFontUseSame");
+	e_mutual_binding_new_with_negation (
+		G_OBJECT (shell_settings), "mail-use-custom-fonts",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "FontFixed");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-font-monospace",
+		G_OBJECT (widget), "font-name");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-use-custom-fonts",
+		G_OBJECT (widget), "sensitive");
+
+	widget = glade_xml_get_widget (gui, "FontVariable");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-font-variable",
+		G_OBJECT (widget), "font-name");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-use-custom-fonts",
+		G_OBJECT (widget), "sensitive");
 
 	/* HTML Mail tab */
 
@@ -1318,15 +1274,15 @@
 	g_signal_connect (prefs->images_sometimes, "toggled", G_CALLBACK (http_images_changed), prefs);
 	g_signal_connect (prefs->images_always, "toggled", G_CALLBACK (http_images_changed), prefs);
 
-	prefs->show_animated = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkShowAnimatedImages"));
-	toggle_button_init (prefs, prefs->show_animated, FALSE,
-			    "/apps/evolution/mail/display/animate_images",
-			    G_CALLBACK (toggle_button_toggled));
-
-	prefs->prompt_unwanted_html = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkPromptWantHTML"));
-	toggle_button_init (prefs, prefs->prompt_unwanted_html, FALSE,
-			    "/apps/evolution/mail/prompts/unwanted_html",
-			    G_CALLBACK (toggle_button_toggled));
+	widget = glade_xml_get_widget (gui, "chkShowAnimatedImages");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-show-animated-images",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "chkPromptWantHTML");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-confirm-unwanted-html",
+		G_OBJECT (widget), "active");
 
 	/* Labels... */
 	locked = !gconf_client_key_is_writable (prefs->gconf, E_UTIL_LABELS_GCONF_KEY, NULL);
@@ -1351,16 +1307,18 @@
 	/* headers */
 	locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/headers", NULL);
 
-	prefs->photo_show= GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "photo_show"));
-	toggle_button_init (prefs, prefs->photo_show, FALSE,
-			    "/apps/evolution/mail/display/sender_photo",
-			    G_CALLBACK (photo_toggle_changed));
-	prefs->photo_local = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "photo_local"));
-	toggle_button_init (prefs, prefs->photo_local, FALSE,
-			    "/apps/evolution/mail/display/photo_local",
-			    G_CALLBACK (toggle_button_toggled));
-	if (!gtk_toggle_button_get_active (prefs->photo_show))
-		gtk_widget_set_sensitive ((GtkWidget *) prefs->photo_local, FALSE);
+	widget = glade_xml_get_widget (gui, "photo_show");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-show-sender-photo",
+		G_OBJECT (widget), "active");
+
+	widget = glade_xml_get_widget (gui, "photo_local");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-show-sender-photo",
+		G_OBJECT (widget), "sensitive");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-only-local-photos",
+		G_OBJECT (widget), "active");
 
 	/* always de-sensitised until the user types something in the entry */
 	prefs->add_header = GTK_BUTTON (glade_xml_get_widget (gui, "cmdHeadersAdd"));
@@ -1467,10 +1425,10 @@
 	g_slist_free (header_add_list);
 
 	/* Junk prefs */
-	prefs->check_incoming = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "chkCheckIncomingMail"));
-	toggle_button_init (prefs, prefs->check_incoming, FALSE,
-			    "/apps/evolution/mail/junk/check_incoming",
-			    G_CALLBACK (toggle_button_toggled));
+	widget = glade_xml_get_widget (gui, "chkCheckIncomingMail");
+	e_mutual_binding_new (
+		G_OBJECT (shell_settings), "mail-check-for-junk",
+		G_OBJECT (widget), "active");
 
 	prefs->empty_junk = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "junk_empty_check"));
 	prefs->empty_junk_days = GTK_OPTION_MENU (glade_xml_get_widget (gui, "junk_empty_combo"));
@@ -1515,12 +1473,14 @@
 }
 
 GtkWidget *
-em_mailer_prefs_new (void)
+em_mailer_prefs_new (EShell *shell)
 {
 	EMMailerPrefs *new;
 
+	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
+
 	new = (EMMailerPrefs *) g_object_new (em_mailer_prefs_get_type (), NULL);
-	em_mailer_prefs_construct (new);
+	em_mailer_prefs_construct (new, shell);
 
 	return (GtkWidget *) new;
 }

Modified: branches/kill-bonobo/mail/em-mailer-prefs.h
==============================================================================
--- branches/kill-bonobo/mail/em-mailer-prefs.h	(original)
+++ branches/kill-bonobo/mail/em-mailer-prefs.h	Wed Nov 19 01:39:19 2008
@@ -26,6 +26,7 @@
 #include <gtk/gtk.h>
 #include <glade/glade.h>
 #include <gconf/gconf-client.h>
+#include <shell/e-shell.h>
 
 /* Standard GObject macros */
 #define EM_TYPE_MAILER_PREFS \
@@ -61,42 +62,25 @@
 struct _EMMailerPrefs {
 	GtkVBox parent_object;
 
+	EShell *shell;
 	GladeXML *gui;
 	GConfClient *gconf;
 
 	/* General tab */
 
 	/* Message Display */
-	GtkToggleButton *timeout_toggle;
 	GtkSpinButton *timeout;
-	GtkToggleButton *address_toggle;
-	GtkSpinButton *address_count;
-	GtkToggleButton *mlimit_toggle;
-	GtkSpinButton *mlimit_count;
 	GtkOptionMenu *charset;
-	GtkToggleButton *citation_highlight;
-	GtkColorButton *citation_color;
-	GtkToggleButton *enable_search_folders;
-	GtkToggleButton *magic_spacebar;
 
 	/* Deleting Mail */
-	GtkToggleButton *empty_trash;
 	GtkOptionMenu *empty_trash_days;
-	GtkToggleButton *confirm_expunge;
-
-	/* HTML Mail tab */
-	GtkFontButton *font_variable;
-	GtkFontButton *font_fixed;
-	GtkToggleButton *font_share;
 
 	/* Loading Images */
 	GtkToggleButton *images_always;
 	GtkToggleButton *images_sometimes;
 	GtkToggleButton *images_never;
 
-	GtkToggleButton *show_animated;
 	GtkToggleButton *autodetect_links;
-	GtkToggleButton *prompt_unwanted_html;
 
 	/* Labels and Colours tab */
 	GtkWidget *label_add;
@@ -112,11 +96,8 @@
 	GtkEntry *entry_header;
 	GtkTreeView *header_list;
 	GtkListStore *header_list_store;
-	GtkToggleButton *photo_show;
-	GtkToggleButton *photo_local;
 
 	/* Junk prefs */
-	GtkToggleButton *check_incoming;
 	GtkToggleButton *empty_junk;
 	GtkOptionMenu *empty_junk_days;
 	
@@ -142,7 +123,7 @@
 GType		em_mailer_prefs_get_type	(void);
 GtkWidget *	create_combo_text_widget	(void);
 
-GtkWidget *	em_mailer_prefs_new		(void);
+GtkWidget *	em_mailer_prefs_new		(EShell *shell);
 
 EMMailerPrefsHeader *
 		em_mailer_prefs_header_from_xml	(const gchar *xml);

Modified: branches/kill-bonobo/mail/em-message-browser.c
==============================================================================
--- branches/kill-bonobo/mail/em-message-browser.c	(original)
+++ branches/kill-bonobo/mail/em-message-browser.c	Wed Nov 19 01:39:19 2008
@@ -52,8 +52,6 @@
 #include "em-message-browser.h"
 #include "em-menu.h"
 
-#include "evolution-shell-component-utils.h" /* Pixmap stuff, sigh */
-
 #define EM_MESSAGE_BROWSER_GET_PRIVATE(obj) \
 	(G_TYPE_INSTANCE_GET_PRIVATE \
 	((obj), EM_TYPE_MESSAGE_BROWSER, EMMessageBrowserPrivate))

Modified: branches/kill-bonobo/mail/mail-component.c
==============================================================================
--- branches/kill-bonobo/mail/mail-component.c	(original)
+++ branches/kill-bonobo/mail/mail-component.c	Wed Nov 19 01:39:19 2008
@@ -1571,26 +1571,6 @@
 //	return mc_default_folders[id].uri;
 //}
 
-/**
- * mail_indicate_new_mail
- * Indicates new mail in a shell window.
- * @param have_new_mail TRUE when have new mail, false otherwise.
- **/
-//void
-//mail_indicate_new_mail (gboolean have_new_mail)
-//{
-//	const char *icon = NULL;
-//	MailComponent *mc = mail_component_peek ();
-//
-//	g_return_if_fail (mc != NULL);
-//
-//	if (have_new_mail)
-//		icon = "mail-unread";
-//
-//	if (mc->priv->component_view)
-//		e_component_view_set_button_icon (mc->priv->component_view, icon);
-//}
-
 void
 mail_component_show_logger (gpointer top)
 {

Modified: branches/kill-bonobo/mail/mail-folder-cache.c
==============================================================================
--- branches/kill-bonobo/mail/mail-folder-cache.c	(original)
+++ branches/kill-bonobo/mail/mail-folder-cache.c	Wed Nov 19 01:39:19 2008
@@ -198,7 +198,8 @@
 			t->name = em_folder_tree_model_get_folder_name (model, up->store, up->full_name);
 
 			if (t->new > 0)
-				e_shell_event (shell, "new-mail", NULL);
+				e_shell_event (
+					shell, "mail-icon", "mail-unread");
 
 			/** @Event: folder.changed
 			 * @Title: Folder changed

Modified: branches/kill-bonobo/mail/message-list.h
==============================================================================
--- branches/kill-bonobo/mail/message-list.h	(original)
+++ branches/kill-bonobo/mail/message-list.h	Wed Nov 19 01:39:19 2008
@@ -28,6 +28,8 @@
 #include <table/e-table-simple.h>
 #include <table/e-tree-scrolled.h>
 
+#include <camel/camel-folder.h>
+
 #ifdef __cplusplus
 extern "C" {
 #pragma }

Modified: branches/kill-bonobo/shell/Makefile.am
==============================================================================
--- branches/kill-bonobo/shell/Makefile.am	(original)
+++ branches/kill-bonobo/shell/Makefile.am	Wed Nov 19 01:39:19 2008
@@ -62,6 +62,7 @@
 	e-shell-common.h			\
 	e-shell-content.h			\
 	e-shell-module.h			\
+	e-shell-settings.h			\
 	e-shell-sidebar.h			\
 	e-shell-switcher.h			\
 	e-shell-taskbar.h			\
@@ -74,6 +75,7 @@
 	$(IDL_GENERATED)			\
 	e-shell-content.c			\
 	e-shell-module.c			\
+	e-shell-settings.c			\
 	e-shell-sidebar.c			\
 	e-shell-switcher.c			\
 	e-shell-taskbar.c			\

Added: branches/kill-bonobo/shell/e-shell-settings.c
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-settings.c	Wed Nov 19 01:39:19 2008
@@ -0,0 +1,201 @@
+/*
+ * e-shell-settings.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#include "e-shell-settings.h"
+
+#include "e-util/gconf-bridge.h"
+
+#define E_SHELL_SETTINGS_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_SHELL_SETTINGS, EShellSettingsPrivate))
+
+struct _EShellSettingsPrivate {
+	GArray *value_array;
+};
+
+static GList *instances;
+static guint property_count;
+static gpointer parent_class;
+
+static void
+shell_settings_set_property (GObject *object,
+                             guint property_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
+{
+	EShellSettingsPrivate *priv;
+	GValue *dest_value;
+
+	priv = E_SHELL_SETTINGS_GET_PRIVATE (object);
+
+	dest_value = &g_array_index (
+		priv->value_array, GValue, property_id - 1);
+
+	g_value_copy (value, dest_value);
+	g_object_notify (object, pspec->name);
+}
+
+static void
+shell_settings_get_property (GObject *object,
+                             guint property_id,
+                             GValue *value,
+                             GParamSpec *pspec)
+{
+	EShellSettingsPrivate *priv;
+	GValue *src_value;
+
+	priv = E_SHELL_SETTINGS_GET_PRIVATE (object);
+
+	src_value = &g_array_index (
+		priv->value_array, GValue, property_id - 1);
+
+	g_value_copy (src_value, value);
+}
+
+static void
+shell_settings_finalize (GObject *object)
+{
+	EShellSettingsPrivate *priv;
+	guint ii;
+
+	priv = E_SHELL_SETTINGS_GET_PRIVATE (object);
+
+	for (ii = 0; ii < priv->value_array->len; ii++)
+		g_value_unset (&g_array_index (priv->value_array, GValue, ii));
+
+	g_array_free (priv->value_array, TRUE);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+shell_settings_class_init (EShellSettingsClass *class)
+{
+	GObjectClass *object_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (EShellSettingsPrivate));
+
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = shell_settings_set_property;
+	object_class->get_property = shell_settings_get_property;
+	object_class->finalize = shell_settings_finalize;
+}
+
+static void
+shell_settings_init (EShellSettings *shell_settings,
+                     GObjectClass *object_class)
+{
+	GArray *value_array;
+
+	instances = g_list_prepend (instances, shell_settings);
+
+	value_array = g_array_new (FALSE, TRUE, sizeof (GValue));
+	g_array_set_size (value_array, property_count);
+
+	shell_settings->priv = E_SHELL_SETTINGS_GET_PRIVATE (shell_settings);
+	shell_settings->priv->value_array = value_array;
+}
+
+GType
+e_shell_settings_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		const GTypeInfo type_info = {
+			sizeof (EShellSettingsClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) shell_settings_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL,  /* class_data */
+			sizeof (EShellSettings),
+			0,     /* n_preallocs */
+			(GInstanceInitFunc) shell_settings_init,
+			NULL   /* value_table */
+		};
+
+		type = g_type_register_static (
+			G_TYPE_OBJECT, "EShellSettings", &type_info, 0);
+	}
+
+	return type;
+}
+
+void
+e_shell_settings_install_property (GParamSpec *pspec)
+{
+	static GObjectClass *class = NULL;
+	GList *iter, *next;
+
+	g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+
+	if (G_UNLIKELY (class == NULL))
+		class = g_type_class_ref (E_TYPE_SHELL_SETTINGS);
+
+	if (g_object_class_find_property (class, pspec->name) != NULL) {
+		g_warning (
+			"Settings property \"%s\" already exists",
+			pspec->name);
+		return;
+	}
+
+	for (iter = instances; iter != NULL; iter = iter->next)
+		g_object_freeze_notify (iter->data);
+
+	g_object_class_install_property (class, ++property_count, pspec);
+
+	for (iter = instances; iter != NULL; iter = iter->next) {
+		EShellSettings *shell_settings = iter->data;
+		GArray *value_array;
+		GValue *value;
+
+		value_array = shell_settings->priv->value_array;
+		g_array_set_size (value_array, property_count);
+
+		value = &g_array_index (
+			value_array, GValue, property_count - 1);
+		g_value_init (value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+		g_param_value_set_default (pspec, value);
+		g_object_notify (G_OBJECT (shell_settings), pspec->name);
+	}
+
+	for (iter = instances; iter != NULL; iter = next) {
+		next = iter->next;
+		g_object_thaw_notify (iter->data);
+	}
+}
+
+void
+e_shell_settings_bind_to_gconf (EShellSettings *shell_settings,
+                                const gchar *property_name,
+                                const gchar *gconf_key)
+{
+	g_return_if_fail (E_IS_SHELL_SETTINGS (shell_settings));
+	g_return_if_fail (property_name != NULL);
+	g_return_if_fail (gconf_key != NULL);
+
+	gconf_bridge_bind_property (
+		gconf_bridge_get (), gconf_key,
+		G_OBJECT (shell_settings), property_name);
+}

Added: branches/kill-bonobo/shell/e-shell-settings.h
==============================================================================
--- (empty file)
+++ branches/kill-bonobo/shell/e-shell-settings.h	Wed Nov 19 01:39:19 2008
@@ -0,0 +1,82 @@
+/*
+ * e-shell-settings.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>  
+ *
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+/**
+ * SECTION: e-shell-settings
+ * @short_description: settings management
+ * @include: shell/e-shell-settings.h
+ **/
+
+#ifndef E_SHELL_SETTINGS_H
+#define E_SHELL_SETTINGS_H
+
+#include <shell/e-shell-common.h>
+
+/* Standard GObject macros */
+#define E_TYPE_SHELL_SETTINGS \
+	(e_shell_settings_get_type ())
+#define E_SHELL_SETTINGS(obj) \
+	(G_TYPE_CHECK_INSTANCE_CAST \
+	((obj), E_TYPE_SHELL_SETTINGS, EShellSettings))
+#define E_SHELL_SETTINGS_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_CAST \
+	((cls), E_TYPE_SHELL_SETTINGS, EShellSettingsClass))
+#define E_IS_SHELL_SETTINGS(obj) \
+	(G_TYPE_CHECK_INSTANCE_TYPE \
+	((obj), E_TYPE_SHELL_SETTINGS))
+#define E_IS_SHELL_SETTINGS_CLASS(cls) \
+	(G_TYPE_CHECK_CLASS_TYPE \
+	((cls), E_TYPE_SHELL_SETTINGS))
+#define E_SHELL_SETTINGS_GET_CLASS(obj) \
+	(G_TYPE_INSTANCE_GET_CLASS \
+	((obj), E_TYPE_SHELL_SETTINGS, EShellSettingsClass))
+
+G_BEGIN_DECLS
+
+typedef struct _EShellSettings EShellSettings;
+typedef struct _EShellSettingsClass EShellSettingsClass;
+typedef struct _EShellSettingsPrivate EShellSettingsPrivate;
+
+/**
+ * EShellSettings:
+ *
+ * Contains only private data that should be read and manipulated using the
+ * functions below.
+ **/
+struct _EShellSettings {
+	GObject parent;
+	EShellSettingsPrivate *priv;
+};
+
+struct _EShellSettingsClass {
+	GObjectClass parent_class;
+};
+
+GType		e_shell_settings_get_type	(void);
+void		e_shell_settings_install_property
+						(GParamSpec *pspec);
+void		e_shell_settings_bind_to_gconf	(EShellSettings *shell_settings,
+						 const gchar *property_name,
+						 const gchar *gconf_key);
+
+G_END_DECLS
+
+#endif /* E_SHELL_SETTINGS_H */

Modified: branches/kill-bonobo/shell/e-shell-view.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell-view.c	(original)
+++ branches/kill-bonobo/shell/e-shell-view.c	Wed Nov 19 01:39:19 2008
@@ -111,6 +111,17 @@
 }
 
 static void
+shell_view_update_view_id (EShellView *shell_view,
+                           GalViewInstance *view_instance)
+{
+	gchar *view_id;
+
+	view_id = gal_view_instance_get_current_view_id (view_instance);
+	e_shell_view_set_view_id (shell_view, view_id);
+	g_free (view_id);
+}
+
+static void
 shell_view_emit_toggled (EShellView *shell_view)
 {
 	g_signal_emit (shell_view, signals[TOGGLED], 0);
@@ -967,3 +978,35 @@
 			GTK_MENU (menu), NULL, NULL, NULL, NULL,
 			0, gtk_get_current_event_time ());
 }
+
+/**
+ * e_shell_view_new_view_instance:
+ * @shell_view: an #EShellView
+ * @instance_id: a name for the #GalViewInstance
+ *
+ * Creates a new #GalViewInstance and configures it to keep
+ * @shell_view<!-- -->'s #EShellView:view-id property up-to-date.
+ *
+ * Returns: a new #GalViewInstance
+ **/
+GalViewInstance *
+e_shell_view_new_view_instance (EShellView *shell_view,
+                                const gchar *instance_id)
+{
+	EShellViewClass *shell_view_class;
+	GalViewCollection *view_collection;
+	GalViewInstance *view_instance;
+
+	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+	shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
+
+	view_collection = shell_view_class->view_collection;
+	view_instance = gal_view_instance_new (view_collection, instance_id);
+
+	g_signal_connect_swapped (
+		view_instance, "changed",
+		G_CALLBACK (shell_view_update_view_id), shell_view);
+
+	return view_instance;
+}

Modified: branches/kill-bonobo/shell/e-shell-view.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell-view.h	(original)
+++ branches/kill-bonobo/shell/e-shell-view.h	Wed Nov 19 01:39:19 2008
@@ -36,6 +36,7 @@
 #include <shell/e-shell-window.h>
 
 #include <widgets/menus/gal-view-collection.h>
+#include <widgets/menus/gal-view-instance.h>
 
 /* Standard GObject macros */
 #define E_TYPE_SHELL_VIEW \
@@ -174,6 +175,9 @@
 void		e_shell_view_show_popup_menu	(EShellView *shell_view,
 						 const gchar *widget_path,
 						 GdkEventButton *event);
+GalViewInstance *
+		e_shell_view_new_view_instance	(EShellView *shell_view,
+						 const gchar *instance_id);
 
 G_END_DECLS
 

Modified: branches/kill-bonobo/shell/e-shell.c
==============================================================================
--- branches/kill-bonobo/shell/e-shell.c	(original)
+++ branches/kill-bonobo/shell/e-shell.c	Wed Nov 19 01:39:19 2008
@@ -37,6 +37,7 @@
 
 struct _EShellPrivate {
 	GList *active_windows;
+	EShellSettings *settings;
 	EShellLineStatus line_status;
 
 	/* Shell Modules */
@@ -50,7 +51,8 @@
 
 enum {
 	PROP_0,
-	PROP_ONLINE_MODE
+	PROP_ONLINE_MODE,
+	PROP_SETTINGS
 };
 
 enum {
@@ -261,6 +263,12 @@
 				value, e_shell_get_online_mode (
 				E_SHELL (object)));
 			return;
+
+		case PROP_SETTINGS:
+			g_value_set_object (
+				value, e_shell_get_settings (
+				E_SHELL (object)));
+			return;
 	}
 
 	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -273,6 +281,11 @@
 
 	priv = E_SHELL_GET_PRIVATE (object);
 
+	if (priv->settings != NULL) {
+		g_object_unref (priv->settings);
+		priv->settings = NULL;
+	}
+
 	g_list_foreach (
 		priv->loaded_modules,
 		(GFunc) g_type_module_unuse, NULL);
@@ -358,6 +371,16 @@
 			G_PARAM_READWRITE |
 			G_PARAM_CONSTRUCT));
 
+	g_object_class_install_property (
+		object_class,
+		PROP_SETTINGS,
+		g_param_spec_object (
+			"settings",
+			_("Settings"),
+			_("Application settings"),
+			E_TYPE_SHELL_SETTINGS,
+			G_PARAM_READABLE));
+
 	signals[EVENT] = g_signal_new (
 		"event",
 		G_OBJECT_CLASS_TYPE (object_class),
@@ -415,6 +438,7 @@
 	modules_by_name = g_hash_table_new (g_str_hash, g_str_equal);
 	modules_by_scheme = g_hash_table_new (g_str_hash, g_str_equal);
 
+	shell->priv->settings = g_object_new (E_TYPE_SHELL_SETTINGS, NULL);
 	shell->priv->modules_by_name = modules_by_name;
 	shell->priv->modules_by_scheme = modules_by_scheme;
 	shell->priv->safe_mode = e_file_lock_exists ();
@@ -517,6 +541,14 @@
 	return g_hash_table_lookup (hash_table, scheme);
 }
 
+EShellSettings *
+e_shell_get_settings (EShell *shell)
+{
+	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
+
+	return shell->priv->settings;
+}
+
 GtkWidget *
 e_shell_create_window (EShell *shell)
 {

Modified: branches/kill-bonobo/shell/e-shell.h
==============================================================================
--- branches/kill-bonobo/shell/e-shell.h	(original)
+++ branches/kill-bonobo/shell/e-shell.h	Wed Nov 19 01:39:19 2008
@@ -30,6 +30,7 @@
 
 #include <shell/e-shell-common.h>
 #include <shell/e-shell-module.h>
+#include <shell/e-shell-settings.h>
 
 /* Standard GObject macros */
 #define E_TYPE_SHELL \
@@ -89,6 +90,7 @@
 						 const gchar *name);
 EShellModule *	e_shell_get_module_by_scheme	(EShell *shell,
 						 const gchar *scheme);
+EShellSettings *e_shell_get_settings		(EShell *shell);
 GtkWidget *	e_shell_create_window		(EShell *shell);
 GtkWidget *	e_shell_get_focused_window	(EShell *shell);
 gboolean	e_shell_handle_uri		(EShell *shell,



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