This is Stopwatch.m in view mode; [Download] [Up]
/* Stopwatch.m -- Implementation for Stopwatch class. * * See Stopwatch.h for details. * * jwp@silvertone.Princeton.edu, 11/89 * Version 1.2, 1/90 * -- changed name of panel updating function * Version 1.21, 2/90 * -- Fixed bug that kept Stopwatch from starting plays */ #import "Stopwatch.h" #import "Animator.h" #import "UpPanel.h" #import <appkit/appkit.h> #import <appkit/TextField.h> #import <appkit/Button.h> #define ST_START 1 /* startButton state 1 = "start" */ #define ST_STOP 0 /* startButton state 0 = "stop" */ @implementation Stopwatch /* +new -- Create an instance. * In addition to the normal stuff, this loads the .nib file * and initializes the Animator. */ + new { self = [super new]; [NXApp loadNibSection:"Stopwatch.nib" owner:self]; myAnimator = [Animator newChronon: 0.1 adaptation: 3.0 target: self action: @selector(animate:) autoStart: NO eventMask: NX_ALLEVENTS]; [panel setUpdateAction:@selector(panelUpdate:) by:NXApp]; [panel setDelegate:self]; return self; } /* startPressed: -- Respond to start/stop button press * Action taken depends on state of button. This message should * not be sent by an external object, only by the start/stop button. * To simulate Start/Stop button behavior, use performStart:/Stop: * methods. */ #define DELSTART @selector(stopwatchWillStart:) /* Shorthand for delegate */ #define DELSTOP @selector(stopwatchDidStop:) /* selectors ... */ - startPressed:sender { if ([sender state] == ST_START) { [[lapTimeField setStringValue: ""] display]; if (delegate && [delegate respondsTo:DELSTART]) [delegate perform:DELSTART with:self]; if (target != nil) [target perform:startAction with:self]; [[myAnimator startEntry] resetRealTime]; } else { [myAnimator stopEntry]; if (target != nil) [target perform:stopAction with:self]; if (delegate && [delegate respondsTo:DELSTOP]) [delegate perform:DELSTOP with:self]; } return self; } /* performStart -- simulate start button press * performStop -- simulate stop button press * These messages can be sent by any object. They cause the * start/stop button to "press itself". These methods thus * allow external control of the watch. */ - performStart:sender { if ([startButton state] == ST_STOP) { [panel orderFront:self]; /* Be sure we can see panel */ [startButton performClick:self]; } return self; } - performStop:sender { if ([startButton state] == ST_START) [startButton performClick:self]; return self; } /* lapPressed: -- respond to lap button press * Displays current time in lap time field. This message can * be sent by any object. */ - lapPressed:sender { char str[64]; /* For sprintf'd time */ sprintf(str,"%8.3f",(float)[myAnimator getDoubleEntryTime]); [[lapTimeField setStringValue: str] display]; return self; } /* setTarget:toStart:andStop -- Link watch with another object * start and stop actions must be implemented on target object and * should return immediately. They must take 'sender' as their only * argument. */ - setTarget:anObject toStart:(SEL)beginAction andStop:(SEL)endAction { target = anObject; startAction = beginAction; stopAction = endAction; return self; } /* (BOOL) isRunning -- query the status of the watch */ - (BOOL) isRunning { return [myAnimator isTicking]; } /* panel -- returns pointer to Stopwatch panel */ - panel { return panel; } /* delegate -- returns pointer to delegate */ - delegate { return delegate; } /* -animate: -- response to Animator timed entry. * Prints the elapsed time in the proper text field. */ - animate: sender { char str[64]; /* sprintf'd time value goes here */ sprintf(str,"%8.3f",(float)[myAnimator getDoubleEntryTime]); [[timeField setStringValue: str] display]; return self; } /* windowWillClose: -- delegate method for panel * Stops the watch before panel disappears */ - windowWillClose:sender { [self performStop:self]; return self; } /* Stuff for Interface Builder */ - setPanel:anObject { panel = anObject; return self; } - setTimeField:anObject { timeField = anObject; return self; } - setLapTimeField:anObject { lapTimeField = anObject; return self; } - setStartButton:anObject { startButton = anObject; return self; } - setLapButton:anObject { lapButton = anObject; return self; } - setDelegate:anObject { /* Test validity of this object as a delegate NOW, so we can save * a little time later. */ if ([anObject respondsTo:@selector(stopwatchWillStart:)] || [anObject respondsTo:@selector(stopwatchDidStop:)]) delegate = anObject; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.