set the height of the scrolled window for the description field, since the
2000-09-24 Damon Chaplin <damon@helixcode.com> * gui/dialogs/task-editor-dialog.glade: set the height of the scrolled window for the description field, since the default window height doesn't seem to be working. * cal-util/cal-component.h: added functions to get the actual icalproperty lists for RRULE and EXRULE properties. * cal-util/cal-recur.[hc]: added support for COUNT, though I need to test it a bit. Also fixed the call to generate_instances_for_year() so it uses the chunk dates. 2000-09-20 Damon Chaplin <damon@helixcode.com> * gui/event-editor.c: got rid of 1 '_' in '__Formatting'. svn path=/trunk/; revision=5562
This commit is contained in:
committed by
Damon Chaplin
parent
bfa2f69ce5
commit
fb1cdc0287
@ -1,3 +1,20 @@
|
||||
2000-09-24 Damon Chaplin <damon@helixcode.com>
|
||||
|
||||
* gui/dialogs/task-editor-dialog.glade: set the height of the scrolled
|
||||
window for the description field, since the default window height
|
||||
doesn't seem to be working.
|
||||
|
||||
* cal-util/cal-component.h: added functions to get the actual
|
||||
icalproperty lists for RRULE and EXRULE properties.
|
||||
|
||||
* cal-util/cal-recur.[hc]: added support for COUNT, though I need to
|
||||
test it a bit. Also fixed the call to generate_instances_for_year() so
|
||||
it uses the chunk dates.
|
||||
|
||||
2000-09-20 Damon Chaplin <damon@helixcode.com>
|
||||
|
||||
* gui/event-editor.c: got rid of 1 '_' in '__Formatting'.
|
||||
|
||||
2000-09-22 Michael Meeks <michael@helixcode.com>
|
||||
|
||||
* gui/calendar-commands.c (calendar_control_activate): upd.
|
||||
|
||||
@ -2192,6 +2192,29 @@ cal_component_get_exrule_list (CalComponent *comp, GSList **recur_list)
|
||||
get_recur_list (priv->exrule_list, icalproperty_get_exrule, recur_list);
|
||||
}
|
||||
|
||||
/**
|
||||
* cal_component_get_exrule_property_list:
|
||||
* @comp: A calendar component object.
|
||||
* @recur_list: Returns a list of exception rule properties.
|
||||
*
|
||||
* Returns a list of exception rule properties of a calendar component
|
||||
* object.
|
||||
**/
|
||||
void
|
||||
cal_component_get_exrule_property_list (CalComponent *comp, GSList **recur_list)
|
||||
{
|
||||
CalComponentPrivate *priv;
|
||||
|
||||
g_return_if_fail (comp != NULL);
|
||||
g_return_if_fail (IS_CAL_COMPONENT (comp));
|
||||
g_return_if_fail (recur_list != NULL);
|
||||
|
||||
priv = comp->priv;
|
||||
g_return_if_fail (priv->icalcomp != NULL);
|
||||
|
||||
*recur_list = priv->exrule_list;
|
||||
}
|
||||
|
||||
/**
|
||||
* cal_component_set_exrule_list:
|
||||
* @comp: A calendar component object.
|
||||
@ -2590,6 +2613,29 @@ cal_component_get_rrule_list (CalComponent *comp, GSList **recur_list)
|
||||
get_recur_list (priv->rrule_list, icalproperty_get_rrule, recur_list);
|
||||
}
|
||||
|
||||
/**
|
||||
* cal_component_get_rrule_property_list:
|
||||
* @comp: A calendar component object.
|
||||
* @recur_list: Returns a list of recurrence rule properties.
|
||||
*
|
||||
* Returns a list of recurrence rule properties of a calendar component
|
||||
* object.
|
||||
**/
|
||||
void
|
||||
cal_component_get_rrule_property_list (CalComponent *comp, GSList **recur_list)
|
||||
{
|
||||
CalComponentPrivate *priv;
|
||||
|
||||
g_return_if_fail (comp != NULL);
|
||||
g_return_if_fail (IS_CAL_COMPONENT (comp));
|
||||
g_return_if_fail (recur_list != NULL);
|
||||
|
||||
priv = comp->priv;
|
||||
g_return_if_fail (priv->icalcomp != NULL);
|
||||
|
||||
*recur_list = priv->rrule_list;
|
||||
}
|
||||
|
||||
/**
|
||||
* cal_component_set_rrule_list:
|
||||
* @comp: A calendar component object.
|
||||
|
||||
@ -203,6 +203,7 @@ void cal_component_set_exdate_list (CalComponent *comp, GSList *exdate_list);
|
||||
gboolean cal_component_has_exdates (CalComponent *comp);
|
||||
|
||||
void cal_component_get_exrule_list (CalComponent *comp, GSList **recur_list);
|
||||
void cal_component_get_exrule_property_list (CalComponent *comp, GSList **recur_list);
|
||||
void cal_component_set_exrule_list (CalComponent *comp, GSList *recur_list);
|
||||
gboolean cal_component_has_exrules (CalComponent *comp);
|
||||
|
||||
@ -225,6 +226,7 @@ void cal_component_set_rdate_list (CalComponent *comp, GSList *period_list);
|
||||
gboolean cal_component_has_rdates (CalComponent *comp);
|
||||
|
||||
void cal_component_get_rrule_list (CalComponent *comp, GSList **recur_list);
|
||||
void cal_component_get_rrule_property_list (CalComponent *comp, GSList **recur_list);
|
||||
void cal_component_set_rrule_list (CalComponent *comp, GSList *recur_list);
|
||||
gboolean cal_component_has_rrules (CalComponent *comp);
|
||||
|
||||
|
||||
@ -117,7 +117,8 @@ struct _RecurData {
|
||||
guint8 seconds[61];
|
||||
};
|
||||
|
||||
|
||||
/* The paramter we use to store the enddate in RRULE and EXRULE properties. */
|
||||
#define EVOLUTION_END_DATE_PARAMETER "X-EVOLUTION-ENDDATE"
|
||||
|
||||
typedef gboolean (*CalObjFindStartFn) (CalObjTime *event_start,
|
||||
CalObjTime *event_end,
|
||||
@ -159,6 +160,19 @@ typedef enum {
|
||||
CALOBJ_SECOND
|
||||
} CalObjTimeComparison;
|
||||
|
||||
static void cal_recur_generate_instances_of_rule (CalComponent *comp,
|
||||
icalproperty *prop,
|
||||
time_t start,
|
||||
time_t end,
|
||||
CalRecurInstanceFn cb,
|
||||
gpointer cb_data);
|
||||
|
||||
static CalRecurrence * cal_recur_from_icalproperty (icalproperty *prop,
|
||||
gboolean exception);
|
||||
static gint cal_recur_ical_weekday_to_weekday (enum icalrecurrencetype_weekday day);
|
||||
static void cal_recur_free (CalRecurrence *r);
|
||||
|
||||
|
||||
static void cal_object_compute_duration (CalObjTime *start,
|
||||
CalObjTime *end,
|
||||
gint *days,
|
||||
@ -196,7 +210,7 @@ static GArray* cal_obj_generate_set_default (RecurData *recur_data,
|
||||
CalObjTime *occ);
|
||||
|
||||
|
||||
static CalRecurVTable* cal_obj_get_vtable (CalRecurType recur_type);
|
||||
static CalRecurVTable* cal_obj_get_vtable (icalrecurrencetype_frequency recur_type);
|
||||
static void cal_obj_initialize_recur_data (RecurData *recur_data,
|
||||
CalRecurrence *recur,
|
||||
CalObjTime *event_start);
|
||||
@ -353,6 +367,24 @@ static gint cal_obj_date_only_compare_func (const void *arg1,
|
||||
const void *arg2);
|
||||
|
||||
|
||||
|
||||
static gboolean cal_recur_ensure_end_dates (CalComponent *comp,
|
||||
gboolean refresh);
|
||||
static gboolean cal_recur_ensure_rule_end_date (CalComponent *comp,
|
||||
icalproperty *prop,
|
||||
gboolean exception,
|
||||
gboolean refresh);
|
||||
static gboolean cal_recur_ensure_rule_end_date_cb (CalComponent *comp,
|
||||
time_t instance_start,
|
||||
time_t instance_end,
|
||||
gpointer data);
|
||||
static time_t cal_recur_get_rule_end_date (icalproperty *prop);
|
||||
static void cal_recur_set_rule_end_date (icalproperty *prop,
|
||||
time_t end_date);
|
||||
|
||||
|
||||
|
||||
|
||||
CalRecurVTable cal_obj_yearly_vtable = {
|
||||
cal_obj_yearly_find_start_position,
|
||||
cal_obj_yearly_find_next_position,
|
||||
@ -463,10 +495,39 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
time_t end,
|
||||
CalRecurInstanceFn cb,
|
||||
gpointer cb_data)
|
||||
{
|
||||
cal_recur_generate_instances_of_rule (comp, NULL, start, end,
|
||||
cb, cb_data);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Calls the given callback function for each occurrence of the given
|
||||
* recurrence rule between the given start and end times. If the rule is NULL
|
||||
* it uses all the rules from the component.
|
||||
* If end is 0 it continues until the event ends or forever if the event has
|
||||
* an infinite recurrence rule.
|
||||
* If the callback routine return 0 the occurrence generation stops.
|
||||
*
|
||||
* The use of the specific rule is for determining the end of a rule when
|
||||
* COUNT is set. The callback will count instances and store the enddata
|
||||
* when COUNT is reached.
|
||||
*
|
||||
* Both start and end can be -1, in which case we start at the events first
|
||||
* instance and continue until it ends, or forever if it has no enddate.
|
||||
*/
|
||||
void
|
||||
cal_recur_generate_instances_of_rule (CalComponent *comp,
|
||||
icalproperty *prop,
|
||||
time_t start,
|
||||
time_t end,
|
||||
CalRecurInstanceFn cb,
|
||||
gpointer cb_data)
|
||||
{
|
||||
CalComponentDateTime dtstart, dtend;
|
||||
time_t dtstart_time, dtend_time;
|
||||
GSList *rrules, *rdates, *exrules, *exdates;
|
||||
GSList *rrules = NULL, *rdates = NULL, elem;
|
||||
GSList *exrules = NULL, *exdates = NULL;
|
||||
CalObjTime interval_start, interval_end, event_start, event_end;
|
||||
CalObjTime chunk_start, chunk_end;
|
||||
gint days, seconds, year;
|
||||
@ -486,6 +547,10 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
}
|
||||
|
||||
dtstart_time = icaltime_as_timet (*dtstart.value);
|
||||
if (start == -1)
|
||||
start = dtstart_time;
|
||||
|
||||
/* FIXME: DURATION could be used instead, couldn't it? - Damon */
|
||||
if (dtend.value)
|
||||
dtend_time = icaltime_as_timet (*dtend.value);
|
||||
else
|
||||
@ -495,23 +560,34 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
intersects the given interval. */
|
||||
if (!(cal_component_has_recurrences (comp)
|
||||
|| cal_component_has_exceptions (comp))) {
|
||||
if ((end && dtstart_time < end && dtend_time > start)
|
||||
|| (end == 0 && dtend_time > start)) {
|
||||
if ((end == -1 || dtstart_time < end) && dtend_time > start) {
|
||||
(* cb) (comp, dtstart_time, dtend_time, cb_data);
|
||||
}
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Get the recurrence rules */
|
||||
cal_component_get_rrule_list (comp, &rrules);
|
||||
cal_component_get_rdate_list (comp, &rdates);
|
||||
cal_component_get_exrule_list (comp, &exrules);
|
||||
cal_component_get_exdate_list (comp, &exdates);
|
||||
/* If a specific recurrence rule is being used, set up a simple list,
|
||||
else get the recurrence rules from the component. */
|
||||
if (prop) {
|
||||
elem.data = prop;
|
||||
elem.next = NULL;
|
||||
rrules = &elem;
|
||||
} else {
|
||||
/* Make sure all the enddates for the rules are set. */
|
||||
cal_recur_ensure_end_dates (comp, FALSE);
|
||||
|
||||
/* Convert the interval start & end to CalObjTime. */
|
||||
cal_component_get_rrule_property_list (comp, &rrules);
|
||||
cal_component_get_rdate_list (comp, &rdates);
|
||||
cal_component_get_exrule_property_list (comp, &exrules);
|
||||
cal_component_get_exdate_list (comp, &exdates);
|
||||
}
|
||||
|
||||
/* Convert the interval start & end to CalObjTime. Note that if end
|
||||
is -1 interval_end won't be set, so don't use it! */
|
||||
cal_object_time_from_time (&interval_start, start);
|
||||
cal_object_time_from_time (&interval_end, end);
|
||||
if (end != -1)
|
||||
cal_object_time_from_time (&interval_end, end);
|
||||
|
||||
cal_object_time_from_time (&event_start, dtstart_time);
|
||||
cal_object_time_from_time (&event_end, dtend_time);
|
||||
@ -526,10 +602,13 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
|
||||
/* Expand the recurrence for each year between start & end, or until
|
||||
the callback returns 0 if end is 0. */
|
||||
for (year = interval_start.year; year <= interval_end.year; year++) {
|
||||
for (year = interval_start.year;
|
||||
end == -1 || year <= interval_end.year;
|
||||
year++) {
|
||||
chunk_start = interval_start;
|
||||
chunk_start.year = year;
|
||||
chunk_end = interval_end;
|
||||
if (end != -1)
|
||||
chunk_end = interval_end;
|
||||
chunk_end.year = year;
|
||||
|
||||
if (year != interval_start.year) {
|
||||
@ -539,7 +618,7 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
chunk_start.minute = 0;
|
||||
chunk_start.second = 0;
|
||||
}
|
||||
if (year != interval_end.year) {
|
||||
if (end == -1 || year != interval_end.year) {
|
||||
chunk_end.year++;
|
||||
chunk_end.month = 0;
|
||||
chunk_end.day = 0;
|
||||
@ -552,18 +631,17 @@ cal_recur_generate_instances (CalComponent *comp,
|
||||
rrules, rdates,
|
||||
exrules, exdates,
|
||||
&event_start,
|
||||
&interval_start,
|
||||
&interval_end,
|
||||
&chunk_start, &chunk_end,
|
||||
start, end,
|
||||
days, seconds,
|
||||
cb, cb_data))
|
||||
break;
|
||||
}
|
||||
|
||||
cal_component_free_recur_list (rrules);
|
||||
cal_component_free_period_list (rdates);
|
||||
cal_component_free_recur_list (exrules);
|
||||
cal_component_free_exdate_list (exdates);
|
||||
if (!prop) {
|
||||
cal_component_free_period_list (rdates);
|
||||
cal_component_free_exdate_list (exdates);
|
||||
}
|
||||
|
||||
out:
|
||||
cal_component_free_datetime (&dtstart);
|
||||
@ -587,140 +665,135 @@ array_to_list (short *array, int max_elements)
|
||||
}
|
||||
|
||||
/**
|
||||
* cal_recur_from_icalrecurrencetype:
|
||||
* @ir: A struct #icalrecurrencetype.
|
||||
* cal_recur_from_icalproperty:
|
||||
* @ir: An RRULE or EXRULE #icalproperty.
|
||||
*
|
||||
* Converts a struct #icalrecurrencetype to a #CalRecurrence. This should be
|
||||
* Converts an #icalproperty to a #CalRecurrence. This should be
|
||||
* freed using the cal_recur_free() function.
|
||||
*
|
||||
* Return value: #CalRecurrence structure.
|
||||
**/
|
||||
CalRecurrence *
|
||||
cal_recur_from_icalrecurrencetype (struct icalrecurrencetype *ir)
|
||||
static CalRecurrence *
|
||||
cal_recur_from_icalproperty (icalproperty *prop, gboolean exception)
|
||||
{
|
||||
struct icalrecurrencetype ir;
|
||||
CalRecurrence *r;
|
||||
gint max_elements, i;
|
||||
|
||||
g_return_val_if_fail (ir != NULL, NULL);
|
||||
g_return_val_if_fail (prop != NULL, NULL);
|
||||
|
||||
r = g_new (CalRecurrence, 1);
|
||||
|
||||
switch (ir->freq) {
|
||||
case ICAL_SECONDLY_RECURRENCE:
|
||||
r->type = CAL_RECUR_SECONDLY;
|
||||
break;
|
||||
if (exception)
|
||||
ir = icalproperty_get_exrule (prop);
|
||||
else
|
||||
ir = icalproperty_get_rrule (prop);
|
||||
|
||||
case ICAL_MINUTELY_RECURRENCE:
|
||||
r->type = CAL_RECUR_MINUTELY;
|
||||
break;
|
||||
r->freq = ir.freq;
|
||||
r->interval = ir.interval;
|
||||
|
||||
case ICAL_HOURLY_RECURRENCE:
|
||||
r->type = CAL_RECUR_HOURLY;
|
||||
break;
|
||||
|
||||
case ICAL_DAILY_RECURRENCE:
|
||||
r->type = CAL_RECUR_DAILY;
|
||||
break;
|
||||
|
||||
case ICAL_WEEKLY_RECURRENCE:
|
||||
r->type = CAL_RECUR_WEEKLY;
|
||||
break;
|
||||
|
||||
case ICAL_MONTHLY_RECURRENCE:
|
||||
r->type = CAL_RECUR_MONTHLY;
|
||||
break;
|
||||
|
||||
case ICAL_YEARLY_RECURRENCE:
|
||||
r->type = CAL_RECUR_YEARLY;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_message ("cal_recur_from_icalrecurrencetype(): Unknown recurrence frequency %d",
|
||||
(int) ir->freq);
|
||||
g_free (r);
|
||||
return NULL;
|
||||
if (ir.count != 0) {
|
||||
r->enddate = cal_recur_get_rule_end_date (prop);
|
||||
} else {
|
||||
/* FIXME: Does this work for never-ending events? */
|
||||
r->enddate = icaltime_as_timet (ir.until);
|
||||
if (r->enddate == (time_t)-1)
|
||||
r->enddate = 0;
|
||||
}
|
||||
|
||||
r->interval = ir->interval;
|
||||
r->week_start_day = cal_recur_ical_weekday_to_weekday (ir.week_start);
|
||||
|
||||
/* FIXME: we don't deal with ir->count. Also, how does libical
|
||||
* distinguish between n-occurrences and until-some-date rules?
|
||||
*/
|
||||
r->enddate = icaltime_as_timet (ir->until);
|
||||
if (r->enddate == (time_t)-1)
|
||||
r->enddate = 0;
|
||||
r->bymonth = array_to_list (ir.by_month,
|
||||
sizeof (ir.by_month) / sizeof (ir.by_month[0]));
|
||||
|
||||
switch (ir->week_start) {
|
||||
case ICAL_MONDAY_WEEKDAY:
|
||||
r->week_start_day = 0;
|
||||
break;
|
||||
r->byweekno = array_to_list (ir.by_week_no,
|
||||
sizeof (ir.by_week_no) / sizeof (ir.by_week_no[0]));
|
||||
|
||||
case ICAL_TUESDAY_WEEKDAY:
|
||||
r->week_start_day = 1;
|
||||
break;
|
||||
r->byyearday = array_to_list (ir.by_year_day,
|
||||
sizeof (ir.by_year_day) / sizeof (ir.by_year_day[0]));
|
||||
|
||||
case ICAL_WEDNESDAY_WEEKDAY:
|
||||
r->week_start_day = 2;
|
||||
break;
|
||||
r->bymonthday = array_to_list (ir.by_month_day,
|
||||
sizeof (ir.by_month_day) / sizeof (ir.by_month_day[0]));
|
||||
|
||||
case ICAL_THURSDAY_WEEKDAY:
|
||||
r->week_start_day = 3;
|
||||
break;
|
||||
/* FIXME: libical only supports 8 values, out of possible 107 * 7. */
|
||||
r->byday = NULL;
|
||||
max_elements = sizeof (ir.by_day) / sizeof (ir.by_day[0]);
|
||||
for (i = 0; i < max_elements && ir.by_day[i] != ICAL_RECURRENCE_ARRAY_MAX; i++) {
|
||||
enum icalrecurrencetype_weekday day;
|
||||
gint weeknum, weekday;
|
||||
|
||||
case ICAL_FRIDAY_WEEKDAY:
|
||||
r->week_start_day = 4;
|
||||
break;
|
||||
day = icalrecurrencetype_day_day_of_week (ir.by_day[i]);
|
||||
weeknum = icalrecurrencetype_day_position (ir.by_day[i]);
|
||||
|
||||
case ICAL_SATURDAY_WEEKDAY:
|
||||
r->week_start_day = 5;
|
||||
break;
|
||||
weekday = cal_recur_ical_weekday_to_weekday (day);
|
||||
|
||||
case ICAL_SUNDAY_WEEKDAY:
|
||||
r->week_start_day = 6;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_message ("cal_recur_from_icalrecurrencetype(): Unknown week day %d",
|
||||
ir->week_start);
|
||||
g_free (r);
|
||||
return NULL;
|
||||
r->byday = g_list_prepend (r->byday,
|
||||
GINT_TO_POINTER (weeknum));
|
||||
r->byday = g_list_prepend (r->byday,
|
||||
GINT_TO_POINTER (weekday));
|
||||
}
|
||||
|
||||
r->bymonth = array_to_list (ir->by_month,
|
||||
sizeof (ir->by_month) / sizeof (ir->by_month[0]));
|
||||
r->byhour = array_to_list (ir.by_hour,
|
||||
sizeof (ir.by_hour) / sizeof (ir.by_hour[0]));
|
||||
|
||||
r->byweekno = array_to_list (ir->by_week_no,
|
||||
sizeof (ir->by_week_no) / sizeof (ir->by_week_no[0]));
|
||||
r->byminute = array_to_list (ir.by_minute,
|
||||
sizeof (ir.by_minute) / sizeof (ir.by_minute[0]));
|
||||
|
||||
r->byyearday = array_to_list (ir->by_year_day,
|
||||
sizeof (ir->by_year_day) / sizeof (ir->by_year_day[0]));
|
||||
r->bysecond = array_to_list (ir.by_second,
|
||||
sizeof (ir.by_second) / sizeof (ir.by_second[0]));
|
||||
|
||||
r->bymonthday = array_to_list (ir->by_month_day,
|
||||
sizeof (ir->by_month_day) / sizeof (ir->by_month_day[0]));
|
||||
|
||||
r->byday = NULL; /* FIXME: libical sucks in this respect */
|
||||
|
||||
r->byhour = array_to_list (ir->by_hour,
|
||||
sizeof (ir->by_hour) / sizeof (ir->by_hour[0]));
|
||||
|
||||
r->byminute = array_to_list (ir->by_minute,
|
||||
sizeof (ir->by_minute) / sizeof (ir->by_minute[0]));
|
||||
|
||||
r->bysecond = array_to_list (ir->by_second,
|
||||
sizeof (ir->by_second) / sizeof (ir->by_second[0]));
|
||||
|
||||
r->bysetpos = array_to_list (ir->by_set_pos,
|
||||
sizeof (ir->by_set_pos) / sizeof (ir->by_set_pos[0]));
|
||||
r->bysetpos = array_to_list (ir.by_set_pos,
|
||||
sizeof (ir.by_set_pos) / sizeof (ir.by_set_pos[0]));
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
static gint
|
||||
cal_recur_ical_weekday_to_weekday (enum icalrecurrencetype_weekday day)
|
||||
{
|
||||
gint weekday;
|
||||
|
||||
switch (day) {
|
||||
case ICAL_NO_WEEKDAY: /* Monday is the default in RFC2445. */
|
||||
case ICAL_MONDAY_WEEKDAY:
|
||||
weekday = 0;
|
||||
break;
|
||||
case ICAL_TUESDAY_WEEKDAY:
|
||||
weekday = 1;
|
||||
break;
|
||||
case ICAL_WEDNESDAY_WEEKDAY:
|
||||
weekday = 2;
|
||||
break;
|
||||
case ICAL_THURSDAY_WEEKDAY:
|
||||
weekday = 3;
|
||||
break;
|
||||
case ICAL_FRIDAY_WEEKDAY:
|
||||
weekday = 4;
|
||||
break;
|
||||
case ICAL_SATURDAY_WEEKDAY:
|
||||
weekday = 5;
|
||||
break;
|
||||
case ICAL_SUNDAY_WEEKDAY:
|
||||
weekday = 6;
|
||||
break;
|
||||
default:
|
||||
g_warning ("cal_recur_ical_weekday_to_weekday(): Unknown week day %d",
|
||||
day);
|
||||
weekday = 0;
|
||||
}
|
||||
|
||||
return weekday;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* cal_recur_free:
|
||||
* @r: A #CalRecurrence structure.
|
||||
*
|
||||
* Frees a #CalRecurrence structure.
|
||||
**/
|
||||
void
|
||||
static void
|
||||
cal_recur_free (CalRecurrence *r)
|
||||
{
|
||||
g_return_if_fail (r != NULL);
|
||||
@ -771,11 +844,11 @@ generate_instances_for_year (CalComponent *comp,
|
||||
|
||||
/* Expand each of the recurrence rules. */
|
||||
for (elem = rrules; elem; elem = elem->next) {
|
||||
struct icalrecurrencetype *ir;
|
||||
icalproperty *prop;
|
||||
CalRecurrence *r;
|
||||
|
||||
ir = elem->data;
|
||||
r = cal_recur_from_icalrecurrencetype (ir);
|
||||
prop = elem->data;
|
||||
r = cal_recur_from_icalproperty (prop, FALSE);
|
||||
|
||||
tmp_occs = cal_obj_expand_recurrence (event_start, r,
|
||||
interval_start,
|
||||
@ -791,7 +864,11 @@ generate_instances_for_year (CalComponent *comp,
|
||||
struct icaltimetype *it;
|
||||
time_t t;
|
||||
|
||||
/* FIXME we should only be dealing with dates, not times too */
|
||||
/* FIXME we should only be dealing with dates, not times too.
|
||||
|
||||
No, I think it is supposed to be dates & times - Damon.
|
||||
I'm not sure what the semantics of just a date would be,
|
||||
since the event could recur several times each day. */
|
||||
it = elem->data;
|
||||
t = icaltime_as_timet (*it);
|
||||
cal_object_time_from_time (&cotime, t);
|
||||
@ -813,11 +890,11 @@ generate_instances_for_year (CalComponent *comp,
|
||||
|
||||
/* Expand each of the exception rules. */
|
||||
for (elem = exrules; elem; elem = elem->next) {
|
||||
struct icalrecurrencetype *ir;
|
||||
icalproperty *prop;
|
||||
CalRecurrence *r;
|
||||
|
||||
ir = elem->data;
|
||||
r = cal_recur_from_icalrecurrencetype (ir);
|
||||
prop = elem->data;
|
||||
r = cal_recur_from_icalproperty (prop, FALSE);
|
||||
|
||||
tmp_occs = cal_obj_expand_recurrence (event_start, r,
|
||||
interval_start,
|
||||
@ -833,7 +910,11 @@ generate_instances_for_year (CalComponent *comp,
|
||||
struct icaltimetype *it;
|
||||
time_t t;
|
||||
|
||||
/* FIXME we should only be dealing with dates, not times too */
|
||||
/* FIXME we should only be dealing with dates, not times too.
|
||||
|
||||
No, I think it is supposed to be dates & times - Damon.
|
||||
I'm not sure what the semantics of just a date would be,
|
||||
since the event could recur several times each day. */
|
||||
it = elem->data;
|
||||
t = icaltime_as_timet (*it);
|
||||
cal_object_time_from_time (&cotime, t);
|
||||
@ -940,11 +1021,13 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
|
||||
GArray *all_occs, *occs;
|
||||
gint len;
|
||||
|
||||
vtable = cal_obj_get_vtable (recur->type);
|
||||
|
||||
/* This is the resulting array of CalObjTime elements. */
|
||||
all_occs = g_array_new (FALSE, FALSE, sizeof (CalObjTime));
|
||||
|
||||
vtable = cal_obj_get_vtable (recur->freq);
|
||||
if (!vtable)
|
||||
return all_occs;
|
||||
|
||||
/* Calculate some useful data such as some fast lookup tables. */
|
||||
cal_obj_initialize_recur_data (&recur_data, recur, event_start);
|
||||
|
||||
@ -967,12 +1050,12 @@ cal_obj_expand_recurrence (CalObjTime *event_start,
|
||||
interval. */
|
||||
for (;;) {
|
||||
/* Generate the set of occurrences for this period. */
|
||||
switch (recur->type) {
|
||||
case CAL_RECUR_YEARLY:
|
||||
switch (recur->freq) {
|
||||
case ICAL_YEARLY_RECURRENCE:
|
||||
occs = cal_obj_generate_set_yearly (&recur_data,
|
||||
vtable, &occ);
|
||||
break;
|
||||
case CAL_RECUR_MONTHLY:
|
||||
case ICAL_MONTHLY_RECURRENCE:
|
||||
occs = cal_obj_generate_set_monthly (&recur_data,
|
||||
vtable, &occ);
|
||||
break;
|
||||
@ -1213,26 +1296,38 @@ cal_obj_generate_set_default (RecurData *recur_data,
|
||||
|
||||
|
||||
/* Returns the function table corresponding to the recurrence frequency. */
|
||||
static CalRecurVTable*
|
||||
cal_obj_get_vtable (CalRecurType recur_type)
|
||||
static CalRecurVTable* cal_obj_get_vtable (icalrecurrencetype_frequency recur_type)
|
||||
{
|
||||
CalRecurVTable* vtable;
|
||||
|
||||
switch (recur_type) {
|
||||
case CAL_RECUR_YEARLY:
|
||||
return &cal_obj_yearly_vtable;
|
||||
case CAL_RECUR_MONTHLY:
|
||||
return &cal_obj_monthly_vtable;
|
||||
case CAL_RECUR_WEEKLY:
|
||||
return &cal_obj_weekly_vtable;
|
||||
case CAL_RECUR_DAILY:
|
||||
return &cal_obj_daily_vtable;
|
||||
case CAL_RECUR_HOURLY:
|
||||
return &cal_obj_hourly_vtable;
|
||||
case CAL_RECUR_MINUTELY:
|
||||
return &cal_obj_minutely_vtable;
|
||||
case CAL_RECUR_SECONDLY:
|
||||
return &cal_obj_secondly_vtable;
|
||||
case ICAL_YEARLY_RECURRENCE:
|
||||
vtable = &cal_obj_yearly_vtable;
|
||||
break;
|
||||
case ICAL_MONTHLY_RECURRENCE:
|
||||
vtable = &cal_obj_monthly_vtable;
|
||||
break;
|
||||
case ICAL_WEEKLY_RECURRENCE:
|
||||
vtable = &cal_obj_weekly_vtable;
|
||||
break;
|
||||
case ICAL_DAILY_RECURRENCE:
|
||||
vtable = &cal_obj_daily_vtable;
|
||||
break;
|
||||
case ICAL_HOURLY_RECURRENCE:
|
||||
vtable = &cal_obj_hourly_vtable;
|
||||
break;
|
||||
case ICAL_MINUTELY_RECURRENCE:
|
||||
vtable = &cal_obj_minutely_vtable;
|
||||
break;
|
||||
case ICAL_SECONDLY_RECURRENCE:
|
||||
vtable = &cal_obj_secondly_vtable;
|
||||
break;
|
||||
default:
|
||||
g_warning ("Unknown recurrence frequenct");
|
||||
vtable = NULL;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return vtable;
|
||||
}
|
||||
|
||||
|
||||
@ -3095,3 +3190,168 @@ cal_object_time_from_time (CalObjTime *cotime,
|
||||
cotime->minute = tmp_tm->tm_min;
|
||||
cotime->second = tmp_tm->tm_sec;
|
||||
}
|
||||
|
||||
|
||||
/* This recalculates the end dates for recurrence & exception rules which use
|
||||
the COUNT property. If refresh is TRUE it will recalculate all enddates
|
||||
for rules which use COUNT. If refresh is FALSE, it will only calculate
|
||||
the enddate if it hasn't already been set. It returns TRUE if the component
|
||||
was changed, i.e. if the component should be saved at some point.
|
||||
We store the enddate in the "X-EVOLUTION-ENDDATE" parameter of the RRULE
|
||||
or EXRULE. */
|
||||
static gboolean
|
||||
cal_recur_ensure_end_dates (CalComponent *comp,
|
||||
gboolean refresh)
|
||||
{
|
||||
GSList *rrules, *exrules, *elem;
|
||||
gboolean changed = FALSE;
|
||||
|
||||
/* Do the RRULEs. */
|
||||
cal_component_get_rrule_property_list (comp, &rrules);
|
||||
for (elem = rrules; elem; elem = elem->next) {
|
||||
changed |= cal_recur_ensure_rule_end_date (comp, elem->data,
|
||||
FALSE, refresh);
|
||||
}
|
||||
|
||||
/* Do the EXRULEs. */
|
||||
cal_component_get_exrule_property_list (comp, &exrules);
|
||||
for (elem = exrules; elem; elem = elem->next) {
|
||||
changed |= cal_recur_ensure_rule_end_date (comp, elem->data,
|
||||
TRUE, refresh);
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
||||
typedef struct _CalRecurEnsureEndDateData CalRecurEnsureEndDateData;
|
||||
struct _CalRecurEnsureEndDateData {
|
||||
gint count;
|
||||
gint instances;
|
||||
time_t end_date;
|
||||
};
|
||||
|
||||
|
||||
static gboolean
|
||||
cal_recur_ensure_rule_end_date (CalComponent *comp,
|
||||
icalproperty *prop,
|
||||
gboolean exception,
|
||||
gboolean refresh)
|
||||
{
|
||||
struct icalrecurrencetype rule;
|
||||
CalRecurEnsureEndDateData cb_data;
|
||||
|
||||
if (exception)
|
||||
rule = icalproperty_get_exrule (prop);
|
||||
else
|
||||
rule = icalproperty_get_rrule (prop);
|
||||
|
||||
/* If the rule doesn't use COUNT just return. */
|
||||
if (rule.count == 0)
|
||||
return FALSE;
|
||||
|
||||
/* If refresh is FALSE, we check if the enddate is already set, and
|
||||
if it is we just return. */
|
||||
if (!refresh) {
|
||||
if (cal_recur_get_rule_end_date (prop) != -1)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Calculate the end date. */
|
||||
cb_data.count = rule.count;
|
||||
cb_data.instances = 0;
|
||||
cal_recur_generate_instances_of_rule (comp, prop, -1, -1,
|
||||
cal_recur_ensure_rule_end_date_cb,
|
||||
&cb_data);
|
||||
|
||||
/* Store the end date in the "X-EVOLUTION-ENDDATE" parameter of the
|
||||
rule. */
|
||||
cal_recur_set_rule_end_date (prop, cb_data.end_date);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
cal_recur_ensure_rule_end_date_cb (CalComponent *comp,
|
||||
time_t instance_start,
|
||||
time_t instance_end,
|
||||
gpointer data)
|
||||
{
|
||||
CalRecurEnsureEndDateData *cb_data;
|
||||
|
||||
cb_data = (CalRecurEnsureEndDateData*) data;
|
||||
|
||||
cb_data->instances++;
|
||||
if (cb_data->instances == cb_data->count) {
|
||||
cb_data->end_date = instance_start;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static time_t
|
||||
cal_recur_get_rule_end_date (icalproperty *prop)
|
||||
{
|
||||
icalparameter *param;
|
||||
char *xname, *xvalue;
|
||||
icalvalue *value;
|
||||
struct icaltimetype icaltime;
|
||||
|
||||
param = icalproperty_get_first_parameter (prop, ICAL_X_PARAMETER);
|
||||
while (param) {
|
||||
xname = icalparameter_get_xname (param);
|
||||
if (!strcmp (xname, EVOLUTION_END_DATE_PARAMETER)) {
|
||||
xvalue = icalparameter_get_xvalue (param);
|
||||
value = icalvalue_new_from_string (ICAL_DATETIME_VALUE,
|
||||
xvalue);
|
||||
if (value) {
|
||||
icaltime = icalvalue_get_datetime (value);
|
||||
icalvalue_free (value);
|
||||
|
||||
return icaltime_as_timet (icaltime);
|
||||
}
|
||||
}
|
||||
|
||||
param = icalproperty_get_next_parameter (prop,
|
||||
ICAL_X_PARAMETER);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
cal_recur_set_rule_end_date (icalproperty *prop,
|
||||
time_t end_date)
|
||||
{
|
||||
icalparameter *param;
|
||||
icalvalue *value;
|
||||
struct icaltimetype icaltime;
|
||||
char *end_date_string, *xname;
|
||||
|
||||
icaltime = icaltime_from_timet (end_date, FALSE, FALSE);
|
||||
value = icalvalue_new_datetime (icaltime);
|
||||
end_date_string = icalvalue_as_ical_string (value);
|
||||
icalvalue_free (value);
|
||||
|
||||
/* If we already have an X-EVOLUTION-ENDDATE parameter, set the value
|
||||
to the new date-time. */
|
||||
param = icalproperty_get_first_parameter (prop, ICAL_X_PARAMETER);
|
||||
while (param) {
|
||||
xname = icalparameter_get_xname (param);
|
||||
if (!strcmp (xname, EVOLUTION_END_DATE_PARAMETER)) {
|
||||
icalparameter_set_x (param, end_date_string);
|
||||
return;
|
||||
}
|
||||
param = icalproperty_get_next_parameter (prop, ICAL_X_PARAMETER);
|
||||
}
|
||||
|
||||
/* Create a new X-EVOLUTION-ENDDATE and add it to the property. */
|
||||
param = icalparameter_new_x (EVOLUTION_END_DATE_PARAMETER);
|
||||
icalparameter_set_x (param, end_date_string);
|
||||
icalproperty_add_parameter (prop, param);
|
||||
}
|
||||
|
||||
|
||||
@ -30,18 +30,8 @@
|
||||
|
||||
BEGIN_GNOME_DECLS
|
||||
|
||||
typedef enum {
|
||||
CAL_RECUR_YEARLY,
|
||||
CAL_RECUR_MONTHLY,
|
||||
CAL_RECUR_WEEKLY,
|
||||
CAL_RECUR_DAILY,
|
||||
CAL_RECUR_HOURLY,
|
||||
CAL_RECUR_MINUTELY,
|
||||
CAL_RECUR_SECONDLY
|
||||
} CalRecurType;
|
||||
|
||||
typedef struct {
|
||||
CalRecurType type;
|
||||
icalrecurrencetype_frequency freq;
|
||||
|
||||
int interval;
|
||||
|
||||
@ -103,15 +93,18 @@ typedef gboolean (* CalRecurInstanceFn) (CalComponent *comp,
|
||||
time_t instace_end,
|
||||
gpointer data);
|
||||
|
||||
/*
|
||||
* Calls the given callback function for each occurrence of the event between
|
||||
* the given start and end times. If end is 0 it continues until the event
|
||||
* ends or forever if the event has an infinite recurrence rule.
|
||||
* If the callback routine return 0 the occurrence generation stops.
|
||||
*/
|
||||
void cal_recur_generate_instances (CalComponent *comp,
|
||||
time_t start,
|
||||
time_t end,
|
||||
CalRecurInstanceFn cb,
|
||||
gpointer cb_data);
|
||||
|
||||
CalRecurrence *cal_recur_from_icalrecurrencetype (struct icalrecurrencetype *ir);
|
||||
void cal_recur_free (CalRecurrence *r);
|
||||
|
||||
END_GNOME_DECLS
|
||||
|
||||
#endif
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
<type>GTK_WINDOW_TOPLEVEL</type>
|
||||
<position>GTK_WIN_POS_NONE</position>
|
||||
<modal>False</modal>
|
||||
<default_height>350</default_height>
|
||||
<allow_shrink>False</allow_shrink>
|
||||
<allow_grow>True</allow_grow>
|
||||
<auto_shrink>False</auto_shrink>
|
||||
@ -450,6 +449,7 @@ Confidential
|
||||
<widget>
|
||||
<class>GtkScrolledWindow</class>
|
||||
<name>scrolledwindow1</name>
|
||||
<height>150</height>
|
||||
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
|
||||
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
|
||||
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
|
||||
@ -484,6 +484,7 @@ Confidential
|
||||
<class>GtkButton</class>
|
||||
<name>button3</name>
|
||||
<can_focus>True</can_focus>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -524,6 +525,7 @@ Confidential
|
||||
<class>GtkButton</class>
|
||||
<name>button4</name>
|
||||
<can_focus>True</can_focus>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
|
||||
@ -10,22 +10,19 @@ gchar *s = N_("Sta_rt Date:");
|
||||
gchar *s = N_("_Due Date:");
|
||||
gchar *s = N_("% Comp_lete:");
|
||||
gchar *s = N_("_Status:");
|
||||
gchar *s = N_("Not Started\n"
|
||||
"In Progress\n"
|
||||
"Completed\n"
|
||||
"Cancelled\n"
|
||||
"");
|
||||
gchar *s = N_("Not Started");
|
||||
gchar *s = N_("In Progress");
|
||||
gchar *s = N_("Completed");
|
||||
gchar *s = N_("Cancelled");
|
||||
gchar *s = N_("_Priority:");
|
||||
gchar *s = N_("High\n"
|
||||
"Normal\n"
|
||||
"Low\n"
|
||||
"");
|
||||
gchar *s = N_("High");
|
||||
gchar *s = N_("Normal");
|
||||
gchar *s = N_("Low");
|
||||
gchar *s = N_("C_lassification:");
|
||||
gchar *s = N_("None\n"
|
||||
"Public\n"
|
||||
"Private\n"
|
||||
"Confidential\n"
|
||||
"");
|
||||
gchar *s = N_("None");
|
||||
gchar *s = N_("Public");
|
||||
gchar *s = N_("Private");
|
||||
gchar *s = N_("Confidential");
|
||||
gchar *s = N_("_Contacts...");
|
||||
gchar *s = N_("Ca_tegories...");
|
||||
gchar *s = N_("Task");
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
<type>GTK_WINDOW_TOPLEVEL</type>
|
||||
<position>GTK_WIN_POS_NONE</position>
|
||||
<modal>False</modal>
|
||||
<default_height>350</default_height>
|
||||
<allow_shrink>False</allow_shrink>
|
||||
<allow_grow>True</allow_grow>
|
||||
<auto_shrink>False</auto_shrink>
|
||||
@ -450,6 +449,7 @@ Confidential
|
||||
<widget>
|
||||
<class>GtkScrolledWindow</class>
|
||||
<name>scrolledwindow1</name>
|
||||
<height>150</height>
|
||||
<hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
|
||||
<vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
|
||||
<hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
|
||||
@ -484,6 +484,7 @@ Confidential
|
||||
<class>GtkButton</class>
|
||||
<name>button3</name>
|
||||
<can_focus>True</can_focus>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
@ -524,6 +525,7 @@ Confidential
|
||||
<class>GtkButton</class>
|
||||
<name>button4</name>
|
||||
<can_focus>True</can_focus>
|
||||
<relief>GTK_RELIEF_NORMAL</relief>
|
||||
<child>
|
||||
<padding>0</padding>
|
||||
<expand>False</expand>
|
||||
|
||||
@ -1239,7 +1239,7 @@ static GnomeUIInfo view_next_menu[] = {
|
||||
static GnomeUIInfo view_toolbars_menu[] = {
|
||||
{ GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Standard"), NULL, NULL, NULL, NULL,
|
||||
GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
|
||||
{ GNOME_APP_UI_TOGGLEITEM, N_("FIXME: __Formatting"), NULL, NULL, NULL, NULL,
|
||||
{ GNOME_APP_UI_TOGGLEITEM, N_("FIXME: _Formatting"), NULL, NULL, NULL, NULL,
|
||||
GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },
|
||||
GNOMEUIINFO_SEPARATOR,
|
||||
GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Customize..."), NULL, NULL),
|
||||
|
||||
Reference in New Issue
Block a user