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:

committed by
Arturo Espinosa

parent
23ef00df35
commit
49a388705e
@ -1,5 +1,25 @@
|
||||
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.c (gncal_full_day_focus_child): New function to
|
||||
let the outside world decide which child to focus.
|
||||
|
@ -85,6 +85,13 @@ typedef struct {
|
||||
int frequency;
|
||||
} 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
|
||||
* always compute the end time computed from the start + duration.
|
||||
|
@ -85,6 +85,13 @@ typedef struct {
|
||||
int frequency;
|
||||
} 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
|
||||
* always compute the end time computed from the start + duration.
|
||||
|
@ -114,7 +114,7 @@ gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper)
|
||||
dview->upper = upper;
|
||||
dview->events = 0;
|
||||
|
||||
gncal_day_view_update (dview);
|
||||
gncal_day_view_update (dview, NULL, 0);
|
||||
|
||||
return GTK_WIDGET (dview);
|
||||
}
|
||||
@ -284,7 +284,7 @@ gncal_day_view_expose (GtkWidget *widget, GdkEventExpose *event)
|
||||
}
|
||||
|
||||
void
|
||||
gncal_day_view_update (GncalDayView *dview)
|
||||
gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
|
||||
{
|
||||
struct tm tm;
|
||||
char buf[256];
|
||||
@ -323,7 +323,7 @@ gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper)
|
||||
dview->lower = lower;
|
||||
dview->upper = upper;
|
||||
|
||||
gncal_day_view_update (dview);
|
||||
gncal_day_view_update (dview, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,7 @@ struct _GncalDayViewClass {
|
||||
guint gncal_day_view_get_type (void);
|
||||
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_shadow (GncalDayView *dview, GtkShadowType shadow_type);
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
|
||||
#define TEXT_BORDER 2
|
||||
#define HANDLE_SIZE 3
|
||||
#define HANDLE_SIZE 8
|
||||
#define MIN_WIDTH 200
|
||||
#define XOR_RECT_WIDTH 2
|
||||
#define UNSELECT_TIMEOUT 150 /* ms */
|
||||
@ -173,9 +173,9 @@ child_set_text_pos (Child *child)
|
||||
GtkAllocation allocation;
|
||||
|
||||
allocation.x = 0;
|
||||
allocation.y = HANDLE_SIZE;
|
||||
allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
|
||||
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_allocate (child->widget, &allocation);
|
||||
@ -297,18 +297,43 @@ child_realized_setup (GtkWidget *widget, gpointer data)
|
||||
}
|
||||
|
||||
static gint
|
||||
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
||||
child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
||||
{
|
||||
Child *child;
|
||||
|
||||
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)
|
||||
g_free (child->ico->summary);
|
||||
|
||||
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;
|
||||
}
|
||||
@ -328,6 +353,8 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
|
||||
child->width = 0;
|
||||
child->height = 0;
|
||||
|
||||
gtk_object_set_user_data (GTK_OBJECT (child->widget), fullday);
|
||||
|
||||
child_range_changed (fullday, child);
|
||||
|
||||
/* We set the i-beam cursor and the initial summary text upon realization */
|
||||
@ -336,9 +363,11 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
|
||||
(GtkSignalFunc) child_realized_setup,
|
||||
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,
|
||||
child);
|
||||
|
||||
@ -1354,7 +1383,7 @@ update_from_drag_info (GncalFullDay *fullday)
|
||||
|
||||
/* 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
|
||||
@ -1569,7 +1598,7 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
|
||||
}
|
||||
|
||||
void
|
||||
gncal_full_day_update (GncalFullDay *fullday)
|
||||
gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
|
||||
{
|
||||
GList *children;
|
||||
GList *l_events, *events;
|
||||
@ -1581,6 +1610,24 @@ gncal_full_day_update (GncalFullDay *fullday)
|
||||
if (!fullday->calendar->cal)
|
||||
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)
|
||||
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 */
|
||||
|
||||
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
|
||||
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object)
|
||||
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico)
|
||||
{
|
||||
GList *children;
|
||||
Child *child;
|
||||
GdkEvent event;
|
||||
|
||||
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) {
|
||||
child = children->data;
|
||||
|
||||
if (child->ico == object) {
|
||||
if (child->ico == ico) {
|
||||
gtk_widget_grab_focus (child->widget);
|
||||
|
||||
/* We synthesize a click because GtkText will not set the cursor and
|
||||
|
@ -52,7 +52,7 @@ struct _GncalFullDayClass {
|
||||
guint gncal_full_day_get_type (void);
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object);
|
||||
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico);
|
||||
|
||||
END_GNOME_DECLS
|
||||
|
||||
|
@ -105,24 +105,24 @@ gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week)
|
||||
}
|
||||
|
||||
static void
|
||||
update (GncalWeekView *wview, int update_days)
|
||||
update (GncalWeekView *wview, int update_days, iCalObject *object, int flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (update_days)
|
||||
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 */
|
||||
}
|
||||
|
||||
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 (GNCAL_IS_WEEK_VIEW (wview));
|
||||
|
||||
update (wview, TRUE);
|
||||
update (wview, TRUE, ico, flags);
|
||||
}
|
||||
|
||||
void
|
||||
@ -166,5 +166,5 @@ gncal_week_view_set (GncalWeekView *wview, time_t start_of_week)
|
||||
day_start = day_end;
|
||||
}
|
||||
|
||||
update (wview, FALSE);
|
||||
update (wview, FALSE, NULL, 0);
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ struct _GncalWeekViewClass {
|
||||
guint gncal_week_view_get_type (void);
|
||||
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);
|
||||
|
||||
|
||||
|
@ -185,18 +185,18 @@ gnome_calendar_new (char *title)
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
gnome_calendar_update_all (GnomeCalendar *cal)
|
||||
static void
|
||||
gnome_calendar_update_all (GnomeCalendar *cal, iCalObject *object, int flags)
|
||||
{
|
||||
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view));
|
||||
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view));
|
||||
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view), object, flags);
|
||||
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view), object, flags);
|
||||
}
|
||||
|
||||
void
|
||||
gnome_calendar_load (GnomeCalendar *gcal, char *file)
|
||||
{
|
||||
calendar_load (gcal->cal, file);
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, NULL, 0);
|
||||
}
|
||||
|
||||
void
|
||||
@ -205,11 +205,11 @@ gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj)
|
||||
printf ("Adding object at: ");
|
||||
print_time_t (obj->dtstart);
|
||||
calendar_add_object (gcal->cal, obj);
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, obj, CHANGE_NEW);
|
||||
}
|
||||
|
||||
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 (GNOME_IS_CALENDAR (gcal));
|
||||
@ -222,5 +222,5 @@ gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
|
||||
|
||||
gcal->cal->modified = TRUE;
|
||||
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, obj, flags);
|
||||
}
|
||||
|
@ -42,7 +42,9 @@ void gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj);
|
||||
void gnome_calendar_next (GnomeCalendar *gcal);
|
||||
void gnome_calendar_previous (GnomeCalendar *gcal);
|
||||
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
|
||||
|
||||
|
@ -114,7 +114,7 @@ gncal_day_view_new (GnomeCalendar *calendar, time_t lower, time_t upper)
|
||||
dview->upper = upper;
|
||||
dview->events = 0;
|
||||
|
||||
gncal_day_view_update (dview);
|
||||
gncal_day_view_update (dview, NULL, 0);
|
||||
|
||||
return GTK_WIDGET (dview);
|
||||
}
|
||||
@ -284,7 +284,7 @@ gncal_day_view_expose (GtkWidget *widget, GdkEventExpose *event)
|
||||
}
|
||||
|
||||
void
|
||||
gncal_day_view_update (GncalDayView *dview)
|
||||
gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
|
||||
{
|
||||
struct tm tm;
|
||||
char buf[256];
|
||||
@ -323,7 +323,7 @@ gncal_day_view_set_bounds (GncalDayView *dview, time_t lower, time_t upper)
|
||||
dview->lower = lower;
|
||||
dview->upper = upper;
|
||||
|
||||
gncal_day_view_update (dview);
|
||||
gncal_day_view_update (dview, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,7 +46,7 @@ struct _GncalDayViewClass {
|
||||
guint gncal_day_view_get_type (void);
|
||||
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_shadow (GncalDayView *dview, GtkShadowType shadow_type);
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
|
||||
#define TEXT_BORDER 2
|
||||
#define HANDLE_SIZE 3
|
||||
#define HANDLE_SIZE 8
|
||||
#define MIN_WIDTH 200
|
||||
#define XOR_RECT_WIDTH 2
|
||||
#define UNSELECT_TIMEOUT 150 /* ms */
|
||||
@ -173,9 +173,9 @@ child_set_text_pos (Child *child)
|
||||
GtkAllocation allocation;
|
||||
|
||||
allocation.x = 0;
|
||||
allocation.y = HANDLE_SIZE;
|
||||
allocation.y = (GTK_WIDGET_HAS_FOCUS (child->widget) ? HANDLE_SIZE : 0);
|
||||
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_allocate (child->widget, &allocation);
|
||||
@ -297,18 +297,43 @@ child_realized_setup (GtkWidget *widget, gpointer data)
|
||||
}
|
||||
|
||||
static gint
|
||||
child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
||||
child_focus_in (GtkWidget *widget, GdkEventFocus *event, gpointer data)
|
||||
{
|
||||
Child *child;
|
||||
|
||||
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)
|
||||
g_free (child->ico->summary);
|
||||
|
||||
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;
|
||||
}
|
||||
@ -328,6 +353,8 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
|
||||
child->width = 0;
|
||||
child->height = 0;
|
||||
|
||||
gtk_object_set_user_data (GTK_OBJECT (child->widget), fullday);
|
||||
|
||||
child_range_changed (fullday, child);
|
||||
|
||||
/* We set the i-beam cursor and the initial summary text upon realization */
|
||||
@ -336,9 +363,11 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
|
||||
(GtkSignalFunc) child_realized_setup,
|
||||
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,
|
||||
child);
|
||||
|
||||
@ -1354,7 +1383,7 @@ update_from_drag_info (GncalFullDay *fullday)
|
||||
|
||||
/* 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
|
||||
@ -1569,7 +1598,7 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
|
||||
}
|
||||
|
||||
void
|
||||
gncal_full_day_update (GncalFullDay *fullday)
|
||||
gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
|
||||
{
|
||||
GList *children;
|
||||
GList *l_events, *events;
|
||||
@ -1581,6 +1610,24 @@ gncal_full_day_update (GncalFullDay *fullday)
|
||||
if (!fullday->calendar->cal)
|
||||
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)
|
||||
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 */
|
||||
|
||||
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
|
||||
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object)
|
||||
gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico)
|
||||
{
|
||||
GList *children;
|
||||
Child *child;
|
||||
GdkEvent event;
|
||||
|
||||
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) {
|
||||
child = children->data;
|
||||
|
||||
if (child->ico == object) {
|
||||
if (child->ico == ico) {
|
||||
gtk_widget_grab_focus (child->widget);
|
||||
|
||||
/* We synthesize a click because GtkText will not set the cursor and
|
||||
|
@ -52,7 +52,7 @@ struct _GncalFullDayClass {
|
||||
guint gncal_full_day_get_type (void);
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
||||
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *object);
|
||||
void gncal_full_day_focus_child (GncalFullDay *fullday, iCalObject *ico);
|
||||
|
||||
END_GNOME_DECLS
|
||||
|
||||
|
@ -105,24 +105,24 @@ gncal_week_view_new (GnomeCalendar *calendar, time_t start_of_week)
|
||||
}
|
||||
|
||||
static void
|
||||
update (GncalWeekView *wview, int update_days)
|
||||
update (GncalWeekView *wview, int update_days, iCalObject *object, int flags)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (update_days)
|
||||
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 */
|
||||
}
|
||||
|
||||
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 (GNCAL_IS_WEEK_VIEW (wview));
|
||||
|
||||
update (wview, TRUE);
|
||||
update (wview, TRUE, ico, flags);
|
||||
}
|
||||
|
||||
void
|
||||
@ -166,5 +166,5 @@ gncal_week_view_set (GncalWeekView *wview, time_t start_of_week)
|
||||
day_start = day_end;
|
||||
}
|
||||
|
||||
update (wview, FALSE);
|
||||
update (wview, FALSE, NULL, 0);
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ struct _GncalWeekViewClass {
|
||||
guint gncal_week_view_get_type (void);
|
||||
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);
|
||||
|
||||
|
||||
|
@ -185,18 +185,18 @@ gnome_calendar_new (char *title)
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
gnome_calendar_update_all (GnomeCalendar *cal)
|
||||
static void
|
||||
gnome_calendar_update_all (GnomeCalendar *cal, iCalObject *object, int flags)
|
||||
{
|
||||
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view));
|
||||
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view));
|
||||
gncal_full_day_update (GNCAL_FULL_DAY (cal->day_view), object, flags);
|
||||
gncal_week_view_update (GNCAL_WEEK_VIEW (cal->week_view), object, flags);
|
||||
}
|
||||
|
||||
void
|
||||
gnome_calendar_load (GnomeCalendar *gcal, char *file)
|
||||
{
|
||||
calendar_load (gcal->cal, file);
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, NULL, 0);
|
||||
}
|
||||
|
||||
void
|
||||
@ -205,11 +205,11 @@ gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj)
|
||||
printf ("Adding object at: ");
|
||||
print_time_t (obj->dtstart);
|
||||
calendar_add_object (gcal->cal, obj);
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, obj, CHANGE_NEW);
|
||||
}
|
||||
|
||||
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 (GNOME_IS_CALENDAR (gcal));
|
||||
@ -222,5 +222,5 @@ gnome_calendar_object_changed (GnomeCalendar *gcal, iCalObject *obj)
|
||||
|
||||
gcal->cal->modified = TRUE;
|
||||
|
||||
gnome_calendar_update_all (gcal);
|
||||
gnome_calendar_update_all (gcal, obj, flags);
|
||||
}
|
||||
|
@ -42,7 +42,9 @@ void gnome_calendar_add_object (GnomeCalendar *gcal, iCalObject *obj);
|
||||
void gnome_calendar_next (GnomeCalendar *gcal);
|
||||
void gnome_calendar_previous (GnomeCalendar *gcal);
|
||||
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
|
||||
|
||||
|
@ -85,6 +85,13 @@ typedef struct {
|
||||
int frequency;
|
||||
} 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
|
||||
* always compute the end time computed from the start + duration.
|
||||
|
Reference in New Issue
Block a user