[evolution/calendar-clutter] Clutter calendar canvas tryout.



commit f38292880d9686a4196365379f71ae46a901caca
Author: Srinivasa Ragavan <sragavan gnome org>
Date:   Wed Aug 11 11:13:02 2010 +0530

    Clutter calendar canvas tryout.

 calendar/gui/Makefile.am            |    2 +
 calendar/gui/e-day-view-main-item.c |  228 +++++++++--
 calendar/gui/e-day-view-main-item.h |   13 +-
 calendar/gui/e-day-view-time-item.c |  132 +++++--
 calendar/gui/e-day-view-time-item.h |   18 +-
 calendar/gui/e-day-view.c           |  764 +++++++++++++++++++++++++++--------
 calendar/gui/e-day-view.h           |    8 +-
 mail/e-mail-message-pane.c          |    8 +-
 mail/e-mail-message-pane.h          |    2 +
 mail/e-mail-notebook-view.c         |  139 ++++++-
 mail/e-mail-paned-view.c            |   22 +
 mail/e-mail-paned-view.h            |    2 +
 mail/e-mail-reader.c                |   81 ++++
 mail/e-mail-reader.h                |    4 +
 ui/evolution-mail-reader.ui         |    4 +-
 15 files changed, 1163 insertions(+), 264 deletions(-)
---
diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am
index a168582..cd83024 100644
--- a/calendar/gui/Makefile.am
+++ b/calendar/gui/Makefile.am
@@ -72,6 +72,7 @@ libevolution_calendar_la_CPPFLAGS =			\
 	$(GNOME_PLATFORM_CFLAGS)			\
 	$(LIBSOUP_CFLAGS)				\
 	$(EVOLUTION_CALENDAR_CFLAGS)			\
+	$(CLUTTER_CFLAGS)				\
 	$(CAMEL_CFLAGS)
 
 ui_DATA = 					\
@@ -229,6 +230,7 @@ libevolution_calendar_la_LIBADD =					\
 	$(CAMEL_LIBS)							\
 	$(LIBSOUP_LIBS)							\
 	$(EVOLUTION_CALENDAR_LIBS)					\
+	$(CLUTTER_LIBS)							\
 	$(GNOME_PLATFORM_LIBS)
 
 libevolution_calendar_la_LDFLAGS = $(NO_UNDEFINED)
diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c
index 0229f51..bf64157 100644
--- a/calendar/gui/e-day-view-main-item.c
+++ b/calendar/gui/e-day-view-main-item.c
@@ -90,7 +90,7 @@ icalcomp_is_transparent (icalcomponent *icalcomp)
 
 static void
 day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
-                                              GdkDrawable *drawable,
+                                              cairo_t *cr,
                                               gint x,
                                               gint y,
                                               gint width,
@@ -100,11 +100,13 @@ day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
 	EDayView *day_view;
 	EDayViewEvent *event;
 	gint event_num, start_day, end_day, day, bar_y1, bar_y2, grid_x;
-	cairo_t *cr = NULL;
 	GdkColor bg_color;
 
 	day_view = e_day_view_main_item_get_day_view (main_item);
 
+	cairo_save (cr);
+	gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
+
 	for (event_num = 0; event_num < day_view->long_events->len; event_num++) {
 		gboolean first = TRUE;
 		event = &g_array_index (day_view->long_events, EDayViewEvent, event_num);
@@ -146,9 +148,9 @@ day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
 
 			if (bar_y1 < height && bar_y2 > 0 && bar_y2 > bar_y1 && can_draw_in_region (draw_region, grid_x, bar_y1, E_DAY_VIEW_BAR_WIDTH - 2, bar_y2 - bar_y1)) {
 				if (!cr) {
-					cr = gdk_cairo_create (drawable);
-					cairo_save (cr);
-					gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
+				//	cr = gdk_cairo_create (drawable);
+				//	cairo_save (cr);
+				//	gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
 				}
 
 				if (first) {
@@ -172,13 +174,21 @@ day_view_main_item_draw_long_events_in_vbars (EDayViewMainItem *main_item,
 
 	if (cr) {
 		cairo_restore (cr);
-		cairo_destroy (cr);
+		//cairo_destroy (cr);
 	}
 }
 
 static void
+hide_drag (ClutterAnimation *anim,
+		EDayView *day_view)
+{
+	clutter_actor_destroy (day_view->dragged);
+	day_view->dragged = NULL;
+}
+
+static void
 day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
-                                   GdkDrawable *drawable,
+                                   cairo_t *cr,
                                    gint x,
                                    gint y,
                                    gint width,
@@ -199,7 +209,6 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 	gboolean draw_reminder_icon, draw_recurrence_icon, draw_timezone_icon, draw_meeting_icon;
 	gboolean draw_attach_icon;
 	ECalComponentTransparency transparency;
-	cairo_t *cr;
 	cairo_pattern_t *pat;
 	cairo_font_options_t *font_options;
 	guint16 red, green, blue;
@@ -221,7 +230,13 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 	gchar *text = NULL;
 	gint scroll_flag = 0;
 	gint row_y;
-
+	ClutterActor *actor;
+	char *tmp;
+	ClutterActor *stage = g_object_get_data (main_item, "stage");
+	gboolean new = TRUE;
+	gboolean dragged = FALSE;
+	gboolean drag_end = FALSE;
+	gboolean resize = FALSE;
 	day_view = e_day_view_main_item_get_day_view (main_item);
 	model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view));
 
@@ -236,13 +251,89 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 					    &item_w, &item_h))
 		return;
 
+	if (!is_array_index_in_bounds (day_view->events[day], event_num))
+		return;
+
+	event = &g_array_index (day_view->events[day], EDayViewEvent,
+				event_num);	
+
 	item_x -= x;
 	item_y -= y;
 
 	if (!can_draw_in_region (draw_region, item_x, item_y, item_w, item_h))
 		return;
 
-	cr = gdk_cairo_create (drawable);
+	tmp = g_strdup_printf("%d-%d", day, event_num);
+	actor = g_object_get_data (day_view, tmp);
+
+	dragged = (GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "drag-is-actor"))) ? TRUE : FALSE;
+	drag_end = (GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "drag-end"))) ? TRUE : FALSE;
+	resize = (GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "resize-event"))) ? TRUE : FALSE;
+	
+	g_object_set_data (event->canvas_item, "resize-event", GINT_TO_POINTER(FALSE));
+
+	//del = (GPOINTER_TO_INT(g_object_get_data (actor, "mark-delete"))) ? TRUE : FALSE;
+	if (actor && !dragged && !resize) {
+		double x,y;
+		if (clutter_actor_is_scaled (actor)) {
+			clutter_actor_animate (actor,          /* the actor to animate */
+                	       CLUTTER_LINEAR, /* the easing mode */
+                       		200,           /* the duration of the animation */
+                       		"scale-x", 1.0, /* final horizontal scaling factor */
+                       		"scale-y", 1.0, /* final vertical scaling factor */
+				"opacity", 0,
+				"signal::completed", clutter_actor_destroy, actor,
+                       		NULL);
+
+		} else
+			clutter_actor_destroy (actor);
+		new = FALSE;
+	}
+
+	if (!dragged && !resize) {
+		actor  = clutter_cairo_texture_new (item_w, item_h);
+		if (new) {
+			clutter_actor_set_opacity (actor, 0);
+			clutter_actor_set_scale (actor, 5.0, 5.0);
+		}
+		clutter_actor_show (actor);
+		clutter_actor_set_size (actor, item_w, item_h);
+		clutter_container_add_actor (stage, actor);
+		clutter_actor_set_position (actor, item_x, item_y);
+	} else {
+		gfloat nx, ny;
+		clutter_actor_get_position (actor, &nx, &ny);
+		clutter_actor_set_scale (actor, 1.0, 1.0);
+		printf("from %lf,%lf to %d,%d\n", nx, ny, item_x, item_y);
+		//clutter_actor_set_anchor_point (actor, 0, 0);
+		//clutter_actor_set_position (actor, item_x, item_y);
+		clutter_actor_show (actor);
+		clutter_actor_raise_top (actor);
+		if (drag_end) {
+			g_object_set_data (event->canvas_item, "drag-is-actor", GINT_TO_POINTER(FALSE));
+			g_object_set_data (event->canvas_item, "drag-end", GINT_TO_POINTER(FALSE));	
+		}
+		clutter_actor_raise_top (event->canvas_item);
+		
+		
+		clutter_actor_animate (actor,
+				CLUTTER_LINEAR, 200,
+				"x", (float)item_x + (item_w/2),
+				"y", (float)item_y + (item_h/2),
+				"opacity", 255, 
+				"signal::completed", hide_drag, day_view,					
+				NULL);
+
+		return;
+	}
+
+	item_x = 0;
+	item_y = 0;
+	clutter_actor_raise (actor, main_item);
+	g_object_set_data (day_view, tmp, actor);
+	g_free (tmp);
+	cr = clutter_cairo_texture_create (actor);
+
 	gdk_cairo_set_source_color (cr,
 			&day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR]);
 
@@ -253,11 +344,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 
 	font_options = get_font_options ();
 
-	if (!is_array_index_in_bounds (day_view->events[day], event_num))
-		return;
 
-	event = &g_array_index (day_view->events[day], EDayViewEvent,
-				event_num);
 
 	if (!is_comp_data_valid (event))
 		return;
@@ -285,12 +372,47 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 	}
 
 	is_editing = day_view->editing_event_day == day && day_view->editing_event_num == event_num;
-
+	clutter_actor_move_anchor_point (actor, item_w/2, item_h/2);
+	
+	if (is_editing) {
+		printf("EDITING %d %d\n", day_view->editing_event_day, day_view->editing_event_num);
+		clutter_actor_raise_top (actor);
+		clutter_actor_move_anchor_point (actor, item_w/2, item_h/2);
+		clutter_actor_animate (actor,          /* the actor to animate */
+                       CLUTTER_LINEAR, /* the easing mode */
+                       200,           /* the duration of the animation */
+                       "scale-x", 1.2, /* final horizontal scaling factor */
+                       "scale-y", 1.2, /* final vertical scaling factor */
+                       NULL);
+		if (event->canvas_item) {
+			clutter_actor_raise_top (event->canvas_item);
+			//clutter_actor_move_anchor_point (event->canvas_item, item_w/2, item_h/2);
+
+			//clutter_actor_set_scale (event->canvas_item, 1.5, 1.5);
+		}
+	}  else if  (event->canvas_item)
+		clutter_actor_set_scale (event->canvas_item, 1.0, 1.0);
+
+	if (new) {
+		clutter_actor_raise_top (actor);
+		clutter_actor_move_anchor_point (actor, item_w/2, item_h/2);
+		clutter_actor_animate (actor,          /* the actor to animate */
+                       CLUTTER_LINEAR, /* the easing mode */
+                       200,           /* the duration of the animation */
+                       "scale-x", 1.0, /* final horizontal scaling factor */
+                       "scale-y", 1.0, /* final vertical scaling factor */
+		       "opacity", 255,
+                       NULL);
+		clutter_actor_raise_top (event->canvas_item);		
+		
+	}
+		
 	if (event->canvas_item)
-		g_object_get (G_OBJECT (event->canvas_item), "x_offset", &text_x_offset, NULL);
+		text_x_offset = (gdouble)GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "x_offset"));
+		//g_object_get (G_OBJECT (event->canvas_item), "x_offset", &text_x_offset, NULL);
 
 	/* Draw shadow around the event when selected */
-	if (is_editing && (gtk_widget_has_focus (day_view->main_canvas))) {
+	if (is_editing && 0 && (gtk_widget_has_focus (day_view->main_canvas))) {
 		/* For embossing Item selection */
 		item_x -= 1;
 		item_y -= 2;
@@ -832,7 +954,7 @@ day_view_main_item_draw_day_event (EDayViewMainItem *main_item,
 
 static void
 day_view_main_item_draw_day_events (EDayViewMainItem *main_item,
-                                    GdkDrawable *drawable,
+                                    cairo_t *cr,
                                     gint x,
                                     gint y,
                                     gint width,
@@ -848,14 +970,14 @@ day_view_main_item_draw_day_events (EDayViewMainItem *main_item,
 	for (event_num = 0; event_num < day_view->events[day]->len;
 	     event_num++) {
 		day_view_main_item_draw_day_event (
-			main_item, drawable, x, y, width, height,
+			main_item, cr, x, y, width, height,
 			day, event_num, draw_region);
 	}
 }
 
 static void
 day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
-                                         GdkDrawable *drawable,
+                                         cairo_t *cr,
                                          gint x,
                                          gint y,
                                          gint width,
@@ -866,12 +988,15 @@ day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
 	EDayView *day_view;
 	EDayViewEvent *event;
 	gint grid_x, event_num, bar_y, bar_h;
-	cairo_t *cr = NULL;
+	//cairo_t *cr = NULL;
 	GdkColor bg_color;
 
 	day_view = e_day_view_main_item_get_day_view (main_item);
 
 	grid_x = day_view->day_offsets[day] + 1 - x;
+	
+	cairo_save (cr);
+			gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
 
 	/* Draw the busy times corresponding to the events in the day. */
 	for (event_num = 0; event_num < day_view->events[day]->len; event_num++) {
@@ -901,10 +1026,10 @@ day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
 		}
 
 		if (!cr) {
-			cr = gdk_cairo_create (drawable);
-			cairo_save (cr);
+		//	//cr = gdk_cairo_create (drawable);
+		//	cairo_save (cr);
 
-			gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
+		//	gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND]);
 		}
 
 		if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), event->comp_data), &bg_color)) {
@@ -923,7 +1048,7 @@ day_view_main_item_draw_events_in_vbars (EDayViewMainItem *main_item,
 
 	if (cr) {
 		cairo_restore (cr);
-		cairo_destroy (cr);
+		//cairo_destroy (cr);
 	}
 }
 
@@ -977,6 +1102,7 @@ day_view_main_item_dispose (GObject *object)
 	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
+#if 0
 static void
 day_view_main_item_update (GnomeCanvasItem *item,
 			   gdouble *affine,
@@ -995,14 +1121,15 @@ day_view_main_item_update (GnomeCanvasItem *item,
 	item->x2 = INT_MAX;
 	item->y2 = INT_MAX;
 }
+#endif
 
-static void
-day_view_main_item_draw (GnomeCanvasItem *canvas_item,
-                         GdkDrawable *drawable,
+void
+e_day_view_main_item_draw (EDayViewMainItem *canvas_item)
+ /*                        GdkDrawable *drawable,
                          gint x,
                          gint y,
                          gint width,
-                         gint height)
+                         gint height) */
 {
 	EDayViewMainItem *main_item;
 	EDayView *day_view;
@@ -1017,8 +1144,13 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
 	gboolean today = FALSE;
 	GdkRegion *draw_region;
 	GdkRectangle rect;
+	int x=0, y=0;
+	int width, height;
 
-	cr = gdk_cairo_create (drawable);
+	clutter_cairo_texture_get_surface_size (canvas_item, &width, &height);
+	
+	cr = clutter_cairo_texture_create (canvas_item);
+	//cr = gdk_cairo_create (drawable);
 
 	main_item = E_DAY_VIEW_MAIN_ITEM (canvas_item);
 	day_view = e_day_view_main_item_get_day_view (main_item);
@@ -1173,23 +1305,22 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
 		cairo_fill (cr);
 
 		cairo_restore (cr);
-
 		/* Fill in the bars when the user is busy. */
 		day_view_main_item_draw_events_in_vbars (
-			main_item, drawable, x, y,
+			main_item, cr, x, y,
 			width, height, day, draw_region);
 	}
 
 	/* Fill in the vertical bars corresponding to the busy times from the
 	   long events. */
 	day_view_main_item_draw_long_events_in_vbars (
-		main_item, drawable, x, y, width, height, draw_region);
+		main_item, cr, x, y, width, height, draw_region);
 
 	/* Draw the event borders and backgrounds, and the vertical bars
 	   down the left edges. */
 	for (day = 0; day < day_view->days_shown; day++)
 		day_view_main_item_draw_day_events (
-			main_item, drawable, x, y,
+			main_item, cr, x, y,
 			width, height, day, draw_region);
 
 	if (e_day_view_marcus_bains_get_show_line (day_view)) {
@@ -1234,6 +1365,7 @@ day_view_main_item_draw (GnomeCanvasItem *canvas_item,
 	gdk_region_destroy (draw_region);
 }
 
+#if 0
 static gdouble
 day_view_main_item_point (GnomeCanvasItem *item,
                           gdouble x,
@@ -1250,12 +1382,13 @@ day_view_main_item_point (GnomeCanvasItem *item,
 
 	return 0.0;
 }
+#endif
 
 static void
 day_view_main_item_class_init (EDayViewMainItemClass *class)
 {
 	GObjectClass *object_class;
-	GnomeCanvasItemClass *item_class;
+	ClutterCairoTextureClass *item_class;
 
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (EDayViewMainItemPrivate));
@@ -1265,10 +1398,10 @@ day_view_main_item_class_init (EDayViewMainItemClass *class)
 	object_class->get_property = day_view_main_item_get_property;
 	object_class->dispose = day_view_main_item_dispose;
 
-	item_class = GNOME_CANVAS_ITEM_CLASS (class);
-	item_class->update = day_view_main_item_update;
-	item_class->draw = day_view_main_item_draw;
-	item_class->point = day_view_main_item_point;
+	item_class = CLUTTER_CAIRO_TEXTURE_CLASS (class);
+//	item_class->update = day_view_main_item_update;
+//	item_class->draw = day_view_main_item_draw;
+//	item_class->point = day_view_main_item_point;
 
 	g_object_class_install_property (
 		object_class,
@@ -1310,7 +1443,7 @@ e_day_view_main_item_get_type (void)
 		};
 
 		type = g_type_register_static (
-			GNOME_TYPE_CANVAS_ITEM, "EDayViewMainItem",
+			CLUTTER_TYPE_CAIRO_TEXTURE, "EDayViewMainItem",
 			&type_info, 0);
 	}
 
@@ -1339,3 +1472,18 @@ e_day_view_main_item_set_day_view (EDayViewMainItem *main_item,
 
 	g_object_notify (G_OBJECT (main_item), "day-view");
 }
+
+void
+e_day_view_main_item_set_size (EDayViewMainItem *item, int width, int height)
+{
+	clutter_cairo_texture_set_surface_size (item, width, height);
+	clutter_cairo_texture_clear (item);
+	e_day_view_main_item_draw (item);
+}
+
+void
+e_day_view_main_item_redraw (EDayViewMainItem *item)
+{
+	clutter_cairo_texture_clear (item);
+	e_day_view_main_item_draw ((ClutterActor *)item);
+}
diff --git a/calendar/gui/e-day-view-main-item.h b/calendar/gui/e-day-view-main-item.h
index 567565b..e5c991a 100644
--- a/calendar/gui/e-day-view-main-item.h
+++ b/calendar/gui/e-day-view-main-item.h
@@ -30,6 +30,10 @@
 
 #include "e-day-view.h"
 
+#include <clutter/clutter.h>
+#include <mx/mx.h>
+#include <clutter-gtk/clutter-gtk.h>
+
 /* Standard GObject macros */
 #define E_TYPE_DAY_VIEW_MAIN_ITEM \
 	(e_day_view_main_item_get_type ())
@@ -56,12 +60,12 @@ typedef struct _EDayViewMainItemClass EDayViewMainItemClass;
 typedef struct _EDayViewMainItemPrivate EDayViewMainItemPrivate;
 
 struct _EDayViewMainItem {
-	GnomeCanvasItem parent;
+	ClutterCairoTexture parent;
 	EDayViewMainItemPrivate *priv;
 };
 
 struct _EDayViewMainItemClass {
-	GnomeCanvasItemClass parent_class;
+	ClutterCairoTextureClass parent_class;
 };
 
 GType		e_day_view_main_item_get_type	(void);
@@ -70,6 +74,11 @@ EDayView *	e_day_view_main_item_get_day_view
 void		e_day_view_main_item_set_day_view
 						(EDayViewMainItem *main_item,
 						 EDayView *day_view);
+void		e_day_view_main_item_set_size 	(EDayViewMainItem *item, 
+						 int width, 
+						 int height);
+void		e_day_view_main_item_draw (EDayViewMainItem *item);
+void		e_day_view_main_item_redraw (EDayViewMainItem *item);
 
 G_END_DECLS
 
diff --git a/calendar/gui/e-day-view-time-item.c b/calendar/gui/e-day-view-time-item.c
index edc446a..a19d3a5 100644
--- a/calendar/gui/e-day-view-time-item.c
+++ b/calendar/gui/e-day-view-time-item.c
@@ -25,6 +25,10 @@
 #include <config.h>
 #endif
 
+#include <clutter/clutter.h>
+#include <mx/mx.h>
+#include <clutter-gtk/clutter-gtk.h>
+
 #include <string.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
@@ -76,16 +80,14 @@ struct _EDayViewTimeItemPrivate {
 static void e_day_view_time_item_update (GnomeCanvasItem *item,
 					 double *affine,
 					 ArtSVP *clip_path, gint flags);
-static void e_day_view_time_item_draw (GnomeCanvasItem *item,
+static void e_day_view_time_item_draw (ClutterActor *actor);/*
 				       GdkDrawable *drawable,
 				       gint x, gint y,
-				       gint width, gint height);
+				       gint width, gint height);*/
 static double e_day_view_time_item_point (GnomeCanvasItem *item,
 					  double x, double y,
 					  gint cx, gint cy,
 					  GnomeCanvasItem **actual_item);
-static gint e_day_view_time_item_event (GnomeCanvasItem *item,
-					GdkEvent *event);
 static void e_day_view_time_item_increment_time	(gint	*hour,
 						 gint	*minute,
 						 gint	 mins_per_row);
@@ -180,7 +182,7 @@ static void
 day_view_time_item_class_init (EDayViewTimeItemClass *class)
 {
 	GObjectClass *object_class;
-	GnomeCanvasItemClass *item_class;
+	ClutterCairoTextureClass *item_class;
 
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (EDayViewTimeItemPrivate));
@@ -191,11 +193,10 @@ day_view_time_item_class_init (EDayViewTimeItemClass *class)
 	object_class->dispose = day_view_time_item_dispose;
 	object_class->finalize = day_view_time_item_finalize;
 
-	item_class = GNOME_CANVAS_ITEM_CLASS (class);
-	item_class->update = e_day_view_time_item_update;
-	item_class->draw = e_day_view_time_item_draw;
-	item_class->point = e_day_view_time_item_point;
-	item_class->event = e_day_view_time_item_event;
+	item_class = CLUTTER_CAIRO_TEXTURE_CLASS (class);
+//	item_class->update = e_day_view_time_item_update;
+//	item_class->point = e_day_view_time_item_point;
+//	CLUTTER_ACTOR_CLASS(item_class)->event = e_day_view_time_item_event;
 
 	g_object_class_install_property (
 		object_class,
@@ -229,6 +230,36 @@ day_view_time_item_init (EDayViewTimeItem *time_item)
 	time_item->priv->second_zone_changed_id = calendar_config_add_notification_day_second_zone (edvti_second_zone_changed_cb, time_item);
 }
 
+EDayViewTimeItem *
+e_day_view_time_item_new (EDayView *day_view, gint width, gint height)
+{
+	EDayViewTimeItem *item;
+
+	item =  g_object_new (
+			E_TYPE_DAY_VIEW_TIME_ITEM,
+			"EDayViewTimeItem::day_view", day_view,
+                       "surface-width", 50,
+                       "surface-height", 300,			
+			NULL); 
+
+	e_day_view_time_item_draw ((ClutterActor *)item);
+}
+
+void
+e_day_view_time_item_set_size (EDayViewTimeItem *item, int width, int height)
+{
+	clutter_cairo_texture_set_surface_size (item, width, height);
+	clutter_cairo_texture_clear (item);
+	e_day_view_time_item_draw ((ClutterActor *)item);
+}
+
+void
+e_day_view_time_item_redraw (EDayViewTimeItem *item)
+{
+	clutter_cairo_texture_clear (item);
+	e_day_view_time_item_draw ((ClutterActor *)item);
+}
+
 GType
 e_day_view_time_item_get_type (void)
 {
@@ -249,13 +280,13 @@ e_day_view_time_item_get_type (void)
 		};
 
 		type = g_type_register_static (
-			GNOME_TYPE_CANVAS_ITEM, "EDayViewTimeItem",
+			CLUTTER_TYPE_CAIRO_TEXTURE, "EDayViewTimeItem",
 			&type_info, 0);
 	}
 
 	return type;
 }
-
+#if 0
 static void
 e_day_view_time_item_update (GnomeCanvasItem *item,
 			    double *affine,
@@ -271,13 +302,13 @@ e_day_view_time_item_update (GnomeCanvasItem *item,
 	item->x2 = INT_MAX;
 	item->y2 = INT_MAX;
 }
-
+#endif
 /*
  * DRAWING ROUTINES - functions to paint the canvas item.
  */
 static void
-edvti_draw_zone (GnomeCanvasItem   *canvas_item,
-		GdkDrawable	   *drawable,
+edvti_draw_zone (ClutterActor *actor,
+	//	GdkDrawable	   *drawable,
 		gint		    x,
 		gint		    y,
 		gint		    width,
@@ -305,9 +336,9 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 	GdkColor fg, dark;
 	GdkColor mb_color;
 
-	cr = gdk_cairo_create (drawable);
+	cr = clutter_cairo_texture_create (actor);
 
-	time_item = E_DAY_VIEW_TIME_ITEM (canvas_item);
+	time_item = E_DAY_VIEW_TIME_ITEM (actor);
 	day_view = e_day_view_time_item_get_day_view (time_item);
 	g_return_if_fail (day_view != NULL);
 
@@ -427,6 +458,7 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 
 		cairo_save (cr);
 		gdk_cairo_set_source_color (cr, &day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE]);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
 
 		if (day_view->marcus_bains_time_bar_color && gdk_color_parse (day_view->marcus_bains_time_bar_color, &mb_color)) {
 			GdkColormap *colormap;
@@ -453,7 +485,9 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 
 			colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view));
 			if (gdk_colormap_alloc_color (colormap, &mb_color, TRUE, TRUE)) {
-				gdk_cairo_set_source_color (cr, &mb_color);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
+//				gdk_cairo_set_source_color (cr, &mb_color);
 			}
 		}
 	}
@@ -484,7 +518,9 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 			   between hours and display as one long string,
 			   e.g. "14:00" or "2 pm". */
 			cairo_save (cr);
-			gdk_cairo_set_source_color (cr, &dark);
+	//		gdk_cairo_set_source_color (cr, &dark);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+	
 			cairo_save (cr);
 			cairo_set_line_width (cr, 0.7);
 			cairo_move_to (cr, long_line_x1, row_y);
@@ -505,10 +541,12 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 			}
 
 			cairo_save (cr);
-			if (show_midnight_date)
-				gdk_cairo_set_source_color (cr, &mb_color);
-			else
-				gdk_cairo_set_source_color (cr, &fg);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
+	//		if (show_midnight_date)
+	//			gdk_cairo_set_source_color (cr, &mb_color);
+	//		else
+	//			gdk_cairo_set_source_color (cr, &fg);
 			layout = pango_cairo_create_layout (cr);
 			pango_layout_set_text (layout, buffer, -1);
 			pango_layout_get_pixel_size (layout, &minute_width, NULL);
@@ -527,7 +565,9 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 				   large font. */
 
 				cairo_save (cr);
-				gdk_cairo_set_source_color (cr, &dark);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
+//				gdk_cairo_set_source_color (cr, &dark);
 				if (show_midnight_date)
 					strcpy (buffer, midnight_day);
 				else
@@ -545,6 +585,8 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 					gdk_cairo_set_source_color (cr, &mb_color);
 				else
 					gdk_cairo_set_source_color (cr, &fg);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
 				layout = pango_cairo_create_layout (cr);
 				pango_layout_set_text (layout, buffer, -1);
 				pango_layout_set_font_description (layout, day_view->large_font_desc);
@@ -614,22 +656,27 @@ edvti_draw_zone (GnomeCanvasItem   *canvas_item,
 }
 
 static void
-e_day_view_time_item_draw (GnomeCanvasItem *canvas_item,
-			   GdkDrawable	   *drawable,
+e_day_view_time_item_draw (ClutterActor *actor)
+/*			   GdkDrawable	   *drawable,
 			   gint		    x,
 			   gint		    y,
 			   gint		    width,
-			   gint		    height)
+			   gint		    height)*/
 {
 	EDayViewTimeItem *time_item;
+	gint x = 0;
+	gint y =0;
+	gint width; //=  clutter_actor_get_width (actor);
+	gint height;// = clutter_actor_get_height (actor);
 
-	time_item = E_DAY_VIEW_TIME_ITEM (canvas_item);
+	clutter_cairo_texture_get_surface_size (actor, &width, &height);
+	time_item = E_DAY_VIEW_TIME_ITEM (actor);
 	g_return_if_fail (time_item != NULL);
 
-	edvti_draw_zone (canvas_item, drawable, x, y, width, height, 0, NULL);
+	edvti_draw_zone (actor, x, y, width, height, 0, NULL);
 
 	if (time_item->priv->second_zone)
-		edvti_draw_zone (canvas_item, drawable, x, y, width, height, time_item->priv->column_width, time_item->priv->second_zone);
+		edvti_draw_zone (actor, x, y, width, height, time_item->priv->column_width, time_item->priv->second_zone);
 }
 
 /* Increment the time by the 5/10/15/30/60 minute interval.
@@ -648,7 +695,7 @@ e_day_view_time_item_increment_time	(gint	*hour,
 		*hour = (*hour + 1) % 24;
 	}
 }
-
+#if 0
 static double
 e_day_view_time_item_point (GnomeCanvasItem *item, double x, double y,
 			    gint cx, gint cy,
@@ -657,9 +704,11 @@ e_day_view_time_item_point (GnomeCanvasItem *item, double x, double y,
 	*actual_item = item;
 	return 0.0;
 }
+#endif
 
-static gint
-e_day_view_time_item_event (GnomeCanvasItem *item,
+
+gint
+e_day_view_time_item_event (EDayViewTimeItem *item,
 			    GdkEvent *event)
 {
 	EDayViewTimeItem *time_item;
@@ -692,6 +741,7 @@ e_day_view_time_item_event (GnomeCanvasItem *item,
 	return FALSE;
 }
 
+
 static void
 edvti_second_zone_changed_cb (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data)
 {
@@ -708,7 +758,8 @@ edvti_second_zone_changed_cb (GConfClient *client, guint cnxn_id, GConfEntry *en
 
 	day_view = e_day_view_time_item_get_day_view (time_item);
 	gtk_widget_set_size_request (day_view->time_canvas, e_day_view_time_item_get_column_width (time_item), -1);
-	gtk_widget_queue_draw (day_view->time_canvas);
+	e_day_view_time_item_redraw (time_item);
+	//gtk_widget_queue_draw (day_view->time_canvas);
 }
 
 static void
@@ -872,7 +923,7 @@ e_day_view_time_item_on_button_press (EDayViewTimeItem *time_item,
 	if (!gtk_widget_has_focus (GTK_WIDGET (day_view)))
 		gtk_widget_grab_focus (GTK_WIDGET (day_view));
 
-	window = gtk_layout_get_bin_window (GTK_LAYOUT (canvas));
+	window = gtk_layout_get_bin_window (GTK_LAYOUT (day_view->time_canvas));
 
 	if (gdk_pointer_grab (window, FALSE,
 			      GDK_POINTER_MOTION_MASK
@@ -906,7 +957,7 @@ e_day_view_time_item_on_motion_notify (EDayViewTimeItem *time_item,
 				       GdkEvent *event)
 {
 	EDayView *day_view;
-	GnomeCanvas *canvas;
+	//GnomeCanvas *canvas;
 	gdouble window_y;
 	gint y, row;
 
@@ -916,16 +967,17 @@ e_day_view_time_item_on_motion_notify (EDayViewTimeItem *time_item,
 	day_view = e_day_view_time_item_get_day_view (time_item);
 	g_return_if_fail (day_view != NULL);
 
-	canvas = GNOME_CANVAS_ITEM (time_item)->canvas;
+	//canvas = GNOME_CANVAS_ITEM (time_item)->canvas;
 
 	y = event->motion.y;
 	row = e_day_view_time_item_convert_position_to_row (time_item, y);
 
 	if (row != -1) {
-		gnome_canvas_world_to_window (canvas, 0, event->motion.y,
-					      NULL, &window_y);
+		//gnome_canvas_world_to_window (canvas, 0, event->motion.y,
+		//			      NULL, &window_y);
 		e_day_view_update_selection (day_view, -1, row);
-		e_day_view_check_auto_scroll (day_view, -1, (gint) window_y);
+		e_day_view_check_auto_scroll (day_view, -1, (gint) event->motion.y);
+		//e_day_view_check_auto_scroll (day_view, -1, (gint) window_y);
 	}
 }
 
diff --git a/calendar/gui/e-day-view-time-item.h b/calendar/gui/e-day-view-time-item.h
index 354a370..c7d9435 100644
--- a/calendar/gui/e-day-view-time-item.h
+++ b/calendar/gui/e-day-view-time-item.h
@@ -31,6 +31,11 @@
 
 #include "e-day-view.h"
 
+#include <clutter/clutter.h>
+#include <mx/mx.h>
+#include <clutter-gtk/clutter-gtk.h>
+
+
 /* Standard GObject macros */
 #define E_TYPE_DAY_VIEW_TIME_ITEM \
 	(e_day_view_time_item_get_type ())
@@ -57,12 +62,14 @@ typedef struct _EDayViewTimeItemClass EDayViewTimeItemClass;
 typedef struct _EDayViewTimeItemPrivate EDayViewTimeItemPrivate;
 
 struct _EDayViewTimeItem {
-	GnomeCanvasItem parent;
+	//GnomeCanvasItem parent;
+	ClutterCairoTexture parent;
 	EDayViewTimeItemPrivate *priv;
 };
 
 struct _EDayViewTimeItemClass {
-	GnomeCanvasItemClass parent_class;
+//	GnomeCanvasItemClass parent_class;
+	ClutterCairoTextureClass parent_class;
 };
 
 GType		e_day_view_time_item_get_type	(void);
@@ -75,7 +82,12 @@ gint		e_day_view_time_item_get_column_width
 						(EDayViewTimeItem *time_item);
 icaltimezone *	e_day_view_time_item_get_second_zone
 						(EDayViewTimeItem *time_item);
-
+void		e_day_view_time_item_set_size   (EDayViewTimeItem *item, 
+						 int width, 
+						 int height);
+void 		e_day_view_time_item_redraw 	(EDayViewTimeItem *item);
+gint		e_day_view_time_item_event 	(EDayViewTimeItem *item,
+			    			 GdkEvent *event);
 G_END_DECLS
 
 #endif /* E_DAY_VIEW_TIME_ITEM_H */
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 3d5969a..b259801 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -208,7 +208,7 @@ static gboolean e_day_view_on_main_canvas_motion (GtkWidget *widget,
 						  GdkEventMotion *event,
 						  EDayView *day_view);
 static gboolean e_day_view_convert_event_coords (EDayView *day_view,
-						 GdkEvent *event,
+						 ClutterEvent *event,
 						 GdkWindow *window,
 						 gint *x_return,
 						 gint *y_return);
@@ -325,7 +325,7 @@ static void e_day_view_start_editing_event (EDayView *day_view,
 					    GdkEventKey *key_event);
 static void e_day_view_stop_editing_event (EDayView *day_view);
 static gboolean e_day_view_on_text_item_event (GnomeCanvasItem *item,
-					       GdkEvent *event,
+					       ClutterEvent *event,
 					       EDayView *day_view);
 static gboolean e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction);
 static void e_day_view_change_event_time (EDayView *day_view, time_t start_dt,
@@ -852,9 +852,12 @@ update_row (EDayView *day_view, gint row)
 
 	process_component (day_view, comp_data);
 
+	e_day_view_check_layout (day_view);	
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
-	e_day_view_queue_layout (day_view);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+	//	e_day_view_main_item_redraw (day_view->main_canvas_item);
+
+	//e_day_view_queue_layout (day_view);
 }
 
 static void
@@ -905,10 +908,13 @@ model_rows_inserted_cb (ETableModel *etm, gint row, gint count, gpointer user_da
 		}
 		process_component (day_view, comp_data);
 	}
-
+	
+	e_day_view_check_layout (day_view);
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
-	e_day_view_queue_layout (day_view);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+	//	e_day_view_main_item_redraw (day_view->main_canvas_item);
+
+	//e_day_view_queue_layout (day_view);
 
 }
 
@@ -946,7 +952,9 @@ model_comps_deleted_cb (ETableModel *etm, gpointer data, gpointer user_data)
 	}
 
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	e_day_view_queue_layout (day_view);
 }
 
@@ -980,6 +988,55 @@ timezone_changed_cb (ECalModel *cal_model, icaltimezone *old_zone,
 }
 
 static void
+set_main_canvas_size  (GtkWidget     *widget,
+		       GtkAllocation *allocation,
+		       EDayView *day_view)
+{
+	ClutterActor *stage = g_object_get_data (day_view->main_canvas, "stage");
+	GtkWidget *embed = g_object_get_data (day_view->main_canvas, "embed");
+	GtkAllocation aloc;
+	guint w,h;
+
+	gtk_layout_get_size (day_view->main_canvas, &w, &h);
+
+	gtk_widget_set_size_request (embed, allocation->width, h);
+	//gtk_layout_set_size (widget, allocation->width, h);
+
+	clutter_actor_set_size (stage, allocation->width, h);
+	clutter_actor_set_size (day_view->main_canvas_item, allocation->width, h);
+	e_day_view_main_item_set_size (day_view->main_canvas_item, allocation->width, h);
+}
+
+static void                
+set_canvas_size (GtkWidget     *widget,
+		 GtkAllocation *allocation,
+		  EDayView *day_view)
+{
+	ClutterActor *stage = g_object_get_data (day_view->time_canvas, "stage");
+	GtkWidget *embed = g_object_get_data (day_view->time_canvas, "embed");
+	GtkAllocation aloc;
+	guint w,h;
+
+	gtk_layout_get_size (day_view->main_canvas, &w, &h);
+
+	gtk_widget_set_size_request (embed, allocation->width, h);
+	gtk_layout_set_size (widget, allocation->width, h);
+
+	clutter_actor_set_size (stage, allocation->width, h);
+	clutter_actor_set_size (day_view->time_canvas_item, allocation->width, h);
+	e_day_view_time_item_set_size (day_view->time_canvas_item, allocation->width, h);
+}
+
+gboolean            
+embed_event (GtkWidget *widget,
+		GdkEvent  *event,
+		EDayView *day_view)
+{
+	e_day_view_time_item_event (day_view->time_canvas_item, event);
+	return FALSE;
+}
+
+static void
 e_day_view_init (EDayView *day_view)
 {
 	gint day;
@@ -987,6 +1044,8 @@ e_day_view_init (EDayView *day_view)
 	GtkAdjustment *adjustment;
 	GtkLayout *layout;
 	GtkWidget *w;
+	GtkWidget *embed;
+	ClutterActor *stage;
 
 	gtk_widget_set_can_focus (GTK_WIDGET (day_view), TRUE);
 
@@ -1208,11 +1267,37 @@ e_day_view_init (EDayView *day_view)
 
 	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root);
 
-	day_view->main_canvas_item =
+	embed = gtk_clutter_embed_new ();
+	gtk_widget_show (embed);
+	gtk_container_add (day_view->main_canvas, embed);
+
+	g_signal_connect (day_view->main_canvas, "size-allocate", G_CALLBACK(set_main_canvas_size), day_view);
+
+	stage = gtk_clutter_embed_get_stage ((GtkClutterEmbed *) embed);
+	g_object_set_data (day_view->main_canvas, "stage", stage);
+	g_object_set_data (day_view->main_canvas, "embed", embed);
+	
+	day_view->main_canvas_item = g_object_new (
+			E_TYPE_DAY_VIEW_MAIN_ITEM,
+			"EDayViewMainItem::day_view", day_view,
+                       "surface-width", 64,
+                       "surface-height", 600,			
+			NULL);
+	clutter_actor_set_reactive (day_view->main_canvas_item, TRUE);
+	//g_signal_connect (embed, "event", embed_event, day_view);
+	g_object_set_data (day_view->main_canvas_item, "stage", stage);
+	g_object_set_data (day_view->main_canvas_item, "embed", embed);
+
+	clutter_container_add_actor (stage, day_view->main_canvas_item);
+	clutter_actor_show (day_view->main_canvas_item);
+
+
+	/*day_view->main_canvas_item = 
 		gnome_canvas_item_new (canvas_group,
 				       e_day_view_main_item_get_type (),
 				       "EDayViewMainItem::day_view", day_view,
 				       NULL);
+*/
 
 	day_view->drag_rect_item =
 		gnome_canvas_item_new (canvas_group,
@@ -1240,28 +1325,45 @@ e_day_view_init (EDayView *day_view)
 				       NULL);
 	gnome_canvas_item_hide (day_view->drag_item);
 
+
+	layout = GTK_LAYOUT (day_view->main_canvas);
+	adjustment = gtk_layout_get_vadjustment (layout);
+
 	/*
 	 * Times Canvas
 	 */
 	day_view->time_canvas = e_canvas_new ();
-	layout = GTK_LAYOUT (day_view->main_canvas);
-	adjustment = gtk_layout_get_vadjustment (layout);
-	layout = GTK_LAYOUT (day_view->time_canvas);
-	gtk_layout_set_vadjustment (layout, adjustment);
+	gtk_layout_set_vadjustment  (day_view->time_canvas, adjustment); 
+	//gtk_layout_new (NULL, adjustment);
+	embed = gtk_clutter_embed_new ();
+	gtk_widget_show (embed);
+	gtk_container_add (day_view->time_canvas, embed);
+
+	g_signal_connect (day_view->time_canvas, "size-allocate", G_CALLBACK(set_canvas_size), day_view);
+	
+
 	gtk_table_attach (GTK_TABLE (day_view), day_view->time_canvas,
 			  0, 1, 1, 2,
 			  GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
 	gtk_widget_show (day_view->time_canvas);
+
 	g_signal_connect_after (day_view->time_canvas, "scroll_event",
 				G_CALLBACK (e_day_view_on_time_canvas_scroll), day_view);
 
-	canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->time_canvas)->root);
-
-	day_view->time_canvas_item =
-		gnome_canvas_item_new (canvas_group,
-				       e_day_view_time_item_get_type (),
-				       "EDayViewTimeItem::day_view", day_view,
-				       NULL);
+	stage = gtk_clutter_embed_get_stage ((GtkClutterEmbed *) embed);
+	g_object_set_data (day_view->time_canvas, "stage", stage);
+	g_object_set_data (day_view->time_canvas, "embed", embed);
+	
+	day_view->time_canvas_item = g_object_new (
+			E_TYPE_DAY_VIEW_TIME_ITEM,
+			"EDayViewTimeItem::day_view", day_view,
+                       "surface-width", 64,
+                       "surface-height", 600,			
+			NULL); 
+	g_signal_connect (embed, "event", embed_event, day_view);
+
+	clutter_container_add_actor (stage, day_view->time_canvas_item);
+	clutter_actor_show (day_view->time_canvas_item);
 
 	/*
 	 * Scrollbar.
@@ -1617,10 +1719,15 @@ e_day_view_style_set (GtkWidget *widget,
 		for (event_num = 0; event_num < day_view->events[week_day]->len; event_num++) {
 			event = &g_array_index (day_view->events[week_day], EDayViewEvent, event_num);
 			if (event->canvas_item) {
+				ClutterColor cc;
 				color = e_day_view_get_text_color (day_view, event, widget);
-				gnome_canvas_item_set (event->canvas_item,
-						"fill_color_gdk", &color,
-						NULL);
+				cc.red = color.red;
+				cc.blue = color.blue;
+				cc.green = color.green;
+				//clutter_text_set_color (event->canvas_item, &cc);
+				//gnome_canvas_item_set (event->canvas_item,
+				//		"fill_color_gdk", &color,
+				//		NULL);
 			}
 		}
 	}
@@ -1938,7 +2045,8 @@ e_day_view_focus_in (GtkWidget *widget, GdkEventFocus *event)
 #endif
 
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	return FALSE;
 }
@@ -1961,7 +2069,8 @@ e_day_view_focus_out (GtkWidget *widget, GdkEventFocus *event)
 #endif
 
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	return FALSE;
 }
@@ -2044,6 +2153,27 @@ e_day_view_foreach_event_with_uid (EDayView *day_view,
 	}
 }
 
+static void
+timeline_new_frame_cb (ClutterTimeline *timeline,
+                       gint             msec,
+                       ClutterActor *actor)
+{
+	guint8 opacity = clutter_actor_get_opacity (actor);
+	int ox = GINT_TO_POINTER(g_object_get_data(actor, "orig-x"));
+	int oy = GINT_TO_POINTER(g_object_get_data(actor, "orig-y"));
+	gfloat w;
+	ClutterActor *parent = clutter_actor_get_parent (actor);
+	
+	w = clutter_actor_get_width (parent);
+
+	clutter_actor_set_opacity (actor, 255 - (int)(255 * (((float)msec) / 500.0))); 
+	clutter_actor_set_scale (actor, 1.0 - (1.0 * msec / 500.0), 1.0 - (1.0 * msec / 500.0));
+	clutter_actor_set_position (actor,
+				ox + ((w - ox) * (float)msec / 500.0),
+				oy - (oy * msec / 500.0));
+
+}
+
 static gboolean
 e_day_view_remove_event_cb (EDayView *day_view,
 			    gint day,
@@ -2051,7 +2181,13 @@ e_day_view_remove_event_cb (EDayView *day_view,
 			    gpointer data)
 {
 	EDayViewEvent *event;
+	char *tmp = g_strdup_printf("%d-%d", day, event_num);
+	ClutterActor *actor = g_object_get_data (day_view, tmp);
+	gboolean dragged = FALSE;
+	gboolean resizing = FALSE;
 
+	g_object_set_data (day_view, tmp, NULL);
+	g_free(tmp);
 #if 0
 	g_print ("In e_day_view_remove_event_cb day:%i event_num:%i\n",
 		 day, event_num);
@@ -2074,6 +2210,10 @@ e_day_view_remove_event_cb (EDayView *day_view,
 	if (!event)
 		return TRUE;
 
+	dragged = (GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "drag-is-actor"))) ? TRUE : FALSE;
+	resizing = (GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "resize-event"))) ? TRUE : FALSE;
+
+	printf("DRAGGED ? %p : %d\n", event->canvas_item, dragged);
 	/* If we were editing this event, set editing_event_day to -1 so
 	   on_editing_stopped doesn't try to update the event. */
 	if (day_view->editing_event_num == event_num && day_view->editing_event_day == day) {
@@ -2085,9 +2225,34 @@ e_day_view_remove_event_cb (EDayView *day_view,
 		day_view->popup_event_num = -1;
 		day_view->popup_event_day = -1;
 	}
-
-	if (event->canvas_item)
-		gtk_object_destroy (GTK_OBJECT (event->canvas_item));
+	
+	if (resizing)
+		day_view->resize_actor = event->canvas_item;
+	if (!dragged && !resizing) {
+		ClutterTimeline *timeline = clutter_timeline_new (500);
+		gfloat x,y;
+
+		clutter_actor_get_position (actor, &x, &y);
+  		g_signal_connect (timeline,
+                    		"new-frame", G_CALLBACK (timeline_new_frame_cb),
+                    		actor);
+		clutter_timeline_start (timeline);
+		g_object_set_data (actor, "orig-x", GINT_TO_POINTER((int)x));
+		g_object_set_data (actor, "orig-y", GINT_TO_POINTER((int)y));
+
+	#if 0
+		clutter_actor_animate (actor,          /* the actor to animate */
+                	       CLUTTER_LINEAR, /* the easing mode */
+                       		200,           /* the duration of the animation */
+                       		"scale-x", 5.0, /* final horizontal scaling factor */
+                       		"scale-y", 5.0, /* final vertical scaling factor */
+				"opacity", 0,
+				//"signal::completed", clutter_actor_destroy, actor,
+                       		NULL);
+#endif   
+	}
+	if (event->canvas_item && !dragged && !resizing)
+		clutter_actor_destroy ((event->canvas_item));
 
 	if (is_comp_data_valid (event))
 		g_object_unref (event->comp_data);
@@ -2189,10 +2354,11 @@ e_day_view_update_event_label (EDayView *day_view,
 		}
 	}
 
-	gnome_canvas_item_set (event->canvas_item,
-			       "text", text,
-			       NULL);
+//	gnome_canvas_item_set (event->canvas_item,
+//			       "text", text,
+//			       NULL);
 
+	clutter_text_set_text (event->canvas_item, text);
 	if (e_cal_get_static_capability (event->comp_data->client, CAL_STATIC_CAPABILITY_HAS_UNACCEPTED_MEETING)
 				&& e_cal_util_component_has_attendee (event->comp_data->icalcomp))
 		set_text_as_bold (event);
@@ -2221,10 +2387,11 @@ e_day_view_update_long_event_label (EDayView *day_view,
 
 	summary = e_calendar_view_get_icalcomponent_summary (event->comp_data->client, event->comp_data->icalcomp, &free_text);
 
-	gnome_canvas_item_set (event->canvas_item,
-			       "text", summary ? summary : "",
-			       NULL);
-
+//	gnome_canvas_item_set (event->canvas_item,
+//			       "text", summary ? summary : "",
+//			       NULL);
+	clutter_text_set_text (event->canvas_item, summary ? summary : "");
+	
 	if (free_text)
 		g_free ((gchar *)summary);
 
@@ -2393,7 +2560,9 @@ e_day_view_set_selected_time_range_in_top_visible	(EDayView	*day_view,
 	if (need_redraw) {
 		gtk_widget_queue_draw (day_view->top_canvas);
 		gtk_widget_queue_draw (day_view->top_dates_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+	//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	}
 }
 
@@ -2448,7 +2617,9 @@ e_day_view_set_selected_time_range_visible	(EDayView	*day_view,
 	if (need_redraw) {
 		gtk_widget_queue_draw (day_view->top_canvas);
 		gtk_widget_queue_draw (day_view->top_dates_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+	//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	}
 }
 
@@ -2554,7 +2725,9 @@ e_day_view_set_selected_time_range	(ECalendarView	*cal_view,
 	if (need_redraw) {
 		gtk_widget_queue_draw (day_view->top_canvas);
 		gtk_widget_queue_draw (day_view->top_dates_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		//gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	}
 }
 
@@ -2751,10 +2924,18 @@ e_day_view_set_mins_per_row (EDayView *day_view,
 	/* We must layout the events before updating the scroll region, since
 	   that will result in a redraw which would crash otherwise. */
 	e_day_view_check_layout (day_view);
-	gtk_widget_queue_draw (day_view->time_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	e_day_view_update_scroll_regions (day_view);
+	{
+		int h;
+		GtkWidget *embed = g_object_get_data (day_view->time_canvas, "embed");
+
+		gtk_layout_get_size ((GtkLayout *)day_view->main_canvas, NULL, &h);
+		gtk_layout_set_size ((GtkLayout *)day_view->time_canvas, -1, h);
+		gtk_widget_set_size_request (embed, -1, h);
+	}
 }
 
 /* This specifies the working days in the week. The value is a bitwise
@@ -2783,7 +2964,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);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	g_object_notify (G_OBJECT (day_view), "working-days");
 }
@@ -2846,7 +3028,8 @@ e_day_view_set_work_day_start_hour (EDayView *day_view,
 
 	day_view->work_day_start_hour = work_day_start_hour;
 
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	g_object_notify (G_OBJECT (day_view), "work-day-start-hour");
 }
@@ -2867,7 +3050,8 @@ e_day_view_set_work_day_start_minute (EDayView *day_view,
 
 	day_view->work_day_start_minute = work_day_start_minute;
 
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	g_object_notify (G_OBJECT (day_view), "work-day-start-minute");
 }
@@ -2888,7 +3072,8 @@ e_day_view_set_work_day_end_hour (EDayView *day_view,
 
 	day_view->work_day_end_hour = work_day_end_hour;
 
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	g_object_notify (G_OBJECT (day_view), "work-day-end-hour");
 }
@@ -2909,18 +3094,23 @@ e_day_view_set_work_day_end_minute (EDayView *day_view,
 
 	day_view->work_day_end_minute = work_day_end_minute;
 
-	gtk_widget_queue_draw (day_view->main_canvas);
+//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	g_object_notify (G_OBJECT (day_view), "work-day-end-minute");
 }
 
 /* Force a redraw of the Marcus Bains Lines */
+
+	
 void
 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);
+	//gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	e_day_view_time_item_redraw (day_view->time_canvas_item);
+//	gtk_widget_queue_draw (day_view->time_canvas);
 }
 
 gboolean
@@ -3065,17 +3255,21 @@ e_day_view_update_scroll_regions (EDayView *day_view)
 	gtk_widget_get_allocation (
 		day_view->time_canvas, &time_canvas_allocation);
 
+#if 0	
 	/* Set the scroll region of the time canvas to its allocated width,
 	   but with the height the same as the main canvas. */
 	gnome_canvas_get_scroll_region (
 		GNOME_CANVAS (day_view->time_canvas),
 		NULL, NULL, &old_x2, &old_y2);
 	new_x2 = time_canvas_allocation.width - 1;
+#endif	
 	new_y2 = MAX (day_view->rows * day_view->row_height,
 		      main_canvas_allocation.height) - 1;
+#if 0
 	if (old_x2 != new_x2 || old_y2 != new_y2)
 		gnome_canvas_set_scroll_region (GNOME_CANVAS (day_view->time_canvas),
 						0, 0, new_x2, new_y2);
+#endif
 
 	/* Set the scroll region of the main canvas to its allocated width,
 	   but with the height depending on the number of rows needed. */
@@ -3172,9 +3366,12 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
 
 	/* Convert the coords to the main canvas window, or return if the
 	   window is not found. */
-	if (!e_day_view_convert_event_coords (
-		day_view, (GdkEvent*) event, window, &event_x, &event_y))
-		return FALSE;
+	//if (!e_day_view_convert_event_coords (
+	//	day_view, (GdkEvent*) event, window, &event_x, &event_y))
+	//	return FALSE;
+
+	event_x = (int)event->x;
+	event_y = (int)event->y;
 
 	pos = e_day_view_convert_position_in_top_canvas (day_view,
 							 event_x, event_y,
@@ -3237,7 +3434,7 @@ e_day_view_on_top_canvas_button_press (GtkWidget *widget,
 
 static gboolean
 e_day_view_convert_event_coords (EDayView *day_view,
-				 GdkEvent *event,
+				 ClutterEvent *event,
 				 GdkWindow *window,
 				 gint *x_return,
 				 gint *y_return)
@@ -3247,30 +3444,30 @@ e_day_view_convert_event_coords (EDayView *day_view,
 
 	/* Get the event window, x & y from the appropriate event struct. */
 	switch (event->type) {
-	case GDK_BUTTON_PRESS:
-	case GDK_2BUTTON_PRESS:
-	case GDK_3BUTTON_PRESS:
-	case GDK_BUTTON_RELEASE:
+	case CLUTTER_BUTTON_PRESS:
+//	case GDK_2BUTTON_PRESS:
+//	case GDK_3BUTTON_PRESS:
+	case CLUTTER_BUTTON_RELEASE:
 		event_x = event->button.x;
 		event_y = event->button.y;
-		event_window = event->button.window;
+		//event_window = event->button.window;
 		break;
-	case GDK_MOTION_NOTIFY:
+	case CLUTTER_MOTION:
 		event_x = event->motion.x;
 		event_y = event->motion.y;
-		event_window = event->motion.window;
+		//event_window = event->motion.window;
 		break;
-	case GDK_ENTER_NOTIFY:
-	case GDK_LEAVE_NOTIFY:
+	case CLUTTER_ENTER:
+	case CLUTTER_LEAVE:
 		event_x = event->crossing.x;
 		event_y = event->crossing.y;
-		event_window = event->crossing.window;
+		//event_window = event->crossing.window;
 		break;
 	default:
 		/* Shouldn't get here. */
 		g_return_val_if_reached (FALSE);
 	}
-
+/*
 	while (event_window && event_window != window
 	       && event_window != gdk_get_default_root_window ()) {
 		gdk_window_get_position (event_window, &win_x, &win_y);
@@ -3278,14 +3475,14 @@ e_day_view_convert_event_coords (EDayView *day_view,
 		event_y += win_y;
 		event_window = gdk_window_get_parent (event_window);
 	}
-
+*/
 	*x_return = event_x;
 	*y_return = event_y;
 
-	if (event_window != window)
-		g_warning ("Couldn't find event window\n");
+//	if (event_window != window)
+//		g_warning ("Couldn't find event window\n");
 
-	return (event_window == window) ? TRUE : FALSE;
+	return TRUE;// (event_window == window) ? TRUE : FALSE;
 }
 
 static gboolean
@@ -3297,6 +3494,7 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
 	ECalendarViewPosition pos;
 	GtkLayout *layout;
 	GdkWindow *window;
+	EDayViewEvent *e;
 
 #if 0
 	g_print ("In e_day_view_on_main_canvas_button_press\n");
@@ -3313,13 +3511,15 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
 
 	/* Convert the coords to the main canvas window, or return if the
 	   window is not found. */
-	if (!e_day_view_convert_event_coords (
-		day_view, (GdkEvent*) event, window, &event_x, &event_y))
-		return FALSE;
+	//if (!e_day_view_convert_event_coords (
+	//	day_view, (GdkEvent*) event, window, &event_x, &event_y))
+	//	return FALSE;
 
+	event_x = (int)event->x;
+	event_y = (int)event->y;
 	/* Find out where the mouse is. */
 	pos = e_day_view_convert_position_in_main_canvas (day_view,
-							  event_x, event_y,
+							  (int )event->x,(int) event->y,
 							  &day, &row,
 							  &event_num);
 
@@ -3331,8 +3531,15 @@ e_day_view_on_main_canvas_button_press (GtkWidget *widget,
 							 event_num, event, pos,
 							 event_x, event_y);
 
+	if (day_view->editing_event_day != -1 &&
+		day_view->editing_event_num != -1) {
+		e = &g_array_index (day_view->events[day_view->editing_event_day], EDayViewEvent, day_view->editing_event_num);
+		g_object_set_data (e->canvas_item, "editing", FALSE);
+		printf("Editing stopped\n");
+		e_day_view_on_editing_stopped (day_view, NULL);
+	}
 	e_day_view_stop_editing_event (day_view);
-
+	
 	/* Start the selection drag. */
 	if (event->button == 1) {
 		if (event->type == GDK_2BUTTON_PRESS) {
@@ -3543,12 +3750,14 @@ e_day_view_on_long_event_click (EDayView *day_view,
 		return;
 
 	/* Ignore clicks on the EText while editing. */
+#warning "fixit"
+/*	
 	if (pos == E_CALENDAR_VIEW_POS_EVENT
 	    && E_TEXT (event->canvas_item)->editing) {
 		GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (event->canvas_item, (GdkEvent*)bevent);
 		return;
 	}
-
+*/
 	if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
 	     !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
 	    && (pos == E_CALENDAR_VIEW_POS_LEFT_EDGE
@@ -3579,7 +3788,7 @@ e_day_view_on_long_event_click (EDayView *day_view,
 			day_view->resize_end_row = end_day;
 
 			/* Raise the event's item, above the rect as well. */
-			gnome_canvas_item_raise_to_top (event->canvas_item);
+			clutter_actor_raise_top (event->canvas_item);
 		}
 	} else if (e_day_view_get_long_event_position (day_view, event_num,
 						       &start_day, &end_day,
@@ -3623,13 +3832,14 @@ e_day_view_on_event_click (EDayView *day_view,
 	if (!is_comp_data_valid (event))
 		return;
 
+#warning "fix it"
 	/* Ignore clicks on the EText while editing. */
-	if (pos == E_CALENDAR_VIEW_POS_EVENT
+/*	if (pos == E_CALENDAR_VIEW_POS_EVENT
 	    && E_TEXT (event->canvas_item)->editing) {
 		GNOME_CANVAS_ITEM_GET_CLASS (event->canvas_item)->event (event->canvas_item, (GdkEvent*)bevent);
 		return;
 	}
-
+*/
 	if ((e_cal_util_component_is_instance (event->comp_data->icalcomp) ||
 	     !e_cal_util_component_has_recurrences (event->comp_data->icalcomp))
 	    && (pos == E_CALENDAR_VIEW_POS_TOP_EDGE
@@ -3667,7 +3877,7 @@ e_day_view_on_event_click (EDayView *day_view,
 			e_day_view_reshape_main_canvas_resize_bars (day_view);
 
 			/* Raise the event's item, above the rect as well. */
-			gnome_canvas_item_raise_to_top (event->canvas_item);
+			clutter_actor_raise_top (event->canvas_item);
 		}
 
 	} else {
@@ -3805,7 +4015,9 @@ e_day_view_update_query (EDayView *day_view)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	//gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	e_day_view_free_events (day_view);
 	e_day_view_queue_layout (day_view);
 
@@ -3921,10 +4133,12 @@ e_day_view_on_top_canvas_motion (GtkWidget *widget,
 
 	/* Convert the coords to the main canvas window, or return if the
 	   window is not found. */
-	if (!e_day_view_convert_event_coords (
-		day_view, (GdkEvent*) mevent, window, &event_x, &event_y))
-		return FALSE;
+	//if (!e_day_view_convert_event_coords (
+	//	day_view, (GdkEvent*) mevent, window, &event_x, &event_y))
+	//	return FALSE;
 
+	event_x = mevent->x;
+	event_y = mevent->y;
 	canvas_x = event_x;
 	canvas_y = event_y;
 
@@ -4035,10 +4249,12 @@ e_day_view_on_main_canvas_motion (GtkWidget *widget,
 
 	/* Convert the coords to the main canvas window, or return if the
 	   window is not found. */
-	if (!e_day_view_convert_event_coords (
-		day_view, (GdkEvent*) mevent, window, &event_x, &event_y))
-		return FALSE;
+	//if (!e_day_view_convert_event_coords (
+	//	day_view, (GdkEvent*) mevent, window, &event_x, &event_y))
+	//	return FALSE;
 
+	event_x = mevent->x;
+	event_y = mevent->y;
 	canvas_x = event_x;
 	canvas_y = event_y;
 
@@ -4158,7 +4374,8 @@ e_day_view_start_selection (EDayView *day_view,
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+//	gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 /* Updates the selection during a drag. If day is -1 the selection day is
@@ -4202,7 +4419,8 @@ e_day_view_update_selection (EDayView *day_view,
 	/* FIXME: Optimise? */
 	if (need_redraw) {
 		gtk_widget_queue_draw (day_view->top_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+		//gtk_widget_queue_draw (day_view->main_canvas);
 	}
 }
 
@@ -4319,7 +4537,9 @@ e_day_view_update_resize (EDayView *day_view,
 	if (need_reshape) {
 		e_day_view_reshape_day_event (day_view, day, event_num);
 		e_day_view_reshape_main_canvas_resize_bars (day_view);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		//gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+
 	}
 }
 
@@ -4468,6 +4688,10 @@ e_day_view_finish_resize (EDayView *day_view)
 	if (!is_comp_data_valid (event))
 		return;
 
+	g_object_set_data (event->canvas_item, "resize-event", GINT_TO_POINTER(TRUE));
+	char *tmp = g_strdup_printf ("%d-%d", day, event_num);
+	day_view->resize_draw_actor = g_object_get_data (day_view, tmp);
+	
 	client = event->comp_data->client;
 
 	/* We use a temporary shallow copy of the ico since we don't want to
@@ -4575,7 +4799,8 @@ e_day_view_abort_resize (EDayView *day_view)
 	} else {
 		e_day_view_reshape_day_event (day_view, day, event_num);
 		e_day_view_reshape_main_canvas_resize_bars (day_view);
-		gtk_widget_queue_draw (day_view->main_canvas);
+	//	gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 		day_view->last_cursor_set_in_main_canvas = day_view->normal_cursor;
 		window = gtk_widget_get_window (day_view->main_canvas);
@@ -4614,7 +4839,7 @@ e_day_view_free_event_array (EDayView *day_view,
 	for (event_num = 0; event_num < array->len; event_num++) {
 		event = &g_array_index (array, EDayViewEvent, event_num);
 		if (event->canvas_item)
-			gtk_object_destroy (GTK_OBJECT (event->canvas_item));
+			clutter_actor_destroy ((event->canvas_item));
 
 		if (is_comp_data_valid (event))
 			g_object_unref (event->comp_data);
@@ -4675,6 +4900,15 @@ e_day_view_add_event (ECalComponent *comp,
 	event.comp_data->instance_start = start;
 	event.comp_data->instance_end = end;
 
+	if (add_event_data->day_view->drag_move) {
+		event.canvas_item = add_event_data->day_view->drag_move;
+		add_event_data->day_view->drag_move = NULL;
+		printf("WHILE ADDING %p %p\n", &event, event.canvas_item);
+	} else if (add_event_data->day_view->resize_actor) {
+		event.canvas_item = add_event_data->day_view->resize_actor;
+		add_event_data->day_view->resize_actor = NULL;
+	}	
+	
 	/* Calculate the start & end minute, relative to the top of the
 	   display. */
 	offset = add_event_data->day_view->first_hour_shown * 60
@@ -4690,7 +4924,6 @@ e_day_view_add_event (ECalComponent *comp,
 						    event.comp_data->client,
 						    e_calendar_view_get_timezone (E_CALENDAR_VIEW (add_event_data->day_view))))
 		event.different_timezone = TRUE;
-
 	if (!e_cal_component_has_attendees (comp) || itip_organizer_is_user (comp, event.comp_data->client) || itip_sentby_is_user (comp, event.comp_data->client))
 		event.is_editable = TRUE;
 	else
@@ -4807,7 +5040,7 @@ e_day_view_reshape_long_events (EDayView *day_view)
 
 		if (event->num_columns == 0) {
 			if (event->canvas_item) {
-				gtk_object_destroy (GTK_OBJECT (event->canvas_item));
+				clutter_actor_destroy ((event->canvas_item));
 				event->canvas_item = NULL;
 			}
 		} else {
@@ -4841,7 +5074,7 @@ e_day_view_reshape_long_event (EDayView *day_view,
 						 &item_x, &item_y,
 						 &item_w, &item_h)) {
 		if (event->canvas_item) {
-			gtk_object_destroy (GTK_OBJECT (event->canvas_item));
+			clutter_actor_destroy ((event->canvas_item));
 			event->canvas_item = NULL;
 		}
 		return;
@@ -4895,13 +5128,28 @@ e_day_view_reshape_long_event (EDayView *day_view,
 	if (!event->canvas_item) {
 		GtkWidget *widget;
 		GdkColor color;
-
+		ClutterColor ccolor;
 		widget = (GtkWidget *)day_view;
+		ClutterActor *stage = g_object_get_data (day_view->main_canvas_item, "stage");
 
 		color = e_day_view_get_text_color (day_view, event, widget);
-
-		event->canvas_item =
-			gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root),
+		ccolor.red = color.red;
+		ccolor.blue = color.blue;
+		ccolor.green = color.green;
+
+		event->canvas_item = clutter_text_new ();
+			clutter_actor_set_reactive (event->canvas_item, TRUE);
+
+		clutter_text_set_cursor_visible (event->canvas_item, FALSE);
+		clutter_actor_show (event->canvas_item);
+		clutter_text_set_ellipsize (event->canvas_item, PANGO_ELLIPSIZE_END);
+		clutter_text_set_editable (event->canvas_item, TRUE);
+		clutter_text_set_line_wrap (event->canvas_item, TRUE);
+		clutter_text_set_single_line_mode (event->canvas_item, FALSE);
+		//clutter_text_set_color (event->canvas_item, &ccolor);
+		clutter_container_add_actor (stage, event->canvas_item);
+		clutter_actor_raise_top (event->canvas_item);
+			/*gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root),
 					       e_text_get_type (),
 					       "anchor", GTK_ANCHOR_NW,
 					       "clip", TRUE,
@@ -4911,7 +5159,7 @@ e_day_view_reshape_long_event (EDayView *day_view,
 					       "draw_background", FALSE,
 					       "fill_color_gdk", &color,
 					       "im_context", E_CANVAS (day_view->top_canvas)->im_context,
-					       NULL);
+					       NULL);*/
 		g_object_set_data (G_OBJECT (event->canvas_item), "event-num", GINT_TO_POINTER (event_num));
 		g_object_set_data (G_OBJECT (event->canvas_item), "event-day", GINT_TO_POINTER (E_DAY_VIEW_LONG_EVENT));
 		g_signal_connect (event->canvas_item, "event",
@@ -4973,8 +5221,9 @@ e_day_view_reshape_long_event (EDayView *day_view,
 			       "clip_width", (gdouble) text_w,
 			       "clip_height", (gdouble) item_h,
 			       NULL);
-	e_canvas_item_move_absolute(event->canvas_item,
-				    text_x, item_y);
+
+	//e_canvas_item_move_absolute(event->canvas_item,
+	clutter_actor_set_position (event->canvas_item, text_x, item_y);
 
 	g_object_unref (layout);
 	g_object_unref (comp);
@@ -5006,7 +5255,8 @@ e_day_view_reshape_day_events (EDayView *day_view,
 		}
 
 		if (strncmp (current_comp_string, day_view->last_edited_comp_string,50) == 0) {
-			e_canvas_item_grab_focus (event->canvas_item, TRUE);
+			//e_canvas_item_grab_focus (event->canvas_item, TRUE);
+			clutter_actor_grab_key_focus (event->canvas_item);
 			g_free (day_view->last_edited_comp_string);
 			day_view-> last_edited_comp_string = NULL;
 		}
@@ -5015,6 +5265,9 @@ e_day_view_reshape_day_events (EDayView *day_view,
 }
 
 static void
+cancel_editing (EDayView *day_view);
+
+static void
 e_day_view_reshape_day_event (EDayView *day_view,
 			      gint	day,
 			      gint	event_num)
@@ -5033,7 +5286,7 @@ e_day_view_reshape_day_event (EDayView *day_view,
 					    &item_x, &item_y,
 					    &item_w, &item_h)) {
 		if (event->canvas_item) {
-			gtk_object_destroy (GTK_OBJECT (event->canvas_item));
+			clutter_actor_destroy ((event->canvas_item));
 			event->canvas_item = NULL;
 		}
 	} else {
@@ -5079,6 +5332,26 @@ e_day_view_reshape_day_event (EDayView *day_view,
 				icons_offset = E_DAY_VIEW_ICON_X_PAD;
 		}
 
+		if (event->canvas_item &&
+				day_view->drag_actor) {
+			char *tmp = g_strdup_printf ("%d-%d", day, event_num);
+			g_object_set_data (day_view, tmp, day_view->drag_actor);
+			day_view->drag_actor = NULL;
+			g_object_set_data (event->canvas_item, "drag-end", GINT_TO_POINTER(TRUE));	
+			
+			printf("DRAG %p \n", event->canvas_item);
+			cancel_editing (day_view);
+			g_object_set_data (event->canvas_item, "editing", GINT_TO_POINTER(FALSE));
+			e_day_view_on_editing_stopped (day_view, NULL);
+
+			e_day_view_main_item_redraw (day_view->main_canvas_item);
+		} else if (event->canvas_item &&
+				day_view->resize_draw_actor) {
+			char *tmp = g_strdup_printf ("%d-%d", day, event_num);
+			g_object_set_data (day_view, tmp, day_view->resize_draw_actor);
+			day_view->resize_draw_actor = NULL;
+		}
+
 		if (!event->canvas_item) {
 			GtkWidget *widget;
 			GdkColor color;
@@ -5087,8 +5360,8 @@ e_day_view_reshape_day_event (EDayView *day_view,
 
 			color = e_day_view_get_text_color (day_view, event, widget);
 
-			event->canvas_item =
-				gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root),
+			//event->canvas_item =
+/*				gnome_canvas_item_new (GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root),
 						       e_text_get_type (),
 						       "anchor", GTK_ANCHOR_NW,
 						       "line_wrap", TRUE,
@@ -5098,7 +5371,26 @@ e_day_view_reshape_day_event (EDayView *day_view,
 						       "draw_background", FALSE,
 						       "fill_color_gdk", &color,
 						       "im_context", E_CANVAS (day_view->main_canvas)->im_context,
-						       NULL);
+						       NULL); */
+			ClutterActor *stage = g_object_get_data (day_view->main_canvas_item, "stage");
+			ClutterColor ccolor;
+		ccolor.red = color.red;
+		ccolor.blue = color.blue;
+		ccolor.green = color.green;
+			
+			event->canvas_item = clutter_text_new ();
+			clutter_actor_set_reactive (event->canvas_item, TRUE);
+			clutter_text_set_cursor_visible (event->canvas_item, FALSE);
+			clutter_actor_show (event->canvas_item);
+		clutter_text_set_ellipsize (event->canvas_item, PANGO_ELLIPSIZE_END);
+		clutter_text_set_editable (event->canvas_item, TRUE);
+		clutter_text_set_line_wrap (event->canvas_item, TRUE);
+		clutter_text_set_line_wrap_mode (event->canvas_item, PANGO_WRAP_WORD_CHAR);
+		clutter_text_set_single_line_mode (event->canvas_item, FALSE);
+		//clutter_text_set_color (event->canvas_item, &ccolor);
+		clutter_container_add_actor (stage, event->canvas_item);
+		clutter_actor_raise_top (event->canvas_item);
+
 			g_object_set_data (G_OBJECT (event->canvas_item), "event-num", GINT_TO_POINTER (event_num));
 			g_object_set_data (G_OBJECT (event->canvas_item), "event-day", GINT_TO_POINTER (day));
 			g_signal_connect (event->canvas_item, "event",
@@ -5109,14 +5401,18 @@ e_day_view_reshape_day_event (EDayView *day_view,
 			e_day_view_update_event_label (day_view, day, event_num);
 		}
 
+
 		item_w = MAX (item_w, 0);
 		gnome_canvas_item_set (event->canvas_item,
 				       "clip_width", (gdouble) item_w,
 				       "clip_height", (gdouble) item_h,
-				       "x_offset", (gdouble) icons_offset,
+				      // "x_offset", (gdouble) icons_offset,
 				       NULL);
-		e_canvas_item_move_absolute(event->canvas_item,
-					    item_x, item_y);
+		clutter_actor_set_clip (event->canvas_item, 0, 0, item_w, item_h);
+		clutter_actor_set_size (event->canvas_item, item_w, item_h);
+		g_object_set_data (event->canvas_item, "x_offset", (int)icons_offset);
+		//e_canvas_item_move_absolute(event->canvas_item, item_x, item_y);
+		clutter_actor_set_position (event->canvas_item, item_x, item_y);
 	}
 }
 
@@ -5154,7 +5450,8 @@ e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view)
 		w = item_w - E_DAY_VIEW_BAR_WIDTH;
 		h = item_h;
 
-		gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+		//gtk_widget_queue_draw (day_view->main_canvas);
 	} else {
 		return;
 	}
@@ -5276,7 +5573,8 @@ e_day_view_add_new_event_in_selected_range (EDayView *day_view, GdkEventKey *key
 	e_day_view_add_event (comp, dtstart, dtend, &add_event_data);
 	e_day_view_check_layout (day_view);
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	//gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
 
 	if (!e_day_view_find_event_from_uid (day_view, ecal, uid, NULL, &day, &event_num)) {
 		g_warning ("Couldn't find event to start editing.\n");
@@ -5297,6 +5595,7 @@ e_day_view_do_key_press (GtkWidget *widget, GdkEventKey *event)
 	guint keyval;
 	gboolean stop_emission;
 
+	printf("e_day_view_do_key_press\n");
 	g_return_val_if_fail (widget != NULL, FALSE);
 	g_return_val_if_fail (E_IS_DAY_VIEW (widget), FALSE);
 	g_return_val_if_fail (event != NULL, FALSE);
@@ -5430,11 +5729,12 @@ e_day_view_key_press (GtkWidget *widget, GdkEventKey *event)
 {
 	gboolean handled = FALSE;
 	handled = e_day_view_do_key_press (widget, event);
-
+	handled = FALSE;
 	/* if not handled, try key bindings */
 	if (!handled)
 		handled = GTK_WIDGET_CLASS (e_day_view_parent_class)->key_press_event (widget, event);
-	return handled;
+	printf("handled %d\n", handled);
+	return ;
 }
 
 /* Select the time that begins a work day*/
@@ -5460,7 +5760,8 @@ e_day_view_goto_start_of_work_day (EDayView *day_view)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//	gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 /* Select the time that ends a work day*/
@@ -5484,7 +5785,8 @@ e_day_view_goto_end_of_work_day (EDayView *day_view)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 /* Change the duration to the time that begins the current work day */
@@ -5517,7 +5819,8 @@ e_day_view_change_duration_to_start_of_work_day (EDayView *day_view)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 /* Change the duration to the time that ends the current work day */
@@ -5552,7 +5855,8 @@ e_day_view_change_duration_to_end_of_work_day (EDayView *day_view)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//	gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5581,7 +5885,9 @@ e_day_view_cursor_key_up_shifted (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+
+//	gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static gboolean
@@ -5863,7 +6169,8 @@ e_day_view_cursor_key_down_shifted (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5887,7 +6194,8 @@ e_day_view_cursor_key_left_shifted (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5911,7 +6219,8 @@ e_day_view_cursor_key_right_shifted (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5943,7 +6252,8 @@ e_day_view_cursor_key_up (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	//gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5975,7 +6285,8 @@ e_day_view_cursor_key_down (EDayView *day_view, GdkEventKey *event)
 
 	/* FIXME: Optimise? */
 	gtk_widget_queue_draw (day_view->top_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);
+	// gtk_widget_queue_draw (day_view->main_canvas);
 }
 
 static void
@@ -5991,7 +6302,8 @@ e_day_view_cursor_key_left (EDayView *day_view, GdkEventKey *event)
 
 		/* FIXME: Optimise? */
 		gtk_widget_queue_draw (day_view->top_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);		
+		//gtk_widget_queue_draw (day_view->main_canvas);
 	}
 	g_signal_emit_by_name (day_view, "selected_time_changed");
 }
@@ -6009,7 +6321,8 @@ e_day_view_cursor_key_right (EDayView *day_view, GdkEventKey *event)
 
 		/* FIXME: Optimise? */
 		gtk_widget_queue_draw (day_view->top_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+		//gtk_widget_queue_draw (day_view->main_canvas);
 	}
 	g_signal_emit_by_name (day_view, "selected_time_changed");
 }
@@ -6145,7 +6458,7 @@ e_day_view_start_editing_event (EDayView *day_view,
 	   grabbing the focus will result in a call to
 	   e_day_view_on_editing_started(), which will reset the text to get
 	   rid of the start and end times. */
-	e_canvas_item_grab_focus (event->canvas_item, TRUE);
+	//e_canvas_item_grab_focus (event->canvas_item, TRUE);
 
 	if (key_event) {
                 if (gtk_im_context_filter_keypress (((EText *)(event->canvas_item))->im_context, key_event)) {
@@ -6154,10 +6467,11 @@ e_day_view_start_editing_event (EDayView *day_view,
                 else {
 			gchar *initial_text;
 
-			initial_text = e_utf8_from_gtk_event_key (GTK_WIDGET (day_view), key_event->keyval, key_event->string);
+			initial_text = e_utf8_from_gtk_event_key (GTK_WIDGET (day_view), key_event->keyval, key_event->string); /*
 			gnome_canvas_item_set (event->canvas_item,
 					       "text", initial_text,
-					       NULL);
+					       NULL); */
+			clutter_text_set_text (event->canvas_item, initial_text);
 			if (initial_text)
 				g_free (initial_text);
 		}
@@ -6223,10 +6537,12 @@ cancel_editing (EDayView *day_view)
 	/* Reset the text to what was in the component */
 
 	summary = icalcomponent_get_summary (event->comp_data->icalcomp);
+	clutter_text_set_text (event->canvas_item, summary ? summary : "");
+	/*
 	g_object_set (G_OBJECT (event->canvas_item),
 		      "text", summary ? summary : "",
 		      NULL);
-
+*/
 	/* Stop editing */
 	e_day_view_stop_editing_event (day_view);
 }
@@ -6278,11 +6594,13 @@ tooltip_destroy (EDayView *day_view, GnomeCanvasItem *item)
 
 static gboolean
 e_day_view_on_text_item_event (GnomeCanvasItem *item,
-			       GdkEvent *event,
+			       ClutterEvent *event,
 			       EDayView *day_view)
 {
+	//printf("EVEENT %p\n", item);
 	switch (event->type) {
-	case GDK_KEY_PRESS:
+	case CLUTTER_KEY_PRESS:
+		printf("KEYPRESS\n");
 		tooltip_destroy (day_view, item);
 		if (!E_TEXT (item)->preedit_len && event && event->key.keyval == GDK_Return) {
 			day_view->resize_event_num = -1;
@@ -6290,58 +6608,85 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item,
 			/* We set the keyboard focus to the EDayView, so the
 			   EText item loses it and stops the edit. */
 			gtk_widget_grab_focus (GTK_WIDGET (day_view));
-
+			g_object_set_data (item, "editing", GINT_TO_POINTER(FALSE));
+			e_day_view_on_editing_stopped (day_view, item);
+		clutter_ungrab_keyboard ();
+				
 			/* Stop the signal last or we will also stop any
 			   other events getting to the EText item. */
 			g_signal_stop_emission_by_name (item, "event");
 			return TRUE;
 		} else if (event->key.keyval == GDK_Escape) {
 			cancel_editing (day_view);
+			g_object_set_data (item, "editing", GINT_TO_POINTER(FALSE));
+			e_day_view_on_editing_stopped (day_view, item);
+				clutter_ungrab_keyboard ();
+
 			g_signal_stop_emission_by_name (item, "event");
 			/* focus should go to day view when stop editing */
 			gtk_widget_grab_focus (GTK_WIDGET (day_view));
 			return TRUE;
                } else if ((event->key.keyval == GDK_Up)
-                          && (event->key.state & GDK_SHIFT_MASK)
-                          && (event->key.state & GDK_CONTROL_MASK)
-                          && !(event->key.state & GDK_MOD1_MASK)) {
+                          && (event->key.modifier_state & CLUTTER_SHIFT_MASK)
+                          && (event->key.modifier_state & CLUTTER_CONTROL_MASK)
+                          && !(event->key.modifier_state & CLUTTER_MOD1_MASK)) {
                        e_day_view_change_event_end_time_up (day_view);
                        return TRUE;
                } else if ((event->key.keyval == GDK_Down)
-                          && (event->key.state & GDK_SHIFT_MASK)
-                          && (event->key.state & GDK_CONTROL_MASK)
-                          && !(event->key.state & GDK_MOD1_MASK)) {
+                          && (event->key.modifier_state & CLUTTER_SHIFT_MASK)
+                          && (event->key.modifier_state & CLUTTER_CONTROL_MASK)
+                          && !(event->key.modifier_state & CLUTTER_MOD1_MASK)) {
                        e_day_view_change_event_end_time_down (day_view);
                        return TRUE;
-		}
-		break;
-	case GDK_2BUTTON_PRESS:
+		} else {
+			clutter_actor_grab_key_focus (item);
+			clutter_grab_keyboard (item);
+		} break;
+/*	case GDK_2BUTTON_PRESS:
 #if 0
 		g_print ("Item got double-click\n");
 #endif
 		break;
-
-	case GDK_BUTTON_RELEASE:
+*/
+	case CLUTTER_BUTTON_RELEASE:
 			if (day_view->resize_event_num != -1)
 				day_view->resize_event_num = -1;
 
 			if (day_view->drag_event_num != -1)
 				day_view->drag_event_num = -1;
 
-	case GDK_BUTTON_PRESS:
+	case CLUTTER_BUTTON_PRESS:
 		tooltip_destroy (day_view, item);
+		{
+			gboolean editing = (GPOINTER_TO_INT(g_object_get_data (item, "editing"))) ? TRUE : FALSE;
+
+			if (!editing) {
+
+				g_object_set_data (item, "editing", GINT_TO_POINTER(!editing));
+				e_day_view_on_editing_started (day_view, item);
+				clutter_actor_grab_key_focus (item);
+				clutter_grab_keyboard (item);
+			} 
+			g_object_set_data (item, "click-x", GINT_TO_POINTER((int)((ClutterButtonEvent *)event)->x));
+			g_object_set_data (item, "click-y", GINT_TO_POINTER((int)((ClutterButtonEvent *)event)->y));
+			
+				printf("Clicked at %lf %lf\n", ((ClutterButtonEvent *)event)->x, ((ClutterButtonEvent *)event)->y);//else
+			//	e_day_view_on_editing_stopped (day_view, item);
+
+		}
 		/* Only let the EText handle the event while editing. */
-		if (!E_TEXT (item)->editing)
-			g_signal_stop_emission_by_name (item, "event");
+		//if (!E_TEXT (item)->editing)
+		//	g_signal_stop_emission_by_name (item, "event");
+		return TRUE;
 		break;
-	case GDK_FOCUS_CHANGE:
-		if (event->focus_change.in)
+	//case GDK_FOCUS_CHANGE:
+		/*if (event->focus_change.in)
 			e_day_view_on_editing_started (day_view, item);
 		else
 			e_day_view_on_editing_stopped (day_view, item);
-
-		return FALSE;
-	case GDK_ENTER_NOTIFY:
+*/
+	//	return FALSE;
+	case CLUTTER_ENTER:
 		{
 			EDayViewEvent *pevent;
 			ECalendarViewEventData *data;
@@ -6350,6 +6695,7 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item,
 			gboolean main_canvas = TRUE;
 			GdkWindow *window;
 			GtkLayout *layout;
+			gfloat xp, yp;
 
 			if (day_view->editing_event_num != -1)
 				break;
@@ -6378,6 +6724,10 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item,
 					return FALSE;
 				}
 			}
+
+			clutter_actor_get_position (item, &xp, &yp);
+			event_x += (int)xp;
+			event_y += (int)yp;
 			/* Find out where the mouse is. */
 			if (main_canvas) {
 				pos = e_day_view_convert_position_in_main_canvas (day_view,
@@ -6418,17 +6768,18 @@ e_day_view_on_text_item_event (GnomeCanvasItem *item,
 
 		return TRUE;
 		}
-	case GDK_LEAVE_NOTIFY:
+	case CLUTTER_LEAVE:
 		tooltip_destroy (day_view, item);
 		return TRUE;
-	case GDK_MOTION_NOTIFY:
+	case CLUTTER_MOTION:
 		{
 			EDayViewEvent *pevent;
 			gint event_num = GPOINTER_TO_INT(g_object_get_data ((GObject *)item, "event-num"));
 			gint day = GPOINTER_TO_INT(g_object_get_data ((GObject *)item, "event-day"));
 
 			pevent = tooltip_get_view_event (day_view, day, event_num);
-
+			if (!pevent)
+				return TRUE;
 			pevent->x = ((GdkEventMotion *)event)->x_root;
 			pevent->y = ((GdkEventMotion *)event)->y_root;
 			pevent->tooltip = (GtkWidget *)g_object_get_data (G_OBJECT (day_view), "tooltip-window");
@@ -6688,15 +7039,16 @@ e_day_view_on_editing_started (EDayView *day_view,
 {
 	GtkAllocation allocation;
 	gint day, event_num;
+	char *tmp;
 
 	if (!e_day_view_find_event_from_item (day_view, item,
 					      &day, &event_num))
 		return;
 
-#if 0
+
 	g_print ("In e_day_view_on_editing_started Day:%i Event:%i\n",
 		 day, event_num);
-#endif
+
 
 	/* FIXME: This is a temporary workaround for a bug which seems to stop
 	   us getting focus_out signals. It is not a complete fix since if we
@@ -6706,6 +7058,16 @@ e_day_view_on_editing_started (EDayView *day_view,
 	    && day_view->editing_event_num == event_num)
 		return;
 
+	if (day_view->editing_event_day != -1 &&
+		day_view->editing_event_num != -1) {
+		EDayViewEvent *event;
+		
+		event = &g_array_index (day_view->events[day_view->editing_event_day], EDayViewEvent,
+                                        day_view->editing_event_num);
+
+		g_object_set_data (event->canvas_item, "editing", GINT_TO_POINTER(FALSE));
+		e_day_view_on_editing_stopped (day_view, event->canvas_item);
+	}
 	day_view->editing_event_day = day;
 	day_view->editing_event_num = event_num;
 
@@ -6761,10 +7123,10 @@ e_day_view_on_editing_stopped (EDayView *day_view,
 	day = day_view->editing_event_day;
 	event_num = day_view->editing_event_num;
 
-#if 0
+
 	g_print ("In e_day_view_on_editing_stopped Day:%i Event:%i\n",
 		 day, event_num);
-#endif
+
 
 	/* If no item is being edited, just return. */
 	if (day == -1)
@@ -6816,7 +7178,8 @@ e_day_view_on_editing_stopped (EDayView *day_view,
 						   e_day_view_remove_event_cb, NULL);
 		e_day_view_check_layout (day_view);
 		gtk_widget_queue_draw (day_view->top_canvas);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);
+		//gtk_widget_queue_draw (day_view->main_canvas);
 		goto out;
 	}
 
@@ -6912,7 +7275,8 @@ e_day_view_on_editing_stopped (EDayView *day_view,
 		}
 
 	}
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);	
+	//gtk_widget_queue_draw (day_view->main_canvas);
 
  out:
 
@@ -7347,9 +7711,9 @@ e_day_view_convert_position_in_main_canvas (EDayView *day_view,
 	gint day, row, col, event_num;
 	gint item_x, item_y, item_w, item_h;
 
-#if 0
-	g_print ("e_day_view_convert_position_in_main_canvas: (%d, %d)\n", x, y);
-#endif
+
+//	g_print ("e_day_view_convert_position_in_main_canvas: (%d, %d)\n", x, y);
+
 
 	*day_return = -1;
 	*row_return = -1;
@@ -7584,13 +7948,18 @@ e_day_view_on_main_canvas_drag_motion (GtkWidget      *widget,
 				       EDayView	      *day_view)
 {
 	gint scroll_x, scroll_y;
-
+	gint offx, offy;
 	gnome_canvas_get_scroll_offsets (GNOME_CANVAS (widget),
 					 &scroll_x, &scroll_y);
 
-	day_view->drag_event_x = x + scroll_x;
-	day_view->drag_event_y = y + scroll_y;
-
+	offx = GPOINTER_TO_INT(g_object_get_data (day_view->dragged, "off-x"));
+	offy = GPOINTER_TO_INT(g_object_get_data (day_view->dragged, "off-y"));
+	
+	day_view->drag_event_x = x + scroll_x - offx;
+	day_view->drag_event_y = y + scroll_y - offy;
+	
+	printf("Offset %d %d, %d %d\n", offx, offy,day_view->drag_event_x, day_view->drag_event_y );
+	clutter_actor_set_position (day_view->dragged, day_view->drag_event_x, day_view->drag_event_y);
 	e_day_view_reshape_main_canvas_drag_item (day_view);
 	e_day_view_reshape_main_canvas_resize_bars (day_view);
 
@@ -7601,6 +7970,7 @@ e_day_view_on_main_canvas_drag_motion (GtkWidget      *widget,
 
 static void
 e_day_view_reshape_main_canvas_drag_item (EDayView *day_view)
+
 {
 	ECalendarViewPosition pos;
 	gint x, y, day, row;
@@ -7766,6 +8136,10 @@ e_day_view_on_main_canvas_drag_leave (GtkWidget      *widget,
 	gnome_canvas_item_hide (day_view->drag_bar_item);
 	gnome_canvas_item_hide (day_view->drag_item);
 
+	//clutter_actor_hide (day_view->dragged);
+	//clutter_actor_destroy (day_view->dragged);
+	//day_view->dragged = NULL;
+
 	/* Hide the resize bars if they are being used in the drag. */
 	if (day_view->drag_event_day == day_view->resize_bars_event_day
 	    && day_view->drag_event_num == day_view->resize_bars_event_num) {
@@ -7779,10 +8153,13 @@ e_day_view_on_drag_begin (GtkWidget      *widget,
 {
 	EDayViewEvent *event;
 	gint day, event_num;
+	ClutterActor *stage = g_object_get_data (day_view->main_canvas_item, "stage");
 
+	cancel_editing (day_view);
+	printf("CAAAAAAAAAAAAAAN\n");
 	day = day_view->drag_event_day;
 	event_num = day_view->drag_event_num;
-
+	gtk_drag_set_icon_name (context, "appointment-new", 0, 0);
 	/* These should both be set. */
 	g_return_if_fail (day != -1);
 	g_return_if_fail (event_num != -1);
@@ -7799,8 +8176,37 @@ e_day_view_on_drag_begin (GtkWidget      *widget,
 
 		event = &g_array_index (day_view->events[day], EDayViewEvent,
 					event_num);
-	}
-
+		g_object_set_data (event->canvas_item, "editing", FALSE);
+	}
+
+	char *tmp = g_strdup_printf ("%d-%d", day, event_num);
+	//clutter_actor_set_anchor_point (g_object_get_data(day_view, tmp), 0, 0);
+	clutter_actor_set_opacity (g_object_get_data(day_view, tmp), 128);
+	clutter_actor_set_scale (g_object_get_data(day_view, tmp), 1.0, 1.0);
+	float x,y;
+	int grabx, graby;
+	int offx, offy, w,h, rx,ry;
+
+	grabx = GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "click-x"));
+	graby = GPOINTER_TO_INT(g_object_get_data (event->canvas_item, "click-y"));
+	
+	clutter_actor_get_position (g_object_get_data(day_view, tmp), &x, &y);
+	offx = grabx - (int)x;
+	offy = graby - (int)y;
+
+	day_view->dragged = clutter_clone_new (g_object_get_data(day_view, tmp));
+	e_day_view_get_event_position (day_view, day, event_num, &rx, &ry,
+						&w, &h);
+	clutter_actor_show (day_view->dragged);
+	clutter_actor_set_opacity (day_view->dragged, 128);
+	clutter_actor_set_anchor_point (day_view->dragged, w/2, h/2);
+	g_object_set_data (day_view->dragged, "off-x", GINT_TO_POINTER(offx));
+	g_object_set_data (day_view->dragged, "off-y", GINT_TO_POINTER(offy));
+
+	clutter_container_add_actor (stage, day_view->dragged);
+	clutter_actor_raise_top (day_view->dragged);
+	g_object_set_data (event->canvas_item, "drag-is-actor", GINT_TO_POINTER(TRUE));
+	printf("DRAG BEBIN? %p\n", event->canvas_item);
 	/* Hide the text item, since it will be shown in the special drag
 	   items. */
 	gnome_canvas_item_hide (event->canvas_item);
@@ -7817,6 +8223,11 @@ e_day_view_on_drag_end (GtkWidget      *widget,
 	day = day_view->drag_event_day;
 	event_num = day_view->drag_event_num;
 
+	//if (day_view->dragged) {
+	//	clutter_actor_destroy (day_view->dragged);
+	//	day_view->dragged = NULL;
+	//}
+
 	/* If the calendar has already been updated in drag_data_received()
 	   we just return. */
 	if (day == -1 || event_num == -1)
@@ -7830,12 +8241,16 @@ e_day_view_on_drag_end (GtkWidget      *widget,
 					event_num);
 		gtk_widget_queue_draw (day_view->top_canvas);
 	} else {
+		printf("Returning ..\n");
 		if (!is_array_index_in_bounds (day_view->events[day], event_num))
 			return;
-
+		
 		event = &g_array_index (day_view->events[day], EDayViewEvent,
 					event_num);
-		gtk_widget_queue_draw (day_view->main_canvas);
+		g_object_set_data (event->canvas_item, "drag-is-actor", GINT_TO_POINTER(TRUE));
+		printf("drag-end %p\n", event->canvas_item);
+		e_day_view_main_item_redraw (day_view->main_canvas_item);	
+		//gtk_widget_queue_draw (day_view->main_canvas);
 	}
 
 	/* Show the text item again. */
@@ -7879,6 +8294,14 @@ e_day_view_on_drag_data_get (GtkWidget          *widget,
 					EDayViewEvent, event_num);
 	}
 
+	g_object_set_data (event->canvas_item, "drag-is-actor", GINT_TO_POINTER(TRUE));
+	day_view->drag_move = event->canvas_item;
+	char *tmp = g_strdup_printf ("%d-%d", day, event_num);
+	day_view->drag_actor = g_object_get_data (day_view, tmp);
+	clutter_actor_set_opacity (g_object_get_data(day_view, tmp), 128);
+	clutter_actor_set_scale (g_object_get_data(day_view, tmp), 1.0, 1.0);
+
+
 	if (!is_comp_data_valid (event))
 		return;
 
@@ -8448,7 +8871,8 @@ e_day_view_layout_timeout_cb (gpointer data)
 
 	gtk_widget_queue_draw (day_view->top_canvas);
 	gtk_widget_queue_draw (day_view->top_dates_canvas);
-	gtk_widget_queue_draw (day_view->main_canvas);
+	e_day_view_main_item_redraw (day_view->main_canvas_item);	
+	//gtk_widget_queue_draw (day_view->main_canvas);
 	e_day_view_check_layout (day_view);
 
 	day_view->layout_timeout_id = 0;
diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h
index aee8be0..41abd7a 100644
--- a/calendar/gui/e-day-view.h
+++ b/calendar/gui/e-day-view.h
@@ -30,7 +30,7 @@
 
 #include "e-calendar-view.h"
 #include "gnome-cal.h"
-
+#include <clutter/clutter.h>
 G_BEGIN_DECLS
 
 /*
@@ -473,7 +473,11 @@ struct _EDayView {
 	GnomeCanvasItem *drag_rect_item;
 	GnomeCanvasItem *drag_bar_item;
 	GnomeCanvasItem *drag_item;
-
+	ClutterActor *dragged;
+	ClutterActor *drag_move;
+	ClutterActor *drag_actor;
+	ClutterActor *resize_actor;
+	ClutterActor *resize_draw_actor;
 	/* "am" and "pm" in the current locale, and their widths. */
 	gchar *am_string;
 	gchar *pm_string;
diff --git a/mail/e-mail-message-pane.c b/mail/e-mail-message-pane.c
index 0f3488d..18b86c4 100644
--- a/mail/e-mail-message-pane.c
+++ b/mail/e-mail-message-pane.c
@@ -181,11 +181,17 @@ e_mail_message_pane_get_type (void)
 GtkWidget *
 e_mail_message_pane_new (EShellContent *content)
 {
+	GtkWidget *widget;
+
 	g_return_val_if_fail (E_IS_SHELL_CONTENT (content), NULL);
 
-	return g_object_new (
+	widget = g_object_new (
 		E_TYPE_MAIL_MESSAGE_PANE,
 		"shell-content", content, 
 		"preview-visible", TRUE,
 		NULL);
+
+	e_mail_paned_view_set_enable_show_folder (E_MAIL_PANED_VIEW(widget), TRUE);
+
+	return widget;
 }
diff --git a/mail/e-mail-message-pane.h b/mail/e-mail-message-pane.h
index ce5ea85..e31e167 100644
--- a/mail/e-mail-message-pane.h
+++ b/mail/e-mail-message-pane.h
@@ -53,6 +53,8 @@ typedef struct _EMailMessagePanePrivate EMailMessagePanePrivate;
 struct _EMailMessagePane {
 	EMailPanedView parent;
 	EMailMessagePanePrivate *priv;
+
+	EMailView *parent_folder_view;
 };
 
 struct _EMailMessagePaneClass {
diff --git a/mail/e-mail-notebook-view.c b/mail/e-mail-notebook-view.c
index 5add673..614229b 100644
--- a/mail/e-mail-notebook-view.c
+++ b/mail/e-mail-notebook-view.c
@@ -616,14 +616,38 @@ mail_notebook_view_class_init (EMailViewClass *klass)
 		object_class, PROP_ORIENTATION, "orientation"); */	
 }
 
+static void
+emnv_show_folder (EMailNotebookView *view, gpointer not_used)
+{
+	int pos;
+	EMailNotebookViewPrivate *priv = view->priv;
+	
+	pos = emnv_get_page_num (view, E_MAIL_MESSAGE_PANE(priv->current_view)->parent_folder_view);
+
+#if HAVE_CLUTTER		
+	e_mail_tab_picker_set_current_tab (priv->tab_picker, pos);
+	mnv_set_current_tab (E_MAIL_NOTEBOOK_VIEW(view), pos);
+#else
+	gtk_notebook_set_current_page (priv->book, pos);
+#endif
+
+
+}
+
 GtkWidget *
 e_mail_notebook_view_new (EShellContent *content)
 {
-	g_return_val_if_fail (E_IS_SHELL_CONTENT (content), NULL);
+	GtkWidget *widget;
+
+	g_return_val_if_fail (E_IS_SHELL_CONTENT (content), NULL);	
 
-	return g_object_new (
+	widget = g_object_new (
 		E_MAIL_NOTEBOOK_VIEW_TYPE,
 		"shell-content", content, NULL);
+	g_signal_connect (widget, "show-folder",
+			G_CALLBACK (emnv_show_folder), widget);
+
+	return widget;
 }
 
 static GtkActionGroup *
@@ -753,6 +777,8 @@ mail_netbook_view_open_mail (EMailView *view, const char *uid, EMailNotebookView
 	pos = emnv_get_page_num (nview, (GtkWidget *)priv->current_view);
 	pane = e_mail_message_pane_new (E_MAIL_VIEW(nview)->content);
 	E_MAIL_VIEW(pane)->prev = priv->current_view;
+	E_MAIL_MESSAGE_PANE(pane)->parent_folder_view = priv->current_view;
+
 	priv->current_view = (EMailView *)pane;
 	
 	gtk_widget_show (pane);
@@ -821,10 +847,99 @@ mail_netbook_view_open_mail (EMailView *view, const char *uid, EMailNotebookView
 		E_MAIL_READER (pane),
 		e_mail_reader_get_group_by_threads (E_MAIL_READER(view))); 
 
+	e_mail_reader_enable_show_folder (E_MAIL_READER(pane));
 	e_mail_reader_set_message (E_MAIL_READER (pane), uid);
 	camel_message_info_free (info);
 }
 
+static ClutterActor *
+build_histogram (GtkWidget *widget, CamelFolder *folder)
+{
+	int week_time = 60 * 60 * 24 * 7;
+	int weeks[54];
+	int i;
+	GPtrArray *uids;
+	int max = 1;
+	ClutterActor *texture;
+	cairo_t *cr;
+	float ratio;
+	int x = 0;
+	time_t now = time(NULL);
+	GtkStyle *style;
+	GdkColor *color;
+
+	for (i=0; i<54; i++)
+		weeks[i] = 0;
+
+	style = gtk_widget_get_style (GTK_WIDGET (widget));
+	color = &style->mid[GTK_STATE_NORMAL];
+//	&style->bg[GTK_STATE_NORMAL]
+
+	uids = camel_folder_get_uids (folder);
+	camel_folder_summary_prepare_fetch_all (folder->summary, NULL);
+	for (i = 0; i < uids->len; i++) {
+		CamelMessageInfo *info = camel_folder_get_message_info (folder, uids->pdata[i]);
+		if (info) {
+			time_t dreceived = now - camel_message_info_date_received (info);
+			int week;
+
+			week = (dreceived / week_time) - 1;
+			if (week > 52)
+				weeks[53]++;
+			else
+				weeks[week]++;
+
+			camel_message_info_free (info);
+		} 
+	}
+
+	for (i=0; i< 53; i++) {
+		if (weeks[i] > max)
+			max = weeks[i];
+	}
+
+	ratio = 50.0/max;
+
+	camel_folder_free_uids (folder, uids);
+
+  	texture = clutter_cairo_texture_new (200, 50);
+	clutter_actor_set_size (texture, 200, 50);
+  	cr = clutter_cairo_texture_create (CLUTTER_CAIRO_TEXTURE (texture));
+
+	clutter_actor_show_all (texture);
+
+	//cairo_set_source_rgba (cr, color->red, color->green, color->blue, 1.0);
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
+	cairo_save (cr);
+	x+=4;
+
+	cairo_set_source_rgba (cr, 0.8, 0.5, 0.3, 1.0);
+	cairo_arc (cr, x,  50 - (weeks[0] * ratio), 3, 0, 2*M_PI);
+
+	cairo_fill (cr);
+	cairo_restore (cr);
+
+	cairo_save (cr);
+	cairo_new_path (cr);
+	cairo_move_to (cr, x, 50 - (weeks[0] * ratio));
+
+	cairo_set_source_rgba (cr, 0.3, 0.2, 0.4, 1.0);
+
+	for (i=1; i<53; i++) {	
+		x+=4;
+		cairo_line_to (cr, x, 50 - (weeks[i]*ratio));
+
+	}
+
+	cairo_stroke (cr);
+	cairo_restore (cr);
+
+  	cairo_destroy(cr);
+
+	return texture;
+}
+
 static void
 mail_notebook_view_set_folder (EMailReader *reader,
                                CamelFolder *folder,
@@ -899,7 +1014,8 @@ mail_notebook_view_set_folder (EMailReader *reader,
 			g_object_set_data ((GObject *)tab, "page", priv->current_view);
 			g_object_set_data ((GObject *)priv->current_view, "page", tab);
 
-			clone = e_mail_tab_new_full (camel_folder_get_full_name(folder), NULL, 1);
+			clone = build_histogram (reader, folder);
+				//e_mail_tab_new_full (camel_folder_get_full_name(folder), NULL, 1);
 			clutter_actor_set_reactive (clone, FALSE);
 			e_mail_tab_set_can_close ((EMailTab *)clone, FALSE);
 			clutter_actor_show (clone);
@@ -935,8 +1051,9 @@ mail_notebook_view_set_folder (EMailReader *reader,
 			g_object_set_data ((GObject *)priv->current_view, "page", tab);
 
 			e_mail_tab_set_text (tab, camel_folder_get_full_name(folder));
-			clone = e_mail_tab_get_preview_actor (tab);
-			e_mail_tab_set_text ((EMailTab *)clone, camel_folder_get_full_name(folder));
+			e_mail_tab_set_preview_actor (tab, build_histogram (reader, folder));
+			//clone = e_mail_tab_get_preview_actor (tab);
+			//e_mail_tab_set_text ((EMailTab *)clone, camel_folder_get_full_name(folder));
 #endif			
 		}
 	
@@ -1002,6 +1119,17 @@ mail_notebook_view_open_selected_mail (EMailReader *reader)
 	return e_mail_reader_open_selected_mail (E_MAIL_READER(priv->current_view));	
 }
 
+static void
+mail_notebook_view_enable_show_folder (EMailReader *reader)
+{
+	EMailNotebookViewPrivate *priv = E_MAIL_NOTEBOOK_VIEW (reader)->priv;
+	
+	if (!priv->current_view)
+		return ;
+
+	return e_mail_reader_get_enable_show_folder (E_MAIL_READER(priv->current_view));	
+}
+
 void
 e_mail_notebook_view_set_search_strings (EMailView *view,
 					 GSList *search_strings)
@@ -1037,6 +1165,7 @@ mail_notebook_view_reader_init (EMailReaderIface *iface)
 	iface->set_folder = mail_notebook_view_set_folder;
 	iface->show_search_bar = mail_notebook_view_show_search_bar;
 	iface->open_selected_mail = mail_notebook_view_open_selected_mail;
+	iface->enable_show_folder = mail_notebook_view_enable_show_folder;
 }
 
 GType
diff --git a/mail/e-mail-paned-view.c b/mail/e-mail-paned-view.c
index 6733e40..2b88138 100644
--- a/mail/e-mail-paned-view.c
+++ b/mail/e-mail-paned-view.c
@@ -72,6 +72,7 @@ struct _EMailPanedViewPrivate {
 
 	guint preview_visible	: 1;
 	guint show_deleted	: 1;
+	guint enable_show_folder : 1;
 };
 
 enum {
@@ -568,6 +569,16 @@ mail_paned_view_open_selected_mail (EMailReader *reader)
 	E_MAIL_PANED_VIEW_CLASS(G_OBJECT_GET_CLASS (reader))->open_selected_mail (E_MAIL_PANED_VIEW(reader));
 }
 
+static gboolean
+mail_paned_view_enable_show_folder (EMailReader *reader)
+{
+	EMailPanedViewPrivate *priv;
+
+	priv = E_MAIL_PANED_VIEW (reader)->priv;
+	
+	return priv->enable_show_folder ? TRUE : FALSE;
+}
+
 static void
 mail_paned_view_constructed (GObject *object)
 {
@@ -685,6 +696,7 @@ mail_paned_view_init (EMailPanedView  *shell)
 	shell->priv = g_new0(EMailPanedViewPrivate, 1);
 
 	shell->priv->preview_visible = TRUE;
+	shell->priv->enable_show_folder = FALSE;
 
 	g_signal_connect (
 		shell, "notify::group-by-threads",
@@ -761,6 +773,8 @@ mail_paned_view_reader_init (EMailReaderIface *iface)
 	iface->set_folder = mail_paned_view_set_folder;
 	iface->show_search_bar = mail_paned_view_show_search_bar;
 	iface->open_selected_mail = mail_paned_view_open_selected_mail;
+	iface->enable_show_folder = mail_paned_view_enable_show_folder;
+	
 }
 
 GType
@@ -1122,3 +1136,11 @@ e_mail_paned_view_get_preview (EMailPanedView *view)
 {
 	return view->priv->preview;
 }
+
+void
+e_mail_paned_view_set_enable_show_folder (EMailPanedView *view, gboolean set)
+{
+	printf("Set %p: %d\n", view, set);
+	view->priv->enable_show_folder = set ? 1 : 0;
+}
+
diff --git a/mail/e-mail-paned-view.h b/mail/e-mail-paned-view.h
index 8cb5a0e..852beb7 100644
--- a/mail/e-mail-paned-view.h
+++ b/mail/e-mail-paned-view.h
@@ -90,5 +90,7 @@ e_mail_paned_view_hide_message_list_pane (EMailPanedView *view,
 					  gboolean visible);
 GtkWidget *
 e_mail_paned_view_get_preview (EMailPanedView *view);
+void
+e_mail_paned_view_set_enable_show_folder (EMailPanedView *view, gboolean set);
 
 #endif
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 40622ea..4cd011d 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -95,6 +95,7 @@ enum {
 	FOLDER_LOADED,
 	SHOW_SEARCH_BAR,
 	UPDATE_ACTIONS,
+	SHOW_FOLDER,
 	LAST_SIGNAL
 };
 
@@ -673,6 +674,13 @@ exit:
 }
 
 static void
+action_mail_folder_cb (GtkAction *action,
+                     EMailReader *reader)
+{
+	g_signal_emit (reader, signals[SHOW_FOLDER], 0);	
+}
+
+static void
 action_mail_next_cb (GtkAction *action,
                      EMailReader *reader)
 {
@@ -1590,6 +1598,13 @@ static GtkActionEntry mail_reader_entries[] = {
 	  N_("Move selected messages to another folder"),
 	  G_CALLBACK (action_mail_move_cb) },
 
+	{ "mail-goto-folder",
+	  NULL,
+	  N_("_Switch to Folder"),
+	  "<Control>Up",
+	  N_("Display the next message"),
+	  G_CALLBACK (action_mail_folder_cb) },
+	
 	{ "mail-next",
 	  GTK_STOCK_GO_FORWARD,
 	  N_("_Next Message"),
@@ -2315,6 +2330,13 @@ mail_reader_get_folder_uri (EMailReader *reader)
 	return MESSAGE_LIST (message_list)->folder_uri;
 }
 
+static gboolean
+mail_reader_get_enable_show_folder (EMailReader *reader)
+{
+	printf("Oops %p FALSe\n", reader);
+	return FALSE;
+}
+
 static void
 mail_reader_set_folder (EMailReader *reader,
                         CamelFolder *folder,
@@ -2378,6 +2400,7 @@ mail_reader_update_actions (EMailReader *reader,
 	GtkAction *action;
 	const gchar *action_name;
 	gboolean sensitive;
+	EMailReaderPrivate *priv;
 
 	/* Be descriptive. */
 	gboolean any_messages_selected;
@@ -2398,6 +2421,8 @@ mail_reader_update_actions (EMailReader *reader,
 	gboolean selection_is_mailing_list;
 	gboolean single_message_selected;
 
+	priv = E_MAIL_READER_GET_PRIVATE ( reader);
+
 	shell_backend = e_mail_reader_get_shell_backend (reader);
 	shell = e_shell_backend_get_shell (shell_backend);
 	shell_settings = e_shell_get_shell_settings (shell);
@@ -2596,6 +2621,10 @@ mail_reader_update_actions (EMailReader *reader,
 	action = e_mail_reader_get_action (reader, action_name);
 	gtk_action_set_sensitive (action, sensitive);
 
+	action_name = "mail-goto-folder";
+	action = e_mail_reader_get_action (reader, action_name);
+	g_object_set (action, "visible", e_mail_reader_get_enable_show_folder (reader), NULL);
+
 	action_name = "mail-move";
 	sensitive = any_messages_selected;
 	action = e_mail_reader_get_action (reader, action_name);
@@ -2745,6 +2774,7 @@ mail_reader_class_init (EMailReaderIface *iface)
 	iface->get_selected_uids = mail_reader_get_selected_uids;
 	iface->get_folder = mail_reader_get_folder;
 	iface->get_folder_uri = mail_reader_get_folder_uri;
+	iface->enable_show_folder = mail_reader_get_enable_show_folder;
 	iface->set_folder = mail_reader_set_folder;
 	iface->set_message = mail_reader_set_message;
 	iface->open_selected_mail = e_mail_reader_open_selected;
@@ -2793,6 +2823,15 @@ mail_reader_class_init (EMailReaderIface *iface)
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
 
+	signals[SHOW_FOLDER] = g_signal_new (
+		"show-folder",
+		G_OBJECT_CLASS_TYPE (iface),
+		G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+		0,
+		NULL, NULL,
+		g_cclosure_marshal_VOID__VOID,
+		G_TYPE_NONE, 0);	
+
 	signals[UPDATE_ACTIONS] = g_signal_new (
 		"update-actions",
 		G_OBJECT_CLASS_TYPE (iface),
@@ -2939,6 +2978,10 @@ e_mail_reader_init (EMailReader *reader)
 	action = e_mail_reader_get_action (reader, action_name);
 	g_object_set (action, "is-important", TRUE, NULL);
 
+	action_name = "mail-goto-folder";
+	action = e_mail_reader_get_action (reader, action_name);
+	g_object_set (action, "visible", FALSE, NULL);
+
 	action_name = "mail-next";
 	action = e_mail_reader_get_action (reader, action_name);
 	g_object_set (action, "short-label", _("Next"), NULL);
@@ -3313,6 +3356,19 @@ e_mail_reader_get_hide_deleted (EMailReader *reader)
 	return iface->get_hide_deleted (reader);
 }
 
+gboolean
+e_mail_reader_get_enable_show_folder (EMailReader *reader)
+{
+	EMailReaderIface *iface;
+
+	g_return_val_if_fail (E_IS_MAIL_READER (reader), FALSE);
+
+	iface = E_MAIL_READER_GET_IFACE (reader);
+	g_return_val_if_fail (iface->enable_show_folder != NULL, FALSE);
+
+	return iface->enable_show_folder (reader);
+}
+
 GtkWidget *
 e_mail_reader_get_message_list (EMailReader *reader)
 {
@@ -3582,3 +3638,28 @@ e_mail_reader_show_search_bar (EMailReader *reader)
 
 	g_signal_emit (reader, signals[SHOW_SEARCH_BAR], 0);
 }
+
+void 
+e_mail_reader_enable_show_folder (EMailReader *reader)
+{
+	GtkAction *action;
+	const gchar *action_name;
+	EMailReaderPrivate *priv;
+	CamelFolder *folder;
+	char *label;
+
+	g_return_if_fail (E_IS_MAIL_READER (reader));
+
+	priv = E_MAIL_READER_GET_PRIVATE (reader);
+	folder = e_mail_reader_get_folder (reader);
+
+	label = g_strdup_printf (_("Folder '%s'"), camel_folder_get_full_name(folder));
+
+	action_name = "mail-goto-folder";
+	action = e_mail_reader_get_action (reader, action_name);
+	g_object_set (action, "visible", TRUE, 
+		 	"label", label, NULL);
+
+	g_free (label);
+}
+
diff --git a/mail/e-mail-reader.h b/mail/e-mail-reader.h
index 911c2bd..0290866 100644
--- a/mail/e-mail-reader.h
+++ b/mail/e-mail-reader.h
@@ -105,6 +105,7 @@ struct _EMailReaderIface {
 	void		(*show_search_bar)	(EMailReader *reader);
 	void		(*update_actions)	(EMailReader *reader,
 						 guint32 state);
+	int 		(*enable_show_folder)	(EMailReader *reader);
 };
 
 GType		e_mail_reader_get_type		(void);
@@ -150,6 +151,9 @@ void		e_mail_reader_create_charset_menu
 						 GtkUIManager *ui_manager,
 						 guint merge_id);
 void		e_mail_reader_show_search_bar	(EMailReader *reader);
+gboolean	e_mail_reader_get_enable_show_folder
+						(EMailReader *reader);
+void 		e_mail_reader_enable_show_folder(EMailReader *reader);
 
 G_END_DECLS
 
diff --git a/ui/evolution-mail-reader.ui b/ui/evolution-mail-reader.ui
index 3c28887..1b87bf2 100644
--- a/ui/evolution-mail-reader.ui
+++ b/ui/evolution-mail-reader.ui
@@ -57,7 +57,9 @@
           <separator/>
           <menuitem action='mail-previous'/>
           <menuitem action='mail-previous-unread'/>
-          <menuitem action='mail-previous-important'/>
+	  <menuitem action='mail-previous-important'/>
+          <separator/>
+	  <menuitem action='mail-goto-folder'/>	  
         </menu>
         <menuitem action='mail-reply-sender'/>
         <menuitem action='mail-reply-list'/>



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