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
|
/* emacs buffer mode hint -*- objc -*- */
#import <AppKit/AppKit.h>
#import "TaskEditor.h"
#import "StoreManager.h"
#import "Task.h"
#import "AlarmEditor.h"
#import "HourFormatter.h"
#import "Date.h"
static NSMutableDictionary *editors;
@implementation TaskEditor
- (BOOL)canBeModified
{
id <MemoryStore> selectedStore = [[StoreManager globalManager] storeForName:[store titleOfSelectedItem]];
return [selectedStore enabled] && [selectedStore writable];
}
- (id)init
{
HourFormatter *formatter;
NSDateFormatter *dateFormatter;
if (![NSBundle loadNibNamed:@"Task" owner:self])
return nil;
if ((self = [super init])) {
formatter = AUTORELEASE([[HourFormatter alloc] init]);
dateFormatter = AUTORELEASE([[NSDateFormatter alloc] initWithDateFormat:[[NSUserDefaults standardUserDefaults] objectForKey:NSShortDateFormatString] allowNaturalLanguage:NO]);
[dueTime setFormatter:formatter];
[dueDate setFormatter:dateFormatter];
}
return self;
}
- (id)document
{
return nil;
}
- (id)initWithTask:(Task *)task
{
StoreManager *sm = [StoreManager globalManager];
NSEnumerator *list = [sm storeEnumerator];
id <MemoryStore> aStore;
id <MemoryStore> originalStore;
self = [self init];
if (self) {
ASSIGN(_task, task);
ASSIGNCOPY(_modifiedAlarms, [task alarms]);
[summary setStringValue:[task summary]];
[[description textStorage] deleteCharactersInRange:NSMakeRange(0, [[description textStorage] length])];
[[description textStorage] appendAttributedString:[task text]];
[window makeFirstResponder:summary];
originalStore = [task store];
[store removeAllItems];
while ((aStore = [list nextObject])) {
if ([aStore enabled] && ([aStore writable] || aStore == originalStore))
[store addItemWithTitle:[aStore description]];
}
if ([task store])
[store selectItemWithTitle:[[task store] description]];
else
[store selectItemWithTitle:[[sm defaultStore] description]];
[state removeAllItems];
[state addItemsWithTitles:[Task stateNamesArray]];
[state selectItemWithTitle:[task stateAsString]];
[ok setEnabled:[self canBeModified]];
if ([task dueDate]) {
[dueDate setObjectValue:[[task dueDate] calendarDate]];
[dueTime setIntValue:[[task dueDate] hourOfDay] * 3600 + [[task dueDate] minuteOfHour] * 60];
[toggleDueDate setState:YES];
}
[dueDate setEnabled:[toggleDueDate state]];
[dueTime setEnabled:[toggleDueDate state]];
[window makeKeyAndOrderFront:self];
}
return self;
}
- (void)dealloc
{
RELEASE(_task);
RELEASE(_modifiedAlarms);
[super dealloc];
}
+ (void)initialize
{
editors = [[NSMutableDictionary alloc] initWithCapacity:2];
}
+ (TaskEditor *)editorForTask:(Task *)task
{
TaskEditor *editor;
if ((editor = [editors objectForKey:[task UID]])) {
[editor->window makeKeyAndOrderFront:self];
return editor;
}
editor = [[TaskEditor alloc] initWithTask:task];
[editors setObject:editor forKey:[task UID]];
return AUTORELEASE(editor);
}
- (void)validate:(id)sender
{
StoreManager *sm = [StoreManager globalManager];
id <MemoryStore> originalStore = [_task store];
id <MemoryStore> aStore;
Date *date;
[_task setSummary:[summary stringValue]];
[_task setText:[[description textStorage] copy]];
[_task setState:[state indexOfSelectedItem]];
[_task setAlarms:_modifiedAlarms];
if ([toggleDueDate state]) {
date = [Date dateWithCalendarDate:[dueDate objectValue] withTime:NO];
date = [Date dateWithTimeInterval:[dueTime intValue] sinceDate:date];
[_task setDueDate:date];
} else {
[_task setDueDate:nil];
}
aStore = [sm storeForName:[store titleOfSelectedItem]];
if (!originalStore)
[aStore add:_task];
else if (originalStore == aStore)
[aStore update:_task];
else {
[originalStore remove:_task];
[aStore add:_task];
}
[window close];
[editors removeObjectForKey:[_task UID]];
}
- (void)cancel:(id)sender
{
[window close];
[editors removeObjectForKey:[_task UID]];
}
- (void)editAlarms:(id)sender
{
NSArray *alarmArray;
alarmArray = [AlarmEditor editAlarms:_modifiedAlarms];
if (alarmArray)
ASSIGN(_modifiedAlarms, alarmArray);
[window makeKeyAndOrderFront:self];
}
- (void)toggleDueDate:(id)sender
{
Date *date;
[dueDate setEnabled:[toggleDueDate state]];
[dueTime setEnabled:[toggleDueDate state]];
if ([toggleDueDate state]) {
date = [Date now];
[date changeDayBy:7];
[dueDate setObjectValue:[date calendarDate]];
[dueTime setIntValue:[date hourOfDay] * 3600 + [date minuteOfHour] * 60];
} else {
[dueDate setObjectValue:nil];
[dueTime setObjectValue:nil];
}
}
- (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector
{
if ([NSStringFromSelector(aSelector) isEqualToString:@"insertTab:"]) {
[[description window] selectNextKeyView:self];
return YES;
}
return [description tryToPerform:aSelector with:aTextView];
}
@end
|