This is FoneController.m in view mode; [Download] [Up]
//---------------------------------------------------------------------------------------------------- // // FoneController // // Inherits From: Object // // Declared In: FoneController.h // // Disclaimer // // You may freely copy, distribute and reuse this software and its // associated documentation. I disclaim any warranty of any kind, // expressed or implied, as to its fitness for any particular use. // //---------------------------------------------------------------------------------------------------- #import "FoneController.h" #import <dpsclient/dpsNeXT.h> #define _PATTERN_END 13 static int animationPattern[_PATTERN_END] = {0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0}; static int patternIterator; static int loopCount; @implementation FoneController //--------------------------------------------------------------------------------------------------------- // Private Methods //--------------------------------------------------------------------------------------------------------- - (NXPoint) _centerPoint: anImage { // You must center the composited image within the contentView of the // appIcon window. NXSize appTileSize; NXSize imageSize; NXPoint centerPoint; [appTile getSize: &appTileSize]; [anImage getSize: &imageSize]; if ( imageSize.width < appTileSize.width ) centerPoint.x += (appTileSize.width - imageSize.width ) / 2.0; if ( imageSize.height < appTileSize.height ) centerPoint.y += (appTileSize.height - imageSize.height ) / 2.0; return centerPoint; } - _display: anImage { // NXAppTile is composited first at 0,0 of the icon window's content view // (this is required in order to maintain the NeXT icon look). 'anImage' is // then composited at center (centering is also a requirement). NXPoint contentViewOrigin = { 0.0, 0.0 }; NXPoint centerPoint = [self _centerPoint: anImage]; [appIconContentView lockFocus]; [appTile composite:NX_SOVER toPoint:&contentViewOrigin]; [anImage composite:NX_SOVER toPoint:¢erPoint]; [appIconContentView unlockFocus]; [appIconContentView display]; return self; } - _animate { // This contains logic for the icon animation (image sequencing). Three // images are used (contained in imageList). The animationPattern // provides an index into that list, giving us the right image at the right // time. The icon will 'ring' twice, and leave the phone off-hook to indicate // unanswered calls. static int offset; [self _display: [imageList objectAt: animationPattern[patternIterator++]]]; if (patternIterator == (_PATTERN_END - offset)) { [self removeTimedEntry]; patternIterator = 0; loopCount++; if (loopCount < 2) { offset = 1; [self perform: @selector(ring:) with:self afterDelay:500 cancelPrevious:YES]; } else { loopCount = offset = 0; [self _display: [imageList objectAt: 1]]; } } return self; } //--------------------------------------------------------------------------------------------------------- // DPS Timed Entry Methods //--------------------------------------------------------------------------------------------------------- void Animate (timedEntry, now, self) DPSTimedEntry timedEntry; double now; id self; { // This is the callback function for the DPS Timed Entry. It in turn // calls our _animate method. DPS Timed Entries require functions // not methods, as callbacks. [ (id) self _animate]; } - removeTimedEntry { if (timedEntry) { DPSRemoveTimedEntry (timedEntry); timedEntry = 0; } return self; } //--------------------------------------------------------------------------------------------------------- // Application Delegate Method //--------------------------------------------------------------------------------------------------------- - appDidInit: sender { // App has inited. We can now get to the things we need to initialize. // Create the imageList (the list of images used for animation). Get the // standard NXAppTile, icon window content view, and move the icon // somewhere obvious. imageList = [[List alloc] init]; [imageList insertObject: [NXImage findImageNamed: "Phone0"] at: 0]; [imageList insertObject: [NXImage findImageNamed: "Phone1"] at: 1]; [imageList insertObject: [NXImage findImageNamed: "Phone2"] at: 2]; appTile = [NXImage findImageNamed: "NXAppTile"]; appIconContentView = [[NXApp appIcon] contentView]; [[NXApp appIcon] moveTo: 540 :355]; return self; } //--------------------------------------------------------------------------------------------------------- // Action Methods //--------------------------------------------------------------------------------------------------------- - ring: sender { // 'Ring' and add a timed entry to begin the animation sequence... if (timedEntry) return self; [[[Sound findSoundFor: "Ring"] play: nil] free]; timedEntry = DPSAddTimedEntry(0.2, Animate, (void*)self, NX_MODALRESPTHRESHOLD); return self; } - answer: sender { // Indicate 'Answer' by placing the fone on-hook. Do necessary housekeeping. [self removeTimedEntry]; [[[Sound findSoundFor: "Ring"] stop: nil] free]; [self _display: [imageList objectAt: 0]]; patternIterator = 0; loopCount = 0; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.