diff --git a/ChangeLog b/ChangeLog index 3be02f72c..1fa5f6024 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2010-08-13 Wolfgang Sourdeau + + * SoObjects/Appointments/iCalEvent+SOGo.m (-quickRecord): we now + make use of the new -[iCalAlarm nextAlarmDate] method. + + * SoObjects/Appointments/iCalToDo+SOGo.m (-quickRecord): we now + make use of the new -[iCalAlarm nextAlarmDate] method. + 2010-08-12 Wolfgang Sourdeau * UI/WebServerResources/MailerUIdTree.js: (getMailboxNode): fixed diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 91fb55d8a..1a22c37c3 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,8 @@ +2010-08-13 Wolfgang Sourdeau + + * iCalAlarm.m (-nextAlarmDate): new utility method split from the + SOGo quick table extractor for events. + 2010-08-11 Wolfgang Sourdeau * NGVCardPhoto.m (-type): returns @"JPEG" if the type is diff --git a/SOPE/NGCards/iCalAlarm.h b/SOPE/NGCards/iCalAlarm.h index 41a45c042..ecb39f5c6 100644 --- a/SOPE/NGCards/iCalAlarm.h +++ b/SOPE/NGCards/iCalAlarm.h @@ -41,6 +41,8 @@ - (void) setRecurrenceRule: (NSString *) _recurrenceRule; - (NSString *) recurrenceRule; +- (NSCalendarDate *) nextAlarmDate; + @end #endif /* __NGCards_iCalAlarm_H__ */ diff --git a/SOPE/NGCards/iCalAlarm.m b/SOPE/NGCards/iCalAlarm.m index a4218fa84..d07d81f4e 100644 --- a/SOPE/NGCards/iCalAlarm.m +++ b/SOPE/NGCards/iCalAlarm.m @@ -20,10 +20,15 @@ */ #import +#import +#import #import "iCalAttachment.h" +#import "iCalEvent.h" #import "iCalRecurrenceRule.h" #import "iCalTrigger.h" +#import "iCalToDo.h" +#import "NSString+NGCards.h" #import "iCalAlarm.h" @@ -103,4 +108,49 @@ return [[self uniqueChildWithTag: @"rrule"] value: 0]; } +- (NSCalendarDate *) nextAlarmDate +{ + Class parentClass; + iCalTrigger *aTrigger; + NSCalendarDate *relationDate, *nextAlarmDate; + NSString *relation; + NSTimeInterval anInterval; + + // We currently have the following limitations for alarms: + // - the alarm's trigger value type must be DURATION; + + nextAlarmDate = nil; + + parentClass = [parent class]; + if ([parentClass isKindOfClass: [iCalEvent class]] + || [parentClass isKindOfClass: [iCalToDo class]]) + { + aTrigger = [self trigger]; + + if ([[aTrigger valueType] caseInsensitiveCompare: @"DURATION"]) + { + relation = [aTrigger relationType]; + anInterval = [[aTrigger value] durationAsTimeInterval]; + if ([relation caseInsensitiveCompare: @"END"] == NSOrderedSame) + { + if ([parentClass isKindOfClass: [iCalEvent class]]) + relationDate = [(iCalEvent *) parent endDate]; + else + relationDate = [(iCalToDo *) parent due]; + } + else + relationDate = [(iCalEntityObject *) parent startDate]; + + // Compute the next alarm date with respect to the reference date + if ([relationDate isNotNull]) + nextAlarmDate = [relationDate addTimeInterval: anInterval]; + } + } + else + [self warnWithFormat: @"alarms not handled for elements of class '%@'", + NSStringFromClass (parentClass)]; + + return nextAlarmDate; +} + @end /* iCalAlarm */ diff --git a/SoObjects/Appointments/iCalEvent+SOGo.m b/SoObjects/Appointments/iCalEvent+SOGo.m index 29f691c15..df1e1059b 100644 --- a/SoObjects/Appointments/iCalEvent+SOGo.m +++ b/SoObjects/Appointments/iCalEvent+SOGo.m @@ -77,7 +77,6 @@ startDate = [self startDate]; endDate = [self endDate]; - nextAlarmDate = nil; uid = [self uid]; title = [self summary]; if (![title isNotNull]) @@ -203,46 +202,30 @@ [row setObject:partstates forKey: @"c_partstates"]; [partstates release]; - if ([self hasAlarms]) + nextAlarmDate = nil; + if (![self isRecurrent] && [self hasAlarms]) { // We currently have the following limitations for alarms: - // - the event must not be recurrent; + // - the component must not be recurrent; // - only the first alarm is considered; // - the alarm's action must be of type DISPLAY; // - the alarm's trigger value type must be DURATION; // // Morever, we don't update the quick table if the property X-WebStatus // of the trigger is set to "triggered". - iCalAlarm *anAlarm; - iCalTrigger *aTrigger; - NSCalendarDate *relationDate; - NSString *relation, *webstatus; - NSTimeInterval anInterval; + NSString *webstatus; anAlarm = [[self alarms] objectAtIndex: 0]; - aTrigger = [anAlarm trigger]; - relation = [aTrigger relationType]; - anInterval = [[aTrigger value] durationAsTimeInterval]; - - if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame && - [[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame && - ![self isRecurrent]) - { - webstatus = [aTrigger value: 0 ofAttribute: @"x-webstatus"]; - if (!webstatus || - [webstatus caseInsensitiveCompare: @"TRIGGERED"] != NSOrderedSame) - { - if ([relation caseInsensitiveCompare: @"END"] == NSOrderedSame) - relationDate = endDate; - else - relationDate = startDate; - - // Compute the next alarm date with respect to the reference date - if ([relationDate isNotNull]) - nextAlarmDate = [relationDate addTimeInterval: anInterval]; - } - } + if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] + == NSOrderedSame) + { + webstatus = [[anAlarm trigger] value: 0 ofAttribute: @"x-webstatus"]; + if (!webstatus + || ([webstatus caseInsensitiveCompare: @"TRIGGERED"] + != NSOrderedSame)) + nextAlarmDate = [anAlarm nextAlarmDate]; + } } if ([nextAlarmDate isNotNull]) [row setObject: [NSNumber numberWithInt: [nextAlarmDate timeIntervalSince1970]] diff --git a/SoObjects/Appointments/iCalToDo+SOGo.m b/SoObjects/Appointments/iCalToDo+SOGo.m index 00945c2fc..7d03d8c2d 100644 --- a/SoObjects/Appointments/iCalToDo+SOGo.m +++ b/SoObjects/Appointments/iCalToDo+SOGo.m @@ -171,39 +171,29 @@ [row setObject:partstates forKey: @"c_partstates"]; [partstates release]; - if ([self hasAlarms]) + nextAlarmDate = nil; + if (![self isRecurrent] && [self hasAlarms]) { // We currently have the following limitations for alarms: // - the component must not be recurrent; // - only the first alarm is considered; // - the alarm's action must be of type DISPLAY; - // - the alarm's trigger value type must be DURATION; // // Morever, we don't update the quick table if the property X-WebStatus // of the trigger is set to "triggered". - iCalAlarm *anAlarm; - iCalTrigger *aTrigger; NSString *webstatus; - NSTimeInterval anInterval; anAlarm = [[self alarms] objectAtIndex: 0]; - aTrigger = [anAlarm trigger]; - anInterval = [[aTrigger value] durationAsTimeInterval]; - - if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame && - [[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame && - ![self isRecurrent]) - { - webstatus = [aTrigger value: 0 ofAttribute: @"x-webstatus"]; - if (!webstatus || - [webstatus caseInsensitiveCompare: @"TRIGGERED"] != NSOrderedSame) - { - // Compute the next alarm date with respect to the due date - if ([dueDate isNotNull]) - nextAlarmDate = [dueDate addTimeInterval: anInterval]; - } - } + if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] + == NSOrderedSame) + { + webstatus = [[anAlarm trigger] value: 0 ofAttribute: @"x-webstatus"]; + if (!webstatus + || ([webstatus caseInsensitiveCompare: @"TRIGGERED"] + != NSOrderedSame)) + nextAlarmDate = [anAlarm nextAlarmDate]; + } } if ([nextAlarmDate isNotNull]) [row setObject: [NSNumber numberWithInt: [nextAlarmDate timeIntervalSince1970]] diff --git a/UI/WebServerResources/UIxReminderEditor.js b/UI/WebServerResources/UIxReminderEditor.js index 4c8fa291d..69e9a2ec5 100644 --- a/UI/WebServerResources/UIxReminderEditor.js +++ b/UI/WebServerResources/UIxReminderEditor.js @@ -1,45 +1,43 @@ -/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ - function initializeWindowButtons() { - var okButton = $("okButton"); - var cancelButton = $("cancelButton"); + var okButton = $("okButton"); + var cancelButton = $("cancelButton"); - okButton.observe("click", onEditorOkClick, false); - cancelButton.observe("click", onEditorCancelClick, false); + okButton.observe("click", onEditorOkClick, false); + cancelButton.observe("click", onEditorCancelClick, false); } function initializeFormValues() { if (parent$("reminderUnit").value.length > 0) { $("quantityField").value = parent$("reminderQuantity").value; - $("unitsList").value = parent$("reminderUnit").value; - $("relationsList").value = parent$("reminderRelation").value; - $("referencesList").value = parent$("reminderReference").value; + $("unitsList").value = parent$("reminderUnit").value; + $("relationsList").value = parent$("reminderRelation").value; + $("referencesList").value = parent$("reminderReference").value; } } function onEditorOkClick(event) { - preventDefault(event); - if (parseInt($("quantityField").value) > 0) { - parent$("reminderQuantity").value = parseInt($("quantityField").value); - parent$("reminderUnit").value = $("unitsList").value; - parent$("reminderRelation").value = $("relationsList").value; - parent$("reminderReference").value = $("referencesList").value; - - window.close(); - } - else - alert("heu"); + preventDefault(event); + if (parseInt($("quantityField").value) > 0) { + parent$("reminderQuantity").value = parseInt($("quantityField").value); + parent$("reminderUnit").value = $("unitsList").value; + parent$("reminderRelation").value = $("relationsList").value; + parent$("reminderReference").value = $("referencesList").value; + + window.close(); + } + else + alert("heu"); } function onEditorCancelClick(event) { - preventDefault(event); - window.close(); + preventDefault(event); + window.close(); } function onRecurrenceLoadHandler() { - initializeFormValues(); - initializeWindowButtons(); + initializeFormValues(); + initializeWindowButtons(); } document.observe("dom:loaded", onRecurrenceLoadHandler);