aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-week-view-event-item.c
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2009-09-22 07:25:41 +0800
committerMatthew Barnes <mbarnes@redhat.com>2009-09-22 22:34:26 +0800
commit7be192643685acdc081332fc9177417d67870c53 (patch)
tree1c04a080735ed962b6dd89594e16efbf62ed5123 /calendar/gui/e-week-view-event-item.c
parent5a80f92d37e7e8a814f70f826b7b33f5d21b0f72 (diff)
downloadgsoc2013-evolution-7be192643685acdc081332fc9177417d67870c53.tar.gz
gsoc2013-evolution-7be192643685acdc081332fc9177417d67870c53.tar.zst
gsoc2013-evolution-7be192643685acdc081332fc9177417d67870c53.zip
Calendar canvas item cleanup.
Diffstat (limited to 'calendar/gui/e-week-view-event-item.c')
-rw-r--r--calendar/gui/e-week-view-event-item.c1321
1 files changed, 687 insertions, 634 deletions
diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c
index dc31e20696..0c9afbe651 100644
--- a/calendar/gui/e-week-view-event-item.c
+++ b/calendar/gui/e-week-view-event-item.c
@@ -40,178 +40,586 @@
#include <text/e-text.h>
-static void e_week_view_event_item_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-static void e_week_view_event_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- gint flags);
-static void e_week_view_event_item_draw (GnomeCanvasItem *item,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint width,
- gint height);
-static void e_week_view_draw_time (EWeekView *week_view,
- GdkDrawable *drawable,
- gint time_x,
- gint time_y,
- gint hour,
- gint minute);
-static void e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint icon_x,
- gint icon_y,
- gint x2,
- gboolean right_align,
- GdkRegion *draw_region);
-static void e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- GdkColor bg_color,
- gint x,
- gint y,
- gint w,
- gint h,
- GdkRegion *draw_region);
-static double e_week_view_event_item_point (GnomeCanvasItem *item,
- double x,
- double y,
- gint cx,
- gint cy,
- GnomeCanvasItem **actual_item);
-static gint e_week_view_event_item_event (GnomeCanvasItem *item,
- GdkEvent *event);
-static gboolean e_week_view_event_item_button_press (EWeekViewEventItem *wveitem,
- GdkEvent *event);
-static gboolean e_week_view_event_item_button_release (EWeekViewEventItem *wveitem,
- GdkEvent *event);
-static gboolean e_week_view_event_item_double_click (EWeekViewEventItem *wveitem,
- GdkEvent *bevent);
-static ECalendarViewPosition e_week_view_event_item_get_position (EWeekViewEventItem *wveitem,
- gdouble x,
- gdouble y);
-
-/* The arguments we take */
+#define E_WEEK_VIEW_EVENT_ITEM_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_WEEK_VIEW_EVENT_ITEM, EWeekViewEventItemPrivate))
+
+struct _EWeekViewEventItemPrivate {
+ /* The event index in the EWeekView events array. */
+ gint event_num;
+
+ /* The span index within the event. */
+ gint span_num;
+};
+
enum {
PROP_0,
PROP_EVENT_NUM,
PROP_SPAN_NUM
};
-G_DEFINE_TYPE (EWeekViewEventItem, e_week_view_event_item, GNOME_TYPE_CANVAS_ITEM)
+static gpointer parent_class;
+
+static gboolean
+can_draw_in_region (GdkRegion *draw_region,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
+{
+ GdkRectangle rect;
+
+ g_return_val_if_fail (draw_region != NULL, FALSE);
+
+ rect.x = x;
+ rect.y = y;
+ rect.width = width;
+ rect.height = height;
+
+ return gdk_region_rect_in (draw_region, &rect) !=
+ GDK_OVERLAP_RECTANGLE_OUT;
+}
+
+static ECalendarViewPosition
+week_view_event_item_get_position (EWeekViewEventItem *event_item,
+ gdouble x,
+ gdouble y)
+{
+ EWeekView *week_view;
+ GnomeCanvasItem *item;
+
+ item = GNOME_CANVAS_ITEM (event_item);
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), E_CALENDAR_VIEW_POS_NONE);
+
+ if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
+ || x >= item->x2 - E_WEEK_VIEW_EVENT_R_PAD)
+ return E_CALENDAR_VIEW_POS_NONE;
+
+ /* Support left/right edge for long events only. */
+ if (!e_week_view_is_one_day_event (week_view, event_item->priv->event_num)) {
+ if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
+ + E_WEEK_VIEW_EVENT_BORDER_WIDTH
+ + E_WEEK_VIEW_EVENT_EDGE_X_PAD)
+ return E_CALENDAR_VIEW_POS_LEFT_EDGE;
+
+ if (x >= item->x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD
+ - E_WEEK_VIEW_EVENT_BORDER_WIDTH
+ - E_WEEK_VIEW_EVENT_EDGE_X_PAD)
+ return E_CALENDAR_VIEW_POS_RIGHT_EDGE;
+ }
+
+ return E_CALENDAR_VIEW_POS_EVENT;
+}
+
+static gboolean
+week_view_event_item_double_click (EWeekViewEventItem *event_item,
+ GdkEvent *bevent)
+{
+ EWeekView *week_view;
+ EWeekViewEvent *event;
+ GnomeCanvasItem *item;
+
+ item = GNOME_CANVAS_ITEM (event_item);
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
+
+ event = &g_array_index (
+ week_view->events, EWeekViewEvent,
+ event_item->priv->event_num);
+
+ if (week_view->editing_event_num >= 0) {
+ EWeekViewEvent *editing;
+
+ editing = &g_array_index (
+ week_view->events, EWeekViewEvent,
+ week_view->editing_event_num);
+
+ /* do not call edit of the component, if double clicked on the component, which is not on the server */
+ if (editing && event && editing->comp_data == event->comp_data && (!event->comp_data || !is_icalcomp_on_the_server (event->comp_data->icalcomp, event->comp_data->client)))
+ return TRUE;
+ }
+
+ e_week_view_stop_editing_event (week_view);
+
+ e_calendar_view_edit_appointment (
+ E_CALENDAR_VIEW (week_view),
+ event->comp_data->client,
+ event->comp_data->icalcomp, FALSE);
+
+ return TRUE;
+}
+
+static gboolean
+week_view_event_item_button_press (EWeekViewEventItem *event_item,
+ GdkEvent *bevent)
+{
+ EWeekView *week_view;
+ ECalendarViewPosition pos;
+ EWeekViewEvent *event;
+ EWeekViewEventSpan *span;
+ GnomeCanvasItem *item;
+
+ item = GNOME_CANVAS_ITEM (event_item);
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
+
+ event = &g_array_index (week_view->events, EWeekViewEvent,
+ event_item->priv->event_num);
+ span = &g_array_index (week_view->spans, EWeekViewEventSpan,
+ event->spans_index + event_item->priv->span_num);
+
+ pos = week_view_event_item_get_position (event_item, bevent->button.x,
+ bevent->button.y);
+ if (pos == E_CALENDAR_VIEW_POS_NONE)
+ return FALSE;
+
+ if (bevent->button.button == 1) {
+ week_view->pressed_event_num = event_item->priv->event_num;
+ week_view->pressed_span_num = event_item->priv->span_num;
+
+ /* Ignore clicks on the event while editing. */
+ if (E_TEXT (span->text_item)->editing)
+ return FALSE;
+
+ /* Remember the item clicked and the mouse position,
+ so we can start a drag if the mouse moves. */
+ week_view->drag_event_x = bevent->button.x;
+ week_view->drag_event_y = bevent->button.y;
+
+ /* FIXME: Remember the day offset from the start of the event.
+ */
+
+ return TRUE;
+ } else if (bevent->button.button == 3) {
+ if (!GTK_WIDGET_HAS_FOCUS (week_view)) {
+ gtk_widget_grab_focus (GTK_WIDGET (week_view));
+ if (week_view->event_destroyed) {
+ week_view->event_destroyed = FALSE;
+ return FALSE;
+ }
+
+ }
+
+ e_week_view_set_selected_time_range_visible (
+ week_view, event->start, event->end);
+
+ e_week_view_show_popup_menu (
+ week_view, (GdkEventButton*) bevent,
+ event_item->priv->event_num);
+ g_signal_stop_emission_by_name (
+ item->canvas, "button_press_event");
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+week_view_event_item_button_release (EWeekViewEventItem *event_item,
+ GdkEvent *event)
+{
+ EWeekView *week_view;
+ GnomeCanvasItem *item;
+
+ item = GNOME_CANVAS_ITEM (event_item);
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
+ g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
+
+ if (week_view->pressed_event_num != -1
+ && week_view->pressed_event_num == event_item->priv->event_num
+ && week_view->pressed_span_num == event_item->priv->span_num) {
+ e_week_view_start_editing_event (week_view,
+ event_item->priv->event_num,
+ event_item->priv->span_num,
+ NULL);
+ week_view->pressed_event_num = -1;
+ return TRUE;
+ }
+
+ week_view->pressed_event_num = -1;
+
+ return FALSE;
+}
static void
-e_week_view_event_item_class_init (EWeekViewEventItemClass *class)
+week_view_draw_time (EWeekView *week_view,
+ GdkDrawable *drawable,
+ gint time_x,
+ gint time_y,
+ gint hour,
+ gint minute)
{
- GObjectClass *object_class;
- GnomeCanvasItemClass *item_class;
+ ECalModel *model;
+ GtkStyle *style;
+ GdkGC *gc;
+ gint hour_to_display, suffix_width;
+ gint time_y_normal_font, time_y_small_font;
+ const gchar *suffix;
+ gchar buffer[128];
+ PangoLayout *layout;
+ PangoFontDescription *small_font_desc;
- object_class = G_OBJECT_CLASS (class);
- object_class->set_property = e_week_view_event_item_set_property;
+ model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
- item_class = GNOME_CANVAS_ITEM_CLASS (class);
- item_class->update = e_week_view_event_item_update;
- item_class->draw = e_week_view_event_item_draw;
- item_class->point = e_week_view_event_item_point;
- item_class->event = e_week_view_event_item_event;
+ style = gtk_widget_get_style (GTK_WIDGET (week_view));
+ small_font_desc = week_view->small_font_desc;
+ gc = week_view->main_gc;
- g_object_class_install_property (
- object_class,
- PROP_EVENT_NUM,
- g_param_spec_int (
- "event_num",
- NULL,
- NULL,
- G_MININT,
- G_MAXINT,
- -1,
- G_PARAM_WRITABLE));
+ gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]);
- g_object_class_install_property (
- object_class,
- PROP_SPAN_NUM,
- g_param_spec_int (
- "span_num",
- NULL,
- NULL,
- G_MININT,
- G_MAXINT,
- -1,
- G_PARAM_WRITABLE));
+ layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL);
+
+ time_y_normal_font = time_y_small_font = time_y;
+ if (small_font_desc)
+ time_y_small_font = time_y;
+
+ e_week_view_convert_time_to_display (week_view, hour, &hour_to_display,
+ &suffix, &suffix_width);
+
+ if (week_view->use_small_font && week_view->small_font_desc) {
+ g_snprintf (buffer, sizeof (buffer), "%2i:%02i",
+ hour_to_display, minute);
+
+ /* Draw the hour. */
+ if (hour_to_display < 10) {
+ pango_layout_set_text (layout, buffer + 1, 1);
+ gdk_draw_layout (drawable, gc,
+ time_x + week_view->digit_width,
+ time_y_normal_font,
+ layout);
+ } else {
+ pango_layout_set_text (layout, buffer, 2);
+ gdk_draw_layout (drawable, gc,
+ time_x,
+ time_y_normal_font,
+ layout);
+ }
+
+ time_x += week_view->digit_width * 2;
+
+ /* Draw the start minute, in the small font. */
+ pango_layout_set_font_description (layout, week_view->small_font_desc);
+ pango_layout_set_text (layout, buffer + 3, 2);
+ gdk_draw_layout (drawable, gc,
+ time_x,
+ time_y_small_font,
+ layout);
+
+ pango_layout_set_font_description (layout, style->font_desc);
+
+ time_x += week_view->small_digit_width * 2;
+
+ /* Draw the 'am'/'pm' suffix, if 12-hour format. */
+ if (!e_cal_model_get_use_24_hour_format (model)) {
+ pango_layout_set_text (layout, suffix, -1);
+
+ gdk_draw_layout (drawable, gc,
+ time_x,
+ time_y_normal_font,
+ layout);
+ }
+ } else {
+ /* Draw the start time in one go. */
+ g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s",
+ hour_to_display, minute, suffix);
+ if (hour_to_display < 10) {
+ pango_layout_set_text (layout, buffer + 1, -1);
+ gdk_draw_layout (drawable, gc,
+ time_x + week_view->digit_width,
+ time_y_normal_font,
+ layout);
+ } else {
+ pango_layout_set_text (layout, buffer, -1);
+ gdk_draw_layout (drawable, gc,
+ time_x,
+ time_y_normal_font,
+ layout);
+ }
+
+ }
+ g_object_unref (layout);
}
static void
-e_week_view_event_item_init (EWeekViewEventItem *wveitem)
+week_view_event_item_draw_icons (EWeekViewEventItem *event_item,
+ GdkDrawable *drawable,
+ gint icon_x,
+ gint icon_y,
+ gint x2,
+ gboolean right_align,
+ GdkRegion *draw_region)
{
- wveitem->event_num = -1;
- wveitem->span_num = -1;
+ EWeekView *week_view;
+ EWeekViewEvent *event;
+ ECalComponent *comp;
+ GdkGC *gc;
+ gint num_icons = 0, icon_x_inc;
+ gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE;
+ gboolean draw_timezone_icon = FALSE, draw_attach_icon = FALSE;
+ gboolean draw_meeting_icon = FALSE;
+ GSList *categories_pixbufs = NULL, *pixbufs;
+ cairo_t *cr;
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (event_item)->canvas)->parent);
+
+ event = &g_array_index (week_view->events, EWeekViewEvent,
+ event_item->priv->event_num);
+ comp = e_cal_component_new ();
+ e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
+
+ gc = week_view->main_gc;
+ cr = gdk_cairo_create (drawable);
+
+ if (e_cal_component_has_alarms (comp)) {
+ draw_reminder_icon = TRUE;
+ num_icons++;
+ }
+
+ if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp)) {
+ draw_recurrence_icon = TRUE;
+ num_icons++;
+ }
+
+ if (e_cal_component_has_attachments (comp)) {
+ draw_attach_icon = TRUE;
+ num_icons++;
+ }
+
+ if (e_cal_component_has_attendees (comp)) {
+ draw_meeting_icon = TRUE;
+ num_icons++;
+ }
+
+ if (event->different_timezone) {
+ draw_timezone_icon = TRUE;
+ num_icons++;
+ }
+
+ num_icons += cal_comp_util_get_n_icons (comp, &categories_pixbufs);
+
+ icon_x_inc = E_WEEK_VIEW_ICON_WIDTH + E_WEEK_VIEW_ICON_X_PAD;
+
+ if (right_align)
+ icon_x -= icon_x_inc * num_icons;
+
+ #define draw_pixbuf(pf) \
+ if (can_draw_in_region (draw_region, icon_x, icon_y, \
+ E_WEEK_VIEW_ICON_WIDTH, E_WEEK_VIEW_ICON_HEIGHT)) { \
+ cairo_save (cr); \
+ gdk_cairo_set_source_pixbuf (cr, pf, icon_x, icon_y); \
+ cairo_paint (cr); \
+ cairo_restore (cr); \
+ } \
+ \
+ icon_x += icon_x_inc;
+
+ if (draw_reminder_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
+ draw_pixbuf (week_view->reminder_icon);
+ }
+
+ if (draw_attach_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
+ draw_pixbuf (week_view->attach_icon);
+ }
+
+ if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
+ draw_pixbuf (week_view->recurrence_icon);
+ }
+
+ if (draw_timezone_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
+ draw_pixbuf (week_view->timezone_icon);
+ }
+
+ if (draw_meeting_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
+ draw_pixbuf (week_view->meeting_icon);
+ }
+
+ /* draw categories icons */
+ for (pixbufs = categories_pixbufs;
+ pixbufs;
+ pixbufs = pixbufs->next) {
+ GdkPixbuf *pixbuf = pixbufs->data;
+
+ draw_pixbuf (pixbuf);
+ }
+
+ #undef draw_pixbuf
+
+ g_slist_foreach (categories_pixbufs, (GFunc)g_object_unref, NULL);
+ g_slist_free (categories_pixbufs);
+
+ cairo_destroy (cr);
+ g_object_unref(comp);
+ gdk_gc_set_clip_mask (gc, NULL);
}
+/* This draws a little triangle to indicate that an event extends past
+ the days visible on screen. */
static void
-e_week_view_event_item_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
+week_view_event_item_draw_triangle (EWeekViewEventItem *event_item,
+ GdkDrawable *drawable,
+ GdkColor bg_color,
+ gint x,
+ gint y,
+ gint w,
+ gint h,
+ GdkRegion *draw_region)
{
- GnomeCanvasItem *item;
- EWeekViewEventItem *wveitem;
+ EWeekView *week_view;
+ EWeekViewEvent *event;
+ GdkGC *gc;
+ GdkPoint points[3];
+ gint c1, c2;
+ cairo_t *cr;
+
+ if (!can_draw_in_region (draw_region, x, y, w, h))
+ return;
+
+ week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (event_item)->canvas)->parent);
+
+ event = &g_array_index (week_view->events, EWeekViewEvent,
+ event_item->priv->event_num);
+
+ gc = week_view->main_gc;
+ cr = gdk_cairo_create (drawable);
+
+ points[0].x = x;
+ points[0].y = y;
+ points[1].x = x + w;
+ points[1].y = y + (h / 2);
+ points[2].x = x;
+ points[2].y = y + h - 1;
- item = GNOME_CANVAS_ITEM (object);
- wveitem = E_WEEK_VIEW_EVENT_ITEM (object);
+ if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)),
+ event->comp_data),
+ &bg_color)) {
+ GdkColormap *colormap;
+
+ colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
+ if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) {
+ gdk_cairo_set_source_color (cr, &bg_color);
+ }
+ else {
+ gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
+ }
+ } else {
+ gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
+ }
+
+ cairo_save (cr);
+ cairo_set_line_width (cr, 0.7);
+ cairo_move_to (cr, points[0].x, points[0].y);
+ cairo_line_to (cr, points[1].x, points[1].y);
+ cairo_line_to (cr, points[2].x, points[2].y);
+ cairo_line_to (cr, points[0].x, points[0].y);
+ cairo_fill (cr);
+ cairo_restore (cr);
+
+ cairo_save (cr);
+ gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
+
+ /* If the height is odd we can use the same central point for both
+ lines. If it is even we use different end-points. */
+ c1 = c2 = y + (h / 2);
+ if (h % 2 == 0)
+ c1--;
+
+ cairo_set_line_width (cr, 0.7);
+ cairo_move_to (cr, x, y);
+ cairo_line_to (cr, x + w, c1);
+ cairo_move_to (cr, x, y + h - 1);
+ cairo_line_to (cr, x + w, c2);
+ cairo_restore (cr);
+
+ cairo_destroy (cr);
+}
+
+static void
+week_view_event_item_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
switch (property_id) {
- case PROP_EVENT_NUM:
- wveitem->event_num = g_value_get_int (value);
- gnome_canvas_item_request_update (item);
- return;
- case PROP_SPAN_NUM:
- wveitem->span_num = g_value_get_int (value);
- gnome_canvas_item_request_update (item);
- return;
+ case PROP_EVENT_NUM:
+ e_week_view_event_item_set_event_num (
+ E_WEEK_VIEW_EVENT_ITEM (object),
+ g_value_get_int (value));
+ return;
+
+ case PROP_SPAN_NUM:
+ e_week_view_event_item_set_span_num (
+ E_WEEK_VIEW_EVENT_ITEM (object),
+ g_value_get_int (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+week_view_event_item_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_EVENT_NUM:
+ g_value_set_int (
+ value,
+ e_week_view_event_item_get_event_num (
+ E_WEEK_VIEW_EVENT_ITEM (object)));
+ return;
+
+ case PROP_SPAN_NUM:
+ g_value_set_int (
+ value,
+ e_week_view_event_item_get_span_num (
+ E_WEEK_VIEW_EVENT_ITEM (object)));
+ return;
}
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
static void
-e_week_view_event_item_update (GnomeCanvasItem *item,
- double *affine,
- ArtSVP *clip_path,
- gint flags)
+week_view_event_item_update (GnomeCanvasItem *item,
+ gdouble *affine,
+ ArtSVP *clip_path,
+ gint flags)
{
- EWeekViewEventItem *wveitem;
+ GnomeCanvasItemClass *canvas_item_class;
+ EWeekViewEventItem *event_item;
EWeekView *week_view;
+ gint event_num, span_num;
gint span_x, span_y, span_w;
-#if 0
- g_print ("In e_week_view_event_item_update\n");
-#endif
-
- wveitem = E_WEEK_VIEW_EVENT_ITEM (item);
+ event_item = E_WEEK_VIEW_EVENT_ITEM (item);
week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
g_return_if_fail (E_IS_WEEK_VIEW (week_view));
- if (GNOME_CANVAS_ITEM_CLASS (e_week_view_event_item_parent_class)->update)
- (* GNOME_CANVAS_ITEM_CLASS (e_week_view_event_item_parent_class)->update) (item, affine, clip_path, flags);
+ /* 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);
item->x1 = 0;
item->y1 = 0;
item->x2 = 0;
item->y2 = 0;
- if (wveitem->event_num != -1 && wveitem->span_num != -1) {
- if (e_week_view_get_span_position (week_view,
- wveitem->event_num,
- wveitem->span_num,
- &span_x, &span_y,
- &span_w)) {
-#if 0
- g_print (" Event:%i Span:%i %i,%i W:%i\n",
- wveitem->event_num, wveitem->span_num,
- span_x, span_y, span_w);
-#endif
+ event_num = e_week_view_event_item_get_event_num (event_item);
+ span_num = e_week_view_event_item_get_span_num (event_item);
+
+ if (event_num != -1 && span_num != -1) {
+ if (e_week_view_get_span_position (
+ week_view, event_num, span_num,
+ &span_x, &span_y, &span_w)) {
item->x1 = span_x;
item->y1 = span_y;
item->x2 = span_x + span_w - 1;
@@ -220,33 +628,15 @@ e_week_view_event_item_update (GnomeCanvasItem *item,
}
}
-static gboolean
-can_draw_in_region (GdkRegion *draw_region, gint x, gint y, gint width, gint height)
-{
- GdkRectangle rect;
-
- g_return_val_if_fail (draw_region != NULL, FALSE);
-
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
-
- return gdk_region_rect_in (draw_region, &rect) != GDK_OVERLAP_RECTANGLE_OUT;
-}
-
-/*
- * DRAWING ROUTINES - functions to paint the canvas item.
- */
static void
-e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
- GdkDrawable *drawable,
- gint x,
- gint y,
- gint width,
- gint height)
+week_view_event_item_draw (GnomeCanvasItem *canvas_item,
+ GdkDrawable *drawable,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
{
- EWeekViewEventItem *wveitem;
+ EWeekViewEventItem *event_item;
EWeekView *week_view;
EWeekViewEvent *event;
EWeekViewEventSpan *span;
@@ -269,27 +659,22 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
GdkRegion *draw_region;
GdkRectangle rect;
-#if 0
- g_print ("In e_week_view_event_item_draw %i,%i %ix%i\n",
- x, y, width, height);
-#endif
-
- wveitem = E_WEEK_VIEW_EVENT_ITEM (canvas_item);
+ event_item = E_WEEK_VIEW_EVENT_ITEM (canvas_item);
week_view = E_WEEK_VIEW (GTK_WIDGET (canvas_item->canvas)->parent);
g_return_if_fail (E_IS_WEEK_VIEW (week_view));
- if (wveitem->event_num == -1 || wveitem->span_num == -1)
+ if (event_item->priv->event_num == -1 || event_item->priv->span_num == -1)
return;
- g_return_if_fail (wveitem->event_num < week_view->events->len);
+ g_return_if_fail (event_item->priv->event_num < week_view->events->len);
event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
+ event_item->priv->event_num);
- g_return_if_fail (event->spans_index + wveitem->span_num < week_view->spans->len);
+ g_return_if_fail (event->spans_index + event_item->priv->span_num < week_view->spans->len);
span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + wveitem->span_num);
+ event->spans_index + event_item->priv->span_num);
gc = week_view->main_gc;
@@ -331,7 +716,7 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
time_width = e_week_view_get_time_string_width (week_view);
- one_day_event = e_week_view_is_one_day_event (week_view, wveitem->event_num);
+ one_day_event = e_week_view_is_one_day_event (week_view, event_item->priv->event_num);
bg_color = week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND];
if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)), event->comp_data), &bg_color)) {
@@ -425,17 +810,17 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
}
if (draw_start) {
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- start_hour, start_minute);
+ week_view_draw_time (
+ week_view, drawable, time_x,
+ time_y, start_hour, start_minute);
time_x += time_width;
}
if (draw_end) {
time_x += E_WEEK_VIEW_EVENT_TIME_SPACING;
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- end_hour, end_minute);
+ week_view_draw_time (
+ week_view, drawable, time_x,
+ time_y, end_hour, end_minute);
time_x += time_width;
}
@@ -444,9 +829,9 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
icon_x += E_WEEK_VIEW_EVENT_TIME_X_PAD;
/* Draw the icons. */
- e_week_view_event_item_draw_icons (wveitem, drawable,
- icon_x, icon_y,
- x2, FALSE, draw_region);
+ week_view_event_item_draw_icons (
+ event_item, drawable, icon_x,
+ icon_y, x2, FALSE, draw_region);
} else {
rect_x = x1 + E_WEEK_VIEW_EVENT_L_PAD;
@@ -518,7 +903,10 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
}
if (draw_start_triangle) {
- e_week_view_event_item_draw_triangle (wveitem, drawable, bg_color, x1 + E_WEEK_VIEW_EVENT_L_PAD + 2, y1, -3, y2 - y1 + 1, draw_region);
+ week_view_event_item_draw_triangle (
+ event_item, drawable, bg_color,
+ x1 + E_WEEK_VIEW_EVENT_L_PAD + 2,
+ y1, -3, y2 - y1 + 1, draw_region);
} else if (can_draw_in_region (draw_region, rect_x, y1, 1, y2 - y1)) {
cairo_save (cr);
gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
@@ -530,7 +918,10 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
}
if (draw_end_triangle) {
- e_week_view_event_item_draw_triangle (wveitem, drawable, bg_color, x2 - E_WEEK_VIEW_EVENT_R_PAD - 2, y1, 3, y2 - y1 + 1, draw_region);
+ week_view_event_item_draw_triangle (
+ event_item, drawable, bg_color,
+ x2 - E_WEEK_VIEW_EVENT_R_PAD - 2,
+ y1, 3, y2 - y1 + 1, draw_region);
} else if (can_draw_in_region (draw_region, rect_x2, y2, 1, 1)) {
cairo_save (cr);
gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
@@ -570,9 +961,9 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]);
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- start_hour, start_minute);
+ week_view_draw_time (
+ week_view, drawable, time_x,
+ time_y, start_hour, start_minute);
gdk_gc_set_clip_rectangle (gc, NULL);
@@ -598,9 +989,9 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
/* Draw the end time, if the position is greater than
the minimum calculated above. */
if (time_x >= min_end_time_x) {
- e_week_view_draw_time (week_view, drawable,
- time_x, time_y,
- end_hour, end_minute);
+ week_view_draw_time (
+ week_view, drawable, time_x,
+ time_y, end_hour, end_minute);
max_icon_x -= time_width
+ E_WEEK_VIEW_EVENT_TIME_X_PAD;
}
@@ -608,12 +999,12 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
/* Draw the icons. */
if (span->text_item
- && (week_view->editing_event_num != wveitem->event_num
- || week_view->editing_span_num != wveitem->span_num)) {
+ && (week_view->editing_event_num != event_item->priv->event_num
+ || week_view->editing_span_num != event_item->priv->span_num)) {
icon_x = span->text_item->x1 - E_WEEK_VIEW_ICON_R_PAD - x;
- e_week_view_event_item_draw_icons (wveitem, drawable,
- icon_x, icon_y,
- max_icon_x, TRUE, draw_region);
+ week_view_event_item_draw_icons (
+ event_item, drawable, icon_x,
+ icon_y, max_icon_x, TRUE, draw_region);
}
}
cairo_destroy (cr);
@@ -621,325 +1012,38 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item,
gdk_region_destroy (draw_region);
}
-static void
-e_week_view_draw_time (EWeekView *week_view,
- GdkDrawable *drawable,
- gint time_x,
- gint time_y,
- gint hour,
- gint minute)
-{
- ECalModel *model;
- GtkStyle *style;
- GdkGC *gc;
- gint hour_to_display, suffix_width;
- gint time_y_normal_font, time_y_small_font;
- const gchar *suffix;
- gchar buffer[128];
- PangoLayout *layout;
- PangoFontDescription *small_font_desc;
-
- model = e_calendar_view_get_model (E_CALENDAR_VIEW (week_view));
-
- style = gtk_widget_get_style (GTK_WIDGET (week_view));
- small_font_desc = week_view->small_font_desc;
- gc = week_view->main_gc;
-
- gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT]);
-
- layout = gtk_widget_create_pango_layout (GTK_WIDGET (week_view), NULL);
-
- time_y_normal_font = time_y_small_font = time_y;
- if (small_font_desc)
- time_y_small_font = time_y;
-
- e_week_view_convert_time_to_display (week_view, hour, &hour_to_display,
- &suffix, &suffix_width);
-
- if (week_view->use_small_font && week_view->small_font_desc) {
- g_snprintf (buffer, sizeof (buffer), "%2i:%02i",
- hour_to_display, minute);
-
- /* Draw the hour. */
- if (hour_to_display < 10) {
- pango_layout_set_text (layout, buffer + 1, 1);
- gdk_draw_layout (drawable, gc,
- time_x + week_view->digit_width,
- time_y_normal_font,
- layout);
- } else {
- pango_layout_set_text (layout, buffer, 2);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
-
- time_x += week_view->digit_width * 2;
-
- /* Draw the start minute, in the small font. */
- pango_layout_set_font_description (layout, week_view->small_font_desc);
- pango_layout_set_text (layout, buffer + 3, 2);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_small_font,
- layout);
-
- pango_layout_set_font_description (layout, style->font_desc);
-
- time_x += week_view->small_digit_width * 2;
-
- /* Draw the 'am'/'pm' suffix, if 12-hour format. */
- if (!e_cal_model_get_use_24_hour_format (model)) {
- pango_layout_set_text (layout, suffix, -1);
-
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
- } else {
- /* Draw the start time in one go. */
- g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s",
- hour_to_display, minute, suffix);
- if (hour_to_display < 10) {
- pango_layout_set_text (layout, buffer + 1, -1);
- gdk_draw_layout (drawable, gc,
- time_x + week_view->digit_width,
- time_y_normal_font,
- layout);
- } else {
- pango_layout_set_text (layout, buffer, -1);
- gdk_draw_layout (drawable, gc,
- time_x,
- time_y_normal_font,
- layout);
- }
-
- }
- g_object_unref (layout);
-}
-
-static void
-e_week_view_event_item_draw_icons (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- gint icon_x,
- gint icon_y,
- gint x2,
- gboolean right_align,
- GdkRegion *draw_region)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- ECalComponent *comp;
- GdkGC *gc;
- gint num_icons = 0, icon_x_inc;
- gboolean draw_reminder_icon = FALSE, draw_recurrence_icon = FALSE;
- gboolean draw_timezone_icon = FALSE, draw_attach_icon = FALSE;
- gboolean draw_meeting_icon = FALSE;
- GSList *categories_pixbufs = NULL, *pixbufs;
- cairo_t *cr;
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
- comp = e_cal_component_new ();
- e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp));
-
- gc = week_view->main_gc;
- cr = gdk_cairo_create (drawable);
-
- if (e_cal_component_has_alarms (comp)) {
- draw_reminder_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_recurrences (comp) || e_cal_component_is_instance (comp)) {
- draw_recurrence_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_attachments (comp)) {
- draw_attach_icon = TRUE;
- num_icons++;
- }
-
- if (e_cal_component_has_attendees (comp)) {
- draw_meeting_icon = TRUE;
- num_icons++;
- }
-
- if (event->different_timezone) {
- draw_timezone_icon = TRUE;
- num_icons++;
- }
-
- num_icons += cal_comp_util_get_n_icons (comp, &categories_pixbufs);
-
- icon_x_inc = E_WEEK_VIEW_ICON_WIDTH + E_WEEK_VIEW_ICON_X_PAD;
-
- if (right_align)
- icon_x -= icon_x_inc * num_icons;
-
- #define draw_pixbuf(pf) \
- if (can_draw_in_region (draw_region, icon_x, icon_y, \
- E_WEEK_VIEW_ICON_WIDTH, E_WEEK_VIEW_ICON_HEIGHT)) { \
- cairo_save (cr); \
- gdk_cairo_set_source_pixbuf (cr, pf, icon_x, icon_y); \
- cairo_paint (cr); \
- cairo_restore (cr); \
- } \
- \
- icon_x += icon_x_inc;
-
- if (draw_reminder_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- draw_pixbuf (week_view->reminder_icon);
- }
-
- if (draw_attach_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- draw_pixbuf (week_view->attach_icon);
- }
-
- if (draw_recurrence_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- draw_pixbuf (week_view->recurrence_icon);
- }
-
- if (draw_timezone_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- draw_pixbuf (week_view->timezone_icon);
- }
-
- if (draw_meeting_icon && icon_x + E_WEEK_VIEW_ICON_WIDTH <= x2) {
- draw_pixbuf (week_view->meeting_icon);
- }
-
- /* draw categories icons */
- for (pixbufs = categories_pixbufs;
- pixbufs;
- pixbufs = pixbufs->next) {
- GdkPixbuf *pixbuf = pixbufs->data;
-
- draw_pixbuf (pixbuf);
- }
-
- #undef draw_pixbuf
-
- g_slist_foreach (categories_pixbufs, (GFunc)g_object_unref, NULL);
- g_slist_free (categories_pixbufs);
-
- cairo_destroy (cr);
- g_object_unref(comp);
- gdk_gc_set_clip_mask (gc, NULL);
-}
-
-/* This draws a little triangle to indicate that an event extends past
- the days visible on screen. */
-static void
-e_week_view_event_item_draw_triangle (EWeekViewEventItem *wveitem,
- GdkDrawable *drawable,
- GdkColor bg_color,
- gint x,
- gint y,
- gint w,
- gint h,
- GdkRegion *draw_region)
-{
- EWeekView *week_view;
- EWeekViewEvent *event;
- GdkGC *gc;
- GdkPoint points[3];
- gint c1, c2;
- cairo_t *cr;
-
- if (!can_draw_in_region (draw_region, x, y, w, h))
- return;
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (GNOME_CANVAS_ITEM (wveitem)->canvas)->parent);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
-
- gc = week_view->main_gc;
- cr = gdk_cairo_create (drawable);
-
- points[0].x = x;
- points[0].y = y;
- points[1].x = x + w;
- points[1].y = y + (h / 2);
- points[2].x = x;
- points[2].y = y + h - 1;
-
- if (gdk_color_parse (e_cal_model_get_color_for_component (e_calendar_view_get_model (E_CALENDAR_VIEW (week_view)),
- event->comp_data),
- &bg_color)) {
- GdkColormap *colormap;
-
- colormap = gtk_widget_get_colormap (GTK_WIDGET (week_view));
- if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) {
- gdk_cairo_set_source_color (cr, &bg_color);
- }
- else {
- gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
-
- }
- } else {
- gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BACKGROUND]);
- }
-
- cairo_save (cr);
- cairo_set_line_width (cr, 0.7);
- cairo_move_to (cr, points[0].x, points[0].y);
- cairo_line_to (cr, points[1].x, points[1].y);
- cairo_line_to (cr, points[2].x, points[2].y);
- cairo_line_to (cr, points[0].x, points[0].y);
- cairo_fill (cr);
- cairo_restore (cr);
-
- cairo_save (cr);
- gdk_cairo_set_source_color (cr, &week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER]);
-
- /* If the height is odd we can use the same central point for both
- lines. If it is even we use different end-points. */
- c1 = c2 = y + (h / 2);
- if (h % 2 == 0)
- c1--;
-
- cairo_set_line_width (cr, 0.7);
- cairo_move_to (cr, x, y);
- cairo_line_to (cr, x + w, c1);
- cairo_move_to (cr, x, y + h - 1);
- cairo_line_to (cr, x + w, c2);
- cairo_restore (cr);
-
- cairo_destroy (cr);
-}
-
-/* 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_event_item_point (GnomeCanvasItem *item, double x, double y,
- gint cx, gint cy,
- GnomeCanvasItem **actual_item)
+week_view_event_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 gint
-e_week_view_event_item_event (GnomeCanvasItem *item, GdkEvent *event)
+week_view_event_item_event (GnomeCanvasItem *item,
+ GdkEvent *event)
{
- EWeekViewEventItem *wveitem;
+ EWeekViewEventItem *event_item;
- wveitem = E_WEEK_VIEW_EVENT_ITEM (item);
+ event_item = E_WEEK_VIEW_EVENT_ITEM (item);
switch (event->type) {
case GDK_2BUTTON_PRESS:
- return e_week_view_event_item_double_click (wveitem, event);
+ return week_view_event_item_double_click (event_item, event);
case GDK_BUTTON_PRESS:
- return e_week_view_event_item_button_press (wveitem, event);
+ return week_view_event_item_button_press (event_item, event);
case GDK_BUTTON_RELEASE:
- return e_week_view_event_item_button_release (wveitem, event);
+ return week_view_event_item_button_release (event_item, event);
case GDK_MOTION_NOTIFY:
break;
default:
@@ -949,171 +1053,120 @@ e_week_view_event_item_event (GnomeCanvasItem *item, GdkEvent *event)
return FALSE;
}
-static gboolean
-e_week_view_event_item_button_press (EWeekViewEventItem *wveitem,
- GdkEvent *bevent)
+static void
+week_view_event_item_class_init (EWeekViewEventItemClass *class)
{
- EWeekView *week_view;
- ECalendarViewPosition pos;
- EWeekViewEvent *event;
- EWeekViewEventSpan *span;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
- span = &g_array_index (week_view->spans, EWeekViewEventSpan,
- event->spans_index + wveitem->span_num);
-
-#if 0
- g_print ("In e_week_view_event_item_button_press\n");
-#endif
-
- pos = e_week_view_event_item_get_position (wveitem, bevent->button.x,
- bevent->button.y);
- if (pos == E_CALENDAR_VIEW_POS_NONE)
- return FALSE;
-
- if (bevent->button.button == 1) {
- week_view->pressed_event_num = wveitem->event_num;
- week_view->pressed_span_num = wveitem->span_num;
-
- /* Ignore clicks on the event while editing. */
- if (E_TEXT (span->text_item)->editing)
- return FALSE;
-
- /* Remember the item clicked and the mouse position,
- so we can start a drag if the mouse moves. */
- week_view->drag_event_x = bevent->button.x;
- week_view->drag_event_y = bevent->button.y;
-
- /* FIXME: Remember the day offset from the start of the event.
- */
-
- return TRUE;
- } else if (bevent->button.button == 3) {
- if (!GTK_WIDGET_HAS_FOCUS (week_view)) {
- gtk_widget_grab_focus (GTK_WIDGET (week_view));
- if (week_view->event_destroyed) {
- week_view->event_destroyed = FALSE;
- return FALSE;
- }
+ GObjectClass *object_class;
+ GnomeCanvasItemClass *item_class;
- }
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (EWeekViewEventItemPrivate));
- e_week_view_set_selected_time_range_visible (week_view, event->start, event->end);
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = week_view_event_item_set_property;
+ object_class->get_property = week_view_event_item_get_property;
- e_week_view_show_popup_menu (week_view,
- (GdkEventButton*) bevent,
- wveitem->event_num);
- g_signal_stop_emission_by_name (item->canvas, "button_press_event");
+ item_class = GNOME_CANVAS_ITEM_CLASS (class);
+ item_class->update = week_view_event_item_update;
+ item_class->draw = week_view_event_item_draw;
+ item_class->point = week_view_event_item_point;
+ item_class->event = week_view_event_item_event;
- return TRUE;
- }
+ g_object_class_install_property (
+ object_class,
+ PROP_EVENT_NUM,
+ g_param_spec_int (
+ "event-num",
+ "Event Num",
+ NULL,
+ G_MININT,
+ G_MAXINT,
+ -1,
+ G_PARAM_READWRITE));
- return FALSE;
+ g_object_class_install_property (
+ object_class,
+ PROP_SPAN_NUM,
+ g_param_spec_int (
+ "span-num",
+ "Span Num",
+ NULL,
+ G_MININT,
+ G_MAXINT,
+ -1,
+ G_PARAM_READWRITE));
}
-static gboolean
-e_week_view_event_item_button_release (EWeekViewEventItem *wveitem,
- GdkEvent *event)
+static void
+week_view_event_item_init (EWeekViewEventItem *event_item)
{
- EWeekView *week_view;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
-#if 0
- g_print ("In e_week_view_event_item_button_release\n");
-#endif
-
- if (week_view->pressed_event_num != -1
- && week_view->pressed_event_num == wveitem->event_num
- && week_view->pressed_span_num == wveitem->span_num) {
- e_week_view_start_editing_event (week_view,
- wveitem->event_num,
- wveitem->span_num,
- NULL);
- week_view->pressed_event_num = -1;
- return TRUE;
- }
-
- week_view->pressed_event_num = -1;
-
- return FALSE;
+ event_item->priv->event_num = -1;
+ event_item->priv->span_num = -1;
}
-static gboolean
-e_week_view_event_item_double_click (EWeekViewEventItem *wveitem,
- GdkEvent *bevent)
+GType
+e_week_view_event_item_get_type (void)
{
- EWeekView *week_view;
- EWeekViewEvent *event;
- GnomeCanvasItem *item;
-
- item = GNOME_CANVAS_ITEM (wveitem);
-
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), FALSE);
-
- event = &g_array_index (week_view->events, EWeekViewEvent,
- wveitem->event_num);
-
- if (week_view->editing_event_num >= 0) {
- EWeekViewEvent *editing = &g_array_index (week_view->events, EWeekViewEvent, week_view->editing_event_num);
-
- /* do not call edit of the component, if double clicked on the component, which is not on the server */
- if (editing && event && editing->comp_data == event->comp_data && (!event->comp_data || !is_icalcomp_on_the_server (event->comp_data->icalcomp, event->comp_data->client)))
- return TRUE;
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ const GTypeInfo type_info = {
+ sizeof (EWeekViewEventItemClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) week_view_event_item_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (EWeekViewEventItem),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) week_view_event_item_init,
+ NULL /* value_table */
+ };
+
+ type = g_type_register_static (
+ GNOME_TYPE_CANVAS_ITEM, "EWeekViewEventItem",
+ &type_info, 0);
}
- e_week_view_stop_editing_event (week_view);
+ return type;
+}
- e_calendar_view_edit_appointment (E_CALENDAR_VIEW (week_view), event->comp_data->client, event->comp_data->icalcomp, FALSE);
+gint
+e_week_view_event_item_get_event_num (EWeekViewEventItem *event_item)
+{
+ g_return_val_if_fail (E_IS_WEEK_VIEW_EVENT_ITEM (event_item), -1);
- return TRUE;
+ return event_item->priv->event_num;
}
-static ECalendarViewPosition
-e_week_view_event_item_get_position (EWeekViewEventItem *wveitem,
- gdouble x,
- gdouble y)
+void
+e_week_view_event_item_set_event_num (EWeekViewEventItem *event_item,
+ gint event_num)
{
- EWeekView *week_view;
- GnomeCanvasItem *item;
+ g_return_if_fail (E_IS_WEEK_VIEW_EVENT_ITEM (event_item));
- item = GNOME_CANVAS_ITEM (wveitem);
+ event_item->priv->event_num = event_num;
+ gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (event_item));
- week_view = E_WEEK_VIEW (GTK_WIDGET (item->canvas)->parent);
- g_return_val_if_fail (E_IS_WEEK_VIEW (week_view), E_CALENDAR_VIEW_POS_NONE);
+ g_object_notify (G_OBJECT (event_item), "event-num");
+}
-#if 0
- g_print ("In e_week_view_event_item_get_position item: %g,%g %g,%g point: %g,%g\n", item->x1, item->y1, item->x2, item->y2, x, y);
-#endif
+gint
+e_week_view_event_item_get_span_num (EWeekViewEventItem *event_item)
+{
+ g_return_val_if_fail (E_IS_WEEK_VIEW_EVENT_ITEM (event_item), -1);
- if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
- || x >= item->x2 - E_WEEK_VIEW_EVENT_R_PAD)
- return E_CALENDAR_VIEW_POS_NONE;
+ return event_item->priv->span_num;
+}
- /* Support left/right edge for long events only. */
- if (!e_week_view_is_one_day_event (week_view, wveitem->event_num)) {
- if (x < item->x1 + E_WEEK_VIEW_EVENT_L_PAD
- + E_WEEK_VIEW_EVENT_BORDER_WIDTH
- + E_WEEK_VIEW_EVENT_EDGE_X_PAD)
- return E_CALENDAR_VIEW_POS_LEFT_EDGE;
+void
+e_week_view_event_item_set_span_num (EWeekViewEventItem *event_item,
+ gint span_num)
+{
+ g_return_if_fail (E_IS_WEEK_VIEW_EVENT_ITEM (event_item));
- if (x >= item->x2 + 1 - E_WEEK_VIEW_EVENT_R_PAD
- - E_WEEK_VIEW_EVENT_BORDER_WIDTH
- - E_WEEK_VIEW_EVENT_EDGE_X_PAD)
- return E_CALENDAR_VIEW_POS_RIGHT_EDGE;
- }
+ event_item->priv->span_num = span_num;
+ gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (event_item));
- return E_CALENDAR_VIEW_POS_EVENT;
+ g_object_notify (G_OBJECT (event_item), "span-num");
}