Annotation of Examples/AppKit/BusyBox/AnimalView.m, revision 1.1

1.1     ! root        1: 
        !             2: #import "AnimalView.h"
        !             3: #import <appkit/NXBitmapImageRep.h>
        !             4: #import <appkit/Control.h>
        !             5: #import <sys/param.h>
        !             6: 
        !             7: /* 
        !             8:  * AnimalView.m, a simple view to display an NXBitmapImageRep.  
        !             9:  * Subclass of view that draws an NXBitmapImageRep.  Knows how 
        !            10:  * to flip and rotate itself in response to IB controls.       
        !            11:  * NXBitmapImageRep provides the functionality to deal with images 
        !            12:  * that are stored as bitmaps.  The instances of this class are created by 
        !            13:  * loading TIFF data.  In 1.0, I would have read bitmap data (from TIFF 
        !            14:  * file or Mach-O) and imaged it using NXImageBitmap(). It works out much 
        !            15:  * cleaner using NXBitmapImageRep.
        !            16:  *
        !            17:  * Author: Julie Zelenski, NeXT Developer Support
        !            18:  * You may freely copy, distribute and reuse the code in this example.  
        !            19:  * NeXT disclaims any warranty of any kind, expressed or implied, as to 
        !            20:  * its fitness for any particular use.
        !            21:  */
        !            22:  
        !            23: @implementation AnimalView:View
        !            24: 
        !            25: /* INIT/FREE METHODS */
        !            26: 
        !            27: - initFrame:(NXRect *)frameRect;
        !            28: /* Init method for newly created animal view. It initializes the scaling
        !            29:  * factors to normal, and then grabs the duck for the initial image.
        !            30:  */
        !            31: {
        !            32:     [super initFrame:frameRect];
        !            33:     scaleFactor.x = scaleFactor.y = 1.0;
        !            34:     [self setImageToAnimal:"Duck"];
        !            35:     return self;
        !            36: }
        !            37:    
        !            38: - free;
        !            39: /* Free the image on our way out.
        !            40:  */
        !            41: {
        !            42:     [image free];
        !            43:     return [super free];
        !            44: }
        !            45: 
        !            46: 
        !            47: /* TARGET/ACTION METHODS */
        !            48: 
        !            49: - rotateLeft:sender
        !            50: /* Rotates the view 90 degrees to the left and redisplays.
        !            51:  */
        !            52: {  
        !            53:     [self rotate:(scaleFactor.x*scaleFactor.y)*90.0];
        !            54:     [self display];
        !            55:     return self;
        !            56: }
        !            57: 
        !            58: - rotateRight:sender
        !            59: /* Rotates the view 90 degrees to the right and redisplays.
        !            60:  */
        !            61: {
        !            62:     [self rotate:(scaleFactor.x*scaleFactor.y)*-90.0];
        !            63:     [self display];
        !            64:     return self;
        !            65: }
        !            66: 
        !            67: - flipHorizontal:sender
        !            68: /* Mirrors the view across vertical axis, and updates scale factor to 
        !            69:  * indicate that.  Since rotation can change what is currently vertical, 
        !            70:  * need to rotate to zero, do the scaling, and restore rotation.
        !            71:  */ 
        !            72: {   
        !            73:     float angle;
        !            74:     
        !            75:     angle = [self boundsAngle];
        !            76:     scaleFactor.x *= -1;
        !            77:     [self rotate:-1*angle];
        !            78:     [self scale:-1.0 :1.0];
        !            79:     [self rotate:angle];
        !            80:     [self display];
        !            81:     return self;
        !            82: }
        !            83: 
        !            84: - flipVertical:sender
        !            85: /* Mirrors the view across horizontal axis, and updates scale factor to 
        !            86:  * indicate that.  Since rotation can change what is currently horizontal, 
        !            87:  * need to rotate to zero, do the scaling, and restore rotation.
        !            88:  */ 
        !            89: {
        !            90:     float angle;
        !            91:     
        !            92:     angle = [self boundsAngle];
        !            93:     scaleFactor.y *= -1;
        !            94:     [self rotate:-1*angle];
        !            95:     [self scale:1.0 :-1.0];
        !            96:     [self rotate:angle];
        !            97:     [self display];
        !            98:     return self;
        !            99: }
        !           100: 
        !           101: - changeAnimal:sender
        !           102: /* Target/Action for IB control.  Changes to display image with name of
        !           103:  * cell title.
        !           104:  */
        !           105: {   
        !           106:     [self setImageToAnimal:[[sender selectedCell] title]];
        !           107:     return self;
        !           108: }
        !           109: 
        !           110: 
        !           111: 
        !           112: /* PRIVATE METHODS */
        !           113: 
        !           114: - setImageToAnimal:(const char *)imageName;
        !           115: /* Find the bitmap image rep for the specified name, sets the scaling
        !           116:  * and rotation back to "normal" and displays new image.
        !           117:  */
        !           118: {   char filename[MAXPATHLEN];
        !           119: 
        !           120:     sprintf(filename,"%s.tiff",imageName);
        !           121:     if (image) [image free];
        !           122:     image = [[NXBitmapImageRep alloc] initFromSection:filename];
        !           123:     [self setDrawRotation:0.0];
        !           124:     [self scale:scaleFactor.x :scaleFactor.y];
        !           125:     scaleFactor.x = scaleFactor.y = 1.0;
        !           126:     [self display];
        !           127:     return self;
        !           128: }
        !           129: 
        !           130: - drawSelf:(NXRect *)rects :(int)rectCount;
        !           131: /* Clears the background and has the image draw itself 
        !           132:  */
        !           133: {
        !           134:    NXEraseRect(&bounds);  /* to be sure to clear background */
        !           135:    [image drawIn:&bounds];
        !           136:    return self;
        !           137: }
        !           138: 
        !           139: @end

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.