libs-gui/Source/NSClipView.m
Richard Frith-MacDonald 56ebe52aa7 Rewrite and tidy of code to constrain scroll point. Incorporate some
ideas from xraw.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@3577 72102866-910b-0410-8b05-ffd578937521
1999-01-19 10:58:51 +00:00

281 lines
7.3 KiB
Objective-C

/*
NSClipView.m
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Ovidiu Predescu <ovidiu@net-community.com>
Date: July 1997
This file is part of the GNUstep GUI Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gnustep/gui/config.h>
#include <Foundation/NSNotification.h>
#include <AppKit/NSClipView.h>
#include <AppKit/NSCursor.h>
#include <AppKit/NSColor.h>
#include <AppKit/NSWindow.h>
#include <AppKit/NSGraphics.h>
@implementation NSClipView
- init
{
[super init];
[self setAutoresizesSubviews:YES];
[self setBackgroundColor:[NSColor lightGrayColor]];
return self;
}
- (void)setDocumentView:(NSView*)aView
{
if (_documentView == aView)
return;
if (_documentView)
[_documentView removeFromSuperview];
ASSIGN(_documentView, aView);
if (_documentView)
{
NSRect df;
[self addSubview: _documentView];
df = [_documentView frame];
if ([_documentView isFlipped])
df.origin.y += bounds.size.height - df.size.height;
[self setBoundsOrigin: df.origin];
if ([aView respondsToSelector: @selector(backgroundColor)])
[self setBackgroundColor: [(id)aView backgroundColor]];
/* Register for notifications sent by the document view */
[_documentView setPostsFrameChangedNotifications:YES];
[_documentView setPostsBoundsChangedNotifications:YES];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(viewFrameChanged:)
name:NSViewFrameDidChangeNotification object:_documentView];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(viewBoundsChanged:)
name:NSViewBoundsDidChangeNotification object:_documentView];
}
/* TODO: invoke superview's reflectScrolledClipView:? */
[[self superview] reflectScrolledClipView:self];
}
- (void)resetCursorRects
{
[self addCursorRect:[self bounds] cursor:_cursor];
}
- (void) resizeSubviewsWithOldSize: (NSSize)old_size
{
[super resizeSubviewsWithOldSize: old_size];
if ([_documentView isFlipped])
{
[self scrollToPoint: bounds.origin];
}
}
- (void)scrollToPoint:(NSPoint)point
{
#ifdef DEBUGLOG
NSPoint currentPoint = [self bounds].origin;
NSLog (@"scrollToPoint: current point (%f, %f), point (%f, %f)",
currentPoint.x, currentPoint.y,
point.x, point.y);
#endif
point = [self constrainScrollPoint: point];
[self setBoundsOrigin: NSMakePoint(point.x, point.y)];
[self setNeedsDisplay: YES];
if (_copiesOnScroll)
/* TODO: move the visible portion of the document */
[_documentView displayRect: bounds];
else
[_documentView setNeedsDisplayInRect: bounds];
// [_documentView setNeedsDisplay: YES];
[self display];
}
- (NSPoint)constrainScrollPoint:(NSPoint)proposedNewOrigin
{
NSRect documentFrame = [_documentView frame];
NSPoint new = proposedNewOrigin;
if (documentFrame.size.width <= bounds.size.width)
new.x = 0.0;
else if (proposedNewOrigin.x <= documentFrame.origin.x)
new.x = documentFrame.origin.x;
else if (proposedNewOrigin.x
>= documentFrame.size.width - bounds.size.width)
new.x = documentFrame.size.width - bounds.size.width;
if ([_documentView isFlipped])
{
if (documentFrame.size.height <= bounds.size.height)
new.y = documentFrame.origin.y
+ (documentFrame.size.height - bounds.size.height);
else if (proposedNewOrigin.y <= 0)
new.y = 0;
else if (proposedNewOrigin.y
>= documentFrame.size.height - bounds.size.height)
new.y = documentFrame.size.height - bounds.size.height;
}
else
{
if (documentFrame.size.height <= bounds.size.height)
new.y = 0.0;
else if (proposedNewOrigin.y <= documentFrame.origin.y)
new.y = documentFrame.origin.y;
else if (proposedNewOrigin.y
>= documentFrame.size.height - bounds.size.height)
new.y = documentFrame.size.height - bounds.size.height;
}
return new;
}
- (NSRect)documentRect
{
NSRect documentFrame = [_documentView frame];
NSRect clipViewBounds = bounds;
NSRect rect;
rect.origin = documentFrame.origin;
rect.size.width = MAX(documentFrame.size.width, clipViewBounds.size.width);
rect.size.height = MAX(documentFrame.size.height,clipViewBounds.size.height);
return rect;
}
- (NSRect)documentVisibleRect
{
NSRect documentBounds = [_documentView bounds];
NSRect clipViewBounds = bounds;
NSRect rect;
rect.origin = clipViewBounds.origin;
rect.size.width = MIN(documentBounds.size.width, clipViewBounds.size.width);
rect.size.height = MIN(documentBounds.size.height,
clipViewBounds.size.height);
return rect;
}
- (void) drawRect:(NSRect)rect
{
[[self backgroundColor] set];
NSRectFill(rect);
}
- (BOOL)autoscroll:(NSEvent*)theEvent
{
return 0;
}
- (void)viewBoundsChanged:(NSNotification*)aNotification
{
[super_view reflectScrolledClipView:self];
}
- (void)viewFrameChanged:(NSNotification*)aNotification
{
[self setBoundsOrigin: [self constrainScrollPoint: bounds.origin]];
[super_view reflectScrolledClipView:self];
}
- (void)scaleUnitSquareToSize:(NSSize)newUnitSize
{
[super scaleUnitSquareToSize:newUnitSize];
[super_view reflectScrolledClipView:self];
}
- (void)setBoundsOrigin:(NSPoint)aPoint
{
[super setBoundsOrigin:aPoint];
[super_view reflectScrolledClipView:self];
}
- (void)setBoundsSize:(NSSize)aSize
{
[super setBoundsSize:aSize];
[super_view reflectScrolledClipView:self];
}
- (void)setFrameSize:(NSSize)aSize
{
[super setFrameSize:aSize];
[super_view reflectScrolledClipView:self];
}
- (void)setFrameOrigin:(NSPoint)aPoint
{
[super setFrameOrigin:aPoint];
[super_view reflectScrolledClipView:self];
}
- (void)setFrame:(NSRect)rect
{
[super setFrame:rect];
[super_view reflectScrolledClipView:self];
}
- (void)translateOriginToPoint:(NSPoint)aPoint
{
[super translateOriginToPoint:aPoint];
[super_view reflectScrolledClipView:self];
}
- (BOOL)isOpaque { return YES; }
- (id)documentView { return _documentView; }
- (void)setCopiesOnScroll:(BOOL)flag { _copiesOnScroll = flag; }
- (BOOL)copiesOnScroll { return _copiesOnScroll; }
- (void)setDocumentCursor:(NSCursor*)aCursor { ASSIGN(_cursor, aCursor); }
- (NSCursor*)documentCursor { return _cursor; }
- (NSColor*)backgroundColor { return _backgroundColor; }
- (BOOL)isFlipped { return [_documentView isFlipped]; }
- (BOOL)acceptsFirstResponder { return _documentView != nil; }
- (void)setBackgroundColor:(NSColor*)aColor
{
ASSIGN(_backgroundColor, aColor);
}
/* Disable rotation of clip view */
- (void)rotateByAngle:(float)angle
{}
- (void)setBoundsRotation:(float)angle
{}
- (void)setFrameRotation:(float)angle
{}
/* Managing responder chain */
- (BOOL)becomeFirstResponder
{
return [_documentView becomeFirstResponder];
}
@end