source: trunk/Cocoa/Pester/Source/PSAlarmAlertController.m@ 105

Last change on this file since 105 was 105, checked in by Nicholas Riley, 22 years ago

PSAlarm.m: Fixed logic bug with invalid date/time combination. Added
repeating indicator to -description. Fixed plist archiving to
properly handle repeating alarms which expire while the app is quit
(1).

PSAlarmAlertController.m: Restore some debugging.

PSPowerManager.m: Properly return pmuReference (fixes compiler
warning, and 2).

Read Me.rtfd: Fixed some wording.

File size: 3.0 KB
Line 
1//
2// PSAlarmAlertController.m
3// Pester
4//
5// Created by Nicholas Riley on Sat Oct 26 2002.
6// Copyright (c) 2002 Nicholas Riley. All rights reserved.
7//
8
9#import "PSAlarmAlertController.h"
10#import "PSAlert.h"
11#import "PSAlerts.h"
12
13NSString * const PSAlarmAlertStopNotification = @"PSAlarmAlertStopNotification";
14
15@implementation PSAlarmAlertController
16
17+ (PSAlarmAlertController *)controllerWithTimerExpiredNotification:(NSNotification *)notification;
18{
19 return [[[self alloc] initWithAlarm: [notification object]] autorelease];
20}
21
22+ (IBAction)stopAlerts:(id)sender;
23{
24 [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmAlertStopNotification object: nil];
25}
26
27- (void)_resumeAlarm:(PSAlarm *)alarm;
28{
29 [[NSNotificationCenter defaultCenter] removeObserver: self];
30 [alarm setTimer]; // if snooze not set and not repeating, alarm will die
31 if (frontmostApp.highLongOfPSN != 0 || frontmostApp.lowLongOfPSN != 0) {
32 SetFrontProcess(&frontmostApp);
33 if (appWasHidden)
34 [NSApp hide: self];
35 }
36}
37
38- (void)_alertCompleted:(NSNotification *)notification;
39{
40 PSAlert *alert = [[notification userInfo] objectForKey: @"alert"];
41 unsigned count = [pendingAlerts count];
42 [pendingAlerts removeObject: alert];
43 NSLog(@"removed: %@; still pending: %@", alert, [pendingAlerts description]);
44 NSLog(@"alarm: %@ retainCount %d", [notification object], [[notification object] retainCount]);
45 NSAssert2([pendingAlerts count] == count - 1, @"alert not in set: %@\n%@", alert, notification);
46 if ([pendingAlerts count] == 0) {
47 [self _resumeAlarm: [notification object]];
48 [self release];
49 }
50}
51
52- (id)initWithAlarm:(PSAlarm *)alarm;
53{
54 if ( (self = [super init]) != nil) {
55 PSAlerts *alerts = [alarm alerts];
56 NSArray *allAlerts = [alerts allAlerts];
57 if ([allAlerts count] == 0) {
58 [self _resumeAlarm: alarm];
59 } else {
60 pendingAlerts = [[NSMutableSet alloc] init];
61 [pendingAlerts addObjectsFromArray: allAlerts];
62 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(_alertCompleted:)
63 name: PSAlarmAlertCompletedNotification object: alarm];
64 [self retain]; // release in _alertCompleted:
65 }
66 [alerts triggerForAlarm: alarm];
67 if ([alerts requirePesterFrontmost] && ![NSApp isActive]) { // restore frontmost process afterward
68 NSDictionary *activeProcessInfo = [[NSWorkspace sharedWorkspace] activeApplication];
69 frontmostApp.highLongOfPSN = [[activeProcessInfo objectForKey: @"NSApplicationProcessSerialNumberHigh"] longValue];
70 frontmostApp.lowLongOfPSN = [[activeProcessInfo objectForKey: @"NSApplicationProcessSerialNumberLow"] longValue];
71 appWasHidden = [NSApp isHidden];
72 [NSApp activateIgnoringOtherApps: YES];
73 }
74 }
75 return self;
76}
77
78- (void)dealloc;
79{
80 NSLog(@"%@ dealloc", self);
81 [pendingAlerts release];
82 [super dealloc];
83}
84
85@end
Note: See TracBrowser for help on using the repository browser.