diff options
-rw-r--r-- | calendar/ChangeLog | 25 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.c | 73 | ||||
-rw-r--r-- | calendar/cal-util/cal-component.h | 2 | ||||
-rw-r--r-- | calendar/gui/e-day-view-main-item.c | 15 | ||||
-rw-r--r-- | calendar/gui/e-day-view-top-item.c | 55 | ||||
-rw-r--r-- | calendar/gui/e-day-view.c | 106 | ||||
-rw-r--r-- | calendar/gui/e-day-view.h | 13 | ||||
-rw-r--r-- | calendar/gui/e-week-view-event-item.c | 27 | ||||
-rw-r--r-- | calendar/gui/e-week-view-main-item.c | 33 | ||||
-rw-r--r-- | calendar/gui/e-week-view.c | 67 | ||||
-rw-r--r-- | calendar/gui/e-week-view.h | 5 |
11 files changed, 324 insertions, 97 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index 5505ce2b42..000cb7756d 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,28 @@ +2001-01-17 Damon Chaplin <damon@helixcode.com> + + * gui/e-week-view*.c + * gui/e-day-view*.c: don't use the theme colors at all within + the graphical parts of the widgets, since they may clash with + our colors. May make them configurable in future so people can tweak + them to go with their theme. At least the calendars are usable in any + theme now, even though the colors may not go well with the theme. + Also set the font of all the EText items in style_set. + + * gui/e-week-view-event-item.c (e_week_view_event_item_draw): don't + draw the icons if we are editing the event. + + * gui/e-day-view.c: + * gui/e-week-view.c: reinstated the optimizations so we don't do a + complete relayout if the event's dates haven't been changed. + (Though we still do a re-layout when recurring events change, since + comparing all the RDATES/RRULES/EXDATES/EXRULES is too much hassle.) + A side-effect of this change is that the EWeekView won't crash so + often - only recurring events will be a problem. + + * cal-util/cal-component.[hc]: added function to check if the start + and end dates of a component match. Used for optimizing the updating + of the EDayView & EWeekView. + 2001-01-17 JP Rosevear <jpr@ximian.com> * conduits/calendar/calendar-conduit.c (start_calendar_server): Check diff --git a/calendar/cal-util/cal-component.c b/calendar/cal-util/cal-component.c index 2c01991a90..daf50600c8 100644 --- a/calendar/cal-util/cal-component.c +++ b/calendar/cal-util/cal-component.c @@ -3890,3 +3890,76 @@ cal_component_alarm_set_trigger (CalComponentAlarm *alarm, CalAlarmTrigger trigg } } } + + +/** + * cal_component_event_dates_match: + * @comp1: A calendar component object. + * @comp2: A calendar component object. + * + * Checks if the DTSTART and DTEND properties of the 2 components match. + * Note that the events may have different recurrence properties which are not + * taken into account here. + * + * Returns: TRUE if the DTSTART and DTEND properties of the 2 components match. + **/ +gboolean +cal_component_event_dates_match (CalComponent *comp1, + CalComponent *comp2) +{ + CalComponentDateTime comp1_dtstart, comp1_dtend; + CalComponentDateTime comp2_dtstart, comp2_dtend; + + cal_component_get_dtstart (comp1, &comp1_dtstart); + cal_component_get_dtend (comp1, &comp1_dtend); + cal_component_get_dtstart (comp2, &comp2_dtstart); + cal_component_get_dtend (comp2, &comp2_dtend); + + /* If either value is NULL they must both be NULL to match. */ + if (comp1_dtstart.value == NULL || comp2_dtstart.value == NULL) { + if (comp1_dtstart.value != comp2_dtstart.value) + return FALSE; + } else { + if (icaltime_compare (*comp1_dtstart.value, + *comp2_dtstart.value)) + return FALSE; + } + + if (comp1_dtend.value == NULL || comp2_dtend.value == NULL) { + if (comp1_dtend.value != comp2_dtend.value) + return FALSE; + } else { + if (icaltime_compare (*comp1_dtend.value, + *comp2_dtend.value)) + return FALSE; + } + + /* Now check the timezones. */ + if (!cal_component_strings_match (comp1_dtstart.tzid, + comp2_dtstart.tzid)) + return FALSE; + + if (!cal_component_strings_match (comp1_dtend.tzid, + comp2_dtend.tzid)) + return FALSE; + + return TRUE; +} + + +/* Returns TRUE if both strings match, i.e. they are both NULL or the + strings are equal. */ +static gboolean +cal_component_strings_match (const gchar *string1, + const gchar *string2) +{ + if (string1 == NULL || string2 == NULL) + return (string1 == string2) ? TRUE : FALSE; + + if (!strcmp (string1, string2)) + return TRUE; + + return FALSE; +} + + diff --git a/calendar/cal-util/cal-component.h b/calendar/cal-util/cal-component.h index 7f77544467..b7d8b602e9 100644 --- a/calendar/cal-util/cal-component.h +++ b/calendar/cal-util/cal-component.h @@ -255,6 +255,8 @@ void cal_component_set_transparency (CalComponent *comp, CalComponentTransparenc void cal_component_get_url (CalComponent *comp, const char **url); void cal_component_set_url (CalComponent *comp, const char *url); +gboolean cal_component_event_dates_match (CalComponent *comp1, CalComponent *comp2); + /* Functions to free returned values */ void cal_component_free_categories_list (GSList *categ_list); diff --git a/calendar/gui/e-day-view-main-item.c b/calendar/gui/e-day-view-main-item.c index 6867434d53..3cab1f1a05 100644 --- a/calendar/gui/e-day-view-main-item.c +++ b/calendar/gui/e-day-view-main-item.c @@ -182,7 +182,7 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, EDayViewMainItem *dvmitem; EDayView *day_view; GtkStyle *style; - GdkGC *fg_gc, *bg_gc, *light_gc, *dark_gc, *gc; + GdkGC *gc; GdkFont *font; gint row, row_y, grid_x1, grid_x2; gint day, grid_y1, grid_y2; @@ -202,10 +202,6 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, style = GTK_WIDGET (day_view)->style; font = style->font; - fg_gc = style->fg_gc[GTK_STATE_NORMAL]; - bg_gc = style->bg_gc[GTK_STATE_NORMAL]; - light_gc = style->light_gc[GTK_STATE_NORMAL]; - dark_gc = style->dark_gc[GTK_STATE_NORMAL]; /* Paint the background colors. */ gc = day_view->main_gc; @@ -266,7 +262,7 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, rect_y = start_row * day_view->row_height - y; rect_height = (end_row - start_row + 1) * day_view->row_height; - gc = style->bg_gc[GTK_STATE_SELECTED]; + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED]); gdk_draw_rectangle (drawable, gc, TRUE, rect_x, rect_y, rect_width, rect_height); @@ -277,11 +273,12 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, grid_x1 = day_view->day_offsets[0] - x; grid_x2 = day_view->day_offsets[day_view->days_shown] - x; + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_GRID]); for (row = 0, row_y = 0 - y; row < day_view->rows && row_y < height; row++, row_y += day_view->row_height) { if (row_y >= 0 && row_y < height) - gdk_draw_line (drawable, dark_gc, + gdk_draw_line (drawable, gc, grid_x1, row_y, grid_x2, row_y); } @@ -295,10 +292,10 @@ e_day_view_main_item_draw (GnomeCanvasItem *canvas_item, GdkDrawable *drawable, if (grid_x1 >= width || grid_x1 + E_DAY_VIEW_BAR_WIDTH <= 0) continue; - gdk_draw_line (drawable, fg_gc, + gdk_draw_line (drawable, style->black_gc, grid_x1, grid_y1, grid_x1, grid_y2); - gdk_draw_line (drawable, fg_gc, + gdk_draw_line (drawable, style->black_gc, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y1, grid_x1 + E_DAY_VIEW_BAR_WIDTH - 1, grid_y2); gdk_draw_rectangle (drawable, style->white_gc, TRUE, diff --git a/calendar/gui/e-day-view-top-item.c b/calendar/gui/e-day-view-top-item.c index 145809893f..8995832399 100644 --- a/calendar/gui/e-day-view-top-item.c +++ b/calendar/gui/e-day-view-top-item.c @@ -182,7 +182,7 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, EDayViewTopItem *dvtitem; EDayView *day_view; GtkStyle *style; - GdkGC *fg_gc, *bg_gc, *light_gc, *dark_gc; + GdkGC *gc, *fg_gc, *bg_gc, *light_gc, *dark_gc; gchar buffer[128], *format; GdkRectangle clip_rect; GdkFont *font; @@ -200,6 +200,7 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, style = GTK_WIDGET (day_view)->style; font = style->font; + gc = day_view->main_gc; fg_gc = style->fg_gc[GTK_STATE_NORMAL]; bg_gc = style->bg_gc[GTK_STATE_NORMAL]; light_gc = style->light_gc[GTK_STATE_NORMAL]; @@ -209,11 +210,6 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, left_edge = 0; item_height = day_view->top_row_height - E_DAY_VIEW_TOP_CANVAS_Y_GAP; - /* Clear the entire background. */ - gdk_draw_rectangle (drawable, dark_gc, TRUE, - left_edge - x, 0, - canvas_width - left_edge, height); - /* Draw the shadow around the dates. */ gdk_draw_line (drawable, light_gc, left_edge + 1 - x, 1 - y, @@ -221,6 +217,12 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, gdk_draw_line (drawable, light_gc, left_edge + 1 - x, 2 - y, left_edge + 1 - x, item_height - 1 - y); + gdk_draw_line (drawable, dark_gc, + left_edge + 2 - x, item_height - 1 - y, + canvas_width - 1 - x, item_height - 1 - y); + gdk_draw_line (drawable, dark_gc, + canvas_width - 1 - x, 1 - y, + canvas_width - 1 - x, item_height - 1 - y); /* Draw the background for the dates. */ gdk_draw_rectangle (drawable, bg_gc, TRUE, @@ -228,6 +230,13 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, canvas_width - left_edge - 3, item_height - 3); + /* Clear the main area background. */ + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS]); + gdk_draw_rectangle (drawable, gc, TRUE, + left_edge - x, item_height - y, + canvas_width - left_edge, + canvas_height - item_height); + /* Draw the selection background. */ if (GTK_WIDGET_HAS_FOCUS (day_view) && day_view->selection_start_day != -1) { @@ -244,7 +253,8 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, rect_w = day_view->day_offsets[end_col + 1] - rect_x; rect_h = canvas_height - 1 - rect_y; - gdk_draw_rectangle (drawable, style->white_gc, TRUE, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED]); + gdk_draw_rectangle (drawable, gc, TRUE, rect_x - x, rect_y - y, rect_w, rect_h); } @@ -302,7 +312,8 @@ e_day_view_top_item_draw (GnomeCanvasItem *canvas_item, /* Draw the lines between each column. */ if (day != 0) { - gdk_draw_line (drawable, style->black_gc, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID]); + gdk_draw_line (drawable, gc, day_view->day_offsets[day] - x, item_height - y, day_view->day_offsets[day] - x, @@ -371,15 +382,17 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, comp = event->comp; /* Draw the lines across the top & bottom of the entire event. */ - gdk_draw_line (drawable, fg_gc, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + gdk_draw_line (drawable, gc, item_x - x, item_y - y, item_x + item_w - 1 - x, item_y - y); - gdk_draw_line (drawable, fg_gc, + gdk_draw_line (drawable, gc, item_x - x, item_y + item_h - 1 - y, item_x + item_w - 1 - x, item_y + item_h - 1 - y); /* Fill it in. */ - gdk_draw_rectangle (drawable, bg_gc, TRUE, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); + gdk_draw_rectangle (drawable, gc, TRUE, item_x - x, item_y + 1 - y, item_w, item_h - 2); @@ -405,7 +418,8 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, -E_DAY_VIEW_BAR_WIDTH, item_h); } else { - gdk_draw_line (drawable, fg_gc, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + gdk_draw_line (drawable, gc, item_x - x, item_y - y, item_x - x, item_y + item_h - 1 - y); } @@ -419,7 +433,8 @@ e_day_view_top_item_draw_long_event (EDayViewTopItem *dvtitem, E_DAY_VIEW_BAR_WIDTH, item_h); } else { - gdk_draw_line (drawable, fg_gc, + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + gdk_draw_line (drawable, gc, item_x + item_w - 1 - x, item_y - y, item_x + item_w - 1 - x, @@ -565,15 +580,14 @@ e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem, { EDayView *day_view; GtkStyle *style; - GdkGC *fg_gc, *bg_gc; + GdkGC *gc; GdkPoint points[3]; gint c1, c2; day_view = dvtitem->day_view; style = GTK_WIDGET (day_view)->style; - fg_gc = style->fg_gc[GTK_STATE_NORMAL]; - bg_gc = style->bg_gc[GTK_STATE_NORMAL]; + gc = day_view->main_gc; points[0].x = x; points[0].y = y; @@ -588,9 +602,12 @@ e_day_view_top_item_draw_triangle (EDayViewTopItem *dvtitem, if (h % 2 == 0) c1--; - gdk_draw_polygon (drawable, bg_gc, TRUE, points, 3); - gdk_draw_line (drawable, fg_gc, x, y, x + w, c1); - gdk_draw_line (drawable, fg_gc, x, y + h - 1, x + w, c2); + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND]); + gdk_draw_polygon (drawable, gc, TRUE, points, 3); + + gdk_gc_set_foreground (gc, &day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER]); + gdk_draw_line (drawable, gc, x, y, x + w, c1); + gdk_draw_line (drawable, gc, x, y + h - 1, x + w, c2); } diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c index 1960071cdd..47c19dff75 100644 --- a/calendar/gui/e-day-view.c +++ b/calendar/gui/e-day-view.c @@ -385,12 +385,10 @@ static void e_day_view_on_main_canvas_drag_data_received (GtkWidget *widget guint time, EDayView *day_view); -#if 0 static gboolean e_day_view_update_event_cb (EDayView *day_view, gint day, gint event_num, gpointer data); -#endif static gboolean e_day_view_remove_event_cb (EDayView *day_view, gint day, gint event_num, @@ -404,6 +402,10 @@ static time_t e_day_view_find_work_week_start (EDayView *day_view, time_t start_time); static void e_day_view_recalc_work_week (EDayView *day_view); static void e_day_view_recalc_work_week_days_shown (EDayView *day_view); +static gboolean e_day_view_set_event_font_cb (EDayView *day_view, + gint day, + gint event_num, + gpointer data); static GtkTableClass *parent_class; @@ -883,6 +885,26 @@ e_day_view_realize (GtkWidget *widget) day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].green = 216 * 257; day_view->colors[E_DAY_VIEW_COLOR_BG_NOT_WORKING].blue = 214 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED].red = 0 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED].green = 0 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_SELECTED].blue = 156 * 257; + + day_view->colors[E_DAY_VIEW_COLOR_BG_GRID].red = 148 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_GRID].green = 149 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_GRID].blue = 148 * 257; + + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS].red = 148 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS].green = 149 * 257; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS].blue = 148 * 257; + + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED].red = 65535; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED].green = 65535; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED].blue = 65535; + + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID].red = 0; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID].green = 0; + day_view->colors[E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID].blue = 0; + day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].red = 0; day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].green = 0; day_view->colors[E_DAY_VIEW_COLOR_EVENT_VBAR].blue = 65535; @@ -895,6 +917,14 @@ e_day_view_realize (GtkWidget *widget) day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER].green = 0; day_view->colors[E_DAY_VIEW_COLOR_EVENT_BORDER].blue = 0; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].red = 213 * 257; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].green = 213 * 257; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND].blue = 213 * 257; + + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER].red = 0; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER].green = 0; + day_view->colors[E_DAY_VIEW_COLOR_LONG_EVENT_BORDER].blue = 0; + nfailed = gdk_colormap_alloc_colors (colormap, day_view->colors, E_DAY_VIEW_COLOR_LAST, FALSE, TRUE, success); @@ -950,16 +980,6 @@ e_day_view_realize (GtkWidget *widget) "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 the fonts for the text items used when dragging. */ - gnome_canvas_item_set (day_view->drag_long_event_item, - "font_gdk", GTK_WIDGET (day_view)->style->font, - NULL); - - gnome_canvas_item_set (day_view->drag_item, - "font_gdk", GTK_WIDGET (day_view)->style->font, - NULL); } @@ -1108,6 +1128,44 @@ e_day_view_style_set (GtkWidget *widget, /* 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); + + /* Set the font of all the EText items. */ + e_day_view_foreach_event (day_view, e_day_view_set_event_font_cb, + font); + + /* Set the fonts for the text items used when dragging. */ + gnome_canvas_item_set (day_view->drag_long_event_item, + "font_gdk", GTK_WIDGET (day_view)->style->font, + NULL); + + gnome_canvas_item_set (day_view->drag_item, + "font_gdk", GTK_WIDGET (day_view)->style->font, + NULL); +} + + +static gboolean +e_day_view_set_event_font_cb (EDayView *day_view, + gint day, + gint event_num, + gpointer data) +{ + EDayViewEvent *event; + GdkFont *font = data; + + 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); + + if (event->canvas_item) + gnome_canvas_item_set (event->canvas_item, + "font_gdk", font, + NULL); + + return TRUE; } @@ -1367,21 +1425,20 @@ obj_updated_cb (CalClient *client, const char *uid, gpointer data) else event = &g_array_index (day_view->events[day], EDayViewEvent, event_num); -#ifndef NO_WARNINGS -#warning "FIXME" -#endif - /* Do this the long way every time for now */ + if (!cal_component_has_recurrences (comp) + && !cal_component_has_recurrences (event->comp) + && cal_component_event_dates_match (comp, event->comp)) { #if 0 - if (ical_object_compare_dates (event->ico, ico)) { g_print ("updated object's dates unchanged\n"); - e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_update_event_cb, ico); - ical_object_unref (ico); +#endif + e_day_view_foreach_event_with_uid (day_view, uid, e_day_view_update_event_cb, comp); + gtk_object_unref (GTK_OBJECT (comp)); gtk_widget_queue_draw (day_view->top_canvas); gtk_widget_queue_draw (day_view->main_canvas); return; } -#endif + /* The dates have changed, so we need to remove the old occurrrences before adding the new ones. */ #if 0 @@ -1405,6 +1462,7 @@ obj_updated_cb (CalClient *client, const char *uid, gpointer data) gtk_widget_queue_draw (day_view->main_canvas); } + /* Callback used when the calendar client tells us that an object was removed */ static void obj_removed_cb (CalClient *client, const char *uid, gpointer data) @@ -1466,7 +1524,7 @@ e_day_view_set_cal_client (EDayView *day_view, e_day_view_queue_reload_events (day_view); } -#if 0 + static gboolean e_day_view_update_event_cb (EDayView *day_view, gint day, @@ -1502,10 +1560,10 @@ e_day_view_update_event_cb (EDayView *day_view, } return TRUE; } -#endif + /* This calls a given function for each event instance (in both views). - If the callback returns TRUE the iteration is stopped. + If the callback returns FALSE the iteration is stopped. Note that it is safe for the callback to remove the event (since we step backwards through the arrays). */ static void @@ -1542,7 +1600,7 @@ e_day_view_foreach_event (EDayView *day_view, /* This calls a given function for each event instance that matches the given - uid. If the callback returns TRUE the iteration is stopped. + uid. If the callback returns FALSE the iteration is stopped. Note that it is safe for the callback to remove the event (since we step backwards through the arrays). */ static void diff --git a/calendar/gui/e-day-view.h b/calendar/gui/e-day-view.h index b02bcd7710..2379a76b87 100644 --- a/calendar/gui/e-day-view.h +++ b/calendar/gui/e-day-view.h @@ -136,11 +136,20 @@ typedef enum { E_DAY_VIEW_COLOR_BG_WORKING, E_DAY_VIEW_COLOR_BG_NOT_WORKING, - E_DAY_VIEW_COLOR_EVENT_VBAR, + E_DAY_VIEW_COLOR_BG_SELECTED, + E_DAY_VIEW_COLOR_BG_GRID, + + E_DAY_VIEW_COLOR_BG_TOP_CANVAS, + E_DAY_VIEW_COLOR_BG_TOP_CANVAS_SELECTED, + E_DAY_VIEW_COLOR_BG_TOP_CANVAS_GRID, + E_DAY_VIEW_COLOR_EVENT_VBAR, E_DAY_VIEW_COLOR_EVENT_BACKGROUND, E_DAY_VIEW_COLOR_EVENT_BORDER, - + + E_DAY_VIEW_COLOR_LONG_EVENT_BACKGROUND, + E_DAY_VIEW_COLOR_LONG_EVENT_BORDER, + E_DAY_VIEW_COLOR_LAST } EDayViewColors; diff --git a/calendar/gui/e-week-view-event-item.c b/calendar/gui/e-week-view-event-item.c index 5615e86bb6..8adfdd96ff 100644 --- a/calendar/gui/e-week-view-event-item.c +++ b/calendar/gui/e-week-view-event-item.c @@ -416,13 +416,15 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, clip_rect.width = x2 - x1 - E_WEEK_VIEW_EVENT_R_PAD - E_WEEK_VIEW_EVENT_BORDER_WIDTH + 1; clip_rect.height = y2 - y1 + 1; - gdk_gc_set_clip_rectangle (fg_gc, &clip_rect); + gdk_gc_set_clip_rectangle (gc, &clip_rect); + + 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); - gdk_gc_set_clip_rectangle (fg_gc, NULL); + gdk_gc_set_clip_rectangle (gc, NULL); /* We don't want the end time to be drawn over the start time, so we increase the minimum position. */ @@ -455,7 +457,9 @@ e_week_view_event_item_draw (GnomeCanvasItem *canvas_item, } /* Draw the icons. */ - if (span->text_item) { + if (span->text_item && + week_view->editing_event_num != wveitem->event_num + && week_view->editing_span_num != wveitem->span_num) { icon_x = span->text_item->x1 - x; e_week_view_event_item_draw_icons (wveitem, drawable, icon_x, icon_y, @@ -474,7 +478,7 @@ e_week_view_draw_time (EWeekView *week_view, gint minute) { GtkStyle *style; - GdkGC *fg_gc; + GdkGC *gc; GdkFont *font, *small_font; gint hour_to_display, suffix_width; gint time_y_normal_font, time_y_small_font; @@ -483,7 +487,8 @@ e_week_view_draw_time (EWeekView *week_view, style = GTK_WIDGET (week_view)->style; font = style->font; small_font = week_view->small_font; - fg_gc = style->fg_gc[GTK_STATE_NORMAL]; + gc = week_view->main_gc; + time_y_normal_font = time_y_small_font = time_y + font->ascent; if (small_font) @@ -498,24 +503,24 @@ e_week_view_draw_time (EWeekView *week_view, /* Draw the hour. */ if (hour_to_display < 10) - gdk_draw_text (drawable, font, fg_gc, + gdk_draw_text (drawable, font, gc, time_x + week_view->digit_width, time_y_normal_font, buffer + 1, 1); else - gdk_draw_text (drawable, font, fg_gc, + gdk_draw_text (drawable, font, gc, time_x, time_y_normal_font, buffer, 2); time_x += week_view->digit_width * 2; /* Draw the start minute, in the small font. */ - gdk_draw_text (drawable, week_view->small_font, fg_gc, + gdk_draw_text (drawable, week_view->small_font, gc, time_x, time_y_small_font, buffer + 3, 2); time_x += week_view->small_digit_width * 2; /* Draw the 'am'/'pm' suffix, if 12-hour format. */ if (!week_view->use_24_hour_format) { - gdk_draw_string (drawable, font, fg_gc, + gdk_draw_string (drawable, font, gc, time_x, time_y_normal_font, suffix); } } else { @@ -523,11 +528,11 @@ e_week_view_draw_time (EWeekView *week_view, g_snprintf (buffer, sizeof (buffer), "%2i:%02i%s", hour_to_display, minute, suffix); if (hour_to_display < 10) - gdk_draw_string (drawable, font, fg_gc, + gdk_draw_string (drawable, font, gc, time_x + week_view->digit_width, time_y_normal_font, buffer + 1); else - gdk_draw_string (drawable, font, fg_gc, + gdk_draw_string (drawable, font, gc, time_x, time_y_normal_font, buffer); diff --git a/calendar/gui/e-week-view-main-item.c b/calendar/gui/e-week-view-main-item.c index 10990324ff..e1959489b1 100644 --- a/calendar/gui/e-week-view-main-item.c +++ b/calendar/gui/e-week-view-main-item.c @@ -223,8 +223,7 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, { EWeekView *week_view; GtkStyle *style; - GdkGC *fg_gc, *bg_gc, *light_gc, *dark_gc, *gc, *date_gc; - GdkGC *selected_fg_gc, *selected_bg_gc; + GdkGC *gc; GdkFont *font; gint right_edge, bottom_edge, date_width, date_x, line_y; gboolean show_day_name, show_month_name, selected; @@ -238,12 +237,6 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, week_view = wvmitem->week_view; style = GTK_WIDGET (week_view)->style; font = style->font; - fg_gc = style->fg_gc[GTK_STATE_NORMAL]; - bg_gc = style->bg_gc[GTK_STATE_PRELIGHT]; - light_gc = style->light_gc[GTK_STATE_NORMAL]; - dark_gc = style->dark_gc[GTK_STATE_NORMAL]; - selected_fg_gc = style->fg_gc[GTK_STATE_SELECTED]; - selected_bg_gc = style->bg_gc[GTK_STATE_SELECTED]; gc = week_view->main_gc; g_return_if_fail (gc != NULL); @@ -272,9 +265,10 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, right_edge = x + width - 1; bottom_edge = y + height - 1; - gdk_draw_line (drawable, fg_gc, + gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); + gdk_draw_line (drawable, gc, right_edge, y, right_edge, bottom_edge); - gdk_draw_line (drawable, fg_gc, + gdk_draw_line (drawable, gc, x, bottom_edge, right_edge, bottom_edge); /* If the day is selected, draw the blue background. */ @@ -285,16 +279,18 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, || week_view->selection_end_day < day) selected = FALSE; if (selected) { - if (week_view->multi_week_view) - gdk_draw_rectangle (drawable, selected_bg_gc, TRUE, + gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_SELECTED]); + if (week_view->multi_week_view) { + gdk_draw_rectangle (drawable, gc, TRUE, x + 2, y + 1, width - 5, E_WEEK_VIEW_DATE_T_PAD - 1 + font->ascent + font->descent); - else - gdk_draw_rectangle (drawable, selected_bg_gc, TRUE, + } else { + gdk_draw_rectangle (drawable, gc, TRUE, x + 2, y + 1, width - 5, line_y - y); + } } /* Display the date in the top of the cell. @@ -355,16 +351,17 @@ e_week_view_main_item_draw_day (EWeekViewMainItem *wvmitem, date_x = MAX (date_x, x + 1); if (selected) - date_gc = selected_fg_gc; + gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED]); else - date_gc = fg_gc; - gdk_draw_string (drawable, font, date_gc, + gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_DATES]); + gdk_draw_string (drawable, font, gc, date_x, y + E_WEEK_VIEW_DATE_T_PAD + font->ascent, buffer); /* Draw the line under the date. */ if (!week_view->multi_week_view) { - gdk_draw_line (drawable, fg_gc, + gdk_gc_set_foreground (gc, &week_view->colors[E_WEEK_VIEW_COLOR_GRID]); + gdk_draw_line (drawable, gc, x + E_WEEK_VIEW_DATE_LINE_L_PAD, line_y, right_edge, line_y); } diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c index b205bdc34e..99d639688a 100644 --- a/calendar/gui/e-week-view.c +++ b/calendar/gui/e-week-view.c @@ -169,11 +169,9 @@ static void e_week_view_on_delete_appointment (GtkWidget *widget, static void e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data); -#ifndef NO_WARNINGS static gboolean e_week_view_update_event_cb (EWeekView *week_view, gint event_num, gpointer data); -#endif static gboolean e_week_view_remove_event_cb (EWeekView *week_view, gint event_num, gpointer data); @@ -458,6 +456,26 @@ e_week_view_realize (GtkWidget *widget) week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER].green = 0; week_view->colors[E_WEEK_VIEW_COLOR_EVENT_BORDER].blue = 0; + week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT].red = 0; + week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT].green = 0; + week_view->colors[E_WEEK_VIEW_COLOR_EVENT_TEXT].blue = 0; + + week_view->colors[E_WEEK_VIEW_COLOR_GRID].red = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_GRID].green = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_GRID].blue = 0 * 257; + + week_view->colors[E_WEEK_VIEW_COLOR_SELECTED].red = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_SELECTED].green = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_SELECTED].blue = 156 * 257; + + week_view->colors[E_WEEK_VIEW_COLOR_DATES].red = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_DATES].green = 0 * 257; + week_view->colors[E_WEEK_VIEW_COLOR_DATES].blue = 0 * 257; + + week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED].red = 65535; + week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED].green = 65535; + week_view->colors[E_WEEK_VIEW_COLOR_DATES_SELECTED].blue = 65535; + nfailed = gdk_colormap_alloc_colors (colormap, week_view->colors, E_WEEK_VIEW_COLOR_LAST, FALSE, TRUE, success); @@ -502,9 +520,11 @@ e_week_view_style_set (GtkWidget *widget, GtkStyle *previous_style) { EWeekView *week_view; + EWeekViewEventSpan *span; GdkFont *font; gint day, day_width, max_day_width, max_abbr_day_width; gint month, month_width, max_month_width, max_abbr_month_width; + gint span_num; GDate date; gchar buffer[128]; @@ -574,6 +594,19 @@ e_week_view_style_set (GtkWidget *widget, week_view->am_string); week_view->pm_string_width = gdk_string_width (font, week_view->pm_string); + + /* Set the font of all the EText items. */ + if (week_view->spans) { + for (span_num = 0; span_num < week_view->spans->len; + span_num++) { + span = &g_array_index (week_view->spans, + EWeekViewEventSpan, span_num); + if (span->text_item) + gnome_canvas_item_set (span->text_item, + "font_gdk", font, + NULL); + } + } } @@ -892,23 +925,26 @@ obj_updated_cb (CalClient *client, const char *uid, gpointer data) update the event fairly easily without changing the events arrays or computing a new layout. */ if (e_week_view_find_event_from_uid (week_view, uid, &event_num)) { -#ifndef NO_WARNINGS -#warning "FIXME" -#endif event = &g_array_index (week_view->events, EWeekViewEvent, event_num); - /* Do this the long way every time for now */ + if (!cal_component_has_recurrences (comp) + && !cal_component_has_recurrences (event->comp) + && cal_component_event_dates_match (comp, event->comp)) { #if 0 - if (ical_object_compare_dates (event->ico, ico)) { + g_print ("updated object's dates unchanged\n"); +#endif e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_update_event_cb, comp); gtk_object_unref (GTK_OBJECT (comp)); gtk_widget_queue_draw (week_view->main_canvas); return; } -#endif + /* The dates have changed, so we need to remove the old occurrrences before adding the new ones. */ +#if 0 + g_print ("dates changed - removing occurrences\n"); +#endif e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_remove_event_cb, NULL); @@ -1473,7 +1509,6 @@ e_week_view_recalc_display_start_day (EWeekView *week_view) } -#ifndef NO_WARNINGS static gboolean e_week_view_update_event_cb (EWeekView *week_view, gint event_num, @@ -1513,7 +1548,6 @@ e_week_view_update_event_cb (EWeekView *week_view, return TRUE; } -#endif /* This calls a given function for each event instance that matches the given @@ -2772,6 +2806,10 @@ e_week_view_start_editing_event (EWeekView *week_view, NULL); } + /* FIXME: This implicitly stops any edit of another item, causing it + to be sent to the server and resulting in a call to obj_updated_cb() + which may reload all the events and so our span and text item may + actually be destroyed. So we often get a SEGV. */ e_canvas_item_grab_focus (span->text_item); /* Try to move the cursor to the end of the text. */ @@ -3137,10 +3175,11 @@ e_week_view_key_press (GtkWidget *widget, GdkEventKey *event) *date.value = icaltime_from_timet (dtend, FALSE, TRUE); cal_component_set_dtend (comp, &date); - /* We add the event locally and start editing it. When we get the - "update_event" callback from the server, we basically ignore it. - If we were to wait for the "update_event" callback it wouldn't be - as responsive and we may lose a few keystrokes. */ + /* We add the event locally and start editing it. We don't send the + new event to the server until the edit is finished. + FIXME: If we get an obj-updated or obj-removed signal while editing + the event, and we have to do a re-layout, we may lose this new + event. */ e_week_view_add_event (comp, dtstart, dtend, week_view); e_week_view_check_layout (week_view); gtk_widget_queue_draw (week_view->main_canvas); diff --git a/calendar/gui/e-week-view.h b/calendar/gui/e-week-view.h index be2f1057da..47362d0ee6 100644 --- a/calendar/gui/e-week-view.h +++ b/calendar/gui/e-week-view.h @@ -96,6 +96,11 @@ typedef enum E_WEEK_VIEW_COLOR_ODD_MONTHS, E_WEEK_VIEW_COLOR_EVENT_BACKGROUND, E_WEEK_VIEW_COLOR_EVENT_BORDER, + E_WEEK_VIEW_COLOR_EVENT_TEXT, + E_WEEK_VIEW_COLOR_GRID, + E_WEEK_VIEW_COLOR_SELECTED, + E_WEEK_VIEW_COLOR_DATES, + E_WEEK_VIEW_COLOR_DATES_SELECTED, E_WEEK_VIEW_COLOR_LAST } EWeekViewColors; |