From 7be192643685acdc081332fc9177417d67870c53 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Mon, 21 Sep 2009 19:25:41 -0400 Subject: Calendar canvas item cleanup. --- calendar/gui/e-week-view-titles-item.c | 242 +++++++++++++++++++++------------ 1 file changed, 157 insertions(+), 85 deletions(-) (limited to 'calendar/gui/e-week-view-titles-item.c') diff --git a/calendar/gui/e-week-view-titles-item.c b/calendar/gui/e-week-view-titles-item.c index 69108f43cb..f2d90e7150 100644 --- a/calendar/gui/e-week-view-titles-item.c +++ b/calendar/gui/e-week-view-titles-item.c @@ -29,92 +29,83 @@ #include #include "e-week-view-titles-item.h" -static void e_week_view_titles_item_set_property(GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec); -static void e_week_view_titles_item_update (GnomeCanvasItem *item, - double *affine, - ArtSVP *clip_path, - gint flags); -static void e_week_view_titles_item_draw (GnomeCanvasItem *item, - GdkDrawable *drawable, - gint x, - gint y, - gint width, - gint height); -static double e_week_view_titles_item_point (GnomeCanvasItem *item, - double x, - double y, - gint cx, - gint cy, - GnomeCanvasItem **actual_item); - -/* The arguments we take */ +#define E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_WEEK_VIEW_TITLES_ITEM, EWeekViewTitlesItemPrivate)) + +struct _EWeekViewTitlesItemPrivate { + EWeekView *week_view; +}; + enum { PROP_0, PROP_WEEK_VIEW }; -G_DEFINE_TYPE (EWeekViewTitlesItem, e_week_view_titles_item, GNOME_TYPE_CANVAS_ITEM) +static gpointer parent_class; static void -e_week_view_titles_item_class_init (EWeekViewTitlesItemClass *class) +week_view_titles_item_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) { - GObjectClass *object_class; - GnomeCanvasItemClass *item_class; - - object_class = G_OBJECT_CLASS (class); - object_class->set_property = e_week_view_titles_item_set_property; - - item_class = GNOME_CANVAS_ITEM_CLASS (class); - item_class->update = e_week_view_titles_item_update; - item_class->draw = e_week_view_titles_item_draw; - item_class->point = e_week_view_titles_item_point; + switch (property_id) { + case PROP_WEEK_VIEW: + e_week_view_titles_item_set_week_view ( + E_WEEK_VIEW_TITLES_ITEM (object), + g_value_get_object (value)); + return; + } - g_object_class_install_property ( - object_class, - PROP_WEEK_VIEW, - g_param_spec_pointer ( - "week_view", - NULL, - NULL, - G_PARAM_WRITABLE)); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void -e_week_view_titles_item_init (EWeekViewTitlesItem *wvtitem) +week_view_titles_item_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) { - wvtitem->week_view = NULL; + switch (property_id) { + case PROP_WEEK_VIEW: + g_value_set_object ( + value, + e_week_view_titles_item_get_week_view ( + E_WEEK_VIEW_TITLES_ITEM (object))); + return; + } + + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); } static void -e_week_view_titles_item_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) +week_view_titles_item_dispose (GObject *object) { - EWeekViewTitlesItem *wvtitem; + EWeekViewTitlesItemPrivate *priv; - wvtitem = E_WEEK_VIEW_TITLES_ITEM (object); + priv = E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE (object); - switch (property_id) { - case PROP_WEEK_VIEW: - wvtitem->week_view = g_value_get_pointer (value); - return; + if (priv->week_view != NULL) { + g_object_unref (priv->week_view); + priv->week_view = NULL; } - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (parent_class)->dispose (object); } static void -e_week_view_titles_item_update (GnomeCanvasItem *item, - double *affine, - ArtSVP *clip_path, - gint flags) +week_view_titles_item_update (GnomeCanvasItem *item, + gdouble *affine, + ArtSVP *clip_path, + gint flags) { - if (GNOME_CANVAS_ITEM_CLASS (e_week_view_titles_item_parent_class)->update) - (* GNOME_CANVAS_ITEM_CLASS (e_week_view_titles_item_parent_class)->update) (item, affine, clip_path, flags); + GnomeCanvasItemClass *canvas_item_class; + + /* Chain up to parent's update() method. */ + canvas_item_class = GNOME_CANVAS_ITEM_CLASS (parent_class); + canvas_item_class->update (item, affine, clip_path, flags); /* The item covers the entire canvas area. */ item->x1 = 0; @@ -123,19 +114,15 @@ e_week_view_titles_item_update (GnomeCanvasItem *item, item->y2 = INT_MAX; } -/* - * DRAWING ROUTINES - functions to paint the canvas item. - */ - static void -e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, - GdkDrawable *drawable, - gint x, - gint y, - gint width, - gint height) +week_view_titles_item_draw (GnomeCanvasItem *canvas_item, + GdkDrawable *drawable, + gint x, + gint y, + gint width, + gint height) { - EWeekViewTitlesItem *wvtitem; + EWeekViewTitlesItem *titles_item; EWeekView *week_view; GtkStyle *style; GdkGC *fg_gc, *light_gc, *dark_gc; @@ -146,13 +133,8 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, gint weekday; PangoLayout *layout; -#if 0 - g_print ("In e_week_view_titles_item_draw %i,%i %ix%i\n", - x, y, width, height); -#endif - - wvtitem = E_WEEK_VIEW_TITLES_ITEM (canvas_item); - week_view = wvtitem->week_view; + titles_item = E_WEEK_VIEW_TITLES_ITEM (canvas_item); + week_view = e_week_view_titles_item_get_week_view (titles_item); g_return_if_fail (week_view != NULL); style = gtk_widget_get_style (GTK_WIDGET (week_view)); @@ -259,15 +241,105 @@ e_week_view_titles_item_draw (GnomeCanvasItem *canvas_item, g_object_unref (layout); } -/* This is supposed to return the nearest item the the point and the distance. - Since we are the only item we just return ourself and 0 for the distance. - This is needed so that we get button/motion events. */ static double -e_week_view_titles_item_point (GnomeCanvasItem *item, double x, double y, - gint cx, gint cy, - GnomeCanvasItem **actual_item) +week_view_titles_item_point (GnomeCanvasItem *item, + gdouble x, + gdouble y, + gint cx, + gint cy, + GnomeCanvasItem **actual_item) { + /* This is supposed to return the nearest item the the point + * and the distance. Since we are the only item we just return + * ourself and 0 for the distance. This is needed so that we + * get button/motion events. */ *actual_item = item; + return 0.0; } +static void +week_view_titles_item_class_init (EWeekViewTitlesItemClass *class) +{ + GObjectClass *object_class; + GnomeCanvasItemClass *item_class; + + parent_class = g_type_class_peek_parent (class); + g_type_class_add_private (class, sizeof (EWeekViewTitlesItemPrivate)); + + object_class = G_OBJECT_CLASS (class); + object_class->set_property = week_view_titles_item_set_property; + object_class->get_property = week_view_titles_item_get_property; + object_class->dispose = week_view_titles_item_dispose; + + item_class = GNOME_CANVAS_ITEM_CLASS (class); + item_class->update = week_view_titles_item_update; + item_class->draw = week_view_titles_item_draw; + item_class->point = week_view_titles_item_point; + + g_object_class_install_property ( + object_class, + PROP_WEEK_VIEW, + g_param_spec_object ( + "week-view", + "Week View", + NULL, + E_TYPE_WEEK_VIEW, + G_PARAM_READWRITE)); +} + +static void +week_view_titles_item_init (EWeekViewTitlesItem *titles_item) +{ + titles_item->priv = E_WEEK_VIEW_TITLES_ITEM_GET_PRIVATE (titles_item); +} + +GType +e_week_view_titles_item_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + const GTypeInfo type_info = { + sizeof (EWeekViewTitlesItemClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) week_view_titles_item_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EWeekViewTitlesItem), + 0, /* n_preallocs */ + (GInstanceInitFunc) week_view_titles_item_init, + NULL /* value_table */ + }; + + type = g_type_register_static ( + GNOME_TYPE_CANVAS_ITEM, "EWeekViewTitlesItem", + &type_info, 0); + } + + return type; +} + +EWeekView * +e_week_view_titles_item_get_week_view (EWeekViewTitlesItem *titles_item) +{ + g_return_val_if_fail (E_IS_WEEK_VIEW_TITLES_ITEM (titles_item), NULL); + + return titles_item->priv->week_view; +} + +void +e_week_view_titles_item_set_week_view (EWeekViewTitlesItem *titles_item, + EWeekView *week_view) +{ + g_return_if_fail (E_IS_WEEK_VIEW_TITLES_ITEM (titles_item)); + g_return_if_fail (E_IS_WEEK_VIEW (week_view)); + + if (titles_item->priv->week_view != NULL) + g_object_unref (titles_item->priv->week_view); + + titles_item->priv->week_view = g_object_ref (week_view); + + g_object_notify (G_OBJECT (titles_item), "week-view"); +} -- cgit v1.2.3