[34] | 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"
|
---|
[53] | 10 | #import "PSAlert.h"
|
---|
| 11 | #import "PSAlerts.h"
|
---|
[34] | 12 |
|
---|
| 13 | NSString * 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 |
|
---|
[53] | 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];
|
---|
[61] | 43 | // NSLog(@"removed: %@; still pending: %@", alert, [pendingAlerts description]);
|
---|
| 44 | // NSLog(@"alarm: %@ retainCount %d", [notification object], [[notification object] retainCount]);
|
---|
[53] | 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 |
|
---|
[34] | 52 | - (id)initWithAlarm:(PSAlarm *)alarm;
|
---|
| 53 | {
|
---|
| 54 | if ( (self = [super init]) != nil) {
|
---|
[53] | 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 | }
|
---|
[34] | 74 | }
|
---|
| 75 | return self;
|
---|
| 76 | }
|
---|
| 77 |
|
---|
[53] | 78 | - (void)dealloc;
|
---|
| 79 | {
|
---|
| 80 | NSLog(@"%@ dealloc", self);
|
---|
| 81 | [pendingAlerts release];
|
---|
| 82 | [super dealloc];
|
---|
| 83 | }
|
---|
| 84 |
|
---|
[34] | 85 | @end
|
---|