Ignore:
Timestamp:
10/20/02 06:35:16 (20 years ago)
Author:
Nicholas Riley
Message:

Pester 1.0b1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cocoa/Pester/Source/PSAlarm.m

    r24 r26  
    99#import "PSAlarm.h"
    1010
     11NSString * const PSAlarmTimerSetNotification = @"PSAlarmTimerSetNotification";
     12NSString * const PSAlarmTimerExpiredNotification = @"PSAlarmTimerExpiredNotification";
    1113
    1214@implementation PSAlarm
     15
     16- (void)dealloc;
     17{
     18    // NSLog(@"DEALLOC %@", self);
     19    alarmType = PSAlarmInvalid;
     20    [alarmDate release]; alarmDate = nil;
     21    [alarmMessage release]; alarmMessage = nil;
     22    [invalidMessage release]; invalidMessage = nil;
     23    [timer release]; timer = nil;
     24    [super dealloc];
     25}
    1326
    1427- (void)_setAlarmDate:(NSCalendarDate *)aDate;
     
    5467        [self _invalidate: @"Please specify an alarm interval."]; return;
    5568    }
     69    [self _setDateFromInterval];
    5670}
    5771
     
    6680}
    6781
    68 - (void)setForDateAtTime:(NSDate *)dateTime;
    69 {
    70     if (dateTime != alarmDate) {
    71         [alarmDate release];
    72         alarmDate = nil;
    73         alarmDate = [dateTime retain];
    74     }
     82- (void)setForDateAtTime:(NSCalendarDate *)dateTime;
     83{
     84    [self _setAlarmDate: dateTime];
    7585    [self _setIntervalFromDate];
    7686}
     
    106116- (BOOL)isValid;
    107117{
    108     return (alarmType == PSAlarmInvalid);
     118    if (alarmType == PSAlarmDate) [self _setIntervalFromDate];
     119    return (alarmType != PSAlarmInvalid);
    109120}
    110121
     
    127138- (NSString *)invalidMessage;
    128139{
     140    if (invalidMessage == nil) return @"";
    129141    return invalidMessage;
    130142}
     
    138150- (NSTimeInterval)interval;
    139151{
     152    if (alarmType == PSAlarmSet) return [timer timeInterval]; // XXX counts down?
    140153    if (alarmType == PSAlarmDate) [self _setIntervalFromDate];
    141154    return alarmInterval;
    142155}
    143156
     157- (BOOL)setTimer;
     158{
     159    switch (alarmType) {
     160        case PSAlarmDate: if (![self isValid]) return NO;
     161        case PSAlarmInterval:
     162            timer = [NSTimer scheduledTimerWithTimeInterval: alarmInterval
     163                                                     target: self
     164                                                   selector: @selector(_timerExpired:)
     165                                                   userInfo: nil
     166                                                    repeats: NO];
     167            if (timer != nil) {
     168                alarmType = PSAlarmSet;
     169                [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerSetNotification object: self];
     170                return YES;
     171            }
     172        default:
     173            return NO;
     174    }
     175}
     176
     177- (void)cancel;
     178{
     179    [timer release]; timer = nil;
     180}
     181
     182- (void)_timerExpired:(NSTimer *)aTimer;
     183{
     184    [[NSNotificationCenter defaultCenter] postNotificationName: PSAlarmTimerExpiredNotification object: self];
     185    timer = nil;
     186    [timer release];
     187}
     188
     189- (NSString *)_alarmTypeString;
     190{
     191    switch (alarmType) {
     192        case PSAlarmDate: return @"PSAlarmDate";
     193        case PSAlarmInterval: return @"PSAlarmInterval";
     194        case PSAlarmSet: return @"PSAlarmSet";
     195        case PSAlarmInvalid: return @"PSAlarmInvalid";
     196        default: return [NSString stringWithFormat: @"<unknown: %u>", alarmType];
     197    }
     198}
     199
     200- (NSComparisonResult)compare:(PSAlarm *)otherAlarm;
     201{
     202    return [[self date] compare: [otherAlarm date]];
     203}
     204
     205- (NSString *)description;
     206{
     207    return [NSString stringWithFormat: @"%@: type %@ date %@ interval %.1f%@",
     208        [super description], [self _alarmTypeString], alarmDate, alarmInterval,
     209        (alarmType == PSAlarmInvalid ?
     210         [NSString stringWithFormat: @"\ninvalid message: %@", invalidMessage]
     211        : (alarmType == PSAlarmSet ?
     212           [NSString stringWithFormat: @"\ntimer: %@", timer] : @""))];
     213}
     214
     215- (void)encodeWithCoder:(NSCoder *)coder;
     216{
     217    if (![self isValid]) return;
     218    [coder encodeValueOfObjCType: @encode(PSAlarmType) at: &alarmType];
     219    switch (alarmType) {
     220        case PSAlarmDate:
     221        case PSAlarmSet:
     222            [coder encodeObject: alarmDate];
     223            break;
     224        case PSAlarmInterval:
     225            [coder encodeValueOfObjCType: @encode(NSTimeInterval) at: &alarmInterval];
     226            break;
     227        default:
     228            break;
     229    }
     230    [coder encodeObject: alarmMessage];
     231    return;
     232}
     233
     234- (id)initWithCoder:(NSCoder *)coder;
     235{
     236    if ( (self = [super init]) != nil) {
     237        [coder decodeValueOfObjCType: @encode(PSAlarmType) at: &alarmType];
     238        switch (alarmType) {
     239            case PSAlarmDate:
     240            case PSAlarmSet:
     241                [self _setAlarmDate: [coder decodeObject]];
     242                break;
     243            case PSAlarmInterval:
     244                [coder decodeValueOfObjCType: @encode(NSTimeInterval) at: &alarmInterval];
     245                break;
     246            default:
     247                break;
     248        }
     249        [self setMessage: [coder decodeObject]];
     250        if (alarmType == PSAlarmSet) {
     251            alarmType = PSAlarmDate;
     252            [self setTimer];
     253        }
     254    }
     255    return self;
     256}
     257
    144258@end
Note: See TracChangeset for help on using the changeset viewer.