From ae353b456cb569f4beb3e16ae2cf059d9a001c23 Mon Sep 17 00:00:00 2001 From: Radek Doulik Date: Sat, 17 Jan 2004 23:34:46 +0000 Subject: month and week view printing works again, day view is next to fix 2004-01-18 Radek Doulik * gui/print.c (print_border_with_triangles): use rgb color as fillcolor (print_week_day_event): ditto * gui/e-cal-model.c (e_cal_model_get_rgb_color_for_component): new helper function, gets component color as rgb double values * gui/print.c (print_week_summary_cb): uncommented and updated for e_cal_model_generate_instances (print_week_summary): use e_cal_model_generate_instances (print_border_with_triangles): pass rgb fillcolor (print_border_rgb): new function to print border with rgb color background * gui/e-cal-model.c (e_cal_model_generate_instances): new function, similar to e_cal_generate_instances. see comments to understand how to use cb_data svn path=/trunk/; revision=24292 --- calendar/gui/e-cal-model.c | 53 ++++++++++++++ calendar/gui/e-cal-model.h | 7 ++ calendar/gui/print.c | 168 ++++++++++++++++++++++++++------------------- 3 files changed, 157 insertions(+), 71 deletions(-) (limited to 'calendar/gui') diff --git a/calendar/gui/e-cal-model.c b/calendar/gui/e-cal-model.c index 9ac1104380..cb463deb21 100644 --- a/calendar/gui/e-cal-model.c +++ b/calendar/gui/e-cal-model.c @@ -1517,6 +1517,31 @@ e_cal_model_get_color_for_component (ECalModel *model, ECalModelComponent *comp_ return color; } +/** + * e_cal_model_get_rgb_color_for_component + */ +gboolean +e_cal_model_get_rgb_color_for_component (ECalModel *model, ECalModelComponent *comp_data, double *red, double *green, double *blue) +{ + GdkColor gdk_color; + const gchar *color; + + color = e_cal_model_get_color_for_component (model, comp_data); + if (color && gdk_color_parse (color, &gdk_color)) { + + if (red) + *red = ((double) gdk_color.red)/0xffff; + if (green) + *green = ((double) gdk_color.green)/0xffff; + if (blue) + *blue = ((double) gdk_color.blue)/0xffff; + + return TRUE; + } + + return FALSE; +} + /** * e_cal_model_get_component_at */ @@ -1595,3 +1620,31 @@ e_cal_model_free_component_data (ECalModelComponent *comp_data) g_free (comp_data); } + +/** + * e_cal_model_generate_instances + * + * cb function is not called with cb_data, but with ECalModelGenerateInstancesData which contains cb_data + */ +void +e_cal_model_generate_instances (ECalModel *model, time_t start, time_t end, + ECalRecurInstanceFn cb, gpointer cb_data) +{ + ECalModelGenerateInstancesData mdata; + gint i, n; + + n = e_table_model_row_count (E_TABLE_MODEL (model)); + for (i = 0; i < n; i ++) { + ECalModelComponent *comp_data = e_cal_model_get_component_at (model, i); + ECalComponent *comp = e_cal_component_new (); + + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); + mdata.comp_data = comp_data; + mdata.cb_data = cb_data; + e_cal_recur_generate_instances (comp, start, end, + cb, &mdata, + e_cal_resolve_tzid_cb, comp_data->client, + e_cal_model_get_timezone (model)); + g_object_unref (comp); + } +} diff --git a/calendar/gui/e-cal-model.h b/calendar/gui/e-cal-model.h index 9f193b4f07..6cb3f6ba30 100644 --- a/calendar/gui/e-cal-model.h +++ b/calendar/gui/e-cal-model.h @@ -63,6 +63,11 @@ typedef struct { ECellDateEditValue *completed; } ECalModelComponent; +typedef struct { + ECalModelComponent *comp_data; + gpointer cb_data; +} ECalModelGenerateInstancesData; + typedef struct { ETableModel model; ECalModelPrivate *priv; @@ -100,11 +105,13 @@ void e_cal_model_set_query (ECalModel *model, const gchar *sexp); icalcomponent *e_cal_model_create_component_with_defaults (ECalModel *model); const gchar *e_cal_model_get_color_for_component (ECalModel *model, ECalModelComponent *comp_data); +gboolean e_cal_model_get_rgb_color_for_component (ECalModel *model, ECalModelComponent *comp_data, double *red, double *green, double *blue); ECalModelComponent *e_cal_model_get_component_at (ECalModel *model, gint row); gchar *e_cal_model_date_value_to_string (ECalModel *model, const void *value); void e_cal_model_free_component_data (ECalModelComponent *comp_data); +void e_cal_model_generate_instances (ECalModel *model, time_t start, time_t end, ECalRecurInstanceFn cb, gpointer cb_data); G_END_DECLS diff --git a/calendar/gui/print.c b/calendar/gui/print.c index 2d8ef720c4..1fc52bac74 100644 --- a/calendar/gui/print.c +++ b/calendar/gui/print.c @@ -47,6 +47,7 @@ #include #include "calendar-commands.h" #include "calendar-config.h" +#include "e-cal-model.h" #include "e-day-view.h" #include "e-day-view-layout.h" #include "e-week-view.h" @@ -156,6 +157,8 @@ struct psinfo gboolean use_24_hour_format; double row_height; double header_row_height; + + ECalModelComponent *comp_data; }; struct ptinfo @@ -303,20 +306,20 @@ enum align_box { /* Prints a rectangle, with or without a border, filled or outline, and possibly with triangular arrows at one or both horizontal edges. width = width of border, -ve means no border. - fillcolor = shade of fill, -ve means no fill. + red,green,blue = bgcolor to fill, -ve means no fill. left_triangle_width, right_triangle_width = width from edge of rectangle to point of triangle, or -ve for no triangle. */ static void print_border_with_triangles (GnomePrintContext *pc, double l, double r, double t, double b, - double width, double fillcolor, + double width, double red, double green, double blue, double left_triangle_width, double right_triangle_width) { gnome_print_gsave (pc); /* Fill in the interior of the rectangle, if desired. */ - if (fillcolor >= -EPSILON) { + if (red >= -EPSILON && green >= -EPSILON && blue >= -EPSILON) { gnome_print_moveto (pc, l, t); if (left_triangle_width > 0.0) gnome_print_lineto (pc, l - left_triangle_width, @@ -328,8 +331,7 @@ print_border_with_triangles (GnomePrintContext *pc, (t + b) / 2); gnome_print_lineto (pc, r, t); gnome_print_closepath (pc); - gnome_print_setrgbcolor (pc, fillcolor, fillcolor, - fillcolor); + gnome_print_setrgbcolor (pc, red, green, blue); gnome_print_fill (pc); } @@ -358,15 +360,39 @@ print_border_with_triangles (GnomePrintContext *pc, /* Prints a rectangle, with or without a border, and filled or outline. width = width of border, -ve means no border. fillcolor = shade of fill, -ve means no fill. */ +static void +print_border_rgb (GnomePrintContext *pc, + double l, double r, double t, double b, + double width, double red, double green, double blue) +{ + print_border_with_triangles (pc, l, r, t, b, width, red, green, blue, -1.0, -1.0); +} + static void print_border (GnomePrintContext *pc, double l, double r, double t, double b, double width, double fillcolor) { - print_border_with_triangles (pc, l, r, t, b, width, fillcolor, - -1.0, -1.0); + print_border_rgb (pc, l, r, t, b, width, fillcolor, fillcolor, fillcolor); } +static void +print_rectangle (GnomePrintContext *pc, + double l, double r, double t, double b, + double red, double green, double blue) +{ + gnome_print_gsave (pc); + + gnome_print_moveto (pc, l, t); + gnome_print_lineto (pc, l, b); + gnome_print_lineto (pc, r, b); + gnome_print_lineto (pc, r, t); + gnome_print_closepath (pc); + gnome_print_setrgbcolor (pc, red, green, blue); + gnome_print_fill (pc); + + gnome_print_grestore (pc); +} /* Prints 1 line of aligned text in a box. It is centered vertically, and the horizontal alignment can be either ALIGN_LEFT, ALIGN_RIGHT, or @@ -988,7 +1014,7 @@ print_day_long_event (GnomePrintContext *pc, GnomeFont *font, x2 = right - 10; y1 = top - event->start_row_or_col * row_height - 4; y2 = y1 - row_height + 4; - print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, 0.95, + print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, 0.95, 0.95, 0.95, left_triangle_width, right_triangle_width); @@ -1237,54 +1263,6 @@ print_day_details (GnomePrintContext *pc, GnomeCalendar *gcal, time_t whence, g_array_free (pdi.events[0], TRUE); } - -/* This adds one event to the view, adding it to the appropriate array. */ -static gboolean -print_week_summary_cb (ECalComponent *comp, - time_t start, - time_t end, - gpointer data) - -{ -/* icaltimezone *zone = get_timezone (); */ -/* EWeekViewEvent event; */ -/* struct icaltimetype start_tt, end_tt; */ - -/* struct psinfo *psi = (struct psinfo *)data; */ - -/* /\* Check that the event times are valid. *\/ */ - -/* #if 0 */ -/* g_print ("View start:%li end:%li Event start:%li end:%li\n", */ -/* psi->day_starts[0], psi->day_starts[psi->days_shown], */ -/* start, end); */ -/* #endif */ - -/* g_return_val_if_fail (start <= end, TRUE); */ -/* g_return_val_if_fail (start < psi->day_starts[psi->days_shown], TRUE); */ -/* g_return_val_if_fail (end > psi->day_starts[0], TRUE); */ - -/* start_tt = icaltime_from_timet_with_zone (start, FALSE, zone); */ -/* end_tt = icaltime_from_timet_with_zone (end, FALSE, zone); */ - -/* event.comp = comp; */ -/* g_object_ref (event.comp); */ -/* event.start = start; */ -/* event.end = end; */ -/* event.spans_index = 0; */ -/* event.num_spans = 0; */ - -/* event.start_minute = start_tt.hour * 60 + start_tt.minute; */ -/* event.end_minute = end_tt.hour * 60 + end_tt.minute; */ -/* if (event.end_minute == 0 && start != end) */ -/* event.end_minute = 24 * 60; */ - -/* g_array_append_val (psi->events, event); */ - - return TRUE; -} - - /* Returns TRUE if the event is a one-day event (i.e. not a long event). */ static gboolean print_is_one_day_week_event (EWeekViewEvent *event, @@ -1309,7 +1287,7 @@ print_week_long_event (GnomePrintContext *pc, GnomeFont *font, struct psinfo *psi, double x1, double x2, double y1, double y2, EWeekViewEvent *event, EWeekViewEventSpan *span, - char *text) + char *text, double red, double green, double blue) { double left_triangle_width = -1.0, right_triangle_width = -1.0; struct tm date_tm; @@ -1325,7 +1303,7 @@ print_week_long_event (GnomePrintContext *pc, GnomeFont *font, if (event->end > psi->day_starts[span->start_day + span->num_days]) right_triangle_width = 4; - print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, 0.9, + print_border_with_triangles (pc, x1, x2, y1, y2, 0.5, red, green, blue, left_triangle_width, right_triangle_width); @@ -1378,7 +1356,7 @@ print_week_day_event (GnomePrintContext *pc, GnomeFont *font, struct psinfo *psi, double x1, double x2, double y1, double y2, EWeekViewEvent *event, EWeekViewEventSpan *span, - char *text) + char *text, double red, double green, double blue) { struct tm date_tm; char buffer[32]; @@ -1394,10 +1372,9 @@ print_week_day_event (GnomePrintContext *pc, GnomeFont *font, e_time_format_time (&date_tm, psi->use_24_hour_format, FALSE, buffer, sizeof (buffer)); + print_rectangle (pc, x1, x2, y1, y2, red, green, blue); print_text_size (pc, buffer, ALIGN_LEFT, x1, x2, y1, y2); - x1 += gnome_font_get_width_utf8 (font, buffer); - - x1 += 4; + x1 += gnome_font_get_width_utf8 (font, buffer) + 4; print_text_size (pc, text, ALIGN_LEFT, x1, x2, y1, y2); } @@ -1407,6 +1384,7 @@ print_week_event (GnomePrintContext *pc, GnomeFont *font, struct psinfo *psi, double left, double top, double cell_width, double cell_height, + ECalModel *model, EWeekViewEvent *event, GArray *spans) { EWeekViewEventSpan *span; @@ -1415,6 +1393,7 @@ print_week_event (GnomePrintContext *pc, GnomeFont *font, char *text; int num_days, start_x, start_y, start_h, end_x, end_y, end_h; double x1, x2, y1, y2; + double red, green, blue; summary = icalcomponent_get_summary (event->comp_data->icalcomp); text = summary ? (char*) summary : ""; @@ -1461,15 +1440,19 @@ print_week_event (GnomePrintContext *pc, GnomeFont *font, - span->row * psi->row_height; y2 = y1 - psi->row_height * 0.9; + red = .9; + green = .9; + blue = .9; + e_cal_model_get_rgb_color_for_component (model, event->comp_data, &red, &green, &blue); if (print_is_one_day_week_event (event, span, psi->day_starts)) { print_week_day_event (pc, font, psi, x1, x2, y1, y2, - event, span, text); + event, span, text, red, green, blue); } else { print_week_long_event (pc, font, psi, x1, x2, y1, y2, - event, span, text); + event, span, text, red, green, blue); } } } @@ -1539,7 +1522,52 @@ print_week_view_background (GnomePrintContext *pc, GnomeFont *font, } } +/* This adds one event to the view, adding it to the appropriate array. */ +static gboolean +print_week_summary_cb (ECalComponent *comp, + time_t start, + time_t end, + gpointer data) + +{ + icaltimezone *zone = get_timezone (); + EWeekViewEvent event; + struct icaltimetype start_tt, end_tt; + ECalModelGenerateInstancesData *mdata = (ECalModelGenerateInstancesData *) data; + struct psinfo *psi = (struct psinfo *) mdata->cb_data; + + /* Check that the event times are valid. */ + +#if 0 + g_print ("View start:%li end:%li Event start:%li end:%li\n", + psi->day_starts[0], psi->day_starts[psi->days_shown], + start, end); +#endif + + g_return_val_if_fail (start <= end, TRUE); + g_return_val_if_fail (start < psi->day_starts[psi->days_shown], TRUE); + g_return_val_if_fail (end > psi->day_starts[0], TRUE); + start_tt = icaltime_from_timet_with_zone (start, FALSE, zone); + end_tt = icaltime_from_timet_with_zone (end, FALSE, zone); + + event.comp_data = mdata->comp_data; + event.allocated_comp_data = FALSE; + + event.start = start; + event.end = end; + event.spans_index = 0; + event.num_spans = 0; + + event.start_minute = start_tt.hour * 60 + start_tt.minute; + event.end_minute = end_tt.hour * 60 + end_tt.minute; + if (event.end_minute == 0 && start != end) + event.end_minute = 24 * 60; + + g_array_append_val (psi->events, event); + + return TRUE; +} static void print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, @@ -1548,7 +1576,6 @@ print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, double left, double right, double top, double bottom) { icaltimezone *zone = get_timezone (); - ECal *client; EWeekViewEvent *event; struct psinfo psi; time_t day_start; @@ -1556,6 +1583,7 @@ print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, GArray *spans; GnomeFont *font; double cell_width, cell_height; + ECalModel *model = gnome_calendar_get_calendar_model (gcal); psi.days_shown = weeks_shown * 7; psi.events = g_array_new (FALSE, FALSE, sizeof (EWeekViewEvent)); @@ -1585,11 +1613,9 @@ print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, } /* Get the events from the server. */ - client = gnome_calendar_get_default_client (gcal); - e_cal_generate_instances (client, - psi.day_starts[0], - psi.day_starts[psi.days_shown], - print_week_summary_cb, &psi); + e_cal_model_generate_instances (model, + psi.day_starts[0], psi.day_starts[psi.days_shown], + print_week_summary_cb, &psi); qsort (psi.events->data, psi.events->len, sizeof (EWeekViewEvent), e_week_view_event_sort_func); @@ -1631,7 +1657,7 @@ print_week_summary (GnomePrintContext *pc, GnomeCalendar *gcal, for (event_num = 0; event_num < psi.events->len; event_num++) { event = &g_array_index (psi.events, EWeekViewEvent, event_num); print_week_event (pc, font, &psi, left, top, - cell_width, cell_height, event, spans); + cell_width, cell_height, model, event, spans); } g_object_unref (font); -- cgit