This is ClipView.m in view mode; [Download] [Up]
/* Implementation of ClipView class * * Copyright (C) 1994 The Board of Trustees of * The Leland Stanford Junior University. All Rights Reserved. * * Authors: Paul Kunz * * This file is part of an Objective-C class library for a window system. * * ClipView.m,v 1.16 1995/12/13 22:32:57 fedor Exp */ #include "ClipView.h" #include "NXCursor.h" #include "ScrollView.h" #include <objc/List.h> #include "stdmacros.h" @interface View(WidgetSet) - _init; @end @implementation ClipView /* Private methods not declared in interface */ - _scrollClip:cView to:(const NXPoint *)newOrigin { if ( [superview respondsTo:@selector(scrollClip:to:) ] ) { [superview scrollClip:self to:newOrigin]; } else { [self rawScroll:newOrigin]; [superview reflectScroll:self]; } return self; } - _validateScroll:(NXPoint *)aPoint { NXPoint maxpoint; if ( docView ) { [docView getFrame:&_docRect]; } else { _docRect.origin.x = 0; _docRect.origin.y = 0; _docRect.size.width = 0; _docRect.size.height = 0; } maxpoint.x = _docRect.size.width - frame.size.width; maxpoint.y = _docRect.size.height - frame.size.height; maxpoint.x = MAX(maxpoint.x, 0); maxpoint.y = MAX(maxpoint.y, 0); aPoint->x = MIN(aPoint->x, maxpoint.x); aPoint->y = MIN(aPoint->y, maxpoint.y); aPoint->x = MAX(aPoint->x, 0 ); aPoint->y = MAX(aPoint->y, 0 ); return self; } /* Private methods */ - _init { [super _init]; instancename = "ClipView"; return self; } /* Public methods */ - initFrame:(const NXRect *)frameRect { [super initFrame:frameRect]; return self; } - setDocView:aView { View *oldView; if ( docView ) { oldView = [self replaceSubview:docView with:aView]; } else { [self addSubview:aView]; oldView = nil; } docView = [subviews objectAt:0]; /* makes sure it got accepted */ [docView notifyAncestorWhenFrameChanged:YES]; [docView getFrame:&_docRect]; _docRect.origin.x = 0; _docRect.origin.y = 0; [docView setFrame:&_docRect]; /* avoid moveTo:: */ [superview reflectScroll:self]; return oldView; } - docView { return docView; } - getDocRect:(NXRect *)aRect { if ( docView ) { [docView getFrame:aRect]; } else { aRect->origin.x = 0; aRect->origin.y = 0; aRect->size.width = 0; aRect->size.height = 0; } aRect->size.width = MAX(aRect->size.width, frame.size.width); aRect->size.height = MAX(aRect->size.height, frame.size.height); return self; } - setDocCursor:anObj { NXCursor *oldCursor; oldCursor = cursor; cursor = anObj; return oldCursor; } - resetCursorRects { return [self notImplemented:_cmd]; } - getDocVisibleRect:(NXRect *)aRect { if ( docView ) { [docView getFrame:&_docRect]; } else { _docRect.origin.x = 0; _docRect.origin.y = 0; _docRect.size.width = 0; _docRect.size.height = 0; } aRect->origin.x = - _docRect.origin.x; aRect->origin.y = - _docRect.origin.y; aRect->size.width = frame.size.width; aRect->size.height = frame.size.height; return self; } - descendantFrameChanged:sender { if ( sender == docView ) { [(ScrollView *)superview reflectScroll:sender]; } return [superview descendantFrameChanged:sender]; } - descendantFlipped:sender { return [self notImplemented:_cmd]; } - setCopyOnScroll:(BOOL)flag { return [self notImplemented:_cmd]; } - setDisplayOnScroll:(BOOL)flag { return [self notImplemented:_cmd]; } - autoscroll:(NXEvent *)theEvent { return [self notImplemented:_cmd]; } - constrainScroll:(NXPoint *)newOrigin { bounds.origin.x = newOrigin->x; bounds.origin.y = newOrigin->y; return self; } - rawScroll:(const NXPoint *)newOrigin { bounds.origin.x = newOrigin->x; bounds.origin.y = newOrigin->y; [docView moveTo:-bounds.origin.x :-bounds.origin.y]; return self; } // in category - write:(NXTypedStream *)stream { [super write:stream]; /* FIXME: Implement */ return self; } - read:(NXTypedStream *)stream { [super read:stream]; docView = [subviews objectAt:0]; NXReadRect(stream, &_docRect); return self; } - free { return [super free]; } - rotate:(NXCoord)angle { return self; /* over-ride to disable rotation */ } - rotateTo:(NXCoord)angle { return self; /* over-ride to disable rotation */ } - setDrawRotation:(NXCoord)angle { return self; /* over-ride to disable rotation */ } - awake { [super awake]; /* until it's archived in View */ [docView notifyAncestorWhenFrameChanged:YES]; return self; } - moveTo:(NXCoord)x :(NXCoord)y { return [self notImplemented:_cmd]; } - sizeTo:(NXCoord)width :(NXCoord)height { return [self notImplemented:_cmd]; } - setDrawOrigin:(NXCoord)x :(NXCoord)y { return [self notImplemented:_cmd]; } - setDrawSize:(NXCoord)width :(NXCoord)height { return [self notImplemented:_cmd]; } - translate:(NXCoord)x :(NXCoord)y { return [self notImplemented:_cmd]; } - scale:(NXCoord)x :(NXCoord)y { return [self notImplemented:_cmd]; } - _setScrollFloatValue:(float) xPercent :(float) yPercent { NXRect rect; NXSize range; NXPoint point; if ( docView ) { [docView getFrame:&_docRect]; } else { _docRect.origin.x = 0; _docRect.origin.y = 0; _docRect.size.width = 0; _docRect.size.height = 0; } [self getDocRect:&rect]; range.width = rect.size.width - frame.size.width; range.height = rect.size.height - frame.size.height; point.x = xPercent * range.width; point.y = yPercent * range.height; [self _scrollClip:self to:&point]; return self; } - _scrollLine:(int)amount vertical:(BOOL)aFlag { NXPoint point; point.x = bounds.origin.x; point.y = bounds.origin.y; if ( aFlag ) { point.y += amount; } else { point.x += amount; } [self _validateScroll:&point]; [self _scrollClip:self to:&point]; return self; } - _scrollPage:(int)context vertical:(BOOL)vFlag up:(BOOL)uFlag { int amount; if ( vFlag ) { amount = frame.size.height - context; } else { amount = frame.size.width - context; } if ( uFlag ) { amount = - amount; } return [self _scrollLine:amount vertical:vFlag]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.