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

Last change on this file since 53 was 53, checked in by Nicholas Riley, 19 years ago

Updated for Pester 1.1a5 (very limited release).

Pester 1.1a4 was never released.

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.