See ChangeLogs

Monotone-Parent: e2ba584b1367987b411373efc53338c1daf189da
Monotone-Revision: ea7589320f5747a3bd1bbec33e1bd8776e4041db

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2009-04-21T14:34:22
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Francis Lachapelle
2009-04-21 14:34:22 +00:00
parent 3b9d0b83cf
commit fa7408ebc1
26 changed files with 602 additions and 70 deletions
@@ -375,6 +375,14 @@
"reminder_1_WEEK_BEFORE" = "1 week van tevoren";
"reminder_CUSTOM" = "aangepast...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
@@ -392,6 +392,14 @@
"reminder_1_WEEK_BEFORE" = "1 week before";
"reminder_CUSTOM" = "Custom...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
@@ -390,6 +390,14 @@
"reminder_1_WEEK_BEFORE" = "1 semaine avant";
"reminder_CUSTOM" = "Personnaliser...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
+5 -4
View File
@@ -35,14 +35,15 @@ SchedulerUI_OBJC_FILES = \
UIxComponentEditor.m \
UIxCalendarSelector.m \
UIxAppointmentEditor.m \
UIxTaskEditor.m \
UIxTaskEditor.m \
UIxCalDateLabel.m \
UIxDatePicker.m \
UIxTimeDateControl.m \
UIxCalParticipationStatusView.m \
UIxCalMonthOverview.m \
UIxCalMonthViewOld.m \
UIxRecurrenceEditor.m \
UIxCalMonthOverview.m \
UIxCalMonthViewOld.m \
UIxRecurrenceEditor.m \
UIxReminderEditor.m \
UIxOccurenceDialog.m
SchedulerUI_RESOURCE_FILES += \
@@ -389,6 +389,14 @@
"reminder_1_WEEK_BEFORE" = "1 Woche vor";
"reminder_CUSTOM" = "Benutzerdefiniert...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
@@ -392,6 +392,14 @@
"reminder_1_WEEK_BEFORE" = "1 settimana prima";
"reminder_CUSTOM" = "Personalizza...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
@@ -396,6 +396,14 @@
"reminder_1_WEEK_BEFORE" = "1 semana antes";
"reminder_CUSTOM" = "personalizado...";
"reminder_MINUTES" = "minutes";
"reminder_HOURS" = "hours";
"reminder_DAYS" = "days";
"reminder_BEFORE" = "before";
"reminder_AFTER" = "after";
"reminder_START" = "the event starts";
"reminder_END" = "the event ends";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
+7 -2
View File
@@ -1,6 +1,6 @@
/* UIxComponentEditor.h - this file is part of SOGo
*
* Copyright (C) 2006-2008 Inverse inc.
* Copyright (C) 2006-2009 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@@ -67,10 +67,15 @@
NSString *attendeesEmails;
NSString *attendeesStates;
NSString *repeat;
NSString *reminder;
NSString *reminderQuantity;
NSString *reminderUnit;
NSString *reminderRelation;
NSString *reminderReference;
/* ugly */
NSString *repeat;
NSString *repeatType;
NSString *repeat1;
NSString *repeat2;
+210 -41
View File
@@ -1,6 +1,6 @@
/* UIxComponentEditor.m - this file is part of SOGo
*
* Copyright (C) 2006-2008 Inverse inc.
* Copyright (C) 2006-2009 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@@ -30,9 +30,11 @@
#import <Foundation/NSUserDefaults.h>
#import <Foundation/NSURL.h>
#import <NGCards/iCalAlarm.h>
#import <NGCards/iCalPerson.h>
#import <NGCards/iCalRepeatableEntityObject.h>
#import <NGCards/iCalRecurrenceRule.h>
#import <NGCards/iCalTrigger.h>
#import <NGCards/NSString+NGCards.h>
#import <NGCards/NSCalendarDate+NGCards.h>
#import <NGObjWeb/SoSecurityManager.h>
@@ -61,6 +63,9 @@
#import "UIxComponentEditor.h"
#import "UIxDatePicker.h"
static NSArray *reminderItems = nil;
static NSArray *reminderValues = nil;
#define iREPEAT(X) \
- (NSString *) repeat##X; \
- (void) setRepeat##X: (NSString *) theValue
@@ -94,6 +99,52 @@ iRANGE(2);
@implementation UIxComponentEditor
+ (void) initialize
{
if (!reminderItems && !reminderValues)
{
reminderItems = [NSArray arrayWithObjects:
@"5_MINUTES_BEFORE",
@"10_MINUTES_BEFORE",
@"15_MINUTES_BEFORE",
@"30_MINUTES_BEFORE",
@"45_MINUTES_BEFORE",
@"-",
@"1_HOUR_BEFORE",
@"2_HOURS_BEFORE",
@"5_HOURS_BEFORE",
@"15_HOURS_BEFORE",
@"-",
@"1_DAY_BEFORE",
@"2_DAYS_BEFORE",
@"1_WEEK_BEFORE",
@"-",
@"CUSTOM",
nil];
reminderValues = [NSArray arrayWithObjects:
@"-PT5M",
@"-PT10M",
@"-PT15M",
@"-PT30M",
@"-PT45M",
@"",
@"-PT1H",
@"-PT2H",
@"-PT5H",
@"-PT15H",
@"",
@"-P1D",
@"-P2D",
@"-P1W",
@"",
@"",
nil];
[reminderItems retain];
[reminderValues retain];
}
}
- (id) init
{
UIxDatePicker *datePicker;
@@ -120,6 +171,10 @@ iRANGE(2);
calendarList = nil;
repeat = nil;
reminder = nil;
reminderQuantity = nil;
reminderUnit = nil;
reminderRelation = nil;
reminderReference = nil;
repeatType = nil;
repeat1 = nil;
repeat2 = nil;
@@ -155,9 +210,13 @@ iRANGE(2);
[attendeesStates release];
[calendarList release];
[repeat release];
[reminder release];
[reminderQuantity release];
[reminderUnit release];
[reminderRelation release];
[reminderReference release];
[repeat release];
[repeatType release];
[repeat1 release];
[repeat2 release];
@@ -372,6 +431,90 @@ iRANGE(2);
}
}
- (void) _loadAlarms
{
if ([component hasAlarms])
{
// We currently have the following limitations for alarms:
// - only the first alarm is considered;
// - the alarm's action must be of type DISPLAY;
// - the alarm's trigger value type must be DURATION.
iCalAlarm *anAlarm;
iCalTrigger *aTrigger;
NSString *duration, *quantity;
unichar c;
unsigned int i;
anAlarm = [[component alarms] objectAtIndex: 0];
aTrigger = [anAlarm trigger];
if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame &&
[[aTrigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame)
{
duration = [aTrigger value];
i = [reminderValues indexOfObject: duration];
if (i == NSNotFound)
{
// Custom alarm
ASSIGN (reminder, @"CUSTOM");
ASSIGN (reminderRelation, [aTrigger relationType]);
i = 0;
c = [duration characterAtIndex: i];
if (c == '-')
{
ASSIGN (reminderReference, @"BEFORE");
i++;
}
else
{
ASSIGN (reminderReference, @"AFTER");
}
c = [duration characterAtIndex: i];
if (c == 'P')
{
quantity = @"";
// Parse duration -- ignore first character (P)
for (i++; i < [duration length]; i++)
{
c = [duration characterAtIndex: i];
if (c == 't' || c == 'T')
// time -- ignore character
continue;
else if (isdigit (c))
quantity = [quantity stringByAppendingFormat: @"%c", c];
else
{
switch (c)
{
case 'D': /* day */
ASSIGN (reminderUnit, @"DAYS");
break;
case 'H': /* hour */
ASSIGN (reminderUnit, @"HOURS");
break;
case 'M': /* min */
ASSIGN (reminderUnit, @"MINUTES");
break;
default:
NSLog(@"Cannot process duration unit: '%c'", c);
break;
}
}
}
if ([quantity length])
ASSIGN (reminderQuantity, quantity);
}
}
else
// Matches one of the predefined alarms
ASSIGN (reminder, [reminderItems objectAtIndex: i]);
}
}
}
/* warning: we use this method which will be triggered by the template system
when the page is instantiated, but we should find another and cleaner way of
doing this... for example, when the clientObject is set */
@@ -401,6 +544,7 @@ iRANGE(2);
[self _loadCategories];
[self _loadAttendees];
[self _loadRRules];
[self _loadAlarms];
[componentCalendar release];
componentCalendar = [co container];
@@ -739,51 +883,28 @@ iRANGE(2);
- (NSArray *) reminderList
{
static NSArray *reminderItems = nil;
if (!reminderItems)
{
reminderItems = [NSArray arrayWithObjects: @"5_MINUTES_BEFORE",
@"10_MINUTES_BEFORE",
@"15_MINUTES_BEFORE",
@"30_MINUTES_BEFORE",
@"45_MINUTES_BEFORE",
@"-",
@"1_HOUR_BEFORE",
@"2_HOURS_BEFORE",
@"5_HOURS_BEFORE",
@"15_HOURS_BEFORE",
@"-",
@"1_DAY_BEFORE",
@"2_DAYS_BEFORE",
@"1_WEEK_BEFORE",
@"-",
@"CUSTOM",
nil];
[reminderItems retain];
}
return reminderItems;
}
// - (void) setReminder: (NSString *) reminder
// {
// ASSIGN(reminder, _reminder);
// }
// - (NSString *) reminder
// {
// return reminder;
// }
- (void) setReminder: (NSString *) theReminder
{
ASSIGN(reminder, theReminder);
}
- (NSString *) reminder
{
return @"";
}
{
return reminder;
}
- (void) setReminder: (NSString *) newReminder
{
}
- (void) setReminderQuantity: (NSString *) theReminderQuantity
{
ASSIGN(reminderQuantity, theReminderQuantity);
}
- (NSString *) reminderQuantity
{
return reminderQuantity;
}
- (NSString *) itemReminderText
{
@@ -1604,6 +1725,54 @@ RANGE(2);
[component setPriority: priority];
[component setLastModified: now];
if (!reminder || [reminder caseInsensitiveCompare: @"-"] == NSOrderedSame)
// No alarm selected -- if there was an unsupported alarm defined in
// the event, it will be deleted.
[component removeAllAlarms];
else
{
iCalTrigger *aTrigger;
iCalAlarm *anAlarm;
NSString *aValue;
unsigned int index;
index = [reminderItems indexOfObject: reminder];
aValue = [reminderValues objectAtIndex: index];
aTrigger = [iCalTrigger elementWithTag: @"TRIGGER"];
[aTrigger setValueType: @"DURATION"];
anAlarm = [iCalAlarm new];
[anAlarm setAction: @"DISPLAY"];
[anAlarm setTrigger: aTrigger];
if ([aValue length]) {
// Predefined alarm
[aTrigger setValue: aValue];
}
else {
// Custom alarm
if ([reminderReference caseInsensitiveCompare: @"BEFORE"] == NSOrderedSame)
aValue = [NSString stringWithString: @"-P"];
else
aValue = [NSString stringWithString: @"P"];
if ([reminderUnit caseInsensitiveCompare: @"MINUTES"] == NSOrderedSame ||
[reminderUnit caseInsensitiveCompare: @"HOURS"] == NSOrderedSame)
aValue = [aValue stringByAppendingString: @"T"];
aValue = [aValue stringByAppendingFormat: @"%i%@",
[reminderQuantity intValue],
[reminderUnit substringToIndex: 1]];
[aTrigger setValue: aValue];
[aTrigger setRelationType: reminderRelation];
}
[component removeAllAlarms];
[component addToAlarms: anAlarm];
[anAlarm release];
}
if (![self isChildOccurence])
{
// We remove any repeat rules
+43
View File
@@ -0,0 +1,43 @@
/* UIxReminderEditor.h - this file is part of SOGo
*
* Copyright (C) 2009 Inverse inc.
*
* Author: Francis Lachapelle <flachapelle@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef UIXREMINDEREDITOR_H
#define UIXREMINDEREDITOR_H
#import <SOGoUI/UIxComponent.h>
@interface UIxReminderEditor : UIxComponent
{
NSString *item, *repeat;
NSCalendarDate *aptStartDate;
}
- (NSArray *) unitsList;
- (NSArray *) referencesList;
- (NSArray *) relationsList;
- (void) setItem: (NSString *) theItem;
- (NSString *) item;
@end
#endif /* UIXREMINDEREDITOR_H */
+93
View File
@@ -0,0 +1,93 @@
/* UIxReminderEditor.m - this file is part of SOGo
*
* Copyright (C) 2009 Inverse inc.
*
* Author: Francis Lachapelle <flachapelle@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import <Common/UIxPageFrame.h>
#import "UIxReminderEditor.h"
@implementation UIxReminderEditor
- (NSArray *) unitsList
{
static NSArray *unitsList = nil;
if (!unitsList)
{
unitsList = [NSArray arrayWithObjects: @"MINUTES", @"HOURS", @"DAYS", nil];
[unitsList retain];
}
return unitsList;
}
- (NSArray *) referencesList
{
static NSArray *referencesList = nil;
if (!referencesList)
{
referencesList = [NSArray arrayWithObjects: @"BEFORE", @"AFTER", nil];
[referencesList retain];
}
return referencesList;
}
- (NSArray *) relationsList
{
static NSArray *relationsList = nil;
if (!relationsList)
{
relationsList = [NSArray arrayWithObjects: @"START", @"END", nil];
[relationsList retain];
}
return relationsList;
}
- (void) setItem: (NSString *) theItem
{
item = theItem;
}
- (NSString *) item
{
return item;
}
- (NSString *) itemText
{
NSString *text;
if ([item isEqualToString: @"-"])
text = item;
else
text = [self labelForKey: [NSString stringWithFormat: @"reminder_%@", item]];
return text;
}
@end
+5 -2
View File
@@ -1,6 +1,6 @@
/* UIxTaskEditor.m - this file is part of SOGo
*
* Copyright (C) 2007 Inverse inc.
* Copyright (C) 2007-2009 Inverse inc.
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
@@ -403,7 +403,10 @@
if (hasDueDate)
[todo setDue: taskDueDate];
else
[todo setDue: nil];
{
[todo setDue: nil];
[todo removeAllAlarms];
}
if ([status isEqualToString: @"COMPLETED"])
[todo setCompleted: statusDate];
+4
View File
@@ -107,6 +107,10 @@
protectedBy = "View";
pageName = "UIxRecurrenceEditor";
};
editReminder = {
protectedBy = "View";
pageName = "UIxReminderEditor";
};
colorPicker = {
protectedBy = "View";
pageName = "UIxColorPicker";