From 6e1c4ac1feab77e0b0719e02d846d0a626783564 Mon Sep 17 00:00:00 2001 From: Srinivasa Ragavan Date: Fri, 28 Jul 2006 09:25:20 +0000 Subject: Added configure option for disabling cairo calendar svn path=/trunk/; revision=32432 --- ChangeLog | 5 + calendar/ChangeLog | 14 + calendar/gui/e-calendar-view.h | 2 - calendar/gui/e-day-view.c | 2238 ++++++++++++++++++++++++++++++++++------ configure.in | 13 + widgets/misc/ChangeLog | 5 + widgets/misc/e-calendar-item.c | 2 - 7 files changed, 1983 insertions(+), 296 deletions(-) diff --git a/ChangeLog b/ChangeLog index c1c5b72da1..006d3b079d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-07-28 Rajeev ramanathan + + * configure.in: Added configure script for building + evolution calendar with cairo support. + 2006-07-24 Harish Krishnaswamy * NEWS, configure.in: Evolution 2.7.90 release diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 4379175abc..ebcbcbe2e7 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,17 @@ +2006-07-27 Rajeev ramanathan + + * gui/e-calendar-view.h: Removed the hardcoded ENABLE_CAIRO + * gui/e-day-view.c (e_day_view_style_set) (e_day_view_init) + (e_day_view_realize) (e_day_view_update_event_label) + (e_day_view_on_long_event_click) (e_day_view_reshape_resize_long_event_rec) + (e_day_view_reshape_resize_rect_item) (e_day_view_on_top_canvas_motion) + (e_day_view_on_main_canvas_motion) (e_day_view_finish_long_event_resize) + (e_day_view_finish_resize) (e_day_view_abort_resize) + (e_day_view_reshape_main_canvas_resize_bars) (e_day_view_change_event_time) + (e_day_view_on_editing_stopped) (e_day_view_on_main_canvas_drag_leave): + This adds a macro ENABLE_CAIRO to + disable cairo for slow rendering machines. + 2006-07-27 Rajeev ramanathan * gui/e-day-view.c (e_day_view_update_event_label): diff --git a/calendar/gui/e-calendar-view.h b/calendar/gui/e-calendar-view.h index 2fae9350c8..bbf95da71e 100644 --- a/calendar/gui/e-calendar-view.h +++ b/calendar/gui/e-calendar-view.h @@ -29,8 +29,6 @@ #include "e-cal-model.h" #include "gnome-cal.h" -#define ENABLE_CAIRO - G_BEGIN_DECLS /* diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 88f8aa5c80..5d3a552f44 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -649,6 +649,7 @@ timezone_changed_cb (ECalendarView *cal_view, icaltimezone *old_zone, e_day_view_update_query (day_view); } +#ifndef ENABLE_CAIRO static void e_day_view_init (EDayView *day_view) { @@ -783,6 +784,13 @@ e_day_view_init (EDayView *day_view) "EDayViewTopItem::day_view", day_view, NULL); + day_view->resize_long_event_rect_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type(), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->resize_long_event_rect_item); + day_view->drag_long_event_rect_item = gnome_canvas_item_new (canvas_group, gnome_canvas_rect_get_type (), @@ -856,6 +864,35 @@ e_day_view_init (EDayView *day_view) "EDayViewMainItem::day_view", day_view, NULL); + day_view->resize_rect_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type(), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->resize_rect_item); + + day_view->resize_bar_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type(), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->resize_bar_item); + + day_view->main_canvas_top_resize_bar_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type (), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + + day_view->main_canvas_bottom_resize_bar_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type (), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); + + day_view->drag_rect_item = gnome_canvas_item_new (canvas_group, gnome_canvas_rect_get_type (), @@ -951,215 +988,802 @@ e_day_view_init (EDayView *day_view) g_signal_connect (G_OBJECT (day_view), "timezone_changed", G_CALLBACK (timezone_changed_cb), NULL); } +#endif - -/* Turn off the background of the canvas windows. This reduces flicker - considerably when scrolling. (Why isn't it in GnomeCanvas?). */ +#ifdef ENABLE_CAIRO static void -e_day_view_on_canvas_realized (GtkWidget *widget, - EDayView *day_view) +e_day_view_init (EDayView *day_view) { - gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window, - NULL, FALSE); -} + gint day; + GnomeCanvasGroup *canvas_group; + ECalModel *model; + + GTK_WIDGET_SET_FLAGS (day_view, GTK_CAN_FOCUS); + day_view->long_events = g_array_new (FALSE, FALSE, + sizeof (EDayViewEvent)); + day_view->long_events_sorted = TRUE; + day_view->long_events_need_layout = FALSE; + day_view->long_events_need_reshape = FALSE; -/** - * e_day_view_new: - * @Returns: a new #EDayView. - * - * Creates a new #EDayView. - **/ -GtkWidget * -e_day_view_new (void) -{ - GObject *day_view; + day_view->layout_timeout_id = 0; - day_view = g_object_new (e_day_view_get_type (), NULL); - e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); - - return GTK_WIDGET (day_view); -} + for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++) { + day_view->events[day] = g_array_new (FALSE, FALSE, + sizeof (EDayViewEvent)); + day_view->events_sorted[day] = TRUE; + day_view->need_layout[day] = FALSE; + day_view->need_reshape[day] = FALSE; + } -static void -e_day_view_destroy (GtkObject *object) -{ - EDayView *day_view; - gint day; + /* These indicate that the times haven't been set. */ + day_view->lower = 0; + day_view->upper = 0; - day_view = E_DAY_VIEW (object); + day_view->work_week_view = FALSE; + day_view->days_shown = 1; - e_day_view_cancel_layout (day_view); + day_view->mins_per_row = 30; + day_view->date_format = E_DAY_VIEW_DATE_FULL; + day_view->rows_in_top_display = 0; - e_day_view_stop_auto_scroll (day_view); + /* Note that these don't work yet. It would need a few fixes to the + way event->start_minute and event->end_minute are used, and there + may be problems with events that go outside the visible times. */ + day_view->first_hour_shown = 0; + day_view->first_minute_shown = 0; + day_view->last_hour_shown = 24; + day_view->last_minute_shown = 0; - if (day_view->large_font_desc) { - pango_font_description_free (day_view->large_font_desc); - day_view->large_font_desc = NULL; - } + day_view->main_gc = NULL; + e_day_view_recalc_num_rows (day_view); - if (day_view->small_font_desc) { - pango_font_description_free (day_view->small_font_desc); - day_view->small_font_desc = NULL; - } + day_view->working_days = E_DAY_VIEW_MONDAY | E_DAY_VIEW_TUESDAY + | E_DAY_VIEW_WEDNESDAY | E_DAY_VIEW_THURSDAY + | E_DAY_VIEW_FRIDAY; - if (day_view->normal_cursor) { - gdk_cursor_unref (day_view->normal_cursor); - day_view->normal_cursor = NULL; - } - if (day_view->move_cursor) { - gdk_cursor_unref (day_view->move_cursor); - day_view->move_cursor = NULL; - } - if (day_view->resize_width_cursor) { - gdk_cursor_unref (day_view->resize_width_cursor); - day_view->resize_width_cursor = NULL; - } - if (day_view->resize_height_cursor) { - gdk_cursor_unref (day_view->resize_height_cursor); - day_view->resize_height_cursor = NULL; - } + day_view->work_day_start_hour = 9; + day_view->work_day_start_minute = 0; + day_view->work_day_end_hour = 17; + day_view->work_day_end_minute = 0; + day_view->show_event_end_times = TRUE; + day_view->week_start_day = 0; + day_view->scroll_to_work_day = TRUE; - if (day_view->long_events) { - e_day_view_free_events (day_view); - g_array_free (day_view->long_events, TRUE); - day_view->long_events = NULL; - } - - for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++) { - if (day_view->events[day]) { - g_array_free (day_view->events[day], TRUE); - day_view->events[day] = NULL; - } - } + day_view->show_marcus_bains_line = TRUE; + day_view->marcus_bains_day_view_color = NULL; + day_view->marcus_bains_time_bar_color = NULL; - GTK_OBJECT_CLASS (e_day_view_parent_class)->destroy (object); -} + day_view->editing_event_day = -1; + day_view->editing_event_num = -1; + day_view->resize_event_num = -1; + day_view->resize_bars_event_day = -1; + day_view->resize_bars_event_num = -1; -static void -e_day_view_realize (GtkWidget *widget) -{ - EDayView *day_view; - GdkColormap *colormap; + day_view->last_edited_comp_string = NULL; - if (GTK_WIDGET_CLASS (e_day_view_parent_class)->realize) - (*GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)(widget); + day_view->selection_start_row = -1; + day_view->selection_start_day = -1; + day_view->selection_end_row = -1; + day_view->selection_end_day = -1; + day_view->selection_is_being_dragged = FALSE; + day_view->selection_drag_pos = E_DAY_VIEW_DRAG_END; + day_view->selection_in_top_canvas = FALSE; - day_view = E_DAY_VIEW (widget); - day_view->main_gc = gdk_gc_new (widget->window); + day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE; - colormap = gtk_widget_get_colormap (widget); + day_view->pressed_event_day = -1; - /* Allocate the colors. */ - - e_day_view_set_colors(day_view, widget); - - gdk_gc_set_colormap (day_view->main_gc, colormap); + day_view->drag_event_day = -1; + day_view->drag_last_day = -1; - /* Create the pixmaps. */ - day_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU); - day_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU); - day_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU); - day_view->meeting_icon = e_icon_factory_get_icon ("stock_people", E_ICON_SIZE_MENU); - day_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); + day_view->auto_scroll_timeout_id = 0; + + day_view->large_font_desc = NULL; + day_view->small_font_desc = NULL; + + /* String to use in 12-hour time format for times in the morning. */ + day_view->am_string = _("am"); + + /* String to use in 12-hour time format for times in the afternoon. */ + day_view->pm_string = _("pm"); + + + /* + * Top Canvas + */ + day_view->top_canvas = e_canvas_new (); + gtk_table_attach (GTK_TABLE (day_view), day_view->top_canvas, + 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); + gtk_widget_show (day_view->top_canvas); + g_signal_connect_after (day_view->top_canvas, "button_press_event", + G_CALLBACK (e_day_view_on_top_canvas_button_press), day_view); + g_signal_connect (day_view->top_canvas, "button_release_event", + G_CALLBACK (e_day_view_on_top_canvas_button_release), day_view); + g_signal_connect (day_view->top_canvas, "motion_notify_event", + G_CALLBACK (e_day_view_on_top_canvas_motion), day_view); + g_signal_connect (day_view->top_canvas, "drag_motion", + G_CALLBACK (e_day_view_on_top_canvas_drag_motion), day_view); + g_signal_connect (day_view->top_canvas, "drag_leave", + G_CALLBACK (e_day_view_on_top_canvas_drag_leave), day_view); + + g_signal_connect (day_view->top_canvas, "drag_begin", + G_CALLBACK (e_day_view_on_drag_begin), day_view); + g_signal_connect (day_view->top_canvas, "drag_end", + G_CALLBACK (e_day_view_on_drag_end), day_view); + g_signal_connect (day_view->top_canvas, "drag_data_get", + G_CALLBACK (e_day_view_on_drag_data_get), day_view); + g_signal_connect (day_view->top_canvas, "drag_data_received", + G_CALLBACK (e_day_view_on_top_canvas_drag_data_received), day_view); + + canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->top_canvas)->root); + + day_view->top_canvas_item = + gnome_canvas_item_new (canvas_group, + e_day_view_top_item_get_type (), + "EDayViewTopItem::day_view", day_view, + NULL); + + day_view->drag_long_event_rect_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type (), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->drag_long_event_rect_item); + + day_view->drag_long_event_item = + gnome_canvas_item_new (canvas_group, + e_text_get_type (), + "anchor", GTK_ANCHOR_NW, + "line_wrap", TRUE, + "clip", TRUE, + "max_lines", 1, + "editable", TRUE, + "draw_background", FALSE, + "fill_color_rgba", GNOME_CANVAS_COLOR(0, 0, 0), + NULL); + gnome_canvas_item_hide (day_view->drag_long_event_item); + + /* + * Main Canvas + */ + day_view->main_canvas = e_canvas_new (); + gtk_table_attach (GTK_TABLE (day_view), day_view->main_canvas, + 1, 2, 1, 2, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (day_view->main_canvas); + g_signal_connect (day_view->main_canvas, "realize", + G_CALLBACK (e_day_view_on_canvas_realized), day_view); + + g_signal_connect (day_view->main_canvas, + "button_press_event", + G_CALLBACK (e_day_view_on_main_canvas_button_press), + day_view); + g_signal_connect (day_view->main_canvas, + "button_release_event", + G_CALLBACK (e_day_view_on_main_canvas_button_release), + day_view); + g_signal_connect (day_view->main_canvas, + "scroll_event", + G_CALLBACK (e_day_view_on_main_canvas_scroll), + day_view); + g_signal_connect (day_view->main_canvas, + "motion_notify_event", + G_CALLBACK (e_day_view_on_main_canvas_motion), + day_view); + g_signal_connect (day_view->main_canvas, + "drag_motion", + G_CALLBACK (e_day_view_on_main_canvas_drag_motion), + day_view); + g_signal_connect (day_view->main_canvas, + "drag_leave", + G_CALLBACK (e_day_view_on_main_canvas_drag_leave), + day_view); + + g_signal_connect (day_view->main_canvas, "drag_begin", + G_CALLBACK (e_day_view_on_drag_begin), day_view); + g_signal_connect (day_view->main_canvas, "drag_end", + G_CALLBACK (e_day_view_on_drag_end), day_view); + g_signal_connect (day_view->main_canvas, "drag_data_get", + G_CALLBACK (e_day_view_on_drag_data_get), day_view); + g_signal_connect (day_view->main_canvas, "drag_data_received", + G_CALLBACK (e_day_view_on_main_canvas_drag_data_received), day_view); + + canvas_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (day_view->main_canvas)->root); + + 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, + gnome_canvas_rect_get_type (), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->drag_rect_item); + + day_view->drag_bar_item = + gnome_canvas_item_new (canvas_group, + gnome_canvas_rect_get_type (), + "width_pixels", 1, + NULL); + gnome_canvas_item_hide (day_view->drag_bar_item); + + day_view->drag_item = + gnome_canvas_item_new (canvas_group, + e_text_get_type (), + "anchor", GTK_ANCHOR_NW, + "line_wrap", TRUE, + "clip", TRUE, + "editable", TRUE, + "draw_background", FALSE, + "fill_color_rgba", GNOME_CANVAS_COLOR(0, 0, 0), + NULL); + gnome_canvas_item_hide (day_view->drag_item); + + + /* + * Times Canvas + */ + day_view->time_canvas = e_canvas_new (); + gtk_layout_set_vadjustment (GTK_LAYOUT (day_view->time_canvas), + GTK_LAYOUT (day_view->main_canvas)->vadjustment); + 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); + + + /* + * Scrollbar. + */ + day_view->vscrollbar = gtk_vscrollbar_new (GTK_LAYOUT (day_view->main_canvas)->vadjustment); + gtk_table_attach (GTK_TABLE (day_view), day_view->vscrollbar, + 2, 3, 1, 2, 0, GTK_EXPAND | GTK_FILL, 0, 0); + gtk_widget_show (day_view->vscrollbar); + + + /* Create the cursors. */ + day_view->normal_cursor = gdk_cursor_new (GDK_LEFT_PTR); + day_view->move_cursor = gdk_cursor_new (GDK_FLEUR); + day_view->resize_width_cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); + day_view->resize_height_cursor = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW); + day_view->last_cursor_set_in_top_canvas = NULL; + day_view->last_cursor_set_in_main_canvas = NULL; + + /* Set up the drop sites. */ + gtk_drag_dest_set (day_view->top_canvas, + GTK_DEST_DEFAULT_ALL, + target_table, n_targets, + GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK); + gtk_drag_dest_set (day_view->main_canvas, + GTK_DEST_DEFAULT_ALL, + target_table, n_targets, + GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK); + + /* Get the model */ + model = e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)); + + /* connect to ECalModel's signals */ + g_signal_connect (G_OBJECT (model), "time_range_changed", + G_CALLBACK (time_range_changed_cb), day_view); + g_signal_connect (G_OBJECT (model), "model_row_changed", + G_CALLBACK (model_row_changed_cb), day_view); + g_signal_connect (G_OBJECT (model), "model_cell_changed", + G_CALLBACK (model_cell_changed_cb), day_view); + g_signal_connect (G_OBJECT (model), "model_rows_inserted", + G_CALLBACK (model_rows_inserted_cb), day_view); + g_signal_connect (G_OBJECT (model), "model_rows_deleted", + G_CALLBACK (model_rows_deleted_cb), day_view); + + /* connect to ECalendarView's signals */ + g_signal_connect (G_OBJECT (day_view), "timezone_changed", + G_CALLBACK (timezone_changed_cb), NULL); +} +#endif + + +/* Turn off the background of the canvas windows. This reduces flicker + considerably when scrolling. (Why isn't it in GnomeCanvas?). */ +static void +e_day_view_on_canvas_realized (GtkWidget *widget, + EDayView *day_view) +{ + gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window, + NULL, FALSE); +} + + +/** + * e_day_view_new: + * @Returns: a new #EDayView. + * + * Creates a new #EDayView. + **/ +GtkWidget * +e_day_view_new (void) +{ + GObject *day_view; + + day_view = g_object_new (e_day_view_get_type (), NULL); + e_cal_model_set_flags (e_calendar_view_get_model (E_CALENDAR_VIEW (day_view)), E_CAL_MODEL_FLAGS_EXPAND_RECURRENCES); + + return GTK_WIDGET (day_view); +} + +static void +e_day_view_destroy (GtkObject *object) +{ + EDayView *day_view; + gint day; + + day_view = E_DAY_VIEW (object); + + e_day_view_cancel_layout (day_view); + + e_day_view_stop_auto_scroll (day_view); + + if (day_view->large_font_desc) { + pango_font_description_free (day_view->large_font_desc); + day_view->large_font_desc = NULL; + } + + if (day_view->small_font_desc) { + pango_font_description_free (day_view->small_font_desc); + day_view->small_font_desc = NULL; + } + + if (day_view->normal_cursor) { + gdk_cursor_unref (day_view->normal_cursor); + day_view->normal_cursor = NULL; + } + if (day_view->move_cursor) { + gdk_cursor_unref (day_view->move_cursor); + day_view->move_cursor = NULL; + } + if (day_view->resize_width_cursor) { + gdk_cursor_unref (day_view->resize_width_cursor); + day_view->resize_width_cursor = NULL; + } + if (day_view->resize_height_cursor) { + gdk_cursor_unref (day_view->resize_height_cursor); + day_view->resize_height_cursor = NULL; + } + + if (day_view->long_events) { + e_day_view_free_events (day_view); + g_array_free (day_view->long_events, TRUE); + day_view->long_events = NULL; + } + + for (day = 0; day < E_DAY_VIEW_MAX_DAYS; day++) { + if (day_view->events[day]) { + g_array_free (day_view->events[day], TRUE); + day_view->events[day] = NULL; + } + } + + GTK_OBJECT_CLASS (e_day_view_parent_class)->destroy (object); +} + +#ifndef ENABLE_CAIRO +static void +e_day_view_realize (GtkWidget *widget) +{ + EDayView *day_view; + GdkColormap *colormap; + + if (GTK_WIDGET_CLASS (e_day_view_parent_class)->realize) + (*GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)(widget); + + day_view = E_DAY_VIEW (widget); + day_view->main_gc = gdk_gc_new (widget->window); + + colormap = gtk_widget_get_colormap (widget); + + /* Allocate the colors. */ + + e_day_view_set_colors(day_view, widget); + + gdk_gc_set_colormap (day_view->main_gc, colormap); + + /* Create the pixmaps. */ + day_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU); + day_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU); + day_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU); + day_view->meeting_icon = e_icon_factory_get_icon ("stock_people", E_ICON_SIZE_MENU); + day_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); + + + /* Set the canvas item colors. */ + gnome_canvas_item_set (day_view->resize_long_event_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->drag_long_event_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + + gnome_canvas_item_set (day_view->resize_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->resize_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + + gnome_canvas_item_set (day_view->drag_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->drag_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); +} +#endif + +#ifdef ENABLE_CAIRO +static void +e_day_view_realize (GtkWidget *widget) +{ + EDayView *day_view; + GdkColormap *colormap; + + if (GTK_WIDGET_CLASS (e_day_view_parent_class)->realize) + (*GTK_WIDGET_CLASS (e_day_view_parent_class)->realize)(widget); + + day_view = E_DAY_VIEW (widget); + day_view->main_gc = gdk_gc_new (widget->window); + + colormap = gtk_widget_get_colormap (widget); + + /* Allocate the colors. */ + + e_day_view_set_colors(day_view, widget); + + gdk_gc_set_colormap (day_view->main_gc, colormap); + + /* Create the pixmaps. */ + day_view->reminder_icon = e_icon_factory_get_icon ("stock_bell", E_ICON_SIZE_MENU); + day_view->recurrence_icon = e_icon_factory_get_icon ("stock_refresh", E_ICON_SIZE_MENU); + day_view->timezone_icon = e_icon_factory_get_icon ("stock_timezone", E_ICON_SIZE_MENU); + day_view->meeting_icon = e_icon_factory_get_icon ("stock_people", E_ICON_SIZE_MENU); + day_view->attach_icon = e_icon_factory_get_icon ("stock_attach", E_ICON_SIZE_MENU); + + + /* Set the canvas item colors. */ + gnome_canvas_item_set (day_view->drag_long_event_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->drag_rect_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + gnome_canvas_item_set (day_view->drag_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); +} +#endif + +static void +e_day_view_set_colors(EDayView *day_view, GtkWidget *widget) +{ + day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING] = widget->style->base[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING] = widget->style->bg[GTK_STATE_ACTIVE]; + day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED] = widget->style->base[GTK_STATE_SELECTED]; + day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED] = widget->style->bg[GTK_STATE_SELECTED]; + day_view->colors[E_DAY_VIEW_COLOR_BG_GRID] = widget->style->dark[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS] = widget->style->dark[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED] = widget->style->bg[GTK_STATE_SELECTED]; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID] = widget->style->light[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR] = widget->style->base[GTK_STATE_SELECTED]; + day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND] = widget->style->base[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND] = widget->style->bg[GTK_STATE_ACTIVE]; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL]; + day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE] = widget->style->dark[GTK_STATE_PRELIGHT]; +} + +static void +e_day_view_unrealize (GtkWidget *widget) +{ + EDayView *day_view; + GdkColormap *colormap; + + day_view = E_DAY_VIEW (widget); + + gdk_gc_unref (day_view->main_gc); + day_view->main_gc = NULL; + + colormap = gtk_widget_get_colormap (widget); + gdk_colormap_free_colors (colormap, day_view->colors, E_DAY_VIEW_COLOR_LAST); + + g_object_unref (day_view->reminder_icon); + day_view->reminder_icon = NULL; + g_object_unref (day_view->recurrence_icon); + day_view->recurrence_icon = NULL; + g_object_unref (day_view->timezone_icon); + day_view->timezone_icon = NULL; + g_object_unref (day_view->meeting_icon); + day_view->meeting_icon = NULL; + g_object_unref (day_view->attach_icon); + day_view->attach_icon = NULL; + + if (GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize) + (*GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize)(widget); +} + +static GdkColor +e_day_view_get_text_color (EDayView *day_view, EDayViewEvent *event, GtkWidget *widget) +{ + GdkColor color, bg_color; + guint16 red, green, blue; + gdouble cc = 65535.0; + + red = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].red; + green = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].green; + blue = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].blue; + + 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)) { + GdkColormap *colormap; + colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); + if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { + red = bg_color.red; + green = bg_color.green; + blue = bg_color.blue; + } + } + + if ((red/cc > 0.7) || (green/cc > 0.7) || (blue/cc > 0.7 )) + color = widget->style->text[GTK_STATE_NORMAL]; + else + color = widget->style->text[GTK_STATE_ACTIVE]; + + return color; +} + +#ifndef ENABLE_CAIRO +static void +e_day_view_style_set (GtkWidget *widget, + GtkStyle *previous_style) +{ + EDayView *day_view; + gint top_rows, top_canvas_height; + gint hour; + gint minute, max_minute_width, i; + gint month, day, width; + gint longest_month_width, longest_abbreviated_month_width; + gint longest_weekday_width, longest_abbreviated_weekday_width; + struct tm date_tm; + gchar buffer[128]; + gint times_width; + PangoFontDescription *font_desc; + PangoContext *pango_context; + PangoFontMetrics *font_metrics; + PangoLayout *layout; + gint week_day, event_num; + EDayViewEvent *event; + GdkColor color; + + if (GTK_WIDGET_CLASS (e_day_view_parent_class)->style_set) + (*GTK_WIDGET_CLASS (e_day_view_parent_class)->style_set)(widget, previous_style); + + day_view = E_DAY_VIEW (widget); + e_day_view_set_colors(day_view, widget); + + for (week_day = 0; week_day < E_DAY_VIEW_MAX_DAYS; week_day++){ + 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) { + color = e_day_view_get_text_color (day_view, event, widget); + gnome_canvas_item_set (event->canvas_item, + "fill_color_gdk", &color, + NULL); + } + } + } + for (event_num = 0; event_num < day_view->long_events->len; event_num++) { + event = &g_array_index (day_view->long_events, EDayViewEvent, event_num); + if (event->canvas_item) { + color = e_day_view_get_text_color (day_view, event, widget); + gnome_canvas_item_set (event->canvas_item, + "fill_color_gdk", &color, + NULL); + } + } + gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item, + "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], + "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], + NULL); + + /* Set up Pango prerequisites */ + font_desc = gtk_widget_get_style (widget)->font_desc; + pango_context = gtk_widget_get_pango_context (widget); + font_metrics = pango_context_get_metrics (pango_context, font_desc, + pango_context_get_language (pango_context)); + layout = pango_layout_new (pango_context); + + /* Create the large font. */ + if (day_view->large_font_desc != NULL) + pango_font_description_free (day_view->large_font_desc); + + day_view->large_font_desc = pango_font_description_copy (font_desc); + pango_font_description_set_size (day_view->large_font_desc, + E_DAY_VIEW_LARGE_FONT_PTSIZE * PANGO_SCALE); + + /* Create the small fonts. */ + if (day_view->small_font_desc != NULL) + pango_font_description_free (day_view->small_font_desc); + + day_view->small_font_desc = pango_font_description_copy (font_desc); + pango_font_description_set_size (day_view->small_font_desc, + E_DAY_VIEW_SMALL_FONT_PTSIZE * PANGO_SCALE); + + /* Recalculate the height of each row based on the font size. */ + day_view->row_height = + PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) + + PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) + + E_DAY_VIEW_EVENT_BORDER_HEIGHT + E_DAY_VIEW_EVENT_Y_PAD * 2 + 2 /* FIXME */; + day_view->row_height = MAX (day_view->row_height, E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD + 2); + GTK_LAYOUT (day_view->main_canvas)->vadjustment->step_increment = day_view->row_height; + + day_view->top_row_height = + PANGO_PIXELS (pango_font_metrics_get_ascent (font_metrics)) + + PANGO_PIXELS (pango_font_metrics_get_descent (font_metrics)) + + E_DAY_VIEW_LONG_EVENT_BORDER_HEIGHT * 2 + E_DAY_VIEW_LONG_EVENT_Y_PAD * 2 + + E_DAY_VIEW_TOP_CANVAS_Y_GAP; + day_view->top_row_height = MAX (day_view->top_row_height, E_DAY_VIEW_ICON_HEIGHT + E_DAY_VIEW_ICON_Y_PAD + 2 + E_DAY_VIEW_TOP_CANVAS_Y_GAP); + + /* Set the height of the top canvas based on the row height and the + number of rows needed (min 1 + 1 for the dates + 1 space for DnD).*/ + top_rows = MAX (1, day_view->rows_in_top_display); + top_canvas_height = (top_rows + 2) * day_view->top_row_height; + gtk_widget_set_usize (day_view->top_canvas, -1, top_canvas_height); + + /* Find the longest full & abbreviated month names. */ + memset (&date_tm, 0, sizeof (date_tm)); + date_tm.tm_year = 100; + date_tm.tm_mday = 1; + date_tm.tm_isdst = -1; + + longest_month_width = 0; + longest_abbreviated_month_width = 0; + for (month = 0; month < 12; month++) { + date_tm.tm_mon = month; + + e_utf8_strftime (buffer, sizeof (buffer), "%B", &date_tm); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &width, NULL); + + if (width > longest_month_width) { + longest_month_width = width; + day_view->longest_month_name = month; + } + + e_utf8_strftime (buffer, sizeof (buffer), "%b", &date_tm); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &width, NULL); + + if (width > longest_abbreviated_month_width) { + longest_abbreviated_month_width = width; + day_view->longest_abbreviated_month_name = month; + } + } + /* Find the longest full & abbreviated weekday names. */ + memset (&date_tm, 0, sizeof (date_tm)); + date_tm.tm_year = 100; + date_tm.tm_mon = 0; + date_tm.tm_isdst = -1; - /* Set the canvas item colors. */ - gnome_canvas_item_set (day_view->drag_long_event_rect_item, - "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], - "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], - NULL); + longest_weekday_width = 0; + longest_abbreviated_weekday_width = 0; + for (day = 0; day < 7; day++) { + date_tm.tm_mday = 2 + day; + date_tm.tm_wday = day; - gnome_canvas_item_set (day_view->drag_rect_item, - "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND], - "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], - NULL); + e_utf8_strftime (buffer, sizeof (buffer), "%A", &date_tm); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &width, NULL); - gnome_canvas_item_set (day_view->drag_bar_item, - "fill_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR], - "outline_color_gdk", &day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER], - NULL); -} + if (width > longest_weekday_width) { + longest_weekday_width = width; + day_view->longest_weekday_name = day; + } -static void -e_day_view_set_colors(EDayView *day_view, GtkWidget *widget) -{ - day_view->colors[E_DAY_VIEW_COLOR_BG_WORKING] = widget->style->base[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING] = widget->style->bg[GTK_STATE_ACTIVE]; - day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED] = widget->style->base[GTK_STATE_SELECTED]; - day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED_UNFOCUSSED] = widget->style->bg[GTK_STATE_SELECTED]; - day_view->colors[E_DAY_VIEW_COLOR_BG_GRID] = widget->style->dark[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS] = widget->style->dark[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED] = widget->style->bg[GTK_STATE_SELECTED]; - day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID] = widget->style->light[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR] = widget->style->base[GTK_STATE_SELECTED]; - day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND] = widget->style->base[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND] = widget->style->bg[GTK_STATE_ACTIVE]; - day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER] = widget->style->dark[GTK_STATE_NORMAL]; - day_view->colors[E_DAY_VIEW_COLOR_MARCUS_BAINS_LINE] = widget->style->dark[GTK_STATE_PRELIGHT]; -} + e_utf8_strftime (buffer, sizeof (buffer), "%a", &date_tm); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &width, NULL); -static void -e_day_view_unrealize (GtkWidget *widget) -{ - EDayView *day_view; - GdkColormap *colormap; + if (width > longest_abbreviated_weekday_width) { + longest_abbreviated_weekday_width = width; + day_view->longest_abbreviated_weekday_name = day; + } + } - day_view = E_DAY_VIEW (widget); - gdk_gc_unref (day_view->main_gc); - day_view->main_gc = NULL; + /* Calculate the widths of all the time strings necessary. */ + day_view->max_small_hour_width = 0; + for (hour = 0; hour < 24; hour++) { + g_snprintf (buffer, sizeof (buffer), "%02i", hour); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &day_view->small_hour_widths [hour], NULL); - colormap = gtk_widget_get_colormap (widget); - gdk_colormap_free_colors (colormap, day_view->colors, E_DAY_VIEW_COLOR_LAST); + day_view->max_small_hour_width = MAX (day_view->max_small_hour_width, day_view->small_hour_widths[hour]); + } - g_object_unref (day_view->reminder_icon); - day_view->reminder_icon = NULL; - g_object_unref (day_view->recurrence_icon); - day_view->recurrence_icon = NULL; - g_object_unref (day_view->timezone_icon); - day_view->timezone_icon = NULL; - g_object_unref (day_view->meeting_icon); - day_view->meeting_icon = NULL; - g_object_unref (day_view->attach_icon); - day_view->attach_icon = NULL; + max_minute_width = 0; + for (minute = 0, i = 0; minute < 60; minute += 5, i++) { + gint minute_width; - if (GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize) - (*GTK_WIDGET_CLASS (e_day_view_parent_class)->unrealize)(widget); -} + g_snprintf (buffer, sizeof (buffer), "%02i", minute); + pango_layout_set_text (layout, buffer, -1); + pango_layout_get_pixel_size (layout, &minute_width, NULL); -static GdkColor -e_day_view_get_text_color (EDayView *day_view, EDayViewEvent *event, GtkWidget *widget) -{ - GdkColor color, bg_color; - guint16 red, green, blue; - gdouble cc = 65535.0; - - red = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].red; - green = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].green; - blue = day_view->colors[E_DAY_VIEW_COLOR_EVENT_BACKGROUND].blue; + max_minute_width = MAX (max_minute_width, minute_width); + } + day_view->max_minute_width = max_minute_width; - 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)) { - GdkColormap *colormap; - colormap = gtk_widget_get_colormap (GTK_WIDGET (day_view)); - if (gdk_colormap_alloc_color (colormap, &bg_color, TRUE, TRUE)) { - red = bg_color.red; - green = bg_color.green; - blue = bg_color.blue; - } - } + pango_layout_set_text (layout, ":", 1); + pango_layout_get_pixel_size (layout, &day_view->colon_width, NULL); + pango_layout_set_text (layout, "0", 1); + pango_layout_get_pixel_size (layout, &day_view->digit_width, NULL); - if ((red/cc > 0.7) || (green/cc > 0.7) || (blue/cc > 0.7 )) - color = widget->style->text[GTK_STATE_NORMAL]; - else - color = widget->style->text[GTK_STATE_ACTIVE]; + pango_layout_set_text (layout, day_view->am_string, -1); + pango_layout_get_pixel_size (layout, &day_view->am_string_width, NULL); + pango_layout_set_text (layout, day_view->pm_string, -1); + pango_layout_get_pixel_size (layout, &day_view->pm_string_width, NULL); - return color; + /* Calculate the width of the time column. */ + times_width = e_day_view_time_item_get_column_width (E_DAY_VIEW_TIME_ITEM (day_view->time_canvas_item)); + gtk_widget_set_usize (day_view->time_canvas, times_width, -1); + + g_object_unref (layout); + pango_font_metrics_unref (font_metrics); } +#endif +#ifdef ENABLE_CAIRO static void e_day_view_style_set (GtkWidget *widget, GtkStyle *previous_style) @@ -1354,7 +1978,7 @@ e_day_view_style_set (GtkWidget *widget, g_object_unref (layout); pango_font_metrics_unref (font_metrics); } - +#endif /* This recalculates the sizes of each column. */ static void @@ -1716,6 +2340,111 @@ set_text_as_bold (EDayViewEvent *event) /* This updates the text shown for an event. If the event start or end do not lie on a row boundary, the time is displayed before the summary. */ +#ifndef ENABLE_CAIRO +/* This updates the text shown for an event. If the event start or end do not + lie on a row boundary, the time is displayed before the summary. */ +static void +e_day_view_update_event_label (EDayView *day_view, + gint day, + gint event_num) +{ + EDayViewEvent *event; + char *text, *start_suffix, *end_suffix; + gboolean free_text = FALSE, editing_event = FALSE; + gint offset; + gint start_hour, start_display_hour, start_minute, start_suffix_width; + gint end_hour, end_display_hour, end_minute, end_suffix_width; + const gchar *summary; + + event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); + + /* If the event isn't visible just return. */ + if (!event->canvas_item) + return; + + summary = icalcomponent_get_summary (event->comp_data->icalcomp); + text = summary ? (char *) summary : ""; + + if (day_view->editing_event_day == day + && day_view->editing_event_num == event_num) + editing_event = TRUE; + + if (!editing_event + && (event->start_minute % day_view->mins_per_row != 0 + || (day_view->show_event_end_times + && event->end_minute % day_view->mins_per_row != 0))) { + offset = day_view->first_hour_shown * 60 + + day_view->first_minute_shown; + start_minute = offset + event->start_minute; + end_minute = offset + event->end_minute; + + start_hour = start_minute / 60; + start_minute = start_minute % 60; + + end_hour = end_minute / 60; + end_minute = end_minute % 60; + + e_day_view_convert_time_to_display (day_view, start_hour, + &start_display_hour, + &start_suffix, + &start_suffix_width); + e_day_view_convert_time_to_display (day_view, end_hour, + &end_display_hour, + &end_suffix, + &end_suffix_width); + + if (e_calendar_view_get_use_24_hour_format (E_CALENDAR_VIEW (day_view))) { + if (day_view->show_event_end_times) { + /* 24 hour format with end time. */ + text = g_strdup_printf + ("%2i:%02i-%2i:%02i %s", + start_display_hour, start_minute, + end_display_hour, end_minute, + text); + } else { + /* 24 hour format without end time. */ + text = g_strdup_printf + ("%2i:%02i %s", + start_display_hour, start_minute, + text); + } + } else { + if (day_view->show_event_end_times) { + /* 12 hour format with end time. */ + text = g_strdup_printf + ("%2i:%02i%s-%2i:%02i%s %s", + start_display_hour, start_minute, + start_suffix, + end_display_hour, end_minute, + end_suffix, + text); + } else { + /* 12 hour format without end time. */ + text = g_strdup_printf + ("%2i:%02i%s %s", + start_display_hour, start_minute, + start_suffix, + text); + } + } + + free_text = TRUE; + } + + gnome_canvas_item_set (event->canvas_item, + "text", text, + NULL); + +/* 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); */ + + if (free_text) + g_free (text); +} +#endif + +#ifdef ENABLE_CAIRO static void e_day_view_update_event_label (EDayView *day_view, gint day, @@ -1769,6 +2498,7 @@ e_day_view_update_event_label (EDayView *day_view, if (free_text) g_free (text); } +#endif static void e_day_view_update_long_event_label (EDayView *day_view, @@ -2950,10 +3680,86 @@ e_day_view_on_event_button_press (EDayView *day_view, return TRUE; } - return FALSE; + return FALSE; +} + +#ifndef ENABLE_CAIRO +static void +e_day_view_on_long_event_click (EDayView *day_view, + gint event_num, + GdkEventButton *bevent, + ECalendarViewPosition pos, + gint event_x, + gint event_y) +{ + EDayViewEvent *event; + gint start_day, end_day, day; + gint item_x, item_y, item_w, item_h; + + event = &g_array_index (day_view->long_events, EDayViewEvent, + event_num); + + /* Ignore clicks on the EText while editing. */ + if (pos == E_CALENDAR_VIEW_POS_EVENT + && E_TEXT (event->canvas_item)->editing) + 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 + || pos == E_CALENDAR_VIEW_POS_RIGHT_EDGE)) { + if (!e_day_view_find_long_event_days (event, + day_view->days_shown, + day_view->day_starts, + &start_day, &end_day)) + return; + + /* Grab the keyboard focus, so the event being edited is saved + and we can use the Escape key to abort the resize. */ + if (!GTK_WIDGET_HAS_FOCUS (day_view)) + gtk_widget_grab_focus (GTK_WIDGET (day_view)); + + if (gdk_pointer_grab (GTK_LAYOUT (day_view->top_canvas)->bin_window, FALSE, + GDK_POINTER_MOTION_MASK + | GDK_BUTTON_RELEASE_MASK, + FALSE, NULL, bevent->time) == 0) { + + day_view->resize_event_day = E_DAY_VIEW_LONG_EVENT; + day_view->resize_event_num = event_num; + day_view->resize_drag_pos = pos; + day_view->resize_start_row = start_day; + day_view->resize_end_row = end_day; + + /* Create the edit rect if necessary. */ + e_day_view_reshape_resize_long_event_rect_item (day_view); + + /* Make sure the text item is on top. */ + gnome_canvas_item_raise_to_top (day_view->resize_long_event_rect_item); + + /* Raise the event's item, above the rect as well. */ + gnome_canvas_item_raise_to_top (event->canvas_item); + } + } else if (e_day_view_get_long_event_position (day_view, event_num, + &start_day, &end_day, + &item_x, &item_y, + &item_w, &item_h)) { + /* Remember the item clicked and the mouse position, + so we can start a drag if the mouse moves. */ + day_view->pressed_event_day = E_DAY_VIEW_LONG_EVENT; + day_view->pressed_event_num = event_num; + + day_view->drag_event_x = event_x; + day_view->drag_event_y = event_y; + + e_day_view_convert_position_in_top_canvas (day_view, + event_x, event_y, + &day, NULL); + day_view->drag_event_offset = day - start_day; + } } +#endif - +#ifdef ENABLE_CAIRO static void e_day_view_on_long_event_click (EDayView *day_view, gint event_num, @@ -3024,7 +3830,7 @@ e_day_view_on_long_event_click (EDayView *day_view, day_view->drag_event_offset = day - start_day; } } - +#endif static void e_day_view_on_event_click (EDayView *day_view, @@ -3098,7 +3904,7 @@ e_day_view_on_event_click (EDayView *day_view, } } - +#ifndef ENABLE_CAIRO static void e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view) { @@ -3115,6 +3921,7 @@ e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view) &start_day, &end_day, &item_x, &item_y, &item_w, &item_h)) { + gnome_canvas_item_hide (day_view->resize_long_event_rect_item); return; } @@ -3122,6 +3929,14 @@ e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view) y1 = item_y; x2 = item_x + item_w - 1; y2 = item_y + item_h - 1; + + gnome_canvas_item_set (day_view->resize_long_event_rect_item, + "x1", x1, + "y1", y1, + "x2", x2, + "y2", y2, + NULL); + gnome_canvas_item_show (day_view->resize_long_event_rect_item); } @@ -3141,6 +3956,50 @@ e_day_view_reshape_resize_rect_item (EDayView *day_view) || !e_day_view_get_event_position (day_view, day, event_num, &item_x, &item_y, &item_w, &item_h)) { + gnome_canvas_item_hide (day_view->resize_rect_item); + return; + } + + x1 = item_x; + y1 = item_y; + x2 = item_x + item_w - 1; + y2 = item_y + item_h - 1; + + gnome_canvas_item_set (day_view->resize_rect_item, + "x1", x1 + E_DAY_VIEW_BAR_WIDTH - 1, + "y1", y1, + "x2", x2, + "y2", y2, + NULL); + gnome_canvas_item_show (day_view->resize_rect_item); + + gnome_canvas_item_set (day_view->resize_bar_item, + "x1", x1, + "y1", y1, + "x2", x1 + E_DAY_VIEW_BAR_WIDTH - 1, + "y2", y2, + NULL); + gnome_canvas_item_show (day_view->resize_bar_item); +} +#endif + +#ifdef ENABLE_CAIRO +static void +e_day_view_reshape_resize_long_event_rect_item (EDayView *day_view) +{ + gint event_num, start_day, end_day; + gint item_x, item_y, item_w, item_h; + gdouble x1, y1, x2, y2; + + event_num = day_view->resize_event_num; + + /* If we're not resizing an event, or the event is not shown, + hide the resize bars. */ + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE + || !e_day_view_get_long_event_position (day_view, event_num, + &start_day, &end_day, + &item_x, &item_y, + &item_w, &item_h)) { return; } @@ -3151,6 +4010,32 @@ e_day_view_reshape_resize_rect_item (EDayView *day_view) } +static void +e_day_view_reshape_resize_rect_item (EDayView *day_view) +{ + gint day, event_num; + gint item_x, item_y, item_w, item_h; + gdouble x1, y1, x2, y2; + + day = day_view->resize_event_day; + event_num = day_view->resize_event_num; + + /* If we're not resizing an event, or the event is not shown, + hide the resize bars. */ + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE + || !e_day_view_get_event_position (day_view, day, event_num, + &item_x, &item_y, + &item_w, &item_h)) { + return; + } + + x1 = item_x; + y1 = item_y; + x2 = item_x + item_w - 1; + y2 = item_y + item_h - 1; +} +#endif + static void e_day_view_on_event_double_click (EDayView *day_view, gint day, @@ -3353,7 +4238,209 @@ e_day_view_update_calendar_selection_time (EDayView *day_view) #endif } +#ifndef ENABLE_CAIRO +static gboolean +e_day_view_on_top_canvas_motion (GtkWidget *widget, + GdkEventMotion *mevent, + EDayView *day_view) +{ + EDayViewEvent *event = NULL; + ECalendarViewPosition pos; + gint event_x, event_y, canvas_x, canvas_y; + gint day, event_num; + GdkCursor *cursor; + +#if 0 + g_print ("In e_day_view_on_top_canvas_motion\n"); +#endif + + /* 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, + GTK_LAYOUT (widget)->bin_window, + &event_x, &event_y)) + return FALSE; + + canvas_x = event_x; + canvas_y = event_y; + + pos = e_day_view_convert_position_in_top_canvas (day_view, + canvas_x, canvas_y, + &day, &event_num); + if (event_num != -1) + event = &g_array_index (day_view->long_events, EDayViewEvent, + event_num); + + if (day_view->selection_is_being_dragged) { + e_day_view_update_selection (day_view, day, -1); + return TRUE; + } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) { + if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) { + e_day_view_update_long_event_resize (day_view, day); + return TRUE; + } + } else if (day_view->pressed_event_day == E_DAY_VIEW_LONG_EVENT) { + GtkTargetList *target_list; + + event = &g_array_index (day_view->long_events, EDayViewEvent, + day_view->pressed_event_num); + + if (!e_cal_util_component_has_recurrences (event->comp_data->icalcomp) + && (abs (canvas_x - day_view->drag_event_x) + > E_DAY_VIEW_DRAG_START_OFFSET + || abs (canvas_y - day_view->drag_event_y) + > E_DAY_VIEW_DRAG_START_OFFSET)) { + day_view->drag_event_day = day_view->pressed_event_day; + day_view->drag_event_num = day_view->pressed_event_num; + day_view->pressed_event_day = -1; + + /* Hide the horizontal bars. */ + if (day_view->resize_bars_event_day != -1) { + day_view->resize_bars_event_day = -1; + day_view->resize_bars_event_num = -1; + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); + } + + target_list = gtk_target_list_new (target_table, + n_targets); + gtk_drag_begin (widget, target_list, + GDK_ACTION_COPY | GDK_ACTION_MOVE, + 1, (GdkEvent*)mevent); + gtk_target_list_unref (target_list); + } + } else { + cursor = day_view->normal_cursor; + + /* Recurring events can't be resized. */ + if (event && !e_cal_util_component_has_recurrences (event->comp_data->icalcomp)) { + switch (pos) { + case E_CALENDAR_VIEW_POS_LEFT_EDGE: + case E_CALENDAR_VIEW_POS_RIGHT_EDGE: + cursor = day_view->resize_width_cursor; + break; + default: + break; + } + } + + /* Only set the cursor if it is different to last one set. */ + if (day_view->last_cursor_set_in_top_canvas != cursor) { + day_view->last_cursor_set_in_top_canvas = cursor; + gdk_window_set_cursor (widget->window, cursor); + } + + } + + return FALSE; +} + + +static gboolean +e_day_view_on_main_canvas_motion (GtkWidget *widget, + GdkEventMotion *mevent, + EDayView *day_view) +{ + EDayViewEvent *event = NULL; + ECalendarViewPosition pos; + gint event_x, event_y, canvas_x, canvas_y; + gint row, day, event_num; + GdkCursor *cursor; + +#if 0 + g_print ("In e_day_view_on_main_canvas_motion\n"); +#endif + + /* 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, + GTK_LAYOUT (widget)->bin_window, + &event_x, &event_y)) + return FALSE; + + canvas_x = event_x; + canvas_y = event_y; + + pos = e_day_view_convert_position_in_main_canvas (day_view, + canvas_x, canvas_y, + &day, &row, + &event_num); + if (event_num != -1) + event = &g_array_index (day_view->events[day], EDayViewEvent, + event_num); + + if (day_view->selection_is_being_dragged) { + if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) { + e_day_view_update_selection (day_view, day, row); + e_day_view_check_auto_scroll (day_view, + event_x, event_y); + return TRUE; + } + } else if (day_view->resize_drag_pos != E_CALENDAR_VIEW_POS_NONE) { + if (pos != E_CALENDAR_VIEW_POS_OUTSIDE) { + e_day_view_update_resize (day_view, row); + e_day_view_check_auto_scroll (day_view, + event_x, event_y); + return TRUE; + } + } else if (day_view->pressed_event_day != -1 + && day_view->pressed_event_day != E_DAY_VIEW_LONG_EVENT) { + GtkTargetList *target_list; + + event = &g_array_index (day_view->events[day_view->pressed_event_day], EDayViewEvent, day_view->pressed_event_num); + + if ((abs (canvas_x - day_view->drag_event_x) + > E_DAY_VIEW_DRAG_START_OFFSET + || abs (canvas_y - day_view->drag_event_y) + > E_DAY_VIEW_DRAG_START_OFFSET)) { + day_view->drag_event_day = day_view->pressed_event_day; + day_view->drag_event_num = day_view->pressed_event_num; + day_view->pressed_event_day = -1; + + /* Hide the horizontal bars. */ + if (day_view->resize_bars_event_day != -1) { + day_view->resize_bars_event_day = -1; + day_view->resize_bars_event_num = -1; + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); + } + + target_list = gtk_target_list_new (target_table, + n_targets); + gtk_drag_begin (widget, target_list, + GDK_ACTION_COPY | GDK_ACTION_MOVE, + 1, (GdkEvent*)mevent); + gtk_target_list_unref (target_list); + } + } else { + cursor = day_view->normal_cursor; + + if (event) { + switch (pos) { + case E_CALENDAR_VIEW_POS_LEFT_EDGE: + cursor = day_view->move_cursor; + break; + case E_CALENDAR_VIEW_POS_TOP_EDGE: + case E_CALENDAR_VIEW_POS_BOTTOM_EDGE: + cursor = day_view->resize_height_cursor; + break; + default: + break; + } + } + + /* Only set the cursor if it is different to last one set. */ + if (day_view->last_cursor_set_in_main_canvas != cursor) { + day_view->last_cursor_set_in_main_canvas = cursor; + gdk_window_set_cursor (widget->window, cursor); + } + } + + return FALSE; +} +#endif +#ifdef ENABLE_CAIRO static gboolean e_day_view_on_top_canvas_motion (GtkWidget *widget, GdkEventMotion *mevent, @@ -3549,7 +4636,7 @@ e_day_view_on_main_canvas_motion (GtkWidget *widget, return FALSE; } - +#endif /* This sets the selection to a single cell. If day is -1 then the current start day is reused. If row is -1 then the selection is in the top canvas. @@ -3647,102 +4734,343 @@ e_day_view_normalize_selection (EDayView *day_view) else day_view->selection_drag_pos = E_DAY_VIEW_DRAG_START; } -} +} + + +void +e_day_view_finish_selection (EDayView *day_view) +{ + day_view->selection_is_being_dragged = FALSE; + e_day_view_update_calendar_selection_time (day_view); +} + +static void +e_day_view_update_long_event_resize (EDayView *day_view, + gint day) +{ + /* event is never used here either, what's up? */ + EDayViewEvent *event; + gint event_num; + gboolean need_reshape = FALSE; + +#if 0 + g_print ("Updating resize Day:%i\n", day); +#endif + + event_num = day_view->resize_event_num; + event = &g_array_index (day_view->long_events, EDayViewEvent, + event_num); + + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) { + day = MIN (day, day_view->resize_end_row); + if (day != day_view->resize_start_row) { + need_reshape = TRUE; + day_view->resize_start_row = day; + + } + } else { + day = MAX (day, day_view->resize_start_row); + if (day != day_view->resize_end_row) { + need_reshape = TRUE; + day_view->resize_end_row = day; + } + } + + /* FIXME: Optimise? */ + if (need_reshape) { + e_day_view_reshape_long_event (day_view, event_num); + e_day_view_reshape_resize_long_event_rect_item (day_view); + gtk_widget_queue_draw (day_view->top_canvas); + } +} + + +static void +e_day_view_update_resize (EDayView *day_view, + gint row) +{ + /* Same thing again? */ + EDayViewEvent *event; + gint day, event_num; + gboolean need_reshape = FALSE; + +#if 0 + g_print ("Updating resize Row:%i\n", row); +#endif + + day = day_view->resize_event_day; + event_num = day_view->resize_event_num; + event = &g_array_index (day_view->events[day], EDayViewEvent, + event_num); + + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) { + row = MIN (row, day_view->resize_end_row); + if (row != day_view->resize_start_row) { + need_reshape = TRUE; + day_view->resize_start_row = row; + + } + } else { + row = MAX (row, day_view->resize_start_row); + if (row != day_view->resize_end_row) { + need_reshape = TRUE; + day_view->resize_end_row = row; + } + } + + /* FIXME: Optimise? */ + if (need_reshape) { + e_day_view_reshape_day_event (day_view, day, event_num); + e_day_view_reshape_resize_rect_item (day_view); + e_day_view_reshape_main_canvas_resize_bars (day_view); + gtk_widget_queue_draw (day_view->main_canvas); + } +} + + +/* This converts the resize start or end row back to a time and updates the + event. */ +#ifndef ENABLE_CAIRO +static void +e_day_view_finish_long_event_resize (EDayView *day_view) +{ + EDayViewEvent *event; + gint event_num; + ECalComponent *comp; + ECalComponentDateTime date; + struct icaltimetype itt; + time_t dt; + ECal *client; + CalObjModType mod = CALOBJ_MOD_ALL; + GtkWindow *toplevel; + int is_date; + + event_num = day_view->resize_event_num; + event = &g_array_index (day_view->long_events, EDayViewEvent, + event_num); + + client = event->comp_data->client; + + /* We use a temporary copy of the comp since we don't want to + change the original comp here. Otherwise we would not detect that + the event's time had changed in the "update_event" callback. */ + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + + if (e_cal_component_has_attendees (comp) && !itip_organizer_is_user (comp, client)) { + g_object_unref (comp); + e_day_view_abort_resize (day_view); + return; + } + + date.value = &itt; + date.tzid = NULL; + + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) { + e_cal_component_get_dtstart (comp, &date); + is_date = date.value->is_date; + if (!is_date) + date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + dt = day_view->day_starts[day_view->resize_start_row]; + *date.value = icaltime_from_timet_with_zone (dt, is_date, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtstart (comp, &date); + } else { + e_cal_component_get_dtend (comp, &date); + is_date = date.value->is_date; + if (!is_date) + date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + dt = day_view->day_starts[day_view->resize_end_row + 1]; + *date.value = icaltime_from_timet_with_zone (dt, is_date, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtend (comp, &date); + } + + e_cal_component_commit_sequence (comp); + if (e_cal_component_is_instance (comp)) { + if (!recur_component_dialog (client, comp, &mod, NULL, FALSE)) { + gtk_widget_queue_draw (day_view->top_canvas); + goto out; + } + + if (mod == CALOBJ_MOD_THIS) { + /* set the correct DTSTART/DTEND on the individual recurrence */ + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) { + *date.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_end, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtend (comp, &date); + } else { + *date.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_start, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtstart (comp, &date); + } + + e_cal_component_set_rdate_list (comp, NULL); + e_cal_component_set_rrule_list (comp, NULL); + e_cal_component_set_exdate_list (comp, NULL); + e_cal_component_set_exrule_list (comp, NULL); + + e_cal_component_commit_sequence (comp); + } + } + + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view))); + e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE); + + out: + gnome_canvas_item_hide (day_view->resize_long_event_rect_item); + + day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE; + + g_object_unref (comp); +} + + +/* This converts the resize start or end row back to a time and updates the + event. */ +static void +e_day_view_finish_resize (EDayView *day_view) +{ + EDayViewEvent *event; + gint day, event_num; + ECalComponent *comp; + ECalComponentDateTime date; + struct icaltimetype itt; + time_t dt; + ECal *client; + CalObjModType mod = CALOBJ_MOD_ALL; + GtkWindow *toplevel; + + day = day_view->resize_event_day; + event_num = day_view->resize_event_num; + event = &g_array_index (day_view->events[day], EDayViewEvent, + event_num); + + client = event->comp_data->client; + + /* We use a temporary shallow copy of the ico since we don't want to + change the original ico here. Otherwise we would not detect that + the event's time had changed in the "update_event" callback. */ + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + + if (e_cal_component_has_attendees (comp) && !itip_organizer_is_user (comp, client)) { + g_object_unref (comp); + e_day_view_abort_resize (day_view); + return; + } + + date.value = &itt; + /* FIXME: Should probably keep the timezone of the original start + and end times. */ + date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) { + dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_start_row); + *date.value = icaltime_from_timet_with_zone (dt, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtstart (comp, &date); + } else { + dt = e_day_view_convert_grid_position_to_time (day_view, day, day_view->resize_end_row + 1); + *date.value = icaltime_from_timet_with_zone (dt, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtend (comp, &date); + } + + e_cal_component_commit_sequence (comp); + + if (day_view->last_edited_comp_string != NULL) { + g_free (day_view->last_edited_comp_string); + day_view->last_edited_comp_string = NULL; + } + day_view->last_edited_comp_string = e_cal_component_get_as_string (comp); -void -e_day_view_finish_selection (EDayView *day_view) -{ - day_view->selection_is_being_dragged = FALSE; - e_day_view_update_calendar_selection_time (day_view); -} + gnome_canvas_item_hide (day_view->resize_rect_item); + gnome_canvas_item_hide (day_view->resize_bar_item); -static void -e_day_view_update_long_event_resize (EDayView *day_view, - gint day) -{ - /* event is never used here either, what's up? */ - EDayViewEvent *event; - gint event_num; - gboolean need_reshape = FALSE; + /* Hide the horizontal bars. */ + day_view->resize_bars_event_day = -1; + day_view->resize_bars_event_num = -1; + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); -#if 0 - g_print ("Updating resize Day:%i\n", day); -#endif + day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE; - event_num = day_view->resize_event_num; - event = &g_array_index (day_view->long_events, EDayViewEvent, - event_num); + if (e_cal_component_is_instance (comp)) { + if (!recur_component_dialog (client, comp, &mod, NULL, FALSE)) { + gtk_widget_queue_draw (day_view->top_canvas); + goto out; + } - if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_LEFT_EDGE) { - day = MIN (day, day_view->resize_end_row); - if (day != day_view->resize_start_row) { - need_reshape = TRUE; - day_view->resize_start_row = day; + if (mod == CALOBJ_MOD_THIS) { + /* set the correct DTSTART/DTEND on the individual recurrence */ + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) { + *date.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_end, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtend (comp, &date); + } else { + *date.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_start, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtstart (comp, &date); + } - } - } else { - day = MAX (day, day_view->resize_start_row); - if (day != day_view->resize_end_row) { - need_reshape = TRUE; - day_view->resize_end_row = day; + e_cal_component_set_rdate_list (comp, NULL); + e_cal_component_set_rrule_list (comp, NULL); + e_cal_component_set_exdate_list (comp, NULL); + e_cal_component_set_exrule_list (comp, NULL); } } + + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view))); - /* FIXME: Optimise? */ - if (need_reshape) { - e_day_view_reshape_long_event (day_view, event_num); - e_day_view_reshape_resize_long_event_rect_item (day_view); - gtk_widget_queue_draw (day_view->top_canvas); - } + e_cal_component_commit_sequence (comp); + e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE); + out: + g_object_unref (comp); } static void -e_day_view_update_resize (EDayView *day_view, - gint row) +e_day_view_abort_resize (EDayView *day_view) { - /* Same thing again? */ - EDayViewEvent *event; gint day, event_num; - gboolean need_reshape = FALSE; -#if 0 - g_print ("Updating resize Row:%i\n", row); -#endif + if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_NONE) + return; + + day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE; day = day_view->resize_event_day; event_num = day_view->resize_event_num; - event = &g_array_index (day_view->events[day], EDayViewEvent, - event_num); - if (day_view->resize_drag_pos == E_CALENDAR_VIEW_POS_TOP_EDGE) { - row = MIN (row, day_view->resize_end_row); - if (row != day_view->resize_start_row) { - need_reshape = TRUE; - day_view->resize_start_row = row; + if (day == E_DAY_VIEW_LONG_EVENT) { + e_day_view_reshape_long_event (day_view, event_num); + gtk_widget_queue_draw (day_view->top_canvas); - } + day_view->last_cursor_set_in_top_canvas = day_view->normal_cursor; + gdk_window_set_cursor (day_view->top_canvas->window, + day_view->normal_cursor); + gnome_canvas_item_hide (day_view->resize_long_event_rect_item); } else { - row = MAX (row, day_view->resize_start_row); - if (row != day_view->resize_end_row) { - need_reshape = TRUE; - day_view->resize_end_row = row; - } - } - - /* FIXME: Optimise? */ - if (need_reshape) { e_day_view_reshape_day_event (day_view, day, event_num); - e_day_view_reshape_resize_rect_item (day_view); e_day_view_reshape_main_canvas_resize_bars (day_view); gtk_widget_queue_draw (day_view->main_canvas); + + day_view->last_cursor_set_in_main_canvas = day_view->normal_cursor; + gdk_window_set_cursor (day_view->main_canvas->window, + day_view->normal_cursor); + gnome_canvas_item_hide (day_view->resize_rect_item); + gnome_canvas_item_hide (day_view->resize_bar_item); } } +#endif - -/* This converts the resize start or end row back to a time and updates the - event. */ +#ifdef ENABLE_CAIRO static void e_day_view_finish_long_event_resize (EDayView *day_view) { @@ -3971,7 +5299,7 @@ e_day_view_abort_resize (EDayView *day_view) day_view->normal_cursor); } } - +#endif static void e_day_view_free_events (EDayView *day_view) @@ -4513,6 +5841,64 @@ e_day_view_reshape_day_event (EDayView *day_view, /* This creates or resizes the horizontal bars used to resize events in the main canvas. */ +#ifndef ENABLE_CAIRO +static void +e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view) +{ + gint day, event_num; + gint item_x, item_y, item_w, item_h; + gdouble x, y, w, h; + + day = day_view->resize_bars_event_day; + event_num = day_view->resize_bars_event_num; + + /* If we're not editing an event, or the event is not shown, + hide the resize bars. */ + if (day != -1 && day == day_view->drag_event_day + && event_num == day_view->drag_event_num) { + g_object_get (G_OBJECT (day_view->drag_rect_item), + "x1", &x, + "y1", &y, + "x2", &w, + "y2", &h, + NULL); + w -= x; + x++; + h -= y; + } else if (day != -1 + && e_day_view_get_event_position (day_view, day, event_num, + &item_x, &item_y, + &item_w, &item_h)) { + x = item_x + E_DAY_VIEW_BAR_WIDTH; + y = item_y; + w = item_w - E_DAY_VIEW_BAR_WIDTH; + h = item_h; + } else { + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); + return; + } + + gnome_canvas_item_set (day_view->main_canvas_top_resize_bar_item, + "x1", x - E_DAY_VIEW_BAR_WIDTH, + "y1", y - E_DAY_VIEW_BAR_HEIGHT, + "x2", x + w - 1, + "y2", y - 1, + NULL); + gnome_canvas_item_show (day_view->main_canvas_top_resize_bar_item); + + gnome_canvas_item_set (day_view->main_canvas_bottom_resize_bar_item, + "x1", x - E_DAY_VIEW_BAR_WIDTH, + "y1", y + h, + "x2", x + w - 1, + "y2", y + h + E_DAY_VIEW_BAR_HEIGHT - 1, + NULL); + + gnome_canvas_item_show (day_view->main_canvas_bottom_resize_bar_item); +} +#endif + +#ifdef ENABLE_CAIRO static void e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view) { @@ -4550,7 +5936,7 @@ e_day_view_reshape_main_canvas_resize_bars (EDayView *day_view) return; } } - +#endif static void e_day_view_ensure_events_sorted (EDayView *day_view) @@ -5809,57 +7195,138 @@ e_day_view_event_move (ECalendarView *cal_view, ECalViewMoveDirection direction) if (resize_end_row < resize_start_row) resize_end_row = resize_start_row; - switch (direction) { - case E_CAL_VIEW_MOVE_UP: - if (resize_start_row <= 0) - return FALSE; - resize_start_row--; - resize_end_row--; - start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); - end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); - break; - case E_CAL_VIEW_MOVE_DOWN: - if (resize_end_row >= day_view->rows - 1) - return FALSE; - resize_start_row++; - resize_end_row++; - start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); - end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); - break; - case E_CAL_VIEW_MOVE_LEFT: - if (day <= 0) - return TRUE; - start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); - end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); - start_time = icaltime_from_timet (start_dt, 0); - end_time = icaltime_from_timet (end_dt, 0); - icaltime_adjust (&start_time ,-1,0,0,0); - icaltime_adjust (&end_time ,-1,0,0,0); - start_dt = icaltime_as_timet (start_time); - end_dt = icaltime_as_timet (end_time); - break; - case E_CAL_VIEW_MOVE_RIGHT: - if (day + 1 >= day_view->days_shown) - return TRUE; - start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); - end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); - start_time = icaltime_from_timet (start_dt, 0); - end_time = icaltime_from_timet (end_dt, 0); - icaltime_adjust (&start_time ,1,0,0,0); - icaltime_adjust (&end_time ,1,0,0,0); - start_dt = icaltime_as_timet (start_time); - end_dt = icaltime_as_timet (end_time); - break; - default: - return FALSE; + switch (direction) { + case E_CAL_VIEW_MOVE_UP: + if (resize_start_row <= 0) + return FALSE; + resize_start_row--; + resize_end_row--; + start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); + end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); + break; + case E_CAL_VIEW_MOVE_DOWN: + if (resize_end_row >= day_view->rows - 1) + return FALSE; + resize_start_row++; + resize_end_row++; + start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); + end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); + break; + case E_CAL_VIEW_MOVE_LEFT: + if (day <= 0) + return TRUE; + start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); + end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); + start_time = icaltime_from_timet (start_dt, 0); + end_time = icaltime_from_timet (end_dt, 0); + icaltime_adjust (&start_time ,-1,0,0,0); + icaltime_adjust (&end_time ,-1,0,0,0); + start_dt = icaltime_as_timet (start_time); + end_dt = icaltime_as_timet (end_time); + break; + case E_CAL_VIEW_MOVE_RIGHT: + if (day + 1 >= day_view->days_shown) + return TRUE; + start_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_start_row); + end_dt = e_day_view_convert_grid_position_to_time (day_view, day, resize_end_row + 1); + start_time = icaltime_from_timet (start_dt, 0); + end_time = icaltime_from_timet (end_dt, 0); + icaltime_adjust (&start_time ,1,0,0,0); + icaltime_adjust (&end_time ,1,0,0,0); + start_dt = icaltime_as_timet (start_time); + end_dt = icaltime_as_timet (end_time); + break; + default: + return FALSE; + } + + e_day_view_change_event_time (day_view, start_dt, end_dt); + e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row); + + return TRUE; +} + +#ifndef ENABLE_CAIRO +static void +e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt) +{ + EDayViewEvent *event; + gint day, event_num; + ECalComponent *comp; + ECalComponentDateTime date; + struct icaltimetype itt; + ECal *client; + CalObjModType mod = CALOBJ_MOD_ALL; + GtkWindow *toplevel; + + day = day_view->editing_event_day; + event_num = day_view->editing_event_num; + event = &g_array_index (day_view->events[day], EDayViewEvent, + event_num); + client = event->comp_data->client; + + /* We use a temporary shallow copy of the ico since we don't want to + change the original ico here. Otherwise we would not detect that + the event's time had changed in the "update_event" callback. */ + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + + if (e_cal_component_has_attendees (comp) && !itip_organizer_is_user (comp, client)) { + g_object_unref (comp); + return; + } + + date.value = &itt; + /* FIXME: Should probably keep the timezone of the original start + and end times. */ + date.tzid = icaltimezone_get_tzid (e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + + *date.value = icaltime_from_timet_with_zone (start_dt, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtstart (comp, &date); + *date.value = icaltime_from_timet_with_zone (end_dt, FALSE, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + e_cal_component_set_dtend (comp, &date); + + e_cal_component_commit_sequence (comp); + + if (day_view->last_edited_comp_string != NULL) { + g_free (day_view->last_edited_comp_string); + day_view->last_edited_comp_string = NULL; + } + + day_view->last_edited_comp_string = e_cal_component_get_as_string (comp); + + gnome_canvas_item_hide (day_view->resize_rect_item); + gnome_canvas_item_hide (day_view->resize_bar_item); + + day_view->resize_drag_pos = E_CALENDAR_VIEW_POS_NONE; + + if (e_cal_component_is_instance (comp)) { + if (!recur_component_dialog (client, comp, &mod, NULL, FALSE)) { + gtk_widget_queue_draw (day_view->top_canvas); + goto out; + } + + if (mod == CALOBJ_MOD_THIS) { + e_cal_component_set_rdate_list (comp, NULL); + e_cal_component_set_rrule_list (comp, NULL); + e_cal_component_set_exdate_list (comp, NULL); + e_cal_component_set_exrule_list (comp, NULL); + } } - e_day_view_change_event_time (day_view, start_dt, end_dt); - e_day_view_ensure_rows_visible (day_view, resize_start_row, resize_end_row); + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view))); - return TRUE; + e_cal_component_commit_sequence (comp); + e_calendar_view_modify_and_send (comp, client, mod, toplevel, TRUE); + +out: + g_object_unref (comp); } +#endif +#ifdef ENABLE_CAIRO static void e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt) { @@ -5934,6 +7401,7 @@ e_day_view_change_event_time (EDayView *day_view, time_t start_dt, time_t end_dt out: g_object_unref (comp); } +#endif static void e_day_view_change_event_end_time_up (EDayView *day_view) @@ -6035,6 +7503,167 @@ e_day_view_on_editing_started (EDayView *day_view, g_signal_emit_by_name (day_view, "selection_changed"); } +#ifndef ENABLE_CAIRO +static void +e_day_view_on_editing_stopped (EDayView *day_view, + GnomeCanvasItem *item) +{ + gint day, event_num; + EDayViewEvent *event; + gchar *text = NULL; + ECalComponentText summary; + ECalComponent *comp; + ECal *client; + gboolean on_server; + + /* Note: the item we are passed here isn't reliable, so we just stop + the edit of whatever item was being edited. We also receive this + event twice for some reason. */ + 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) + return; + + if (day == E_DAY_VIEW_LONG_EVENT) { + event = &g_array_index (day_view->long_events, EDayViewEvent, + event_num); + } else { + event = &g_array_index (day_view->events[day], EDayViewEvent, + event_num); + + /* Hide the horizontal bars. */ + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); + } + + /* Reset the edit fields. */ + day_view->editing_event_day = -1; + day_view->editing_event_num = -1; + + day_view->resize_bars_event_day = -1; + day_view->resize_bars_event_num = -1; + + g_object_set (event->canvas_item, "handle_popup", FALSE, NULL); + g_object_get (G_OBJECT (event->canvas_item), + "text", &text, + NULL); + g_assert (text != NULL); + + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (event->comp_data->icalcomp)); + + client = event->comp_data->client; + on_server = cal_comp_is_on_server (comp, client); + + if (string_is_empty (text) && !on_server) { + const char *uid; + + e_cal_component_get_uid (comp, &uid); + + e_day_view_foreach_event_with_uid (day_view, uid, + 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); + goto out; + } + + /* Only update the summary if necessary. */ + e_cal_component_get_summary (comp, &summary); + if (summary.value && !strcmp (text, summary.value)) { + if (day == E_DAY_VIEW_LONG_EVENT) + e_day_view_reshape_long_event (day_view, event_num); + else + e_day_view_update_event_label (day_view, day, + event_num); + } else if (summary.value || !string_is_empty (text)) { + icalcomponent *icalcomp = e_cal_component_get_icalcomponent (comp); + + summary.value = text; + summary.altrep = NULL; + e_cal_component_set_summary (comp, &summary); + e_cal_component_commit_sequence (comp); + + if (!on_server) { + if (!e_cal_create_object (client, icalcomp, NULL, NULL)) + g_message (G_STRLOC ": Could not create the object!"); + else + g_signal_emit_by_name (day_view, "user_created"); + + /* we remove the object since we either got the update from the server or failed */ + e_day_view_remove_event_cb (day_view, day, event_num, NULL); + } else { + CalObjModType mod = CALOBJ_MOD_ALL; + GtkWindow *toplevel; + if (e_cal_component_is_instance (comp)) { + if (!recur_component_dialog (client, comp, &mod, NULL, FALSE)) { + goto out; + } + + if (mod == CALOBJ_MOD_THIS) { + ECalComponentDateTime dt; + + e_cal_component_get_dtstart (comp, &dt); + if (dt.value->zone) { + *dt.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_start, + dt.value->is_date, + dt.value->zone); + } else { + *dt.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_start, + dt.value->is_date, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + } + e_cal_component_set_dtstart (comp, &dt); + + e_cal_component_get_dtend (comp, &dt); + if (dt.value->zone) { + *dt.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_end, + dt.value->is_date, + dt.value->zone); + } else { + *dt.value = icaltime_from_timet_with_zone ( + event->comp_data->instance_end, + dt.value->is_date, + e_calendar_view_get_timezone (E_CALENDAR_VIEW (day_view))); + } + e_cal_component_set_dtend (comp, &dt); + + e_cal_component_set_rdate_list (comp, NULL); + e_cal_component_set_rrule_list (comp, NULL); + e_cal_component_set_exdate_list (comp, NULL); + e_cal_component_set_exrule_list (comp, NULL); + + e_cal_component_commit_sequence (comp); + } + } + + /* FIXME When sending here, what exactly should we send? */ + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (day_view))); + e_calendar_view_modify_and_send (comp, client, mod, toplevel, FALSE); + } + + } + + out: + + g_object_unref (comp); + g_free (text); + + g_signal_emit_by_name (day_view, "selection_changed"); +} +#endif + +#ifdef ENABLE_CAIRO static void e_day_view_on_editing_stopped (EDayView *day_view, GnomeCanvasItem *item) @@ -6190,6 +7819,7 @@ e_day_view_on_editing_stopped (EDayView *day_view, g_signal_emit_by_name (day_view, "selection_changed"); } +#endif /* FIXME: It is possible that we may produce an invalid time due to daylight @@ -7018,7 +8648,7 @@ e_day_view_on_top_canvas_drag_leave (GtkWidget *widget, gnome_canvas_item_hide (day_view->drag_long_event_item); } - +#ifndef ENABLE_CAIRO static void e_day_view_on_main_canvas_drag_leave (GtkWidget *widget, GdkDragContext *context, @@ -7036,9 +8666,33 @@ e_day_view_on_main_canvas_drag_leave (GtkWidget *widget, /* 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) { + gnome_canvas_item_hide (day_view->main_canvas_top_resize_bar_item); + gnome_canvas_item_hide (day_view->main_canvas_bottom_resize_bar_item); } } +#endif + +#ifdef ENABLE_CAIRO +static void +e_day_view_on_main_canvas_drag_leave (GtkWidget *widget, + GdkDragContext *context, + guint time, + EDayView *day_view) +{ + day_view->drag_last_day = -1; + + e_day_view_stop_auto_scroll (day_view); + + gnome_canvas_item_hide (day_view->drag_rect_item); + gnome_canvas_item_hide (day_view->drag_bar_item); + gnome_canvas_item_hide (day_view->drag_item); + /* 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) { + } +} +#endif static void e_day_view_on_drag_begin (GtkWidget *widget, diff --git a/configure.in b/configure.in index 2c6564ff04..92cbcd68b7 100644 --- a/configure.in +++ b/configure.in @@ -506,6 +506,19 @@ else fi AM_CONDITIONAL(ENABLE_IMAP4, test x$enable_imap4 = xyes) +dnl ************************************************** +dnl Cairo Calendar support. +dnl ************************************************** +AC_ARG_ENABLE(cairo-calendar, +[ --enable-cairo-calendar=[no/yes] Build evolution calendar with cairo support.],,enable_cairo_calendar="yes") +if test "x$enable_cairo_calendar" = "xyes"; then + AC_DEFINE(ENABLE_CAIRO,1,[Build evolution with cairo support]) + msg_cairo=yes +else + msg_cairo=no +fi +AM_CONDITIONAL(ENABLE_CAIRO, test x$enable_cairo_calendar = xyes) + dnl ************************************************** dnl * Posix thread support dnl ************************************************** diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog index 5f1d722347..2d1f04c25c 100644 --- a/widgets/misc/ChangeLog +++ b/widgets/misc/ChangeLog @@ -1,3 +1,8 @@ +2006-07-28 Srinivasa Ragavan + + * e-calendar-item.c: Removed the hardcoded ENABLE_CAIRO for tag + calendar. + 2006-07-22 Yuri Pankov Reviewed by Harish Krishnaswamy diff --git a/widgets/misc/e-calendar-item.c b/widgets/misc/e-calendar-item.c index 05dbe3c583..17b830d608 100644 --- a/widgets/misc/e-calendar-item.c +++ b/widgets/misc/e-calendar-item.c @@ -47,8 +47,6 @@ #include #include -#define ENABLE_CAIRO 1 - static const int e_calendar_item_days_in_month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; -- cgit v1.2.3