[evolution/kill-bonobo] Add properties to calendar classes.



commit 2fe24b4c136b4d5f255af3571c3d6e1082071809
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Jul 30 12:38:24 2009 -0400

    Add properties to calendar classes.
    
    So we can bind them to EShellSettings and kill off EDayViewConfig
    and similar GConf notification classes.

 calendar/gui/Makefile.am                |    6 -
 calendar/gui/e-cal-list-view-config.c   |  203 ------------
 calendar/gui/e-cal-list-view-config.h   |   56 ----
 calendar/gui/e-cal-model.c              |  274 +++++++++-------
 calendar/gui/e-calendar-view.c          |   67 +++--
 calendar/gui/e-day-view-config.c        |  464 --------------------------
 calendar/gui/e-day-view-config.h        |   56 ----
 calendar/gui/e-day-view-main-item.c     |    2 +-
 calendar/gui/e-day-view-time-item.c     |    2 +-
 calendar/gui/e-day-view.c               |  518 +++++++++++++++++++++++++-----
 calendar/gui/e-day-view.h               |   47 ++-
 calendar/gui/e-week-view-config.c       |  288 ----------------
 calendar/gui/e-week-view-config.h       |   55 ----
 calendar/gui/e-week-view.c              |  540 +++++++++++++++++++------------
 calendar/gui/e-week-view.h              |    4 +-
 calendar/gui/gnome-cal.c                |   21 +--
 modules/calendar/e-cal-shell-content.c  |  183 ++++++++++-
 modules/calendar/e-cal-shell-settings.c |  170 ++++++++++
 18 files changed, 1343 insertions(+), 1613 deletions(-)
---
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
index 7bc52c9..0878c0e 100644
--- a/calendar/gui/Makefile.am
+++ b/calendar/gui/Makefile.am
@@ -83,8 +83,6 @@ libcal_gui_la_SOURCES =		\
 	e-cal-popup.c				\
 	e-cal-list-view.c			\
 	e-cal-list-view.h			\
-	e-cal-list-view-config.c		\
-	e-cal-list-view-config.h		\
 	e-cal-model-memos.c			\
 	e-cal-model-memos.h			\
 	e-calendar-table-config.c		\
@@ -101,8 +99,6 @@ libcal_gui_la_SOURCES =		\
 	e-date-edit-config.h			\
 	e-date-time-list.c                      \
 	e-date-time-list.h                      \
-	e-day-view-config.c			\
-	e-day-view-config.h			\
 	e-day-view-layout.c			\
 	e-day-view-layout.h			\
 	e-day-view-main-item.c			\
@@ -144,8 +140,6 @@ libcal_gui_la_SOURCES =		\
 	e-select-names-renderer.h		\
 	e-task-list-selector.c			\
 	e-task-list-selector.h			\
-	e-week-view-config.c			\
-	e-week-view-config.h			\
 	e-week-view-event-item.c		\
 	e-week-view-event-item.h		\
 	e-week-view-layout.c			\
diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c
index 7476359..c87674f 100644
--- a/calendar/gui/e-cal-model.c
+++ b/calendar/gui/e-cal-model.c
@@ -38,6 +38,14 @@
 #include "calendar-config.h"
 #include "e-util/e-util.h"
 
+#define E_CAL_MODEL_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_CAL_MODEL, ECalModelPrivate))
+
+#define E_CAL_MODEL_COMPONENT_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE \
+	((obj), E_TYPE_CAL_MODEL_COMPONENT, ECalModelComponentPrivate))
+
 typedef struct {
 	ECal *client;
 	ECalView *query;
@@ -83,13 +91,6 @@ struct _ECalModelPrivate {
 	gpointer get_default_time_user_data;
 };
 
-#define E_CAL_MODEL_COMPONENT_GET_PRIVATE(obj) \
-	(G_TYPE_INSTANCE_GET_PRIVATE \
-	((obj), E_TYPE_CAL_MODEL_COMPONENT, ECalModelComponentPrivate))
-
-static void e_cal_model_dispose (GObject *object);
-static void e_cal_model_finalize (GObject *object);
-
 static gint ecm_column_count (ETableModel *etm);
 static gint ecm_row_count (ETableModel *etm);
 static gpointer ecm_value_at (ETableModel *etm, gint col, gint row);
@@ -109,7 +110,11 @@ static ECalModelClient *find_client_data (ECalModel *model, ECal *client);
 static void remove_client_objects (ECalModel *model, ECalModelClient *client_data);
 static void remove_client (ECalModel *model, ECalModelClient *client_data);
 
-/* Signal IDs */
+enum {
+	PROP_0,
+	PROP_USE_24_HOUR_FORMAT
+};
+
 enum {
 	TIME_RANGE_CHANGED,
 	ROW_APPENDED,
@@ -119,19 +124,124 @@ enum {
 	LAST_SIGNAL
 };
 
-static guint signals[LAST_SIGNAL] = { 0 };
+static gpointer parent_class;
+static guint signals[LAST_SIGNAL];
 
 G_DEFINE_TYPE (ECalModel, e_cal_model, E_TABLE_MODEL_TYPE)
 
 static void
-e_cal_model_class_init (ECalModelClass *klass)
+cal_model_set_property (GObject *object,
+                        guint property_id,
+                        const GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_USE_24_HOUR_FORMAT:
+			e_cal_model_set_use_24_hour_format (
+				E_CAL_MODEL (object),
+				g_value_get_boolean (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+cal_model_get_property (GObject *object,
+                        guint property_id,
+                        GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_USE_24_HOUR_FORMAT:
+			g_value_set_boolean (
+				value,
+				e_cal_model_get_use_24_hour_format (
+				E_CAL_MODEL (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+cal_model_dispose (GObject *object)
+{
+	ECalModelPrivate *priv;
+
+	priv = E_CAL_MODEL_GET_PRIVATE (object);
+
+	if (priv->clients) {
+		while (priv->clients != NULL) {
+			ECalModelClient *client_data = (ECalModelClient *) priv->clients->data;
+
+			g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA,
+							      0, 0, NULL, NULL, object);
+			if (client_data->query)
+				g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA,
+								      0, 0, NULL, NULL, object);
+
+			priv->clients = g_list_remove (priv->clients, client_data);
+
+			g_object_unref (client_data->client);
+			if (client_data->query)
+				g_object_unref (client_data->query);
+			g_free (client_data);
+		}
+
+		priv->clients = NULL;
+		priv->default_client = NULL;
+	}
+
+	/* Chain up to parent's dispose() method. */
+	G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+cal_model_finalize (GObject *object)
+{
+	ECalModelPrivate *priv;
+	gint ii;
+
+	priv = E_CAL_MODEL_GET_PRIVATE (object);
+
+	g_free (priv->search_sexp);
+	g_free (priv->full_sexp);
+
+	g_free (priv->default_category);
+
+	for (ii = 0; ii < priv->objects->len; ii++) {
+		ECalModelComponent *comp_data;
+
+		comp_data = g_ptr_array_index (priv->objects, ii);
+		if (comp_data == NULL) {
+			g_warning ("comp_data is null\n");
+			continue;
+		}
+		e_cal_model_free_component_data (comp_data);
+	}
+	g_ptr_array_free (priv->objects, FALSE);
+
+	/* Chain up to parent's finalize() method. */
+	G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+e_cal_model_class_init (ECalModelClass *class)
 {
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	ETableModelClass *etm_class = E_TABLE_MODEL_CLASS (klass);
+	GObjectClass *object_class;
+	ETableModelClass *etm_class;
+
+	parent_class = g_type_class_peek_parent (class);
+	g_type_class_add_private (class, sizeof (ECalModelPrivate));
 
-	object_class->dispose = e_cal_model_dispose;
-	object_class->finalize = e_cal_model_finalize;
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = cal_model_set_property;
+	object_class->get_property = cal_model_get_property;
+	object_class->dispose = cal_model_dispose;
+	object_class->finalize = cal_model_finalize;
 
+	etm_class = E_TABLE_MODEL_CLASS (class);
 	etm_class->column_count = ecm_column_count;
 	etm_class->row_count = ecm_row_count;
 	etm_class->value_at = ecm_value_at;
@@ -144,12 +254,22 @@ e_cal_model_class_init (ECalModelClass *klass)
 	etm_class->value_is_empty = ecm_value_is_empty;
 	etm_class->value_to_string = ecm_value_to_string;
 
-	klass->get_color_for_component = ecm_get_color_for_component;
-	klass->fill_component_from_model = NULL;
+	class->get_color_for_component = ecm_get_color_for_component;
+	class->fill_component_from_model = NULL;
+
+	g_object_class_install_property (
+		object_class,
+		PROP_USE_24_HOUR_FORMAT,
+		g_param_spec_boolean (
+			"use-24-hour-format",
+			"Use 24-Hour Format",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
 
 	signals[TIME_RANGE_CHANGED] =
 		g_signal_new ("time_range_changed",
-			      G_TYPE_FROM_CLASS (klass),
+			      G_TYPE_FROM_CLASS (class),
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (ECalModelClass, time_range_changed),
 			      NULL, NULL,
@@ -158,7 +278,7 @@ e_cal_model_class_init (ECalModelClass *klass)
 
 	signals[ROW_APPENDED] =
 		g_signal_new ("row_appended",
-			      G_TYPE_FROM_CLASS (klass),
+			      G_TYPE_FROM_CLASS (class),
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (ECalModelClass, row_appended),
 			      NULL, NULL,
@@ -167,7 +287,7 @@ e_cal_model_class_init (ECalModelClass *klass)
 
 	signals[COMPS_DELETED] =
 		g_signal_new ("comps_deleted",
-			      G_TYPE_FROM_CLASS (klass),
+			      G_TYPE_FROM_CLASS (class),
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (ECalModelClass, comps_deleted),
 			      NULL, NULL,
@@ -176,7 +296,7 @@ e_cal_model_class_init (ECalModelClass *klass)
 
 	signals[CAL_VIEW_PROGRESS] =
 		g_signal_new ("cal_view_progress",
-			      G_TYPE_FROM_CLASS (klass),
+			      G_TYPE_FROM_CLASS (class),
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (ECalModelClass, cal_view_progress),
 			      NULL, NULL,
@@ -184,7 +304,7 @@ e_cal_model_class_init (ECalModelClass *klass)
 			      G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_INT);
 	signals[CAL_VIEW_DONE] =
 		g_signal_new ("cal_view_done",
-			      G_TYPE_FROM_CLASS (klass),
+			      G_TYPE_FROM_CLASS (class),
 			      G_SIGNAL_RUN_LAST,
 			      G_STRUCT_OFFSET (ECalModelClass, cal_view_done),
 			      NULL, NULL,
@@ -198,101 +318,21 @@ e_cal_model_init (ECalModel *model)
 {
 	ECalModelPrivate *priv;
 
-	priv = g_new0 (ECalModelPrivate, 1);
-	model->priv = priv;
+	model->priv = E_CAL_MODEL_GET_PRIVATE (model);
 
 	/* match none by default */
-	priv->start = -1;
-	priv->end = -1;
-	priv->search_sexp = NULL;
-	priv->full_sexp = g_strdup ("#f");
-
-	priv->objects = g_ptr_array_new ();
-	priv->kind = ICAL_NO_COMPONENT;
-	priv->flags = 0;
-
-	priv->accounts = itip_addresses_get ();
-
-	priv->use_24_hour_format = TRUE;
-}
-
-static void
-clear_objects_array (ECalModelPrivate *priv)
-{
-	gint i;
-
-	for (i = 0; i < priv->objects->len; i++) {
-		ECalModelComponent *comp_data;
-
-		comp_data = g_ptr_array_index (priv->objects, i);
-		if (comp_data == NULL) {
-			g_warning ("comp_data is null\n");
-			continue;
-		}
-		e_cal_model_free_component_data (comp_data);
-	}
-
-	g_ptr_array_set_size (priv->objects, 0);
-}
-
-static void
-e_cal_model_dispose (GObject *object)
-{
-	ECalModelPrivate *priv;
-	ECalModel *model = (ECalModel *) object;
-
-	g_return_if_fail (E_IS_CAL_MODEL (model));
-
-	priv = model->priv;
+	model->priv->start = -1;
+	model->priv->end = -1;
+	model->priv->search_sexp = NULL;
+	model->priv->full_sexp = g_strdup ("#f");
 
-	if (priv->clients) {
-		while (priv->clients != NULL) {
-			ECalModelClient *client_data = (ECalModelClient *) priv->clients->data;
-
-			g_signal_handlers_disconnect_matched (client_data->client, G_SIGNAL_MATCH_DATA,
-							      0, 0, NULL, NULL, model);
-			if (client_data->query)
-				g_signal_handlers_disconnect_matched (client_data->query, G_SIGNAL_MATCH_DATA,
-								      0, 0, NULL, NULL, model);
-
-			priv->clients = g_list_remove (priv->clients, client_data);
-
-			g_object_unref (client_data->client);
-			if (client_data->query)
-				g_object_unref (client_data->query);
-			g_free (client_data);
-		}
-
-		priv->clients = NULL;
-		priv->default_client = NULL;
-	}
-
-	if (G_OBJECT_CLASS (e_cal_model_parent_class)->dispose)
-		G_OBJECT_CLASS (e_cal_model_parent_class)->dispose (object);
-}
-
-static void
-e_cal_model_finalize (GObject *object)
-{
-	ECalModelPrivate *priv;
-	ECalModel *model = (ECalModel *) object;
-
-	g_return_if_fail (E_IS_CAL_MODEL (model));
-
-	priv = model->priv;
-
-	g_free (priv->search_sexp);
-	g_free (priv->full_sexp);
-
-	g_free (priv->default_category);
-
-	clear_objects_array (priv);
-	g_ptr_array_free (priv->objects, FALSE);
+	model->priv->objects = g_ptr_array_new ();
+	model->priv->kind = ICAL_NO_COMPONENT;
+	model->priv->flags = 0;
 
-	g_free (priv);
+	model->priv->accounts = itip_addresses_get ();
 
-	if (G_OBJECT_CLASS (e_cal_model_parent_class)->finalize)
-		G_OBJECT_CLASS (e_cal_model_parent_class)->finalize (object);
+	model->priv->use_24_hour_format = TRUE;
 }
 
 /* ETableModel methods */
@@ -2327,17 +2367,17 @@ struct _ECalModelComponentPrivate {
 
 static void e_cal_model_component_finalize (GObject *object);
 
-static GObjectClass *parent_class;
+static GObjectClass *component_parent_class;
 
 /* Class initialization function for the calendar component object */
 static void
-e_cal_model_component_class_init (ECalModelComponentClass *klass)
+e_cal_model_component_class_init (ECalModelComponentClass *class)
 {
 	GObjectClass *object_class;
 
-	object_class = (GObjectClass *) klass;
+	object_class = (GObjectClass *) class;
 
-	parent_class = g_type_class_peek_parent (klass);
+	component_parent_class = g_type_class_peek_parent (class);
 
 	object_class->finalize = e_cal_model_component_finalize;
 }
@@ -2384,8 +2424,8 @@ e_cal_model_component_finalize (GObject *object)
 		comp_data->color = NULL;
 	}
 
-	if (G_OBJECT_CLASS (parent_class)->finalize)
-		(* G_OBJECT_CLASS (parent_class)->finalize) (object);
+	if (G_OBJECT_CLASS (component_parent_class)->finalize)
+		(* G_OBJECT_CLASS (component_parent_class)->finalize) (object);
 }
 
 /* Object initialization function for the calendar component object */
diff --git a/calendar/gui/e-calendar-view.c b/calendar/gui/e-calendar-view.c
index a9b717f..543623b 100644
--- a/calendar/gui/e-calendar-view.c
+++ b/calendar/gui/e-calendar-view.c
@@ -503,59 +503,72 @@ e_calendar_view_set_default_category (ECalendarView *cal_view, const gchar *cate
 GList *
 e_calendar_view_get_selected_events (ECalendarView *cal_view)
 {
+	ECalendarViewClass *class;
+
 	g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), NULL);
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events)
-		return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_events (cal_view);
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_val_if_fail (class->get_selected_events != NULL, NULL);
 
-	return NULL;
+	return class->get_selected_events (cal_view);
 }
 
 gboolean
-e_calendar_view_get_selected_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
+e_calendar_view_get_selected_time_range (ECalendarView *cal_view,
+                                         time_t *start_time,
+                                         time_t *end_time)
 {
+	ECalendarViewClass *class;
+
 	g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range) {
-		return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_selected_time_range (
-			cal_view, start_time, end_time);
-	}
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_val_if_fail (class->get_selected_time_range != NULL, FALSE);
 
-	return FALSE;
+	return class->get_selected_time_range (cal_view, start_time, end_time);
 }
 
 void
-e_calendar_view_set_selected_time_range (ECalendarView *cal_view, time_t start_time, time_t end_time)
+e_calendar_view_set_selected_time_range (ECalendarView *cal_view,
+                                         time_t start_time,
+                                         time_t end_time)
 {
+	ECalendarViewClass *class;
+
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range) {
-		E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->set_selected_time_range (
-			cal_view, start_time, end_time);
-	}
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_if_fail (class->set_selected_time_range != NULL);
+
+	class->set_selected_time_range (cal_view, start_time, end_time);
 }
 
 gboolean
-e_calendar_view_get_visible_time_range (ECalendarView *cal_view, time_t *start_time, time_t *end_time)
+e_calendar_view_get_visible_time_range (ECalendarView *cal_view,
+                                        time_t *start_time,
+                                        time_t *end_time)
 {
+	ECalendarViewClass *class;
+
 	g_return_val_if_fail (E_IS_CALENDAR_VIEW (cal_view), FALSE);
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range) {
-		return E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->get_visible_time_range (
-			cal_view, start_time, end_time);
-	}
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_val_if_fail (class->get_visible_time_range != NULL, FALSE);
 
-	return FALSE;
+	class->get_visible_time_range (cal_view, start_time, end_time);
 }
 
 void
 e_calendar_view_update_query (ECalendarView *cal_view)
 {
+	ECalendarViewClass *class;
+
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query) {
-		E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->update_query (cal_view);
-	}
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_if_fail (class->update_query != NULL);
+
+	class->update_query (cal_view);
 }
 
 void
@@ -846,10 +859,14 @@ clipboard_get_calendar_data (ECalendarView *cal_view, const gchar *text)
 static void
 e_calendar_view_paste_text (ECalendarView *cal_view)
 {
+	ECalendarViewClass *class;
+
 	g_return_if_fail (E_IS_CALENDAR_VIEW (cal_view));
 
-	if (E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->paste_text)
-		E_CALENDAR_VIEW_CLASS (G_OBJECT_GET_CLASS (cal_view))->paste_text (cal_view);
+	class = E_CALENDAR_VIEW_GET_CLASS (cal_view);
+	g_return_if_fail (class->paste_text != NULL);
+
+	class->paste_text (cal_view);
 }
 
 static void
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
index 9f63d25..afa4e8b 100644
--- a/calendar/gui/e-day-view-main-item.c
+++ b/calendar/gui/e-day-view-main-item.c
@@ -367,7 +367,7 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable,
 						      day);
 	}
 
-	if (e_day_view_get_show_marcus_bains (day_view)) {
+	if (e_day_view_marcus_bains_get_show_line (day_view)) {
 		icaltimezone *zone;
 		struct icaltimetype time_now, day_start;
 		gint marcus_bains_y;
diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c
index 6d5f800..c3129b6 100644
--- a/calendar/gui/e-day-view-time-item.c
+++ b/calendar/gui/e-day-view-time-item.c
@@ -413,7 +413,7 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 			   E_DVTMI_LARGE_HOUR_Y_PAD);
 
 	/* Draw the Marcus Bains Line first, so it appears under other elements. */
-	if (e_day_view_get_show_marcus_bains (day_view)) {
+	if (e_day_view_marcus_bains_get_show_line (day_view)) {
 		struct icaltimetype time_now;
 		gint marcus_bains_y;
 
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 42fe3f4..117e69d 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -431,38 +431,324 @@ static void e_day_view_queue_layout (EDayView *day_view);
 static void e_day_view_cancel_layout (EDayView *day_view);
 static gboolean e_day_view_layout_timeout_cb (gpointer data);
 
+enum {
+	PROP_0,
+	PROP_MARCUS_BAINS_SHOW_LINE,
+	PROP_MARCUS_BAINS_DAY_VIEW_COLOR,
+	PROP_MARCUS_BAINS_TIME_BAR_COLOR,
+	PROP_MINS_PER_ROW,
+	PROP_WEEK_START_DAY,
+	PROP_WORK_DAY_END_HOUR,
+	PROP_WORK_DAY_END_MINUTE,
+	PROP_WORK_DAY_START_HOUR,
+	PROP_WORK_DAY_START_MINUTE,
+	PROP_WORKING_DAYS
+};
+
 G_DEFINE_TYPE (EDayView, e_day_view, E_TYPE_CALENDAR_VIEW)
 
 static void
+day_view_set_property (GObject *object,
+                       guint property_id,
+                       const GValue *value,
+                       GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_MARCUS_BAINS_SHOW_LINE:
+			e_day_view_marcus_bains_set_show_line (
+				E_DAY_VIEW (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_MARCUS_BAINS_DAY_VIEW_COLOR:
+			e_day_view_marcus_bains_set_day_view_color (
+				E_DAY_VIEW (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_MARCUS_BAINS_TIME_BAR_COLOR:
+			e_day_view_marcus_bains_set_time_bar_color (
+				E_DAY_VIEW (object),
+				g_value_get_string (value));
+			return;
+
+		case PROP_MINS_PER_ROW:
+			e_day_view_set_mins_per_row (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			e_day_view_set_week_start_day (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WORK_DAY_END_HOUR:
+			e_day_view_set_work_day_end_hour (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WORK_DAY_END_MINUTE:
+			e_day_view_set_work_day_end_minute (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WORK_DAY_START_HOUR:
+			e_day_view_set_work_day_start_hour (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WORK_DAY_START_MINUTE:
+			e_day_view_set_work_day_start_minute (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+
+		case PROP_WORKING_DAYS:
+			e_day_view_set_working_days (
+				E_DAY_VIEW (object),
+				g_value_get_int (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+day_view_get_property (GObject *object,
+                       guint property_id,
+                       GValue *value,
+                       GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_MARCUS_BAINS_SHOW_LINE:
+			g_value_set_boolean (
+				value,
+				e_day_view_marcus_bains_get_show_line (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_MARCUS_BAINS_DAY_VIEW_COLOR:
+			g_value_set_string (
+				value,
+				e_day_view_marcus_bains_get_day_view_color (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_MARCUS_BAINS_TIME_BAR_COLOR:
+			g_value_set_string (
+				value,
+				e_day_view_marcus_bains_get_time_bar_color (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_MINS_PER_ROW:
+			g_value_set_int (
+				value,
+				e_day_view_get_mins_per_row (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			g_value_set_int (
+				value,
+				e_day_view_get_week_start_day (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WORK_DAY_END_HOUR:
+			g_value_set_int (
+				value,
+				e_day_view_get_work_day_end_hour (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WORK_DAY_END_MINUTE:
+			g_value_set_int (
+				value,
+				e_day_view_get_work_day_end_minute (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WORK_DAY_START_HOUR:
+			g_value_set_int (
+				value,
+				e_day_view_get_work_day_start_hour (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WORK_DAY_START_MINUTE:
+			g_value_set_int (
+				value,
+				e_day_view_get_work_day_start_minute (
+				E_DAY_VIEW (object)));
+			return;
+
+		case PROP_WORKING_DAYS:
+			g_value_set_int (
+				value,
+				e_day_view_get_working_days (
+				E_DAY_VIEW (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
 e_day_view_class_init (EDayViewClass *class)
 {
-	GtkObjectClass *object_class;
+	GObjectClass *object_class;
+	GtkObjectClass *gtk_object_class;
 	GtkWidgetClass *widget_class;
 	ECalendarViewClass *view_class;
 
-	object_class = (GtkObjectClass *) class;
-	widget_class = (GtkWidgetClass *) class;
-	view_class = (ECalendarViewClass *) class;
-
-	/* Method override */
-	object_class->destroy		= e_day_view_destroy;
-
-	widget_class->realize		= e_day_view_realize;
-	widget_class->unrealize		= e_day_view_unrealize;
-	widget_class->style_set		= e_day_view_style_set;
-	widget_class->size_allocate	= e_day_view_size_allocate;
-	widget_class->focus_in_event	= e_day_view_focus_in;
-	widget_class->focus_out_event	= e_day_view_focus_out;
-	widget_class->key_press_event	= e_day_view_key_press;
-	widget_class->focus             = e_day_view_focus;
-	widget_class->popup_menu        = e_day_view_popup_menu;
-
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = day_view_set_property;
+	object_class->get_property = day_view_get_property;
+
+	gtk_object_class = GTK_OBJECT_CLASS (class);
+	gtk_object_class->destroy = e_day_view_destroy;
+
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->realize = e_day_view_realize;
+	widget_class->unrealize = e_day_view_unrealize;
+	widget_class->style_set = e_day_view_style_set;
+	widget_class->size_allocate = e_day_view_size_allocate;
+	widget_class->focus_in_event = e_day_view_focus_in;
+	widget_class->focus_out_event = e_day_view_focus_out;
+	widget_class->key_press_event = e_day_view_key_press;
+	widget_class->focus = e_day_view_focus;
+	widget_class->popup_menu = e_day_view_popup_menu;
+
+	view_class = E_CALENDAR_VIEW_CLASS (class);
 	view_class->get_selected_events = e_day_view_get_selected_events;
 	view_class->get_selected_time_range = e_day_view_get_selected_time_range;
 	view_class->set_selected_time_range = e_day_view_set_selected_time_range;
 	view_class->get_visible_time_range = e_day_view_get_visible_time_range;
 	view_class->paste_text = e_day_view_paste_text;
 
+	/* XXX Should these be constructor properties? */
+
+	g_object_class_install_property (
+		object_class,
+		PROP_MARCUS_BAINS_SHOW_LINE,
+		g_param_spec_boolean (
+			"marcus-bains-show-line",
+			"Marcus Bains Show Line",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_MARCUS_BAINS_DAY_VIEW_COLOR,
+		g_param_spec_string (
+			"marcus-bains-day-view-color",
+			"Marcus Bains Day View Color",
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_MARCUS_BAINS_TIME_BAR_COLOR,
+		g_param_spec_string (
+			"marcus-bains-time-bar-color",
+			"Marcus Bains Time Bar Color",
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_MINS_PER_ROW,
+		g_param_spec_int (
+			"mins-per-row",
+			"Minutes Per Row",
+			NULL,
+			5,   /* not a continuous range */
+			60,  /* valid values: 5, 10, 15, 30, 60 */
+			30,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WEEK_START_DAY,
+		g_param_spec_int (
+			"week-start-day",
+			"Week Start Day",
+			NULL,
+			0,  /* Monday */
+			6,  /* Sunday */
+			0,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WORK_DAY_END_HOUR,
+		g_param_spec_int (
+			"work-day-end-hour",
+			"Work Day End Hour",
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WORK_DAY_END_MINUTE,
+		g_param_spec_int (
+			"work-day-end-minute",
+			"Work Day End Minute",
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WORK_DAY_START_HOUR,
+		g_param_spec_int (
+			"work-day-start-hour",
+			"Work Day Start Hour",
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WORK_DAY_START_MINUTE,
+		g_param_spec_int (
+			"work-day-start-minute",
+			"Work Day Start Minute",
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	/* FIXME Make this a real GFlags type. */
+	g_object_class_install_property (
+		object_class,
+		PROP_WORKING_DAYS,
+		g_param_spec_int (
+			"working-days",
+			"Working Days",
+			NULL,
+			0x00,
+			0x7f,
+			0,
+			G_PARAM_READWRITE));
+
 #if 0  /* KILL-BONOBO */
 	/* init the accessibility support for e_day_view */
 	e_day_view_a11y_init ();
@@ -762,7 +1048,7 @@ e_day_view_init (EDayView *day_view)
 	day_view->week_start_day = 0;
 	day_view->scroll_to_work_day = TRUE;
 
-	day_view->show_marcus_bains_line = TRUE;
+	day_view->marcus_bains_show_line = TRUE;
 	day_view->marcus_bains_day_view_color = NULL;
 	day_view->marcus_bains_time_bar_color = NULL;
 
@@ -2382,7 +2668,7 @@ e_day_view_set_days_shown	(EDayView	*day_view,
 }
 
 gint
-e_day_view_get_mins_per_row	(EDayView	*day_view)
+e_day_view_get_mins_per_row (EDayView *day_view)
 {
 	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
 
@@ -2390,8 +2676,8 @@ e_day_view_get_mins_per_row	(EDayView	*day_view)
 }
 
 void
-e_day_view_set_mins_per_row	(EDayView	*day_view,
-				 gint		 mins_per_row)
+e_day_view_set_mins_per_row (EDayView *day_view,
+                             gint mins_per_row)
 {
 	gint day;
 
@@ -2409,6 +2695,8 @@ e_day_view_set_mins_per_row	(EDayView	*day_view,
 	day_view->mins_per_row = mins_per_row;
 	e_day_view_recalc_num_rows (day_view);
 
+	g_object_notify (G_OBJECT (day_view), "mins-per-row");
+
 	/* If we aren't visible, we'll sort it out later. */
 	if (!E_CALENDAR_VIEW (day_view)->in_focus)
 	    return;
@@ -2433,7 +2721,7 @@ e_day_view_set_mins_per_row	(EDayView	*day_view,
 /* This specifies the working days in the week. The value is a bitwise
    combination of day flags. Defaults to Mon-Fri. */
 EDayViewDays
-e_day_view_get_working_days	(EDayView	*day_view)
+e_day_view_get_working_days (EDayView *day_view)
 {
 	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0);
 
@@ -2441,8 +2729,8 @@ e_day_view_get_working_days	(EDayView	*day_view)
 }
 
 void
-e_day_view_set_working_days	(EDayView	*day_view,
-				 EDayViewDays	 days)
+e_day_view_set_working_days (EDayView *day_view,
+                             EDayViewDays days)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
@@ -2457,6 +2745,8 @@ e_day_view_set_working_days	(EDayView	*day_view,
 	/* We have to do this, as the new working days may have no effect on
 	   the days shown, but we still want the background color to change. */
 	gtk_widget_queue_draw (day_view->main_canvas);
+
+	g_object_notify (G_OBJECT (day_view), "working-days");
 }
 
 static void
@@ -2496,86 +2786,162 @@ e_day_view_recalc_work_week_days_shown	(EDayView	*day_view)
 
 /* The start and end time of the working day. This only affects the background
    colors. */
+gint
+e_day_view_get_work_day_start_hour (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
+
+	return day_view->work_day_start_hour;
+}
+
+void
+e_day_view_set_work_day_start_hour (EDayView *day_view,
+                                    gint work_day_start_hour)
+{
+	g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+	day_view->work_day_start_hour = work_day_start_hour;
+
+	gtk_widget_queue_draw (day_view->main_canvas);
+
+	g_object_notify (G_OBJECT (day_view), "work-day-start-hour");
+}
+
+gint
+e_day_view_get_work_day_start_minute (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
+
+	return day_view->work_day_start_minute;
+}
+
 void
-e_day_view_get_working_day		(EDayView	*day_view,
-					 gint		*start_hour,
-					 gint		*start_minute,
-					 gint		*end_hour,
-					 gint		*end_minute)
+e_day_view_set_work_day_start_minute (EDayView *day_view,
+                                      gint work_day_start_minute)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
-	*start_hour = day_view->work_day_start_hour;
-	*start_minute = day_view->work_day_start_minute;
-	*end_hour = day_view->work_day_end_hour;
-	*end_minute = day_view->work_day_end_minute;
+	day_view->work_day_start_minute = work_day_start_minute;
+
+	gtk_widget_queue_draw (day_view->main_canvas);
+
+	g_object_notify (G_OBJECT (day_view), "work-day-start-minute");
+}
+
+gint
+e_day_view_get_work_day_end_hour (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
+
+	return day_view->work_day_end_hour;
 }
 
 void
-e_day_view_set_working_day		(EDayView	*day_view,
-					 gint		 start_hour,
-					 gint		 start_minute,
-					 gint		 end_hour,
-					 gint		 end_minute)
+e_day_view_set_work_day_end_hour (EDayView *day_view,
+                                  gint work_day_end_hour)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
-	day_view->work_day_start_hour = start_hour;
-	day_view->work_day_start_minute = start_minute;
-	day_view->work_day_end_hour = end_hour;
-	day_view->work_day_end_minute = end_minute;
+	day_view->work_day_end_hour = work_day_end_hour;
 
 	gtk_widget_queue_draw (day_view->main_canvas);
+
+	g_object_notify (G_OBJECT (day_view), "work-day-end-hour");
 }
 
-/* Whether we display the Marcus Bains Line in the main canvas and time canvas. */
-gboolean
-e_day_view_get_show_marcus_bains	(EDayView       *day_view)
+gint
+e_day_view_get_work_day_end_minute (EDayView *day_view)
 {
-	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), TRUE);
-	return day_view->show_marcus_bains_line;
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), -1);
+
+	return day_view->work_day_end_minute;
+}
+
+void
+e_day_view_set_work_day_end_minute (EDayView *day_view,
+                                  gint work_day_end_minute)
+{
+	g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+	day_view->work_day_end_minute = work_day_end_minute;
+
+	gtk_widget_queue_draw (day_view->main_canvas);
+
+	g_object_notify (G_OBJECT (day_view), "work-day-end-minute");
 }
 
 /* Force a redraw of the Marcus Bains Lines */
 void
-e_day_view_update_marcus_bains		(EDayView *day_view)
+e_day_view_marcus_bains_update (EDayView *day_view)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 	gtk_widget_queue_draw (day_view->main_canvas);
 	gtk_widget_queue_draw (day_view->time_canvas);
 }
 
-/* Update the variables controlling the Marcus Bains Line (display toggle, and colors). */
+gboolean
+e_day_view_marcus_bains_get_show_line (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), FALSE);
+
+	return day_view->marcus_bains_show_line;
+}
+
 void
-e_day_view_set_marcus_bains		(EDayView       *day_view,
-					 gboolean        show_line,
-					 const gchar	*dayview_color,
-					 const gchar     *timebar_color)
+e_day_view_marcus_bains_set_show_line (EDayView *day_view,
+                                       gboolean show_line)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 
-	if ((day_view->show_marcus_bains_line != show_line) |
-	    (day_view->marcus_bains_day_view_color != dayview_color) |
-	    (day_view->marcus_bains_time_bar_color != timebar_color)) {
+	day_view->marcus_bains_show_line = show_line;
 
-		if (day_view->marcus_bains_day_view_color)
-			g_free (day_view->marcus_bains_day_view_color);
-		if (day_view->marcus_bains_time_bar_color)
-			g_free (day_view->marcus_bains_time_bar_color);
+	e_day_view_marcus_bains_update (day_view);
 
-		day_view->show_marcus_bains_line = show_line;
-		if (dayview_color)
-			day_view->marcus_bains_day_view_color = g_strdup (dayview_color);
-		else
-			day_view->marcus_bains_day_view_color = NULL;
+	g_object_notify (G_OBJECT (day_view), "marcus-bains-show-line");
+}
 
-		if (timebar_color)
-			day_view->marcus_bains_time_bar_color = g_strdup (timebar_color);
-		else
-			day_view->marcus_bains_time_bar_color = NULL;
+const gchar *
+e_day_view_marcus_bains_get_day_view_color (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
 
-		e_day_view_update_marcus_bains (day_view);
-	}
+	return day_view->marcus_bains_day_view_color;
+}
+
+void
+e_day_view_marcus_bains_set_day_view_color (EDayView *day_view,
+                                            const gchar *day_view_color)
+{
+	g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+	g_free (day_view->marcus_bains_day_view_color);
+	day_view->marcus_bains_day_view_color = g_strdup (day_view_color);
+
+	e_day_view_marcus_bains_update (day_view);
+
+	g_object_notify (G_OBJECT (day_view), "marcus-bains-day-view-color");
+}
+
+const gchar *
+e_day_view_marcus_bains_get_time_bar_color (EDayView *day_view)
+{
+	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), NULL);
+
+	return day_view->marcus_bains_time_bar_color;
+}
+
+void
+e_day_view_marcus_bains_set_time_bar_color (EDayView *day_view,
+                                            const gchar *time_bar_color)
+{
+	g_return_if_fail (E_IS_DAY_VIEW (day_view));
+
+	g_free (day_view->marcus_bains_time_bar_color);
+	day_view->marcus_bains_time_bar_color = g_strdup (time_bar_color);
+
+	e_day_view_marcus_bains_update (day_view);
+
+	g_object_notify (G_OBJECT (day_view), "marcus-bains-time-bar-color");
 }
 
 /* Whether we display event end times in the main canvas. */
@@ -2616,7 +2982,7 @@ e_day_view_set_show_times_cb		(EDayView	*day_view,
 
 /* The first day of the week, 0 (Monday) to 6 (Sunday). */
 gint
-e_day_view_get_week_start_day	(EDayView	*day_view)
+e_day_view_get_week_start_day (EDayView *day_view)
 {
 	g_return_val_if_fail (E_IS_DAY_VIEW (day_view), 0);
 
@@ -2624,8 +2990,8 @@ e_day_view_get_week_start_day	(EDayView	*day_view)
 }
 
 void
-e_day_view_set_week_start_day	(EDayView	*day_view,
-				 gint		 week_start_day)
+e_day_view_set_week_start_day (EDayView *day_view,
+                               gint week_start_day)
 {
 	g_return_if_fail (E_IS_DAY_VIEW (day_view));
 	g_return_if_fail (week_start_day >= 0);
@@ -2638,6 +3004,8 @@ e_day_view_set_week_start_day	(EDayView	*day_view,
 
 	if (day_view->work_week_view)
 		e_day_view_recalc_work_week (day_view);
+
+	g_object_notify (G_OBJECT (day_view), "week-start-day");
 }
 
 static void
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
index 663252b..8d778fa 100644
--- a/calendar/gui/e-day-view.h
+++ b/calendar/gui/e-day-view.h
@@ -309,7 +309,7 @@ struct _EDayView {
 	gint work_day_end_minute;
 
 	/* Whether we show the Marcus Bains Line in the main canvas and time canvas. */
-	gboolean show_marcus_bains_line;
+	gboolean marcus_bains_show_line;
 	gchar *marcus_bains_day_view_color;
 	gchar *marcus_bains_time_bar_color;
 
@@ -525,23 +525,36 @@ void	   e_day_view_set_working_days		(EDayView	*day_view,
 
 /* The start and end time of the working day. This only affects the background
    colors. */
-void	   e_day_view_get_working_day		(EDayView	*day_view,
-						 gint		*start_hour,
-						 gint		*start_minute,
-						 gint		*end_hour,
-						 gint		*end_minute);
-void	   e_day_view_set_working_day		(EDayView	*day_view,
-						 gint		 start_hour,
-						 gint		 start_minute,
-						 gint		 end_hour,
-						 gint		 end_minute);
+gint	   e_day_view_get_work_day_start_hour	(EDayView *day_view);
+void	   e_day_view_set_work_day_start_hour	(EDayView *day_view,
+						 gint work_day_start_hour);
+gint	   e_day_view_get_work_day_start_minute	(EDayView *day_view);
+void	   e_day_view_set_work_day_start_minute	(EDayView *day_view,
+						 gint work_day_start_minute);
+gint	   e_day_view_get_work_day_end_hour	(EDayView *day_view);
+void	   e_day_view_set_work_day_end_hour	(EDayView *day_view,
+						 gint work_day_end_hour);
+gint	   e_day_view_get_work_day_end_minute	(EDayView *day_view);
+void	   e_day_view_set_work_day_end_minute	(EDayView *day_view,
+						 gint work_day_end_minute);
 
 /* Whether we display the Marcus Bains Line in the main canvas and time canvas. */
-gboolean   e_day_view_get_show_marcus_bains	(EDayView	*day_view);
-void       e_day_view_set_marcus_bains		(EDayView       *day_view,
-						 gboolean        show_line,
-						 const gchar	*dayview_color,
-						 const gchar     *timebar_color);
+void	   e_day_view_marcus_bains_update	(EDayView *day_view);
+gboolean   e_day_view_marcus_bains_get_show_line(EDayView *day_view);
+void	   e_day_view_marcus_bains_set_show_line(EDayView *day_view,
+						 gboolean show_line);
+const gchar *
+	   e_day_view_marcus_bains_get_day_view_color
+						(EDayView *day_view);
+void	   e_day_view_marcus_bains_set_day_view_color
+						(EDayView *day_view,
+						 const gchar *day_view_color);
+const gchar *
+	   e_day_view_marcus_bains_get_time_bar_color
+						(EDayView *day_view);
+void	   e_day_view_marcus_bains_set_time_bar_color
+						(EDayView *day_view,
+						 const gchar *time_bar_color);
 
 /* Whether we display event end times in the main canvas. */
 gboolean   e_day_view_get_show_event_end_times	(EDayView	*day_view);
@@ -621,8 +634,6 @@ void e_day_view_ensure_rows_visible (EDayView *day_view,
 				     gint start_row,
 				     gint end_row);
 
-void e_day_view_update_marcus_bains (EDayView *day_view);
-
 /* Week number in upper-left corner of the day view widget */
 gboolean e_day_view_get_show_week_number (EDayView *day_view);
 void e_day_view_set_show_week_number (EDayView *day_view, gboolean show);
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index b671abb..397bb02 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -193,10 +193,109 @@ static gboolean e_week_view_layout_timeout_cb (gpointer data);
 
 G_DEFINE_TYPE (EWeekView, e_week_view, E_TYPE_CALENDAR_VIEW)
 
+enum {
+	PROP_0,
+	PROP_COMPRESS_WEEKEND,
+	PROP_SHOW_EVENT_END_TIMES,
+	PROP_WEEK_START_DAY
+};
+
 static gint map_left[] = {0, 1, 2, 0, 1, 2, 2};
 static gint map_right[] = {3, 4, 5, 3, 4, 5, 6};
 
 static void
+timezone_changed_cb (ECalendarView *cal_view,
+                     icaltimezone *old_zone,
+                     icaltimezone *new_zone,
+                     gpointer user_data)
+{
+	struct icaltimetype tt = icaltime_null_time ();
+	time_t lower;
+	EWeekView *week_view = (EWeekView *) cal_view;
+
+	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
+
+	if (!cal_view->in_focus)
+		return;
+
+	/* If we don't have a valid date set yet, just return. */
+	if (!g_date_valid (&week_view->first_day_shown))
+		return;
+
+	/* Recalculate the new start of the first week. We just use exactly
+	   the same time, but with the new timezone. */
+	tt.year = g_date_get_year (&week_view->first_day_shown);
+	tt.month = g_date_get_month (&week_view->first_day_shown);
+	tt.day = g_date_get_day (&week_view->first_day_shown);
+
+	lower = icaltime_as_timet_with_zone (tt, new_zone);
+
+	e_week_view_recalc_day_starts (week_view, lower);
+	e_week_view_update_query (week_view);
+}
+
+static void
+week_view_set_property (GObject *object,
+                        guint property_id,
+                        const GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_COMPRESS_WEEKEND:
+			e_week_view_set_compress_weekend (
+				E_WEEK_VIEW (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_SHOW_EVENT_END_TIMES:
+			e_week_view_set_show_event_end_times (
+				E_WEEK_VIEW (object),
+				g_value_get_boolean (value));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			e_week_view_set_week_start_day (
+				E_WEEK_VIEW (object),
+				g_value_get_int (value));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+week_view_get_property (GObject *object,
+                        guint property_id,
+                        GValue *value,
+                        GParamSpec *pspec)
+{
+	switch (property_id) {
+		case PROP_COMPRESS_WEEKEND:
+			g_value_set_boolean (
+				value,
+				e_week_view_get_compress_weekend (
+				E_WEEK_VIEW (object)));
+			return;
+
+		case PROP_SHOW_EVENT_END_TIMES:
+			g_value_set_boolean (
+				value,
+				e_week_view_get_show_event_end_times (
+				E_WEEK_VIEW (object)));
+			return;
+
+		case PROP_WEEK_START_DAY:
+			g_value_set_int (
+				value,
+				e_week_view_get_week_start_day (
+				E_WEEK_VIEW (object)));
+			return;
+	}
+
+	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
 week_view_cursor_key_up (EWeekView *week_view)
 {
 	if (week_view->selection_start_day == -1)
@@ -259,28 +358,31 @@ week_view_cursor_key_right (EWeekView *week_view)
 static void
 e_week_view_class_init (EWeekViewClass *class)
 {
-	GtkObjectClass *object_class;
+	GObjectClass *object_class;
+	GtkObjectClass *gtk_object_class;
 	GtkWidgetClass *widget_class;
 	ECalendarViewClass *view_class;
 
-	object_class = (GtkObjectClass *) class;
-	widget_class = (GtkWidgetClass *) class;
-	view_class = (ECalendarViewClass *) class;
-
-	/* Method override */
-	object_class->destroy		= e_week_view_destroy;
-
-	widget_class->realize		= e_week_view_realize;
-	widget_class->unrealize		= e_week_view_unrealize;
-	widget_class->style_set		= e_week_view_style_set;
-	widget_class->size_allocate	= e_week_view_size_allocate;
-	widget_class->focus_in_event	= e_week_view_focus_in;
-	widget_class->focus_out_event	= e_week_view_focus_out;
-	widget_class->key_press_event	= e_week_view_key_press;
-	widget_class->popup_menu        = e_week_view_popup_menu;
-	widget_class->expose_event	= e_week_view_expose_event;
-	widget_class->focus             = e_week_view_focus;
-
+	object_class = G_OBJECT_CLASS (class);
+	object_class->set_property = week_view_set_property;
+	object_class->get_property = week_view_get_property;
+
+	gtk_object_class = GTK_OBJECT_CLASS (class);
+	gtk_object_class->destroy = e_week_view_destroy;
+
+	widget_class = GTK_WIDGET_CLASS (class);
+	widget_class->realize = e_week_view_realize;
+	widget_class->unrealize = e_week_view_unrealize;
+	widget_class->style_set = e_week_view_style_set;
+	widget_class->size_allocate = e_week_view_size_allocate;
+	widget_class->focus_in_event = e_week_view_focus_in;
+	widget_class->focus_out_event = e_week_view_focus_out;
+	widget_class->key_press_event = e_week_view_key_press;
+	widget_class->popup_menu = e_week_view_popup_menu;
+	widget_class->expose_event = e_week_view_expose_event;
+	widget_class->focus = e_week_view_focus;
+
+	view_class = E_CALENDAR_VIEW_CLASS (class);
 	view_class->get_selected_events = e_week_view_get_selected_events;
 	view_class->get_selected_time_range = e_week_view_get_selected_time_range;
 	view_class->set_selected_time_range = e_week_view_set_selected_time_range;
@@ -292,6 +394,40 @@ e_week_view_class_init (EWeekViewClass *class)
 	class->cursor_key_left = week_view_cursor_key_left;
 	class->cursor_key_right = week_view_cursor_key_right;
 
+	/* XXX This property really belongs in EMonthView,
+	 *     but too much drawing code is tied to it. */
+	g_object_class_install_property (
+		object_class,
+		PROP_COMPRESS_WEEKEND,
+		g_param_spec_boolean (
+			"compress-weekend",
+			"Compress Weekend",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_SHOW_EVENT_END_TIMES,
+		g_param_spec_boolean (
+			"show-event-end-times",
+			"Show Event End Times",
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	g_object_class_install_property (
+		object_class,
+		PROP_WEEK_START_DAY,
+		g_param_spec_int (
+			"week-start-day",
+			"Week Start Day",
+			NULL,
+			0,  /* Monday */
+			6,  /* Sunday */
+			0,
+			G_PARAM_READWRITE));
+
 #if 0  /* KILL-BONOBO */
 	/* init the accessibility support for e_week_view */
 	e_week_view_a11y_init ();
@@ -299,6 +435,154 @@ e_week_view_class_init (EWeekViewClass *class)
 }
 
 static void
+e_week_view_init (EWeekView *week_view)
+{
+	GnomeCanvasGroup *canvas_group;
+	GtkObject *adjustment;
+	GdkPixbuf *pixbuf;
+	gint i;
+
+	GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS);
+
+	week_view->query = NULL;
+	week_view->event_destroyed = FALSE;
+	week_view->events = g_array_new (FALSE, FALSE,
+					 sizeof (EWeekViewEvent));
+	week_view->events_sorted = TRUE;
+	week_view->events_need_layout = FALSE;
+	week_view->events_need_reshape = FALSE;
+
+	week_view->layout_timeout_id = 0;
+
+	week_view->spans = NULL;
+
+	week_view->multi_week_view = FALSE;
+	week_view->month_scroll_by_week = FALSE;
+	week_view->scroll_by_week_notif_id = 0;
+	week_view->update_base_date = TRUE;
+	week_view->weeks_shown = 6;
+	week_view->rows = 6;
+	week_view->columns = 2;
+	week_view->compress_weekend = TRUE;
+	week_view->show_event_end_times = TRUE;
+	week_view->week_start_day = 0;		/* Monday. */
+	week_view->display_start_day = 0;	/* Monday. */
+
+	g_date_clear (&week_view->base_date, 1);
+	g_date_clear (&week_view->first_day_shown, 1);
+
+	week_view->row_height = 10;
+	week_view->rows_per_cell = 1;
+
+	week_view->selection_start_day = -1;
+	week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_NONE;
+
+	week_view->pressed_event_num = -1;
+	week_view->editing_event_num = -1;
+
+	week_view->last_edited_comp_string = NULL;
+
+	week_view->main_gc = NULL;
+
+	/* Create the small font. */
+	week_view->use_small_font = TRUE;
+
+	week_view->small_font_desc =
+		pango_font_description_copy (gtk_widget_get_style (GTK_WIDGET (week_view))->font_desc);
+	pango_font_description_set_size (week_view->small_font_desc,
+					 E_WEEK_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE);
+
+	/* String to use in 12-hour time format for times in the morning. */
+	week_view->am_string = _("am");
+
+	/* String to use in 12-hour time format for times in the afternoon. */
+	week_view->pm_string = _("pm");
+
+	week_view->bc_event_time = 0;
+	week_view->before_click_dtstart = 0;
+	week_view->before_click_dtend = 0;
+
+	/*
+	 * Titles Canvas. Note that we don't show it is only shown in the
+	 * Month view.
+	 */
+	week_view->titles_canvas = e_canvas_new ();
+	gtk_table_attach (GTK_TABLE (week_view), week_view->titles_canvas,
+			  1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
+
+	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->titles_canvas)->root);
+
+	week_view->titles_canvas_item =
+		gnome_canvas_item_new (canvas_group,
+				       e_week_view_titles_item_get_type (),
+				       "EWeekViewTitlesItem::week_view", week_view,
+				       NULL);
+
+	/*
+	 * Main Canvas
+	 */
+	week_view->main_canvas = e_canvas_new ();
+	gtk_table_attach (GTK_TABLE (week_view), week_view->main_canvas,
+			  1, 2, 1, 2,
+			  GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
+	gtk_widget_show (week_view->main_canvas);
+
+	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root);
+
+	week_view->main_canvas_item =
+		gnome_canvas_item_new (canvas_group,
+				       e_week_view_main_item_get_type (),
+				       "EWeekViewMainItem::week_view", week_view,
+				       NULL);
+
+	g_signal_connect_after (week_view->main_canvas, "button_press_event",
+				G_CALLBACK (e_week_view_on_button_press), week_view);
+	g_signal_connect (week_view->main_canvas, "button_release_event",
+			  G_CALLBACK (e_week_view_on_button_release), week_view);
+	g_signal_connect (week_view->main_canvas, "scroll_event",
+			  G_CALLBACK (e_week_view_on_scroll), week_view);
+	g_signal_connect (week_view->main_canvas, "motion_notify_event",
+			  G_CALLBACK (e_week_view_on_motion), week_view);
+
+	/* Create the buttons to jump to each days. */
+	pixbuf = gdk_pixbuf_new_from_xpm_data ((const gchar **) jump_xpm);
+
+	for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) {
+		week_view->jump_buttons[i] = gnome_canvas_item_new
+			(canvas_group,
+			 gnome_canvas_pixbuf_get_type (),
+			 "GnomeCanvasPixbuf::pixbuf", pixbuf,
+			 NULL);
+
+		g_signal_connect (week_view->jump_buttons[i], "event",
+				  G_CALLBACK (e_week_view_on_jump_button_event), week_view);
+	}
+	week_view->focused_jump_button = E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS;
+
+	g_object_unref (pixbuf);
+
+	/*
+	 * Scrollbar.
+	 */
+	adjustment = gtk_adjustment_new (0, -52, 52, 1, 1, 1);
+
+	week_view->vscrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (adjustment));
+	gtk_table_attach (GTK_TABLE (week_view), week_view->vscrollbar,
+			  2, 3, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0);
+	gtk_widget_show (week_view->vscrollbar);
+
+	/* Create the cursors. */
+	week_view->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR);
+	week_view->move_cursor = gdk_cursor_new (GDK_FLEUR);
+	week_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
+	week_view->last_cursor_set = NULL;
+
+		/* connect to ECalendarView's signals */
+	g_signal_connect (G_OBJECT (week_view), "timezone_changed",
+			  G_CALLBACK (timezone_changed_cb), NULL);
+}
+
+static void
 time_range_changed_cb (ECalModel *model, time_t start_time, time_t end_time, gpointer user_data)
 {
 	EWeekView *week_view = E_WEEK_VIEW (user_data);
@@ -519,183 +803,6 @@ model_comps_deleted_cb (ETableModel *etm, gpointer data, gpointer user_data)
 }
 
 static void
-timezone_changed_cb (ECalendarView *cal_view, icaltimezone *old_zone,
-		     icaltimezone *new_zone, gpointer user_data)
-{
-	struct icaltimetype tt = icaltime_null_time ();
-	time_t lower;
-	EWeekView *week_view = (EWeekView *) cal_view;
-
-	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-
-	if (!cal_view->in_focus)
-		return;
-
-	/* If we don't have a valid date set yet, just return. */
-	if (!g_date_valid (&week_view->first_day_shown))
-		return;
-
-	/* Recalculate the new start of the first week. We just use exactly
-	   the same time, but with the new timezone. */
-	tt.year = g_date_get_year (&week_view->first_day_shown);
-	tt.month = g_date_get_month (&week_view->first_day_shown);
-	tt.day = g_date_get_day (&week_view->first_day_shown);
-
-	lower = icaltime_as_timet_with_zone (tt, new_zone);
-
-	e_week_view_recalc_day_starts (week_view, lower);
-	e_week_view_update_query (week_view);
-}
-
-static void
-e_week_view_init (EWeekView *week_view)
-{
-	GnomeCanvasGroup *canvas_group;
-	GtkObject *adjustment;
-	GdkPixbuf *pixbuf;
-	gint i;
-
-	GTK_WIDGET_SET_FLAGS (week_view, GTK_CAN_FOCUS);
-
-	week_view->query = NULL;
-	week_view->event_destroyed = FALSE;
-	week_view->events = g_array_new (FALSE, FALSE,
-					 sizeof (EWeekViewEvent));
-	week_view->events_sorted = TRUE;
-	week_view->events_need_layout = FALSE;
-	week_view->events_need_reshape = FALSE;
-
-	week_view->layout_timeout_id = 0;
-
-	week_view->spans = NULL;
-
-	week_view->multi_week_view = FALSE;
-	week_view->month_scroll_by_week = FALSE;
-	week_view->scroll_by_week_notif_id = 0;
-	week_view->update_base_date = TRUE;
-	week_view->weeks_shown = 6;
-	week_view->rows = 6;
-	week_view->columns = 2;
-	week_view->compress_weekend = TRUE;
-	week_view->show_event_end_times = TRUE;
-	week_view->week_start_day = 0;		/* Monday. */
-	week_view->display_start_day = 0;	/* Monday. */
-
-	g_date_clear (&week_view->base_date, 1);
-	g_date_clear (&week_view->first_day_shown, 1);
-
-	week_view->row_height = 10;
-	week_view->rows_per_cell = 1;
-
-	week_view->selection_start_day = -1;
-	week_view->selection_drag_pos = E_WEEK_VIEW_DRAG_NONE;
-
-	week_view->pressed_event_num = -1;
-	week_view->editing_event_num = -1;
-
-	week_view->last_edited_comp_string = NULL;
-
-	week_view->main_gc = NULL;
-
-	/* Create the small font. */
-	week_view->use_small_font = TRUE;
-
-	week_view->small_font_desc =
-		pango_font_description_copy (gtk_widget_get_style (GTK_WIDGET (week_view))->font_desc);
-	pango_font_description_set_size (week_view->small_font_desc,
-					 E_WEEK_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE);
-
-	/* String to use in 12-hour time format for times in the morning. */
-	week_view->am_string = _("am");
-
-	/* String to use in 12-hour time format for times in the afternoon. */
-	week_view->pm_string = _("pm");
-
-	week_view->bc_event_time = 0;
-	week_view->before_click_dtstart = 0;
-	week_view->before_click_dtend = 0;
-
-	/*
-	 * Titles Canvas. Note that we don't show it is only shown in the
-	 * Month view.
-	 */
-	week_view->titles_canvas = e_canvas_new ();
-	gtk_table_attach (GTK_TABLE (week_view), week_view->titles_canvas,
-			  1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
-
-	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->titles_canvas)->root);
-
-	week_view->titles_canvas_item =
-		gnome_canvas_item_new (canvas_group,
-				       e_week_view_titles_item_get_type (),
-				       "EWeekViewTitlesItem::week_view", week_view,
-				       NULL);
-
-	/*
-	 * Main Canvas
-	 */
-	week_view->main_canvas = e_canvas_new ();
-	gtk_table_attach (GTK_TABLE (week_view), week_view->main_canvas,
-			  1, 2, 1, 2,
-			  GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
-	gtk_widget_show (week_view->main_canvas);
-
-	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (week_view->main_canvas)->root);
-
-	week_view->main_canvas_item =
-		gnome_canvas_item_new (canvas_group,
-				       e_week_view_main_item_get_type (),
-				       "EWeekViewMainItem::week_view", week_view,
-				       NULL);
-
-	g_signal_connect_after (week_view->main_canvas, "button_press_event",
-				G_CALLBACK (e_week_view_on_button_press), week_view);
-	g_signal_connect (week_view->main_canvas, "button_release_event",
-			  G_CALLBACK (e_week_view_on_button_release), week_view);
-	g_signal_connect (week_view->main_canvas, "scroll_event",
-			  G_CALLBACK (e_week_view_on_scroll), week_view);
-	g_signal_connect (week_view->main_canvas, "motion_notify_event",
-			  G_CALLBACK (e_week_view_on_motion), week_view);
-
-	/* Create the buttons to jump to each days. */
-	pixbuf = gdk_pixbuf_new_from_xpm_data ((const gchar **) jump_xpm);
-
-	for (i = 0; i < E_WEEK_VIEW_MAX_WEEKS * 7; i++) {
-		week_view->jump_buttons[i] = gnome_canvas_item_new
-			(canvas_group,
-			 gnome_canvas_pixbuf_get_type (),
-			 "GnomeCanvasPixbuf::pixbuf", pixbuf,
-			 NULL);
-
-		g_signal_connect (week_view->jump_buttons[i], "event",
-				  G_CALLBACK (e_week_view_on_jump_button_event), week_view);
-	}
-	week_view->focused_jump_button = E_WEEK_VIEW_JUMP_BUTTON_NO_FOCUS;
-
-	g_object_unref (pixbuf);
-
-	/*
-	 * Scrollbar.
-	 */
-	adjustment = gtk_adjustment_new (0, -52, 52, 1, 1, 1);
-
-	week_view->vscrollbar = gtk_vscrollbar_new (GTK_ADJUSTMENT (adjustment));
-	gtk_table_attach (GTK_TABLE (week_view), week_view->vscrollbar,
-			  2, 3, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0);
-	gtk_widget_show (week_view->vscrollbar);
-
-	/* Create the cursors. */
-	week_view->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR);
-	week_view->move_cursor = gdk_cursor_new (GDK_FLEUR);
-	week_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
-	week_view->last_cursor_set = NULL;
-
-		/* connect to ECalendarView's signals */
-	g_signal_connect (G_OBJECT (week_view), "timezone_changed",
-			  G_CALLBACK (timezone_changed_cb), NULL);
-}
-
-static void
 init_model (EWeekView *week_view, ECalModel *model)
 {
 	/* connect to ECalModel's signals */
@@ -1861,7 +1968,7 @@ e_week_view_set_weeks_shown	(EWeekView	*week_view,
 }
 
 gboolean
-e_week_view_get_compress_weekend	(EWeekView	*week_view)
+e_week_view_get_compress_weekend (EWeekView *week_view)
 {
 	g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
 
@@ -1869,17 +1976,17 @@ e_week_view_get_compress_weekend	(EWeekView	*week_view)
 }
 
 void
-e_week_view_set_compress_weekend	(EWeekView	*week_view,
-					 gboolean	 compress)
+e_week_view_set_compress_weekend (EWeekView *week_view,
+                                  gboolean compress_weekend)
 {
 	gboolean need_reload = FALSE;
 
 	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 
-	if (week_view->compress_weekend == compress)
+	if (week_view->compress_weekend == compress_weekend)
 		return;
 
-	week_view->compress_weekend = compress;
+	week_view->compress_weekend = compress_weekend;
 
 	/* The option only affects the month view. */
 	if (!week_view->multi_week_view)
@@ -1903,11 +2010,13 @@ e_week_view_set_compress_weekend	(EWeekView	*week_view,
 
 	gtk_widget_queue_draw (week_view->titles_canvas);
 	gtk_widget_queue_draw (week_view->main_canvas);
+
+	g_object_notify (G_OBJECT (week_view), "compress-weekend");
 }
 
 /* Whether we display event end times. */
 gboolean
-e_week_view_get_show_event_end_times	(EWeekView	*week_view)
+e_week_view_get_show_event_end_times (EWeekView *week_view)
 {
 	g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), TRUE);
 
@@ -1915,22 +2024,25 @@ e_week_view_get_show_event_end_times	(EWeekView	*week_view)
 }
 
 void
-e_week_view_set_show_event_end_times	(EWeekView	*week_view,
-					 gboolean	 show)
+e_week_view_set_show_event_end_times (EWeekView *week_view,
+                                      gboolean show_event_end_times)
 {
 	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 
-	if (week_view->show_event_end_times != show) {
-		week_view->show_event_end_times = show;
-		e_week_view_recalc_cell_sizes (week_view);
-		week_view->events_need_reshape = TRUE;
-		e_week_view_check_layout (week_view);
-	}
+	if (week_view->show_event_end_times != show_event_end_times)
+		return;
+
+	week_view->show_event_end_times = show_event_end_times;
+	e_week_view_recalc_cell_sizes (week_view);
+	week_view->events_need_reshape = TRUE;
+	e_week_view_check_layout (week_view);
+
+	g_object_notify (G_OBJECT (week_view), "show-event-end-times");
 }
 
 /* The first day of the week, 0 (Monday) to 6 (Sunday). */
 gint
-e_week_view_get_week_start_day	(EWeekView	*week_view)
+e_week_view_get_week_start_day (EWeekView *week_view)
 {
 	g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), 0);
 
@@ -1938,8 +2050,8 @@ e_week_view_get_week_start_day	(EWeekView	*week_view)
 }
 
 void
-e_week_view_set_week_start_day	(EWeekView	*week_view,
-				 gint		 week_start_day)
+e_week_view_set_week_start_day (EWeekView *week_view,
+                                gint week_start_day)
 {
 	g_return_if_fail (E_IS_WEEK_VIEW (week_view));
 	g_return_if_fail (week_start_day >= 0);
@@ -1959,6 +2071,8 @@ e_week_view_set_week_start_day	(EWeekView	*week_view,
 
 	gtk_widget_queue_draw (week_view->titles_canvas);
 	gtk_widget_queue_draw (week_view->main_canvas);
+
+	g_object_notify (G_OBJECT (week_view), "week-start-day");
 }
 
 static gboolean
diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h
index 0589dee..ef4a5c0 100644
--- a/calendar/gui/e-week-view.h
+++ b/calendar/gui/e-week-view.h
@@ -403,14 +403,14 @@ void		e_week_view_set_weeks_shown	(EWeekView *week_view,
    view. In the Week view they are always compressed. */
 gboolean	e_week_view_get_compress_weekend(EWeekView *week_view);
 void		e_week_view_set_compress_weekend(EWeekView *week_view,
-						 gboolean compress);
+						 gboolean compress_weekend);
 
 /* Whether we display event end times. */
 gboolean	e_week_view_get_show_event_end_times
 						(EWeekView *week_view);
 void		e_week_view_set_show_event_end_times
 						(EWeekView *week_view,
-						 gboolean show);
+						 gboolean show_event_end_times);
 
 /* The first day of the week, 0 (Monday) to 6 (Sunday). */
 gint e_week_view_get_week_start_day	(EWeekView *week_view);
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 8714c01..6befd21 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -54,13 +54,10 @@
 #include "comp-util.h"
 #include "e-cal-model-calendar.h"
 #include "e-day-view.h"
-#include "e-day-view-config.h"
 #include "e-day-view-time-item.h"
 #include "e-month-view.h"
 #include "e-week-view.h"
-#include "e-week-view-config.h"
 #include "e-cal-list-view.h"
-#include "e-cal-list-view-config.h"
 #include "e-mini-calendar-config.h"
 #include "e-calendar-table-config.h"
 #include "gnome-cal.h"
@@ -116,7 +113,6 @@ struct _GnomeCalendarPrivate {
 	   positions of the panes. range_selected is TRUE if a range of dates
 	   was selected in the date navigator to show the view. */
 	ECalendarView    *views[GNOME_CAL_LAST_VIEW];
-	GObject    *configs[GNOME_CAL_LAST_VIEW];
 	GnomeCalendarViewType current_view_type;
 	GList *notifications;
 
@@ -1087,7 +1083,7 @@ update_marcus_bains_line_cb (GnomeCalendar *gcal)
 	view = gnome_calendar_get_calendar_view (gcal, view_type);
 
 	if (E_IS_DAY_VIEW (view))
-		e_day_view_update_marcus_bains (E_DAY_VIEW (view));
+		e_day_view_marcus_bains_update (E_DAY_VIEW (view));
 
 	time (&now);
 	day_begin = time_day_begin (now);
@@ -1316,8 +1312,6 @@ setup_widgets (GnomeCalendar *gcal)
 	e_calendar_view_set_calendar (calendar_view, gcal);
 	e_calendar_view_set_timezone (calendar_view, priv->zone);
 	priv->views[GNOME_CAL_DAY_VIEW] = calendar_view;
-	priv->configs[GNOME_CAL_DAY_VIEW] =
-		G_OBJECT (e_day_view_config_new (E_DAY_VIEW (calendar_view)));
 
 	g_signal_connect (
 		calendar_view, "selection-changed",
@@ -1330,8 +1324,6 @@ setup_widgets (GnomeCalendar *gcal)
 	e_calendar_view_set_calendar (calendar_view, gcal);
 	e_calendar_view_set_timezone (calendar_view, priv->zone);
 	priv->views[GNOME_CAL_WORK_WEEK_VIEW] = calendar_view;
-	priv->configs[GNOME_CAL_WORK_WEEK_VIEW] =
-		G_OBJECT (e_day_view_config_new (E_DAY_VIEW (calendar_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);
@@ -1341,8 +1333,6 @@ setup_widgets (GnomeCalendar *gcal)
 	e_calendar_view_set_calendar (calendar_view, gcal);
 	e_calendar_view_set_timezone (calendar_view, priv->zone);
 	priv->views[GNOME_CAL_WEEK_VIEW] = calendar_view;
-	priv->configs[GNOME_CAL_WEEK_VIEW] =
-		G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (calendar_view)));
 
 	g_signal_connect (
 		calendar_view, "selection-changed",
@@ -1367,8 +1357,6 @@ setup_widgets (GnomeCalendar *gcal)
 	e_week_view_set_multi_week_view (E_WEEK_VIEW (calendar_view), TRUE);
 	e_week_view_set_weeks_shown (E_WEEK_VIEW (calendar_view), 6);
 	priv->views[GNOME_CAL_MONTH_VIEW] = calendar_view;
-	priv->configs[GNOME_CAL_MONTH_VIEW] =
-		G_OBJECT (e_week_view_config_new (E_WEEK_VIEW (calendar_view)));
 
 	g_signal_connect (
 		calendar_view, "selection-changed",
@@ -1385,8 +1373,6 @@ setup_widgets (GnomeCalendar *gcal)
 	e_calendar_view_set_calendar (calendar_view, gcal);
 	e_calendar_view_set_timezone (calendar_view, priv->zone);
 	priv->views[GNOME_CAL_LIST_VIEW] = calendar_view;
-	priv->configs[GNOME_CAL_LIST_VIEW] =
-		G_OBJECT (e_cal_list_view_config_new (E_CAL_LIST_VIEW (calendar_view)));
 
 	g_signal_connect (
 		calendar_view, "selection-changed",
@@ -1472,11 +1458,6 @@ gnome_calendar_destroy (GtkObject *object)
 		}
 		priv->default_client = NULL;
 
-		for (i = 0; i < GNOME_CAL_LAST_VIEW; i++) {
-			if (priv->configs[i])
-				g_object_unref (priv->configs[i]);
-			priv->configs[i] = NULL;
-		}
 		g_object_unref (priv->date_navigator_config);
 
 		for (l = priv->notifications; l; l = l->next)
diff --git a/modules/calendar/e-cal-shell-content.c b/modules/calendar/e-cal-shell-content.c
index 1a55c74..4e6f871 100644
--- a/modules/calendar/e-cal-shell-content.c
+++ b/modules/calendar/e-cal-shell-content.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <glib/gi18n.h>
 
+#include "e-util/e-binding.h"
 #include "e-util/gconf-bridge.h"
 
 #include "calendar/gui/calendar-config.h"
@@ -73,6 +74,19 @@ typedef enum {
 static gpointer parent_class;
 static GType cal_shell_content_type;
 
+static gboolean
+transform_week_start_day (const GValue *src_value,
+                          GValue *dst_value)
+{
+	gint v_int;
+
+	/* Transform day numbering from 0 = Sunday to 0 = Monday. */
+	v_int = g_value_get_int (src_value);
+	g_value_set_int (dst_value, (v_int + 6) % 7);
+
+	return TRUE;
+}
+
 static void
 cal_shell_content_display_view_cb (ECalShellContent *cal_shell_content,
                                    GalView *gal_view)
@@ -297,15 +311,20 @@ static void
 cal_shell_content_constructed (GObject *object)
 {
 	ECalShellContentPrivate *priv;
-	ECalModelCalendar *cal_model;
+	ECalendarView *calendar_view;
+	ECalModel *calendar_model;
 	ECalModel *memo_model;
 	ECalModel *task_model;
+	EShell *shell;
 	EShellContent *shell_content;
 	EShellBackend *shell_backend;
+	EShellSettings *shell_settings;
 	EShellView *shell_view;
 	EShellWindow *shell_window;
 	EShellContent *foreign_content;
 	EShellView *foreign_view;
+	GnomeCalendar *calendar;
+	GnomeCalendarViewType view_type;
 	GalViewInstance *view_instance;
 	GConfBridge *bridge;
 	GtkWidget *container;
@@ -329,11 +348,8 @@ cal_shell_content_constructed (GObject *object)
 	shell_backend = e_shell_view_get_shell_backend (shell_view);
 	config_dir = e_shell_backend_get_config_dir (shell_backend);
 
-	/* Calendar model for the views. */
-	cal_model = e_cal_model_calendar_new ();
-	e_cal_model_set_flags (
-		E_CAL_MODEL (cal_model),
-		E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES);
+	shell = e_shell_window_get_shell (shell_window);
+	shell_settings = e_shell_get_shell_settings (shell);
 
 	/* We borrow the memopad and taskpad models from the memo
 	 * and task views, loading the views if necessary. */
@@ -378,16 +394,15 @@ cal_shell_content_constructed (GObject *object)
 	/* Add views in the order defined by GnomeCalendarViewType, such
 	 * that the notebook page number corresponds to the view type. */
 
-	for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {
-		GnomeCalendar *calendar;
-		ECalendarView *view;
+	calendar = GNOME_CALENDAR (priv->calendar);
 
-		calendar = GNOME_CALENDAR (priv->calendar);
-		view = gnome_calendar_get_calendar_view (calendar, ii);
+	for (ii = 0; ii < GNOME_CAL_LAST_VIEW; ii++) {
+		calendar_view = gnome_calendar_get_calendar_view (calendar, ii);
 
 		gtk_notebook_append_page (
-			GTK_NOTEBOOK (container), GTK_WIDGET (view), NULL);
-		gtk_widget_show (GTK_WIDGET (view));
+			GTK_NOTEBOOK (container),
+			GTK_WIDGET (calendar_view), NULL);
+		gtk_widget_show (GTK_WIDGET (calendar_view));
 	}
 
 	container = priv->vpaned;
@@ -471,6 +486,148 @@ cal_shell_content_constructed (GObject *object)
 	key = "/apps/evolution/calendar/display/vpane_position";
 	gconf_bridge_bind_property_delayed (bridge, key, object, "position");
 
+	/* Bind day view properties to EShellSettings. */
+
+	view_type = GNOME_CAL_DAY_VIEW;
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-show-line",
+		G_OBJECT (calendar_view), "marcus-bains-show-line");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-day-view-color",
+		G_OBJECT (calendar_view), "marcus-bains-day-view-color");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-time-bar-color",
+		G_OBJECT (calendar_view), "marcus-bains-time-bar-color");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-time-divisions",
+		G_OBJECT (calendar_view), "mins-per-row");
+
+	e_binding_new_full (
+		G_OBJECT (shell_settings), "cal-week-start-day",
+		G_OBJECT (calendar_view), "week-start-day",
+		(EBindingTransform) transform_week_start_day,
+		(GDestroyNotify) NULL, NULL);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-end-hour",
+		G_OBJECT (calendar_view), "work-day-end-hour");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-end-minute",
+		G_OBJECT (calendar_view), "work-day-end-minute");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-start-hour",
+		G_OBJECT (calendar_view), "work-day-start-hour");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-start-minute",
+		G_OBJECT (calendar_view), "work-day-start-minute");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-working-days",
+		G_OBJECT (calendar_view), "working-days");
+
+	/* Bind work week view properties to EShellSettings. */
+
+	view_type = GNOME_CAL_WORK_WEEK_VIEW;
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-show-line",
+		G_OBJECT (calendar_view), "marcus-bains-show-line");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-day-view-color",
+		G_OBJECT (calendar_view), "marcus-bains-day-view-color");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-marcus-bains-time-bar-color",
+		G_OBJECT (calendar_view), "marcus-bains-time-bar-color");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-time-divisions",
+		G_OBJECT (calendar_view), "mins-per-row");
+
+	e_binding_new_full (
+		G_OBJECT (shell_settings), "cal-week-start-day",
+		G_OBJECT (calendar_view), "week-start-day",
+		(EBindingTransform) transform_week_start_day,
+		(GDestroyNotify) NULL, NULL);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-end-hour",
+		G_OBJECT (calendar_view), "work-day-end-hour");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-end-minute",
+		G_OBJECT (calendar_view), "work-day-end-minute");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-start-hour",
+		G_OBJECT (calendar_view), "work-day-start-hour");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-work-day-start-minute",
+		G_OBJECT (calendar_view), "work-day-start-minute");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-working-days",
+		G_OBJECT (calendar_view), "working-days");
+
+	/* Bind week view properties to EShellSettings. */
+
+	view_type = GNOME_CAL_WEEK_VIEW;
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-compress-weekend",
+		G_OBJECT (calendar_view), "compress-weekend");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-show-event-end-times",
+		G_OBJECT (calendar_view), "show-event-end-times");
+
+	e_binding_new_full (
+		G_OBJECT (shell_settings), "cal-week-start-day",
+		G_OBJECT (calendar_view), "week-start-day",
+		(EBindingTransform) transform_week_start_day,
+		(GDestroyNotify) NULL, NULL);
+
+	/* Bind month view properties to EShellSettings. */
+
+	view_type = GNOME_CAL_MONTH_VIEW;
+	calendar_view = gnome_calendar_get_calendar_view (calendar, view_type);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-compress-weekend",
+		G_OBJECT (calendar_view), "compress-weekend");
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-show-event-end-times",
+		G_OBJECT (calendar_view), "show-event-end-times");
+
+	e_binding_new_full (
+		G_OBJECT (shell_settings), "cal-week-start-day",
+		G_OBJECT (calendar_view), "week-start-day",
+		(EBindingTransform) transform_week_start_day,
+		(GDestroyNotify) NULL, NULL);
+
+	/* Bind calendar model properties to EShellSettings.
+	 * Note, does not matter from which view we get the
+	 * model, since it's shared across all of them. */
+
+	calendar_model = e_calendar_view_get_model (calendar_view);
+
+	e_binding_new (
+		G_OBJECT (shell_settings), "cal-use-24-hour-format",
+		G_OBJECT (calendar_view), "use-24-hour-format");
+
 	g_object_unref (memo_model);
 	g_object_unref (task_model);
 }
diff --git a/modules/calendar/e-cal-shell-settings.c b/modules/calendar/e-cal-shell-settings.c
index 03af4ae..0379a65 100644
--- a/modules/calendar/e-cal-shell-settings.c
+++ b/modules/calendar/e-cal-shell-settings.c
@@ -34,6 +34,54 @@ e_cal_shell_backend_init_settings (EShell *shell)
 	 *     Yes it's redundant, but we're stuck with GConf. */
 
 	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"cal-compress-weekend",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-compress-weekend",
+		"/apps/evolution/calendar/display/compress_weekend");
+
+	e_shell_settings_install_property (
+		g_param_spec_string (
+			"cal-marcus-bains-day-view-color",
+			NULL,
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-marcus-bains-day-view-color",
+		"/apps/evolution/calendar/display/marcus_bains_color_dayview");
+
+	e_shell_settings_install_property (
+		g_param_spec_string (
+			"cal-marcus-bains-time-bar-color",
+			NULL,
+			NULL,
+			NULL,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-marcus-bains-time-bar-color",
+		"/apps/evolution/calendar/display/marcus_bains_color_timebar");
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"cal-marcus-bains-show-line",
+			NULL,
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-marcus-bains-show-line",
+		"/apps/evolution/calendar/display/marcus_bains_line");
+
+	e_shell_settings_install_property (
 		g_param_spec_string (
 			"cal-primary-calendar",
 			NULL,
@@ -47,6 +95,44 @@ e_cal_shell_backend_init_settings (EShell *shell)
 
 	e_shell_settings_install_property (
 		g_param_spec_boolean (
+			"cal-show-event-end-times",
+			NULL,
+			NULL,
+			FALSE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-show-event-end-times",
+		"/apps/evolution/calendar/display/show_event_end");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-time-divisions",
+			NULL,
+			NULL,
+			5,
+			60,
+			30,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-time-divisions",
+		"/apps/evolution/calendar/display/time_divisions");
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
+			"cal-use-24-hour-format",
+			NULL,
+			NULL,
+			TRUE,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-use-24-hour-format",
+		"/apps/evolution/calendar/display/use_24hour_format");
+
+	e_shell_settings_install_property (
+		g_param_spec_boolean (
 			"cal-use-system-timezone",
 			NULL,
 			NULL,
@@ -56,4 +142,88 @@ e_cal_shell_backend_init_settings (EShell *shell)
 	e_shell_settings_bind_to_gconf (
 		shell_settings, "cal-use-system-timezone",
 		"/apps/evolution/calendar/display/use_system_timezone");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-week-start-day",
+			NULL,
+			NULL,
+			0,  /* Sunday */
+			6,  /* Saturday */
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-week-start-day",
+		"/apps/evolution/calendar/display/week_start_day");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-work-day-end-hour",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-work-day-end-hour",
+		"/apps/evolution/calendar/display/day_end_hour");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-work-day-end-minute",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-work-day-end-minute",
+		"/apps/evolution/calendar/display/day_end_minute");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-work-day-start-hour",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-work-day-start-hour",
+		"/apps/evolution/calendar/display/day_start_hour");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-work-day-start-minute",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-work-day-start-minute",
+		"/apps/evolution/calendar/display/day_start_minute");
+
+	e_shell_settings_install_property (
+		g_param_spec_int (
+			"cal-working-days",
+			NULL,
+			NULL,
+			G_MININT,
+			G_MAXINT,
+			0,
+			G_PARAM_READWRITE));
+
+	e_shell_settings_bind_to_gconf (
+		shell_settings, "cal-working-days",
+		"/apps/evolution/calendar/display/working_days");
 }



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