Annotation of Examples/AppKit/ScrollDoodScroll/TileScrollView.m, revision 1.1

1.1     ! root        1: // TileScrollView.m
        !             2: // By Jayson Adams, NeXT Developer Support Team
        !             3: // Modified for 3.0 by Ali Ozer, May '92
        !             4: // You may freely copy, distribute and reuse the code in this example.
        !             5: // NeXT disclaims any warranty of any kind, expressed or implied, as to its
        !             6: // fitness for any particular use.
        !             7: 
        !             8: #import <appkit/ClipView.h>
        !             9: #import <appkit/Matrix.h>
        !            10: 
        !            11: #import "RulerView.h"
        !            12: #import "PostScriptView.h"
        !            13: 
        !            14: #import "TileScrollView.h"
        !            15: 
        !            16: 
        !            17: @implementation TileScrollView
        !            18: 
        !            19: 
        !            20: /* instance methods */
        !            21: 
        !            22: - initFrame:(const NXRect *)theFrame
        !            23: {
        !            24:     NXRect     rulerViewRect = {{0.0, 0.0}, {NX_WIDTH(theFrame), 20.0}};
        !            25:     
        !            26:     [super initFrame:theFrame];
        !            27:     
        !            28:   /* create a rulerView */
        !            29:     rulerView = [[RulerView alloc] initFrame:&rulerViewRect];
        !            30:     
        !            31:   /* make a clipView to hold it (we'll adjust its size & position in tile) */
        !            32:     rulerClipView = [[ClipView alloc] initFrame:&rulerViewRect];
        !            33:     [self addSubview:rulerClipView];
        !            34:     [rulerClipView setDocView:rulerView];
        !            35: 
        !            36:   /* remember the current scale factor */
        !            37:     oldScaleFactor = 1.0;
        !            38:     
        !            39:     return self;
        !            40: }
        !            41: 
        !            42: - free
        !            43: {
        !            44:     [rulerView free];
        !            45:     [rulerClipView free];
        !            46: 
        !            47:     return [super free];
        !            48: }
        !            49: 
        !            50: - changeScale:sender
        !            51: {
        !            52:     float scaleFactor = [[sender selectedCell] tag] / 100.0;
        !            53:     
        !            54:     if (scaleFactor != oldScaleFactor) {
        !            55:        [window disableDisplay];
        !            56:        [[self docView] scale:scaleFactor / oldScaleFactor];
        !            57:        [rulerView scale:scaleFactor / oldScaleFactor :1.0];
        !            58:        [self fixUpRuler];
        !            59:        [window reenableDisplay];
        !            60:        [self display];
        !            61:        oldScaleFactor = scaleFactor;
        !            62:     }
        !            63:     
        !            64:     return self;
        !            65: }
        !            66: 
        !            67: - (void)fixUpRuler
        !            68: {
        !            69:     NXRect docViewBounds, rulerViewBounds;
        !            70:     [window disableDisplay];
        !            71:     [[self docView] getBounds:&docViewBounds];
        !            72:     [rulerView getBounds:&rulerViewBounds];
        !            73:     [rulerView sizeTo:NX_WIDTH(&docViewBounds) :NX_HEIGHT(&rulerViewBounds)];
        !            74:     [self tile];
        !            75:     [window reenableDisplay];
        !            76:     [self display];
        !            77: }
        !            78: 
        !            79: - setDocView:aView
        !            80: {
        !            81:     id retVal = [super setDocView:aView];
        !            82:     [self fixUpRuler];
        !            83:     return retVal;
        !            84: }
        !            85: 
        !            86: - tile
        !            87: /*
        !            88:  * tile gets called whenever the scrollView changes size.  Its job is to resize
        !            89:  * all of the scrollView's "tiled" views (scrollers, contentView and any other
        !            90:  * views we might want to place in the scrollView's bounds).
        !            91:  */
        !            92: {
        !            93:     NXRect     contentViewRect, rulerRect, rulerClipRect, scrollerRect,
        !            94:                buttonRect, stubRect;
        !            95:     
        !            96:   /* resize and arrange the scrollers and contentView as usual */ 
        !            97:     [super tile];
        !            98:     
        !            99:   /* make sure the popup list and stub view are subviews of us */
        !           100:     if ([popupListButton superview] != self) {
        !           101:        [self addSubview:popupListButton];
        !           102:     }
        !           103:     if ([stubView superview] != self) {
        !           104:        [self addSubview:stubView];
        !           105:     }
        !           106:     
        !           107:   /* cut a slice from the contentView to make room for the rulerView */
        !           108:     [contentView getFrame:&contentViewRect];
        !           109:     [rulerView getFrame:&rulerRect];
        !           110:     NXDivideRect(&contentViewRect, &rulerClipRect, NX_HEIGHT(&rulerRect), 1);
        !           111:     [rulerClipView setFrame:&rulerClipRect];
        !           112:     [contentView setFrame:&contentViewRect];
        !           113:     
        !           114:   /* shrink the vScroller to make room for the stub view */
        !           115:     [vScroller getFrame:&scrollerRect];
        !           116:     NXDivideRect(&scrollerRect, &stubRect, NX_HEIGHT(&rulerRect), 1);
        !           117:     [vScroller setFrame:&scrollerRect];
        !           118:     [stubView setFrame:&stubRect];
        !           119:     
        !           120:   /* now make the hScroller smaller and stick the popupList next to it */
        !           121:     [hScroller getFrame:&scrollerRect];
        !           122:     NXDivideRect(&scrollerRect, &buttonRect, 60.0, 2);
        !           123:     [hScroller setFrame:&scrollerRect];
        !           124:     NXInsetRect(&buttonRect, 1.0, 1.0);
        !           125:     [popupListButton setFrame:&buttonRect];
        !           126:     
        !           127:     return self;
        !           128: }
        !           129: 
        !           130: - scrollClip:aClipView to:(NXPoint *)aPoint
        !           131: {
        !           132:     NXPoint    colOrigin;
        !           133:     NXRect     colBounds;
        !           134:     
        !           135:   /* don't do anything if it's not the contentView */
        !           136:     if (aClipView != contentView) {
        !           137:        return self;
        !           138:     }
        !           139:     
        !           140:   /* turn off drawing (to the screen) */
        !           141:     [window disableFlushWindow];
        !           142:     
        !           143:   /* scroll the contentView to the new origin */
        !           144:     [aClipView rawScroll:aPoint];
        !           145:     
        !           146:   /* compute new origin for the rulerView (don't let it scroll vertically) */
        !           147:     [rulerClipView getBounds:&colBounds];
        !           148:     colOrigin.x = aPoint->x;
        !           149:     colOrigin.y = colBounds.origin.y;
        !           150:     
        !           151:   /* scroll the ruler view to that point */
        !           152:     [rulerClipView rawScroll:&colOrigin];
        !           153:     
        !           154:   /* send results to screen */
        !           155:     [[window reenableFlushWindow] flushWindow];
        !           156:     
        !           157:     return self;
        !           158: }
        !           159: 
        !           160: @end

unix.superglobalmegacorp.com

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