Now takes object and flags parameters. Likewise. Likewise.

1998-04-13  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* gncal-week-view.c (gncal_week_view_update): Now takes object and
	flags parameters.
	* gncal-day-view.c (gncal_day_view_update): Likewise.
	* gncal-full-day.c (gncal_full_day_update): Likewise.
	(child_focus_in): New function.  In conjunction with
	child_focus_out(), these only display the handles in the child
	when it is focused.  The result is that the user can see more of
	the child's text when nothing is focused, and we can also display
	fatter and nicer drag handles.

	* gnome-cal.c (gnome_calendar_object_changed): Now takes an
	additional flags parameter
	(gnome_calendar_update_all): Made function static.  Now takes
	changed object and flags parameters as well.
	(gnome_calendar_object_changed): Now takes additional flags
	parameter to indicate what changed in the specified object.

	* calobj.h (CalObjectChange): New enum with flags to describe what
	has been changed in an object.

svn path=/trunk/; revision=132
This commit is contained in:
Federico Mena Quintero
1998-04-14 04:06:58 +00:00
committed by Arturo Espinosa
parent 23ef00df35
commit 49a388705e
20 changed files with 217 additions and 78 deletions

View File

@ -1,5 +1,25 @@
1998-04-13 Federico Mena Quintero <federico@nuclecu.unam.mx> 1998-04-13 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gncal-week-view.c (gncal_week_view_update): Now takes object and
flags parameters.
* gncal-day-view.c (gncal_day_view_update): Likewise.
* gncal-full-day.c (gncal_full_day_update): Likewise.
(child_focus_in): New function. In conjunction with
child_focus_out(), these only display the handles in the child
when it is focused. The result is that the user can see more of
the child's text when nothing is focused, and we can also display
fatter and nicer drag handles.
* gnome-cal.c (gnome_calendar_object_changed): Now takes an
additional flags parameter
(gnome_calendar_update_all): Made function static. Now takes
changed object and flags parameters as well.
(gnome_calendar_object_changed): Now takes additional flags
parameter to indicate what changed in the specified object.
* calobj.h (CalObjectChange): New enum with flags to describe what
has been changed in an object.
* gncal-full-day.h: * gncal-full-day.h:
* gncal-full-day.c (gncal_full_day_focus_child): New function to * gncal-full-day.c (gncal_full_day_focus_child): New function to
let the outside world decide which child to focus. let the outside world decide which child to focus.

View File

@ -85,6 +85,13 @@ typedef struct {
int frequency; int frequency;
} Recurrence; } Recurrence;
/* Flags to indicate what has changed in an object */
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
} CalObjectChange;
/* /*
* This describes an iCalendar object, note that we never store durations, instead we * This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration. * always compute the end time computed from the start + duration.

View File

@ -85,6 +85,13 @@ typedef struct {
int frequency; int frequency;
} Recurrence; } Recurrence;
/* Flags to indicate what has changed in an object */
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
} CalObjectChange;
/* /*
* This describes an iCalendar object, note that we never store durations, instead we * This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration. * always compute the end time computed from the start + duration.

View File

@ -114,7 +114,7 @@ gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper)
dview->upper = upper; dview->upper = upper;
dview->events = 0; dview->events = 0;
gncal_day_view_update (dview); gncal_day_view_update (dview, NULL, 0);
return GTK_WIDGET (dview); return GTK_WIDGET (dview);
} }
@ -284,7 +284,7 @@ gncal_day_view_expose (GtkWidget *widget, GdkEventExpose *event)
} }
void void
gncal_day_view_update (GncalDayView *dview) gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
{ {
struct tm tm; struct tm tm;
char buf[256]; char buf[256];
@ -323,7 +323,7 @@ gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper)
dview->lower = lower; dview->lower = lower;
dview->upper = upper; dview->upper = upper;
gncal_day_view_update (dview); gncal_day_view_update (dview, NULL, 0);
} }
} }

View File

@ -46,7 +46,7 @@ struct _GncalDayViewClass {
guint gncal_day_view_get_type (void); guint gncal_day_view_get_type (void);
GtkWidget *gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper); GtkWidget *gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper);
void gncal_day_view_update (GncalDayView *dview); void gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags);
void gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper); void gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper);
void gncal_day_view_set_shadow (GncalDayView *dview, GtkShadowType shadow_type); void gncal_day_view_set_shadow (GncalDayView *dview, GtkShadowType shadow_type);

View File

@ -14,7 +14,7 @@
#define TEXT_BORDER 2 #define TEXT_BORDER 2
#define HANDLE_SIZE 3 #define HANDLE_SIZE 8
#define MIN_WIDTH 200 #define MIN_WIDTH 200
#define XOR_RECT_WIDTH 2 #define XOR_RECT_WIDTH 2
#define UNSELECT_TIMEOUT 150 /* ms */ #define UNSELECT_TIMEOUT 150 /* ms */
@ -173,9 +173,9 @@ child_set_text_pos (Child *child)
GtkAllocation allocation; GtkAllocation allocation;
allocation.x = 0; allocation.x = 0;
allocation.y = HANDLE_SIZE; allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
allocation.width = child->width; allocation.width = child->width;
allocation.height = child->height - 2 * HANDLE_SIZE; allocation.height = child->height - (GTK_WIDGET_HAS_FOCUS (child->widget) ? (2 * HANDLE_SIZE) : 0);
gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */ gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */
gtk_widget_size_allocate (child->widget, &allocation); gtk_widget_size_allocate (child->widget, &allocation);
@ -297,18 +297,43 @@ child_realized_setup (GtkWidget *widget, gpointer data)
} }
static gint static gint
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data) child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{ {
Child *child; Child *child;
child = data; child = data;
/* Paint handles on child */
child_set_text_pos (child);
return FALSE;
}
static gint
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{
Child *child;
GncalFullDay *fullday;
child = data;
/* Update summary in calendar object */
if (child->ico->summary) if (child->ico->summary)
g_free (child->ico->summary); g_free (child->ico->summary);
child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1); child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
/* FIXME: need notify calendar of change? */ /* Erase handles from child */
child_set_text_pos (child);
/* Notify calendar of change */
fullday = gtk_object_get_user_data (GTK_OBJECT (widget));
gnome_calendar_object_changed (fullday->calendar, child->ico, CHANGE_SUMMARY);
return FALSE; return FALSE;
} }
@ -328,6 +353,8 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
child->width = 0; child->width = 0;
child->height = 0; child->height = 0;
gtk_object_set_user_data (GTK_OBJECT (child->widget), fullday);
child_range_changed (fullday, child); child_range_changed (fullday, child);
/* We set the i-beam cursor and the initial summary text upon realization */ /* We set the i-beam cursor and the initial summary text upon realization */
@ -336,11 +363,13 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
(GtkSignalFunc) child_realized_setup, (GtkSignalFunc) child_realized_setup,
child); child);
/* Update the iCalObject summary when the text widget loses focus */ gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_in_event",
(GtkSignalFunc) child_focus_in,
child);
gtk_signal_connect (GTK_OBJECT (child->widget), "focus_out_event", gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_out_event",
(GtkSignalFunc) child_focus_out, (GtkSignalFunc) child_focus_out,
child); child);
/* Finish setup */ /* Finish setup */
@ -1354,7 +1383,7 @@ update_from_drag_info (GncalFullDay *fullday)
/* Notify calendar of change */ /* Notify calendar of change */
gnome_calendar_object_changed (fullday->calendar, di->child->ico); gnome_calendar_object_changed (fullday->calendar, di->child->ico, CHANGE_DATES);
} }
static gint static gint
@ -1569,7 +1598,7 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
} }
void void
gncal_full_day_update (GncalFullDay *fullday) gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
{ {
GList *children; GList *children;
GList *l_events, *events; GList *l_events, *events;
@ -1581,6 +1610,24 @@ gncal_full_day_update (GncalFullDay *fullday)
if (!fullday->calendar->cal) if (!fullday->calendar->cal)
return; return;
/* Try to find child that changed */
for (children = fullday->children; children; children = children->next) {
child = children->data;
if (child->ico == ico)
break;
}
/* If child was found and nothing but the summary changed, we can just paint the child and return */
if (children && !(flags & ~CHANGE_SUMMARY)) {
child_draw (fullday, child, NULL, TRUE);
return;
}
/* We have to regenerate and layout our list of children */
for (children = fullday->children; children; children = children->next) for (children = fullday->children; children; children = children->next)
child_destroy (fullday, children->data); child_destroy (fullday, children->data);
@ -1633,7 +1680,7 @@ gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper)
di->sel_rows_used = 0; /* clear selection */ di->sel_rows_used = 0; /* clear selection */
gncal_full_day_update (fullday); gncal_full_day_update (fullday, NULL, 0);
} }
} }
@ -1663,19 +1710,19 @@ gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *up
} }
void void
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object) gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico)
{ {
GList *children; GList *children;
Child *child; Child *child;
GdkEvent event; GdkEvent event;
g_return_if_fail (fullday != NULL); g_return_if_fail (fullday != NULL);
g_return_if_fail (object != NULL); g_return_if_fail (ico != NULL);
for (children = fullday->children; children; children = children->next) { for (children = fullday->children; children; children = children->next) {
child = children->data; child = children->data;
if (child->ico == object) { if (child->ico == ico) {
gtk_widget_grab_focus (child->widget); gtk_widget_grab_focus (child->widget);
/* We synthesize a click because GtkText will not set the cursor and /* We synthesize a click because GtkText will not set the cursor and

View File

@ -52,7 +52,7 @@ struct _GncalFullDayClass {
guint gncal_full_day_get_type (void); guint gncal_full_day_get_type (void);
GtkWidget *gncal_full_day_new (GnomeCalendar *calendar, time_t lower, time_t upper); GtkWidget *gncal_full_day_new (GnomeCalendar *calendar, time_t lower, time_t upper);
void gncal_full_day_update (GncalFullDay *fullday); void gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags);
void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper); void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper);
/* Returns the selected range in lower and upper. If nothing is /* Returns the selected range in lower and upper. If nothing is
@ -60,7 +60,7 @@ void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower,
*/ */
int gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *upper); int gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *upper);
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object); void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -105,24 +105,24 @@ gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week)
} }
static void static void
update (GncalWeekView *wview, int update_days) update (GncalWeekView *wview, int update_days, iCalObject *object, int flags)
{ {
int i; int i;
if (update_days) if (update_days)
for (i = 0; i < 7; i++) for (i = 0; i < 7; i++)
gncal_day_view_update (wview->days[i]); gncal_day_view_update (wview->days[i], object, flags);
/* FIXME: update extra widgets */ /* FIXME: update extra widgets */
} }
void void
gncal_week_view_update (GncalWeekView *wview) gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags)
{ {
g_return_if_fail (wview != NULL); g_return_if_fail (wview != NULL);
g_return_if_fail (GNCAL_IS_WEEK_VIEW (wview)); g_return_if_fail (GNCAL_IS_WEEK_VIEW (wview));
update (wview, TRUE); update (wview, TRUE, ico, flags);
} }
void void
@ -166,5 +166,5 @@ gncal_week_view_set (GncalWeekView *wview, time_t start_of_week)
day_start = day_end; day_start = day_end;
} }
update (wview, FALSE); update (wview, FALSE, NULL, 0);
} }

View File

@ -42,11 +42,11 @@ struct _GncalWeekViewClass {
}; };
guint gncal_week_view_get_type (void); guint gncal_week_view_get_type (void);
GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week); GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week);
void gncal_week_view_update (GncalWeekView *wview); void gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags);
void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week); void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -185,18 +185,18 @@ gnome_calendar_new (char *title)
return retval; return retval;
} }
void static void
gnome_calendar_update_all (GnomeCalendar *cal) gnome_calendar_update_all (GnomeCalendar *cal, iCalObject *object, int flags)
{ {
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view)); gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view), object, flags);
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view)); gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view), object, flags);
} }
void void
gnome_calendar_load (GnomeCalendar *gcal, char *file) gnome_calendar_load (GnomeCalendar *gcal, char *file)
{ {
calendar_load (gcal->cal, file); calendar_load (gcal->cal, file);
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, NULL, 0);
} }
void void
@ -205,11 +205,11 @@ gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj)
printf ("Adding object at: "); printf ("Adding object at: ");
print_time_t (obj->dtstart); print_time_t (obj->dtstart);
calendar_add_object (gcal->cal, obj); calendar_add_object (gcal->cal, obj);
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, obj, CHANGE_NEW);
} }
void void
gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj) gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags)
{ {
g_return_if_fail (gcal != NULL); g_return_if_fail (gcal != NULL);
g_return_if_fail (GNOME_IS_CALENDAR (gcal)); g_return_if_fail (GNOME_IS_CALENDAR (gcal));
@ -222,5 +222,5 @@ gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
gcal->cal->modified = TRUE; gcal->cal->modified = TRUE;
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, obj, flags);
} }

View File

@ -42,7 +42,9 @@ void gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj);
void gnome_calendar_next (GnomeCalendar *gcal); void gnome_calendar_next (GnomeCalendar *gcal);
void gnome_calendar_previous (GnomeCalendar *gcal); void gnome_calendar_previous (GnomeCalendar *gcal);
void gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time); void gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time);
void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj);
/* Flags is a bitmask of CalObjectChange values */
void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -114,7 +114,7 @@ gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper)
dview->upper = upper; dview->upper = upper;
dview->events = 0; dview->events = 0;
gncal_day_view_update (dview); gncal_day_view_update (dview, NULL, 0);
return GTK_WIDGET (dview); return GTK_WIDGET (dview);
} }
@ -284,7 +284,7 @@ gncal_day_view_expose (GtkWidget *widget, GdkEventExpose *event)
} }
void void
gncal_day_view_update (GncalDayView *dview) gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
{ {
struct tm tm; struct tm tm;
char buf[256]; char buf[256];
@ -323,7 +323,7 @@ gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper)
dview->lower = lower; dview->lower = lower;
dview->upper = upper; dview->upper = upper;
gncal_day_view_update (dview); gncal_day_view_update (dview, NULL, 0);
} }
} }

View File

@ -46,7 +46,7 @@ struct _GncalDayViewClass {
guint gncal_day_view_get_type (void); guint gncal_day_view_get_type (void);
GtkWidget *gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper); GtkWidget *gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper);
void gncal_day_view_update (GncalDayView *dview); void gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags);
void gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper); void gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper);
void gncal_day_view_set_shadow (GncalDayView *dview, GtkShadowType shadow_type); void gncal_day_view_set_shadow (GncalDayView *dview, GtkShadowType shadow_type);

View File

@ -14,7 +14,7 @@
#define TEXT_BORDER 2 #define TEXT_BORDER 2
#define HANDLE_SIZE 3 #define HANDLE_SIZE 8
#define MIN_WIDTH 200 #define MIN_WIDTH 200
#define XOR_RECT_WIDTH 2 #define XOR_RECT_WIDTH 2
#define UNSELECT_TIMEOUT 150 /* ms */ #define UNSELECT_TIMEOUT 150 /* ms */
@ -173,9 +173,9 @@ child_set_text_pos (Child *child)
GtkAllocation allocation; GtkAllocation allocation;
allocation.x = 0; allocation.x = 0;
allocation.y = HANDLE_SIZE; allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
allocation.width = child->width; allocation.width = child->width;
allocation.height = child->height - 2 * HANDLE_SIZE; allocation.height = child->height - (GTK_WIDGET_HAS_FOCUS (child->widget) ? (2 * HANDLE_SIZE) : 0);
gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */ gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */
gtk_widget_size_allocate (child->widget, &allocation); gtk_widget_size_allocate (child->widget, &allocation);
@ -297,18 +297,43 @@ child_realized_setup (GtkWidget *widget, gpointer data)
} }
static gint static gint
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data) child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{ {
Child *child; Child *child;
child = data; child = data;
/* Paint handles on child */
child_set_text_pos (child);
return FALSE;
}
static gint
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
{
Child *child;
GncalFullDay *fullday;
child = data;
/* Update summary in calendar object */
if (child->ico->summary) if (child->ico->summary)
g_free (child->ico->summary); g_free (child->ico->summary);
child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1); child->ico->summary = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
/* FIXME: need notify calendar of change? */ /* Erase handles from child */
child_set_text_pos (child);
/* Notify calendar of change */
fullday = gtk_object_get_user_data (GTK_OBJECT (widget));
gnome_calendar_object_changed (fullday->calendar, child->ico, CHANGE_SUMMARY);
return FALSE; return FALSE;
} }
@ -328,6 +353,8 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
child->width = 0; child->width = 0;
child->height = 0; child->height = 0;
gtk_object_set_user_data (GTK_OBJECT (child->widget), fullday);
child_range_changed (fullday, child); child_range_changed (fullday, child);
/* We set the i-beam cursor and the initial summary text upon realization */ /* We set the i-beam cursor and the initial summary text upon realization */
@ -336,11 +363,13 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
(GtkSignalFunc) child_realized_setup, (GtkSignalFunc) child_realized_setup,
child); child);
/* Update the iCalObject summary when the text widget loses focus */ gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_in_event",
(GtkSignalFunc) child_focus_in,
child);
gtk_signal_connect (GTK_OBJECT (child->widget), "focus_out_event", gtk_signal_connect_after (GTK_OBJECT (child->widget), "focus_out_event",
(GtkSignalFunc) child_focus_out, (GtkSignalFunc) child_focus_out,
child); child);
/* Finish setup */ /* Finish setup */
@ -1354,7 +1383,7 @@ update_from_drag_info (GncalFullDay *fullday)
/* Notify calendar of change */ /* Notify calendar of change */
gnome_calendar_object_changed (fullday->calendar, di->child->ico); gnome_calendar_object_changed (fullday->calendar, di->child->ico, CHANGE_DATES);
} }
static gint static gint
@ -1569,7 +1598,7 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
} }
void void
gncal_full_day_update (GncalFullDay *fullday) gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
{ {
GList *children; GList *children;
GList *l_events, *events; GList *l_events, *events;
@ -1581,6 +1610,24 @@ gncal_full_day_update (GncalFullDay *fullday)
if (!fullday->calendar->cal) if (!fullday->calendar->cal)
return; return;
/* Try to find child that changed */
for (children = fullday->children; children; children = children->next) {
child = children->data;
if (child->ico == ico)
break;
}
/* If child was found and nothing but the summary changed, we can just paint the child and return */
if (children && !(flags & ~CHANGE_SUMMARY)) {
child_draw (fullday, child, NULL, TRUE);
return;
}
/* We have to regenerate and layout our list of children */
for (children = fullday->children; children; children = children->next) for (children = fullday->children; children; children = children->next)
child_destroy (fullday, children->data); child_destroy (fullday, children->data);
@ -1633,7 +1680,7 @@ gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper)
di->sel_rows_used = 0; /* clear selection */ di->sel_rows_used = 0; /* clear selection */
gncal_full_day_update (fullday); gncal_full_day_update (fullday, NULL, 0);
} }
} }
@ -1663,19 +1710,19 @@ gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *up
} }
void void
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object) gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico)
{ {
GList *children; GList *children;
Child *child; Child *child;
GdkEvent event; GdkEvent event;
g_return_if_fail (fullday != NULL); g_return_if_fail (fullday != NULL);
g_return_if_fail (object != NULL); g_return_if_fail (ico != NULL);
for (children = fullday->children; children; children = children->next) { for (children = fullday->children; children; children = children->next) {
child = children->data; child = children->data;
if (child->ico == object) { if (child->ico == ico) {
gtk_widget_grab_focus (child->widget); gtk_widget_grab_focus (child->widget);
/* We synthesize a click because GtkText will not set the cursor and /* We synthesize a click because GtkText will not set the cursor and

View File

@ -52,7 +52,7 @@ struct _GncalFullDayClass {
guint gncal_full_day_get_type (void); guint gncal_full_day_get_type (void);
GtkWidget *gncal_full_day_new (GnomeCalendar *calendar, time_t lower, time_t upper); GtkWidget *gncal_full_day_new (GnomeCalendar *calendar, time_t lower, time_t upper);
void gncal_full_day_update (GncalFullDay *fullday); void gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags);
void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper); void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower, time_t upper);
/* Returns the selected range in lower and upper. If nothing is /* Returns the selected range in lower and upper. If nothing is
@ -60,7 +60,7 @@ void gncal_full_day_set_bounds (GncalFullDay *fullday, time_t lower,
*/ */
int gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *upper); int gncal_full_day_selection_range (GncalFullDay *fullday, time_t *lower, time_t *upper);
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object); void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -105,24 +105,24 @@ gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week)
} }
static void static void
update (GncalWeekView *wview, int update_days) update (GncalWeekView *wview, int update_days, iCalObject *object, int flags)
{ {
int i; int i;
if (update_days) if (update_days)
for (i = 0; i < 7; i++) for (i = 0; i < 7; i++)
gncal_day_view_update (wview->days[i]); gncal_day_view_update (wview->days[i], object, flags);
/* FIXME: update extra widgets */ /* FIXME: update extra widgets */
} }
void void
gncal_week_view_update (GncalWeekView *wview) gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags)
{ {
g_return_if_fail (wview != NULL); g_return_if_fail (wview != NULL);
g_return_if_fail (GNCAL_IS_WEEK_VIEW (wview)); g_return_if_fail (GNCAL_IS_WEEK_VIEW (wview));
update (wview, TRUE); update (wview, TRUE, ico, flags);
} }
void void
@ -166,5 +166,5 @@ gncal_week_view_set (GncalWeekView *wview, time_t start_of_week)
day_start = day_end; day_start = day_end;
} }
update (wview, FALSE); update (wview, FALSE, NULL, 0);
} }

View File

@ -42,11 +42,11 @@ struct _GncalWeekViewClass {
}; };
guint gncal_week_view_get_type (void); guint gncal_week_view_get_type (void);
GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week); GtkWidget *gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week);
void gncal_week_view_update (GncalWeekView *wview); void gncal_week_view_update (GncalWeekView *wview, iCalObject *ico, int flags);
void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week); void gncal_week_view_set (GncalWeekView *wview, time_t start_of_week);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -185,18 +185,18 @@ gnome_calendar_new (char *title)
return retval; return retval;
} }
void static void
gnome_calendar_update_all (GnomeCalendar *cal) gnome_calendar_update_all (GnomeCalendar *cal, iCalObject *object, int flags)
{ {
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view)); gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view), object, flags);
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view)); gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view), object, flags);
} }
void void
gnome_calendar_load (GnomeCalendar *gcal, char *file) gnome_calendar_load (GnomeCalendar *gcal, char *file)
{ {
calendar_load (gcal->cal, file); calendar_load (gcal->cal, file);
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, NULL, 0);
} }
void void
@ -205,11 +205,11 @@ gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj)
printf ("Adding object at: "); printf ("Adding object at: ");
print_time_t (obj->dtstart); print_time_t (obj->dtstart);
calendar_add_object (gcal->cal, obj); calendar_add_object (gcal->cal, obj);
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, obj, CHANGE_NEW);
} }
void void
gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj) gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags)
{ {
g_return_if_fail (gcal != NULL); g_return_if_fail (gcal != NULL);
g_return_if_fail (GNOME_IS_CALENDAR (gcal)); g_return_if_fail (GNOME_IS_CALENDAR (gcal));
@ -222,5 +222,5 @@ gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
gcal->cal->modified = TRUE; gcal->cal->modified = TRUE;
gnome_calendar_update_all (gcal); gnome_calendar_update_all (gcal, obj, flags);
} }

View File

@ -42,7 +42,9 @@ void gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj);
void gnome_calendar_next (GnomeCalendar *gcal); void gnome_calendar_next (GnomeCalendar *gcal);
void gnome_calendar_previous (GnomeCalendar *gcal); void gnome_calendar_previous (GnomeCalendar *gcal);
void gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time); void gnome_calendar_goto (GnomeCalendar *gcal, time_t new_time);
void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj);
/* Flags is a bitmask of CalObjectChange values */
void gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj, int flags);
END_GNOME_DECLS END_GNOME_DECLS

View File

@ -85,6 +85,13 @@ typedef struct {
int frequency; int frequency;
} Recurrence; } Recurrence;
/* Flags to indicate what has changed in an object */
typedef enum {
CHANGE_NEW = 1 << 0, /* new object */
CHANGE_SUMMARY = 1 << 1, /* summary */
CHANGE_DATES = 1 << 2 /* dtstart / dtend */
} CalObjectChange;
/* /*
* This describes an iCalendar object, note that we never store durations, instead we * This describes an iCalendar object, note that we never store durations, instead we
* always compute the end time computed from the start + duration. * always compute the end time computed from the start + duration.