Files
evolution/calendar/gui/mark.c
Federico Mena Quintero 84fa00e42a Finished with the properties dialog. You can jump to days from the year
Finished with the properties dialog.  You can jump to days from the year view
now.  I'm off to rewrite gnome-popupmenu and friends.

1998-09-03  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* gncal-full-day.c (gncal_full_day_forall): Updated foreach ->
	forall from Gtk changes, bleah.

	* year-view.c (day_event): New function to handle events from
	days.  Jumps to the day that is clicked.

	* main.c: Use a watch cursor while the previous/today/next
	functions are doing their job.

	* mark.c (month_item_prepare_prelight): New public utility
	function to prepare a month item for prelighting.  It will store
	the proper prelight information and attach the appropriate signals.
	(mark_current_day): Make the current day bold as well (useful for
	color-blind people, I guess).

	* prop.c (set_current_day): Reset the date in the sample calendar
	and mark the current day.
	(fake_mark_days): Mark fake events in the sample calendar.

	* year-view.c (year_view_set): Use the general prelighting engine.

	* goto.c (day_event): Just process button presses, as prelighting
	is done behind the scenes now.
	(update): Use the general prelighting engine.

	* prop.c (create_colors_page): We can now configure the colors of

svn path=/trunk/; revision=361
1998-09-04 00:43:06 +00:00

237 lines
6.3 KiB
C

/* Functions to mark calendars
*
* Copyright (C) 1998 Red Hat Software, Inc.
*
* Author: Federico Mena <federico@nuclecu.unam.mx>
*/
#include <config.h>
#include "gnome-cal.h"
#include "main.h"
#include "mark.h"
#include "timeutil.h"
/* In the month item, marks all the days that are touched by the specified time span. Assumes that
* the time span is completely contained within the month.
*/
static void
mark_event_in_month (GnomeMonthItem *mitem, time_t start, time_t end)
{
struct tm tm;
GnomeCanvasItem *item;
int day_index;
tm = *localtime (&start);
for (; start <= end; start += 60 * 60 * 24) {
mktime (&tm); /* normalize the time */
/* Figure out the day index that corresponds to this time */
day_index = gnome_month_item_day2index (mitem, tm.tm_mday);
g_assert (day_index >= 0);
/* Mark the day box */
item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_prop (COLOR_PROP_MARK_DAY_BG),
NULL);
/* Next day */
tm.tm_mday++;
}
}
static void
mark_current_day (GnomeMonthItem *mitem)
{
struct tm *tm;
time_t t;
int day_index;
GnomeCanvasItem *item;
t = time (NULL);
tm = localtime (&t);
if (((tm->tm_year + 1900) == mitem->year) && (tm->tm_mon == mitem->month)) {
day_index = gnome_month_item_day2index (mitem, tm->tm_mday);
item = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_LABEL + day_index);
gnome_canvas_item_set (item,
"fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
"font", CURRENT_DAY_FONT,
NULL);
}
}
void
mark_month_item (GnomeMonthItem *mitem, Calendar *cal)
{
time_t month_begin, month_end;
GList *list, *l;
CalendarObject *co;
month_begin = time_month_begin (time_from_day (mitem->year, mitem->month, 1));
month_end = time_month_end (month_begin);
list = calendar_get_events_in_range (cal, month_begin, month_end);
for (l = list; l; l = l->next) {
co = l->data;
/* We clip the event's start and end times to the month's limits */
mark_event_in_month (mitem, MAX (co->ev_start, month_begin), MIN (co->ev_end, month_end));
}
calendar_destroy_event_list (list);
mark_current_day (mitem);
}
void
unmark_month_item (GnomeMonthItem *mitem)
{
g_return_if_fail (mitem != NULL);
g_return_if_fail (GNOME_IS_MONTH_ITEM (mitem));
/* We have to do this in several calls to gnome_canvas_item_set(), as color_spec_from_prop()
* returns a pointer to a static string -- and we need several values.
*/
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"heading_color", color_spec_from_prop (COLOR_PROP_HEADING_COLOR),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"outline_color", color_spec_from_prop (COLOR_PROP_OUTLINE_COLOR),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_box_color", color_spec_from_prop (COLOR_PROP_EMPTY_DAY_BG),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
NULL);
gnome_canvas_item_set (GNOME_CANVAS_ITEM (mitem),
"day_font", NORMAL_DAY_FONT,
NULL);
}
/* Frees the prelight information in the month item when it is destroyed */
static void
free_prelight_info (GtkObject *object, gpointer data)
{
g_free (gtk_object_get_data (object, "prelight_info"));
}
/* Handles EnterNotify and LeaveNotify events from the month item's day groups, and performs
* appropriate prelighting.
*/
static gint
day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
{
GnomeCanvasItem *mitem;
GnomeCanvasItem *box;
int child_num, day;
gulong *day_pixels;
GetPrelightColorFunc func;
gpointer func_data;
char *spec;
GdkColor color;
mitem = data;
child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mitem), item);
day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mitem), child_num);
if (day == 0)
return FALSE; /* it was a day outside the month's range */
child_num -= GNOME_MONTH_ITEM_DAY_GROUP;
box = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_BOX + child_num);
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
func = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_func");
func_data = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_data");
switch (event->type) {
case GDK_ENTER_NOTIFY:
spec = (* func) (func_data);
gnome_canvas_item_set (box,
"fill_color", spec,
NULL);
break;
case GDK_LEAVE_NOTIFY:
color.pixel = day_pixels[child_num];
gnome_canvas_item_set (box,
"fill_color_gdk", &color,
NULL);
break;
default:
break;
}
return FALSE;
}
void
month_item_prepare_prelight (GnomeMonthItem *mitem, GetPrelightColorFunc func, gpointer func_data)
{
gulong *day_pixels;
GnomeCanvasItem *day_group;
GnomeCanvasItem *box;
GtkArg arg;
GdkColor *color;
int i;
day_pixels = gtk_object_get_data (GTK_OBJECT (mitem), "prelight_info_pixels");
/* Set up the buffer for day background colors and attach it to the month item, if necessary */
if (!day_pixels) {
/* Create the buffer and attach it */
day_pixels = g_new (gulong, 42);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_pixels", day_pixels);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_func", func);
gtk_object_set_data (GTK_OBJECT (mitem), "prelight_info_data", func_data);
gtk_signal_connect (GTK_OBJECT (mitem), "destroy",
(GtkSignalFunc) free_prelight_info,
NULL);
/* Connect the appropriate signals to perform prelighting */
for (i = 0; i < 42; i++) {
day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mitem), GNOME_MONTH_ITEM_DAY_GROUP + i);
gtk_signal_connect (GTK_OBJECT (day_group), "event",
(GtkSignalFunc) day_event,
mitem);
}
}
/* Fetch the background colors from the day boxes and store them in the prelight info */
for (i = 0; i < 42; i++) {
box = gnome_month_item_num2child (mitem, GNOME_MONTH_ITEM_DAY_BOX + i);
arg.name = "fill_color_gdk";
gtk_object_getv (GTK_OBJECT (box), 1, &arg);
color = GTK_VALUE_BOXED (arg);
day_pixels[i] = color->pixel;
g_free (color);
}
}
char *
default_prelight_func (gpointer data)
{
return color_spec_from_prop (COLOR_PROP_PRELIGHT_DAY_BG);
}