aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/year-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/year-view.c')
-rw-r--r--calendar/gui/year-view.c288
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