source: trunk/Cocoa/Pester/Source/PSSnoozeUntilController.m @ 600

Last change on this file since 600 was 600, checked in by Nicholas Riley, 9 years ago

Prototypes to pacify GCC.

File size: 5.5 KB
Line 
1//
2//  PSSnoozeUntilController.m
3//  Pester
4//
5//  Created by Nicholas Riley on Sun Feb 16 2003.
6//  Copyright (c) 2003 Nicholas Riley. All rights reserved.
7//
8
9#import "PSAlarmNotifierController.h"
10#import "PSCalendarController.h"
11#import "PSSnoozeUntilController.h"
12#import "PSTimeDateEditor.h"
13#import "NSCalendarDate-NJRExtensions.h"
14
15@interface PSSnoozeUntilController (PSSnoozeUntilControllerRuntime)
16- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(PSAlarmNotifierController *)aController;
17@end
18
19@implementation PSSnoozeUntilController
20
21+ (PSSnoozeUntilController *)snoozeUntilControllerWithNotifierController:(PSAlarmNotifierController *)aController;
22{
23    return [[self alloc] initWithNotifierController: aController];
24}
25
26- (id)initWithNotifierController:(PSAlarmNotifierController *)aController;
27{
28    if ([self initWithWindowNibName: @"Snooze until"]) {
29        NSWindow *window = [self window];
30        alarm = [[PSAlarm alloc] init];
31        snoozeInterval = [aController snoozeInterval];
32        [alarm setInterval: snoozeInterval];
33        [PSTimeDateEditor setUpTimeField: timeOfDay dateField: timeDate completions: timeDateCompletions];
34        if ([alarm isValid]) {
35            // [alarm time] works fine for display, but we can't use it overall until we've moved off NSCalendarDate
36            [timeOfDay setObjectValue: [alarm date]];
37            [timeDate setObjectValue: [alarm date]];
38        }
39        [self update: self];
40       
41        [NSApp beginSheet: window modalForWindow: [aController window] modalDelegate: self didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:) contextInfo: aController];
42
43        // work around Cocoa confusion with our bizarre key loop
44        [timeOfDay setNextKeyView: timeDate];
45    }
46    return self;
47}
48
49- (void)dealloc;
50{
51    [alarm release];
52    [super dealloc];
53}
54
55- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(PSAlarmNotifierController *)aController;
56{
57    if (returnCode == NSRunAbortedResponse) {
58        [aController setSnoozeInterval: snoozeInterval];
59        [sheet close];
60    } else {
61        [aController snoozeUntilDate: [alarm date]];
62    }
63    // XXX according to Cocoa documentation, the sheet should hide after the didEnd method returns, but it doesn't.
64}
65
66// XXX yuck, should not be duplicating this method between PSAlarmSetController and PSSnoozeUntilController
67// XXX with -[NSControl currentEditor] don't need to compare?  Also check -[NSControl validateEditing]
68- (id)objectValueForTextField:(NSTextField *)field whileEditing:(id)sender;
69{
70    if (sender == field) {
71        NSString *stringValue = [[[self window] fieldEditor: NO forObject: field] string];
72        id obj = nil;
73        [[field formatter] getObjectValue: &obj forString: stringValue errorDescription: NULL];
74        // NSLog(@"from field editor: %@", obj);
75        return obj;
76    } else {
77        // NSLog(@"from field: %@", [field objectValue]);
78        return [field objectValue];
79    }
80}
81
82#pragma mark date setting
83
84- (void)setAlarmDateAndInterval:(id)sender;
85{
86    [alarm setForDate: [self objectValueForTextField: timeDate whileEditing: sender]
87               atTime: [self objectValueForTextField: timeOfDay whileEditing: sender]];
88}
89
90// Be careful not to hook up any of the text fields' actions to update: because we handle them in controlTextDidChange: instead.  If we could get the active text field somehow via public API (guess we could use controlTextDidBegin/controlTextDidEndEditing) then we'd not need to overload the update sender for this purpose.  Or, I guess, we could use another method other than update.  It should not be this hard to implement what is essentially standard behavior.  Sigh.
91// Note: finding out whether a given control is editing is easier.  See: <http://cocoa.mamasam.com/COCOADEV/2002/03/2/28501.php>.
92
93- (IBAction)update:(id)sender;
94{
95    BOOL isValid;
96    [self setAlarmDateAndInterval: sender];
97    isValid = [alarm isValid];
98    [snoozeButton setEnabled: isValid];
99    if (!isValid) {
100        [messageField setStringValue: [alarm invalidMessage]];
101    } else {
102        [messageField setStringValue: @""];
103    }
104}
105
106- (IBAction)dateCompleted:(NSPopUpButton *)sender;
107{
108    [timeDate setStringValue: [sender titleOfSelectedItem]];
109    [self update: sender];
110}
111
112#pragma mark calendar
113
114- (IBAction)showCalendar:(NSButton *)sender;
115{
116    [PSCalendarController controllerWithDate: [NSCalendarDate dateForDay: [timeDate objectValue]] delegate: self];
117}
118
119- (void)calendarController:(PSCalendarController *)calendar didSetDate:(NSCalendarDate *)date;
120{
121    [timeDate setObjectValue: date];
122    [self update: self];
123}
124
125- (NSView *)calendarControllerLaunchingView:(PSCalendarController *)controller;
126{
127    return timeCalendarButton;
128}
129
130#pragma mark actions
131
132- (IBAction)close:(id)sender;
133{
134    [NSApp endSheet: [self window] returnCode: NSRunAbortedResponse];
135}
136
137- (IBAction)snooze:(NSButton *)sender;
138{
139    if ([alarm isValid]) {
140        [NSApp endSheet: [self window] returnCode: NSRunStoppedResponse];
141    } else {
142        [messageField setStringValue: [@"Unable to snooze. " stringByAppendingString: [alarm invalidMessage]]];
143        [sender setEnabled: NO];
144    }
145}
146
147@end
148
149@implementation PSSnoozeUntilController (NSControlSubclassNotifications)
150
151// called because we're the delegate
152
153- (void)controlTextDidChange:(NSNotification *)notification;
154{
155    [self update: [notification object]];
156}
157
158@end
159
160@implementation PSSnoozeUntilController (NSWindowNotifications)
161
162- (void)windowWillClose:(NSNotification *)notification;
163{
164    [self autorelease];
165}
166
167@end
Note: See TracBrowser for help on using the repository browser.