From d4e52567181dd4fa1bfcf928ce1151928d25ded2 Mon Sep 17 00:00:00 2001 From: Arturo Espinosa Date: Wed, 12 Aug 1998 03:55:15 +0000 Subject: More work on the month view item - Federico svn path=/trunk/; revision=311 --- calendar/gui/gnome-month-item.c | 196 ++++++++++++++++++++++++++++++++++++---- calendar/gui/gnome-month-item.h | 5 +- calendar/gui/month-view.c | 4 +- 3 files changed, 185 insertions(+), 20 deletions(-) (limited to 'calendar/gui') diff --git a/calendar/gui/gnome-month-item.c b/calendar/gui/gnome-month-item.c index 83e34ff1c7..0f5aea462c 100644 --- a/calendar/gui/gnome-month-item.c +++ b/calendar/gui/gnome-month-item.c @@ -14,11 +14,39 @@ /* These are indices into the items array of a GnomeMonthItem structure */ enum { - ITEM_HEAD_GROUP = 0, - ITEM_HEAD_BOX = 7, - ITEM_HEAD_LABEL = 14 + ITEM_HEAD_GROUP = 0, /* 7 groups */ + ITEM_HEAD_BOX = 7, /* 7 boxes */ + ITEM_HEAD_LABEL = 14, /* 7 labels */ + ITEM_DAY_GROUP = 21, /* 42 groups */ + ITEM_DAY_BOX = 63, /* 42 boxes */ + ITEM_DAY_LABEL = 105 /* 42 labels */ }; + +/* Number of days in a month, for normal and leap years */ +static int days_in_month[2][12] = { + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +}; + +/* The weird month of September 1752, where 3 Sep through 13 Sep were eliminated due to the + * Gregorian reformation. + */ +static int sept_1752[42] = { + 0, 0, 1, 2, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 +}; + +#define REFORMATION_DAY 639787 /* First day of the reformation, counted from 1 Jan 1 */ +#define MISSING_DAYS 11 /* They corrected out 11 days */ +#define THURSDAY 4 /* First day of reformation */ +#define SATURDAY 6 + + enum { ARG_0, ARG_YEAR, @@ -28,10 +56,12 @@ enum { ARG_WIDTH, ARG_HEIGHT, ARG_ANCHOR, - ARG_PADDING, + ARG_HEAD_PADDING, + ARG_DAY_PADDING, ARG_DAY_NAMES, ARG_HEADING_HEIGHT, ARG_HEADING_ANCHOR, + ARG_DAY_ANCHOR, ARG_START_ON_MONDAY }; @@ -92,10 +122,12 @@ gnome_month_item_class_init (GnomeMonthItemClass *class) gtk_object_add_arg_type ("GnomeMonthItem::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("GnomeMonthItem::height", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEIGHT); gtk_object_add_arg_type ("GnomeMonthItem::anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_ANCHOR); - gtk_object_add_arg_type ("GnomeMonthItem::padding", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_PADDING); + gtk_object_add_arg_type ("GnomeMonthItem::head_padding", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEAD_PADDING); + gtk_object_add_arg_type ("GnomeMonthItem::day_padding", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_DAY_PADDING); gtk_object_add_arg_type ("GnomeMonthItem::day_names", GTK_TYPE_POINTER, GTK_ARG_READABLE, ARG_DAY_NAMES); gtk_object_add_arg_type ("GnomeMonthItem::heading_height", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_HEADING_HEIGHT); gtk_object_add_arg_type ("GnomeMonthItem::heading_anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_HEADING_ANCHOR); + gtk_object_add_arg_type ("GnomeMonthItem::day_anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_DAY_ANCHOR); gtk_object_add_arg_type ("GnomeMonthItem::start_on_monday", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_START_ON_MONDAY); object_class->destroy = gnome_month_item_destroy; @@ -177,10 +209,10 @@ reshape_headings (GnomeMonthItem *mitem) /* Label */ get_label_anchor (mitem->head_anchor, - mitem->padding, - mitem->padding, - width - mitem->padding, - mitem->head_height - mitem->padding, + mitem->head_padding, + mitem->head_padding, + width - mitem->head_padding, + mitem->head_height - mitem->head_padding, &x, &y); gnome_canvas_item_set (mitem->items[ITEM_HEAD_LABEL + i], @@ -191,6 +223,54 @@ reshape_headings (GnomeMonthItem *mitem) } } +/* Resets the position of the days in the calendar */ +static void +reshape_days (GnomeMonthItem *mitem) +{ + double width, height; + double x, y; + int row, col; + int i; + + width = mitem->width / 7; + height = (mitem->height - mitem->head_height) / 6; + + i = 0; + + for (row = 0; row < 6; row++) + for (col = 0; col < 7; col++) { + /* Group */ + gnome_canvas_item_set (mitem->items[ITEM_DAY_GROUP + i], + "x", width * col, + "y", mitem->head_height + height * row, + NULL); + + /* Box */ + gnome_canvas_item_set (mitem->items[ITEM_DAY_BOX + i], + "x1", 0.0, + "y1", 0.0, + "x2", width, + "y2", height, + NULL); + + /* Label */ + get_label_anchor (mitem->day_anchor, + mitem->day_padding, + mitem->day_padding, + width - mitem->day_padding, + height - mitem->day_padding, + &x, &y); + + gnome_canvas_item_set (mitem->items[ITEM_DAY_LABEL + i], + "x", x, + "y", y, + "anchor", mitem->day_anchor, + NULL); + + i++; + } +} + /* Changes the positions and resizes the items in the calendar to match the new size of the * calendar. */ @@ -198,6 +278,7 @@ static void reshape (GnomeMonthItem *mitem) { reshape_headings (mitem); + reshape_days (mitem); } /* Creates the items for the day name headings */ @@ -227,11 +308,67 @@ create_headings (GnomeMonthItem *mitem) gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[ITEM_HEAD_GROUP + i]), gnome_canvas_text_get_type (), "fill_color", "white", - "font", "-adobe-helvetica-medium-r-normal--12-*-72-72-p-*-iso8859-1", + "font", "-adobe-helvetica-medium-r-normal--10-*-72-72-p-*-iso8859-1", NULL); } } +/* Set the day numbers in the monthly calendar */ +static void +set_days (GnomeMonthItem *mitem) +{ + int i; + char buf[100]; + + /* FIXME: actually calculate the numbers */ + + for (i = 0; i < 42; i++) { + sprintf (buf, "%d", i); + gnome_canvas_item_set (mitem->items[ITEM_DAY_LABEL + i], + "text", buf, + NULL); + } +} + +/* Creates the items for the days */ +static void +create_days (GnomeMonthItem *mitem) +{ + int i; + char buf[100]; + GdkColor *c; + + /* Just create the items; they will be positioned and configured by a call to reshape() */ + + for (i = 0; i < 42; i++) { + /* Group */ + mitem->items[ITEM_DAY_GROUP + i] = + gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem), + gnome_canvas_group_get_type (), + NULL); + + /* Box */ + c = >K_WIDGET (GNOME_CANVAS_ITEM (mitem)->canvas)->style->bg[GTK_STATE_NORMAL]; + sprintf (buf, "#%04x%04x%04x", c->red, c->green, c->blue); + mitem->items[ITEM_DAY_BOX + i] = + gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[ITEM_DAY_GROUP + i]), + gnome_canvas_rect_get_type (), + "outline_color", "black", + "fill_color", buf, + NULL); + + /* Label */ + mitem->items[ITEM_DAY_LABEL + i] = + gnome_canvas_item_new (GNOME_CANVAS_GROUP (mitem->items[ITEM_DAY_GROUP + i]), + gnome_canvas_text_get_type (), + "fill_color", "black", + "font", "-adobe-helvetica-medium-r-normal--10-*-72-72-p-*-iso8859-1", + NULL); + } + + set_days (mitem); +} + /* Returns a normalized day index (as in sunday to saturday) based on a visible day index */ static int get_day_index (GnomeMonthItem *mitem, int draw_index) @@ -261,14 +398,17 @@ create_items (GnomeMonthItem *mitem) /* 7 heading groups * 7 heading boxes * 7 heading labels + * 42 day groups + * 42 day boxes + * 42 day labels * ------------------ - * 21 items total + * 147 items total */ - mitem->items = g_new (GnomeCanvasItem *, 21); + mitem->items = g_new (GnomeCanvasItem *, 147); create_headings (mitem); - /* FIXME */ + create_days (mitem); /* Initialize by default to three-letter day names */ @@ -303,9 +443,11 @@ gnome_month_item_init (GnomeMonthItem *mitem) mitem->width = 150.0; /* not unreasonable defaults, I hope */ mitem->height = 100.0; mitem->anchor = GTK_ANCHOR_NW; - mitem->padding = 0.0; + mitem->head_padding = 0.0; + mitem->day_padding = 2.0; mitem->head_height = 14.0; mitem->head_anchor = GTK_ANCHOR_CENTER; + mitem->day_anchor = GTK_ANCHOR_CENTER; } GnomeCanvasItem * @@ -470,8 +612,13 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) reanchor (mitem); break; - case ARG_PADDING: - mitem->padding = fabs (GTK_VALUE_DOUBLE (*arg)); + case ARG_HEAD_PADDING: + mitem->head_padding = fabs (GTK_VALUE_DOUBLE (*arg)); + reshape (mitem); + break; + + case ARG_DAY_PADDING: + mitem->day_padding = fabs (GTK_VALUE_DOUBLE (*arg)); reshape (mitem); break; @@ -505,6 +652,11 @@ gnome_month_item_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) reshape (mitem); break; + case ARG_DAY_ANCHOR: + mitem->day_anchor = GTK_VALUE_ENUM (*arg); + reshape (mitem); + break; + case ARG_START_ON_MONDAY: mitem->start_on_monday = GTK_VALUE_BOOL (*arg); set_day_names (mitem); @@ -551,8 +703,12 @@ gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) GTK_VALUE_ENUM (*arg) = mitem->anchor; break; - case ARG_PADDING: - GTK_VALUE_DOUBLE (*arg) = mitem->padding; + case ARG_HEAD_PADDING: + GTK_VALUE_DOUBLE (*arg) = mitem->head_padding; + break; + + case ARG_DAY_PADDING: + GTK_VALUE_DOUBLE (*arg) = mitem->day_padding; break; case ARG_HEADING_HEIGHT: @@ -563,6 +719,10 @@ gnome_month_item_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) GTK_VALUE_ENUM (*arg) = mitem->head_anchor; break; + case ARG_DAY_ANCHOR: + GTK_VALUE_ENUM (*arg) = mitem->day_anchor; + break; + case ARG_START_ON_MONDAY: GTK_VALUE_BOOL (*arg) = mitem->start_on_monday; break; diff --git a/calendar/gui/gnome-month-item.h b/calendar/gui/gnome-month-item.h index 2260186c6d..f6523aff94 100644 --- a/calendar/gui/gnome-month-item.h +++ b/calendar/gui/gnome-month-item.h @@ -36,13 +36,16 @@ struct _GnomeMonthItem { double width, height; /* Size of calendar */ GtkAnchorType anchor; /* Anchor side for calendar */ - double padding; /* Padding to use between division lines and text */ + double head_padding; /* Padding to use between heading lines and text */ + double day_padding; /* Padding to use between day number lines and text */ char *day_names[7]; /* Names to use for the day labels, starting from Sunday */ double head_height; /* Height of the headings row */ GtkAnchorType head_anchor; /* Anchor side for the heading labels */ + GtkAnchorType day_anchor; /* Anchor side for the day number labels */ + GnomeCanvasItem **items; /* All the items that make up the calendar */ int start_on_monday : 1; /* Start the week on Monday? If false, then start from Sunday */ diff --git a/calendar/gui/month-view.c b/calendar/gui/month-view.c index 78eec0c91d..18e96cbf26 100644 --- a/calendar/gui/month-view.c +++ b/calendar/gui/month-view.c @@ -64,6 +64,7 @@ month_view_init (MonthView *mv) "x", 0.0, "y", 0.0, "anchor", GTK_ANCHOR_NW, + "day_anchor", GTK_ANCHOR_NE, NULL); } @@ -110,9 +111,10 @@ month_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) (* GTK_WIDGET_CLASS (parent_class)->size_allocate) (widget, allocation); gnome_canvas_set_scroll_region (GNOME_CANVAS (mv), 0, 0, allocation->width, allocation->height); - +#if 0 gnome_canvas_item_set (mv->mitem, "width", (double) allocation->width, "height", (double) allocation->height, NULL); +#endif } -- cgit v1.2.3