diff options
Diffstat (limited to 'calendar/gui/year-view.c')
-rw-r--r-- | calendar/gui/year-view.c | 288 |
1 files changed, 283 insertions, 5 deletions
diff --git a/calendar/gui/year-view.c b/calendar/gui/year-view.c index 0a104f25a3..8a5bedc038 100644 --- a/calendar/gui/year-view.c +++ b/calendar/gui/year-view.c @@ -1,13 +1,289 @@ -/* Week view composite widget for gncal +/* Year view display for gncal * * Copyright (C) 1998 The Free Software Foundation * - * Author: Arturo Espinosa <arturo@nuclecu.unam.mx> - * - * Heavily based on Federico Mena's week view. - * + * Authors: Arturo Espinosa <arturo@nuclecu.unam.mx> + * Federico Mena <federico@nuclecu.unam.mx> */ +#include <config.h> +#include <libgnomeui/gnome-canvas-text.h> +#include "year-view.h" +#include "main.h" + + +#define HEAD_SPACING 4 /* Spacing between year heading and months */ +#define TITLE_SPACING 2 /* Spacing between title and calendar */ +#define SPACING 4 /* Spacing between months */ + + +static void year_view_class_init (YearViewClass *class); +static void year_view_init (YearView *yv); +static void year_view_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static void year_view_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); + + +static GnomeCanvas *parent_class; + + +GtkType +year_view_get_type (void) +{ + static GtkType year_view_type = 0; + + if (!year_view_type) { + GtkTypeInfo year_view_info = { + "YearView", + sizeof (YearView), + sizeof (YearViewClass), + (GtkClassInitFunc) year_view_class_init, + (GtkObjectInitFunc) year_view_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL + }; + + year_view_type = gtk_type_unique (gnome_canvas_get_type (), &year_view_info); + } + + return year_view_type; +} + +static void +year_view_class_init (YearViewClass *class) +{ + GtkWidgetClass *widget_class; + + widget_class = (GtkWidgetClass *) class; + + parent_class = gtk_type_class (gnome_canvas_get_type ()); + + widget_class->size_request = year_view_size_request; + widget_class->size_allocate = year_view_size_allocate; +} + +static void +year_view_init (YearView *yv) +{ + int i; + char buf[100]; + struct tm tm; + + memset (&tm, 0, sizeof (tm)); + + /* Heading */ + + yv->heading = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + gnome_canvas_text_get_type (), + "anchor", GTK_ANCHOR_N, + "font", "-*-helvetica-bold-r-normal--14-*-*-*-*-*-iso8859-1", + "fill_color", "black", + NULL); + + /* Months */ + + for (i = 0; i < 12; i++) { + /* Title */ + + strftime (buf, 100, "%B", &tm); + tm.tm_mon++; + + yv->titles[i] = gnome_canvas_item_new (GNOME_CANVAS_GROUP (yv->canvas.root), + gnome_canvas_text_get_type (), + "text", buf, + "anchor", GTK_ANCHOR_N, + "font", "-*-helvetica-bold-r-normal--12-*-*-*-*-*-iso8859-1", + "fill_color", "black", + NULL); + + /* Month item */ + + yv->mitems[i] = gnome_month_item_new (GNOME_CANVAS_GROUP (yv->canvas.root)); + gnome_canvas_item_set (yv->mitems[i], + "anchor", GTK_ANCHOR_NW, + "start_on_monday", week_starts_on_monday, + "heading_color", "white", + NULL); + } +} + +GtkWidget * +year_view_new (GnomeCalendar *calendar, time_t year) +{ + YearView *yv; + + g_return_val_if_fail (calendar != NULL, NULL); + g_return_val_if_fail (GNOME_IS_CALENDAR (calendar), NULL); + + yv = gtk_type_new (year_view_get_type ()); + yv->calendar = calendar; + + year_view_set (yv, year); + return GTK_WIDGET (yv); +} + +static void +year_view_size_request (GtkWidget *widget, GtkRequisition *requisition) +{ + YearView *yv; + + g_return_if_fail (widget != NULL); + g_return_if_fail (IS_YEAR_VIEW (widget)); + g_return_if_fail (requisition != NULL); + + yv = YEAR_VIEW (widget); + + if (GTK_WIDGET_CLASS (parent_class)->size_request) + (* GTK_WIDGET_CLASS (parent_class)->size_request) (widget, requisition); + + requisition->width = 200; + requisition->height = 150; +} + +static void +year_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) +{ + YearView *yv; + double width, height; + double mwidth, mheight; + double h_yofs; + double m_yofs; + double x, y; + int i; + GtkArg arg; + GdkFont *head_font, *title_font; + + g_return_if_fail (widget != NULL); + g_return_if_fail (IS_YEAR_VIEW (widget)); + g_return_if_fail (allocation != NULL); + + yv = YEAR_VIEW (widget); + + if (GTK_WIDGET_CLASS (parent_class)->size_allocate) + (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation); + + gnome_canvas_set_scroll_region (GNOME_CANVAS (yv), 0, 0, allocation->width, allocation->height); + + arg.name = "font_gdk"; + gtk_object_getv (GTK_OBJECT (yv->heading), 1, &arg); + head_font = GTK_VALUE_BOXED (arg); + + arg.name = "font_gdk"; + gtk_object_getv (GTK_OBJECT (yv->titles[0]), 1, &arg); + title_font = GTK_VALUE_BOXED (arg); + + /* Adjust heading */ + + gnome_canvas_item_set (yv->heading, + "x", (double) allocation->width / 2.0, + "y", (double) HEAD_SPACING, + NULL); + + /* Adjust months */ + + h_yofs = 2 * HEAD_SPACING + head_font->ascent + head_font->descent; + m_yofs = SPACING + title_font->ascent + title_font->descent; + + width = (allocation->width + SPACING) / 3.0; + height = (allocation->height - h_yofs + SPACING) / 4.0; + + mwidth = (allocation->width - 2 * SPACING) / 3.0; + mheight = (allocation->height - h_yofs - 3 * SPACING - 4 * m_yofs) / 4.0; + + for (i = 0; i < 12; i++) { + x = (i % 3) * width; + y = (i / 3) * height + h_yofs; + + /* Title */ + + gnome_canvas_item_set (yv->titles[i], + "x", x + width / 2.0, + "y", y, + NULL); + + /* Month item */ + + gnome_canvas_item_set (yv->mitems[i], + "x", x, + "y", y + m_yofs, + "width", mwidth, + "height", mheight, + NULL); + } +} + +void +year_view_update (YearView *yv, iCalObject *object, int flags) +{ + g_return_if_fail (yv != NULL); + g_return_if_fail (IS_YEAR_VIEW (yv)); + + /* FIXME */ +} + +void +year_view_set (YearView *yv, time_t year) +{ + struct tm tm; + int i; + char buf[100]; + + g_return_if_fail (yv != NULL); + g_return_if_fail (IS_YEAR_VIEW (yv)); + + tm = *localtime (&year); + + /* Heading */ + + sprintf (buf, "%d", tm.tm_year + 1900); + gnome_canvas_item_set (yv->heading, + "text", buf, + NULL); + + /* Months */ + + for (i = 0; i < 12; i++) + gnome_canvas_item_set (yv->mitems[i], + "year", tm.tm_year + 1900, + "month", i, + NULL); + + /* FIXME: update events */ +} + +void +year_view_time_format_changed (YearView *yv) +{ + int i; + + g_return_if_fail (yv != NULL); + g_return_if_fail (IS_YEAR_VIEW (yv)); + + for (i = 0; i < 12; i++) + gnome_canvas_item_set (yv->mitems[i], + "start_on_monday", week_starts_on_monday, + NULL); + + /* FIXME: update events */ +} + + + + + + + + + + + + + + +#if 0 + #include "gncal-year-view.h" #include "calendar.h" #include "timeutil.h" @@ -243,3 +519,5 @@ gncal_year_view_update (GncalYearView *yview, iCalObject *ico, int flags) gncal_year_view_set_year (yview, yview->year); } + +#endif |