-
Notifications
You must be signed in to change notification settings - Fork 6
/
AlarmEditor.m
204 lines (181 loc) · 5.19 KB
/
AlarmEditor.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
#import <AppKit/AppKit.h>
#import "AlarmEditor.h"
#import "Element.h"
#import "Alarm.h"
#import "HourFormatter.h"
@implementation AlarmEditor
- (void)setupForSelection
{
NSTimeInterval relativeTrigger;
Date *d;
if ([_alarms count] == 0) {
[action setEnabled:NO];
[type setEnabled:NO];
[relativeSlider setEnabled:NO];
[radio setEnabled:NO];
[date setEnabled:NO];
[time setEnabled:NO];
[date setObjectValue:nil];
[date setObjectValue:nil];
[remove setEnabled:NO];
_current = nil;
return;
}
[action setEnabled:YES];
[type setEnabled:YES];
[remove setEnabled:YES];
_current = [_alarms objectAtIndex:[table selectedRow]];
if ([_current isAbsoluteTrigger]) {
[relativeSlider setEnabled:NO];
[radio setEnabled:NO];
[date setEnabled:YES];
[time setEnabled:YES];
d = [_current absoluteTrigger];
[date setObjectValue:[d calendarDate]];
[time setIntValue:[d hourOfDay] * 3600 + [d minuteOfHour] * 60];
[type selectItemAtIndex:1];
} else {
[relativeSlider setEnabled:YES];
[radio setEnabled:YES];
[date setEnabled:NO];
[time setEnabled:NO];
[date setObjectValue:nil];
[date setObjectValue:nil];
[type selectItemAtIndex:0];
relativeTrigger = [_current relativeTrigger];
if (relativeTrigger >= 0) {
[radio selectCellWithTag:1];
[relativeSlider setFloatValue:relativeTrigger];
} else {
[radio selectCellWithTag:0];
[relativeSlider setFloatValue:-relativeTrigger];
}
[relativeText setFloatValue:[relativeSlider floatValue]];
}
}
- (id)init
{
HourFormatter *formatter;
NSDateFormatter *dateFormatter;
if (![NSBundle loadNibNamed:@"Alarm" owner:self])
return nil;
if ((self = [super init])) {
_current = nil;
_simple = RETAIN([Alarm alarm]);
[_simple setRelativeTrigger:-15*60];
[_simple setAction:ICAL_ACTION_DISPLAY];
[table setDelegate:self];
[type removeAllItems];
[type addItemsWithTitles:[NSArray arrayWithObjects:_(@"Relative"), _(@"Absolute"), nil]];
[action removeAllItems];
[action addItemsWithTitles:[NSArray arrayWithObjects:_(@"Display"), _(@"Sound"), _(@"Email"), _(@"Procedure"), nil]];
[table setUsesAlternatingRowBackgroundColors:YES];
[table sizeLastColumnToFit];
formatter = AUTORELEASE([[HourFormatter alloc] init]);
dateFormatter = AUTORELEASE([[NSDateFormatter alloc] initWithDateFormat:[[NSUserDefaults standardUserDefaults] objectForKey:NSShortDateFormatString] allowNaturalLanguage:NO]);
[[relativeText cell] setFormatter:formatter];
[time setFormatter:formatter];
[date setFormatter:dateFormatter];
}
return self;
}
- (id)initWithAlarms:(NSArray *)alarms
{
if ((self = [self init])) {
_alarms = [[NSMutableArray alloc] initWithArray:alarms copyItems:YES];
[table reloadData];
[self setupForSelection];
}
return self;
}
- (NSArray *)run
{
[NSApp runModalForWindow:window];
return [NSArray arrayWithArray:_alarms];
}
+ (NSArray *)editAlarms:(NSArray *)alarms
{
AlarmEditor *editor;
NSArray *modified;
if ((editor = [[AlarmEditor alloc] initWithAlarms:alarms])) {
modified = [editor run];
[editor release];
return modified;
}
return nil;
}
- (void)dealloc
{
DESTROY(_simple);
DESTROY(_alarms);
[super dealloc];
}
- (void)addAlarm:(id)sender
{
[_alarms addObject:AUTORELEASE([_simple copy])];
[table reloadData];
[table selectRow:[_alarms count]-1 byExtendingSelection:NO];
}
- (void)removeAlarm:(id)sender
{
[_alarms removeObjectAtIndex:[table selectedRow]];
[table reloadData];
[self tableViewSelectionDidChange:nil];
}
- (void)selectType:(id)sender
{
Date *d;
if ([type indexOfSelectedItem] == 1) {
d = [Date now];
[d changeDayBy:7];
[date setObjectValue:[d calendarDate]];
[time setFloatValue:([d hourOfDay]*60 + [d minuteOfHour]) / 60.0];
[_current setAbsoluteTrigger:d];
[table reloadData];
} else {
[self changeDelay:nil];
}
[self setupForSelection];
}
- (void)changeDelay:(id)sender
{
[relativeText setIntValue:[relativeSlider intValue]];
if ([[radio selectedCell] tag] == 0)
[_current setRelativeTrigger:-[relativeSlider intValue]];
else
[_current setRelativeTrigger:[relativeSlider intValue]];
[table reloadData];
}
- (void)switchBeforeAfter:(id)sender
{
[self changeDelay:self];
}
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
[self setupForSelection];
}
- (void)controlTextDidEndEditing:(NSNotification *)aNotification
{
Date *d;
if (_current && [date objectValue] && [time objectValue]) {
d = [Date dateWithCalendarDate:[date objectValue] withTime:NO];
d = [Date dateWithTimeInterval:[time intValue] sinceDate:d];
[_current setAbsoluteTrigger:d];
[table reloadData];
}
}
@end
@implementation AlarmEditor(NSTableViewDataSource)
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [_alarms count];
}
- (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id)info row:(int)row dropOperation:(NSTableViewDropOperation)operation
{
return NO;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
return [[_alarms objectAtIndex:rowIndex] shortDescription];
}
@end