This is PXKScrollView.m in view mode; [Download] [Up]
/*
PXKScrollView.m
Copyright (C) 1996 Free Software Foundation, Inc.
Author: Pascal Forget <pascal@wsc.com>
Date: October 1995
This file is part of the GNUstep GUI X/DPS Backend.
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.
If you are interested in a warranty or support for this source code,
contact Scott Christley <scottc@net-community.com> for more information.
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/xdps/PXKScrollView.h>
#include <gnustep/xdps/PXKTestImage.h>
#include <gnustep/xdps/PXKButton.h>
#include <gnustep/xdps/PXKMatrix.h>
#include <gnustep/xdps/PXKView.h>
@implementation PXKScrollView
- (PXKClipView *)clipView;
{
return [sub_views objectAtIndex:0];
}
- (void)display;
{
[self placeSubviews];
XFlush(pxkDisplay);
XMapWindow(pxkDisplay, [(PXKView *)self xWindow]);
XClearWindow(pxkDisplay, [(PXKView *)self xWindow]);
XMapSubwindows(pxkDisplay, [(PXKView *)self xWindow]);
[(PXKClipView *)[sub_views objectAtIndex:0] display];
if (yScrollerVisible) {
[(PXKScroller *)[sub_views objectAtIndex:1] display];
} else {
[(PXKScroller *)[sub_views objectAtIndex:1] close];
}
if (xScrollerVisible) {
[(PXKScroller *)[sub_views objectAtIndex:2] display];
} else {
[(PXKScroller *)[sub_views objectAtIndex:2] close];
}
[self drawBorder];
XFlush(pxkDisplay);
return self;
}
- drawBorder;
{
// (void)load_font(&win_font);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkDarkgrayGC,
0,0,frame.size.width-1,0);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkDarkgrayGC,
0,1,0,frame.size.height-1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
1,1,frame.size.width-2,1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
1,2,1,frame.size.height-2);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkWhiteGC,
0, frame.size.height-1,
frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkWhiteGC,
frame.size.width-1, 0,
frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkLightgrayGC,
1, frame.size.height-2,
frame.size.width-2, frame.size.height-2);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkLightgrayGC,
frame.size.width-2, 1,
frame.size.width-2, frame.size.height-2);
#if 0
XDrawLine(pxkDisplay, xWindow, pxkWhiteGC, 0, frame.size.height-1,
frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, xWindow, pxkWhiteGC, frame.size.width-1,
0, frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, xWindow, pxkWhiteGC, 2, frame.size.height-2,
frame.size.width-2, frame.size.height-2);
XDrawLine(pxkDisplay, xWindow, pxkWhiteGC, frame.size.width-2,
1, frame.size.width-2, frame.size.height-2);
/* using drawing color white */
XDrawLine(pxkDisplay, xWindow, pxkBlackGC,0,0,frame.size.width-2,0);
XDrawLine(pxkDisplay, xWindow, pxkBlackGC,0,0,0,frame.size.height-2);
#endif
return self;
}
- initWithSuperview:(PXKView *)aView;
{
#if 0
PXKTestImage *c;
PXKButton *b;
NSSize s;
NSRect r;
#endif
PXKClipView *clipView;
[super initWithSuperview:aView];
yScrollerLeft = NO;
yScrollerVisible = YES;
xScrollerVisible = YES;
clipView = [[PXKClipView alloc] initWithSuperview:self];
[sub_views addObject:clipView];
[sub_views addObject:[[PXKScroller alloc] initWithSuperview:self]];
[sub_views addObject:[[PXKScroller alloc] initWithSuperview:self]];
#if 0
s.width = 900;
s.height= 500;
c = [[PXKTestImage alloc] initWithSize:s];
[c setName:"Stupid screen grab"];
b = [[PXKButton alloc] initWithSuperview:clipView];
r.origin.x = 0;
r.origin.y = 0;
r.size.width = 900;
r.size.height= 500;
[b setFrame:r];
[b setImage:c];
[b setTitle:[[PXKString alloc] initWithCString:""]];
[clipView setView:b];
#endif
return self;
}
- (void)hideXScroller;
{
xScrollerVisible = NO;
}
- (void)hideYScroller;
{
yScrollerVisible = NO;
}
#define PXK_SCROLLER_SIDE 20
- placeSubviews;
{
NSRect cRect;
NSRect yRect = [(PXKScroller *)[sub_views objectAtIndex:1] frame];
NSRect xRect = [(PXKScroller *)[sub_views objectAtIndex:2] frame];
yRect.size.width = PXK_SCROLLER_SIDE;
xRect.size.height= PXK_SCROLLER_SIDE;
cRect.origin.y = 2;
#if 0
fprintf(stdout, "before clipView: %d %d %d %d\n", cRect.origin.x,
cRect.origin.y, cRect.size.width, cRect.size.height);
fprintf(stdout, "before vert scroller: %d %d %d %d\n", yRect.origin.x,
yRect.origin.y, yRect.size.width, yRect.size.height);
fprintf(stdout, "before horiz scroller: %d %d %d %d\n", xRect.origin.x,
xRect.origin.y, xRect.size.width, xRect.size.height);
puts("ScrollView: placing subviews");
#endif
if (yScrollerLeft) {
if (yScrollerVisible) {
/* Place vertical scroller */
yRect.origin.x = 1;
yRect.origin.y = 1;
yRect.size.height = frame.size.height-2;
/* Place clipView */
cRect.origin.x = yRect.size.width + 2;
cRect.size.width = frame.size.width - cRect.origin.x - 1;
cRect.origin.y = 2;
if (xScrollerVisible) {
cRect.size.height = frame.size.height - xRect.size.height - 4;
} else {
[(PXKView *)[sub_views objectAtIndex:2] close];
xRect.size.height = 0;
cRect.size.height = frame.size.height - 4;
}
} else {
/* Place vertical scroller */
yRect.size.height = 0;
/* Place clipView */
cRect.origin.x = 2;
cRect.size.width = frame.size.width - 4;
cRect.origin.y = 2;
if (xScrollerVisible) {
cRect.size.height = frame.size.height - xRect.size.height - 4;
} else {
[(PXKView *)[sub_views objectAtIndex:2] close];
xRect.size.height = 0;
cRect.size.height = frame.size.height - 4;
}
[(PXKView *)[sub_views objectAtIndex:1] close];
}
} else { /* The vertical scroller is at the right of the clip view */
if (yScrollerVisible) {
/* Place vertical scroller */
yRect.origin.x = frame.size.width - PXK_SCROLLER_SIDE-2;
yRect.origin.y = 1;
yRect.size.height = frame.size.height-2;
/* Place clipView */
cRect.origin.x = 2;
cRect.size.width = frame.size.width - yRect.size.width - 4;
cRect.origin.y = 2;
if (xScrollerVisible) {
cRect.size.height = frame.size.height - xRect.size.height - 4;
} else {
[(PXKView *)[sub_views objectAtIndex:2] close];
xRect.size.height = 0;
cRect.size.height = frame.size.height - 4;
}
} else {
/* Place vertical scroller */
yRect.size.height = 0;
/* Place clipView */
cRect.origin.x = 2;
cRect.size.width = frame.size.width - 4;
cRect.origin.y = 2;
if (xScrollerVisible) {
cRect.size.height = frame.size.height - xRect.size.height - 4;
} else {
xRect.size.height = 0;
[(PXKView *)[sub_views objectAtIndex:2] close];
cRect.size.height = frame.size.height - 4;
}
[(PXKView *)[sub_views objectAtIndex:1] close];
}
}
/* Place horizontal scroller */
if (xScrollerVisible) {
if (yScrollerLeft) {
xRect.origin.x = cRect.origin.x - 1;
} else {
xRect.origin.x = 1;
}
xRect.size.width = cRect.size.width + 1;
xRect.origin.y = frame.size.height - xRect.size.height - 1;
}
#if 0
fprintf(stdout, "clipView: %d %d %d %d\n", cRect.origin.x,
cRect.origin.y, cRect.size.width, cRect.size.height);
fprintf(stdout, "vert scroller: %d %d %d %d\n", yRect.origin.x,
yRect.origin.y, yRect.size.width, yRect.size.height);
fprintf(stdout, "horiz scroller: %d %d %d %d\n", xRect.origin.x,
xRect.origin.y, xRect.size.width, xRect.size.height);
#endif
[(PXKView *)[sub_views objectAtIndex:0] setFrame:cRect];
[(PXKView *)[sub_views objectAtIndex:1] setFrame:yRect];
[(PXKView *)[sub_views objectAtIndex:2] setFrame:xRect];
return self;
}
- (void)putYScrollerToTheLeft;
{
yScrollerLeft = YES;
}
- (void)putYScrollerToTheRight;
{
yScrollerLeft = NO;
}
- (void)showXScroller;
{
xScrollerVisible = YES;
}
- (void)showYScroller;
{
yScrollerVisible = YES;
}
- (PXKScroller *)xScroller;
{
return [sub_views objectAtIndex:2];
}
- (PXKScroller *)yScroller;
{
return [sub_views objectAtIndex:1];
}
- xScrolled;
{
float relativePos = [[sub_views objectAtIndex:2] relativePosition];
[(PXKClipView *)[sub_views objectAtIndex:0]
setXRelativePosition:relativePos];
[[sub_views objectAtIndex:0] display];
return self;
}
- yScrolled;
{
float relativePos = [[sub_views objectAtIndex:1] relativePosition];
[(PXKClipView *)[sub_views objectAtIndex:0]
setYRelativePosition:relativePos];
[[sub_views objectAtIndex:0] display];
return self;
}
- updateScrollers; /* Message sent from ClipView object */
{
PXKClipView *clipView = [sub_views objectAtIndex:0];
PXKMatrix *docView = [clipView view];
NSRect clipR = [clipView frame];
NSRect viewR = [docView frame];
float xRatio = clipR.size.width / (float)viewR.size.width;
float yRatio = clipR.size.height / (float)viewR.size.height;
float min;
float max;
float pos;
puts("update scrollers");
#if 0
fprintf(stdout, "clipView: %d %d %d %d\n", clipR.origin.x,
clipR.origin.y, clipR.size.width, clipR.size.height);
fprintf(stdout, "docView: %d %d %d %d\n", viewR.origin.x,
viewR.origin.y, viewR.size.width, viewR.size.height);
#endif
/*
* set the ratios for the scroll buttons.
*/
if (xRatio > 1.0) {
xRatio = 1.0;
}
if (yRatio > 1.0) {
yRatio = 1.0;
}
[(PXKScroller *)[sub_views objectAtIndex:1] setRatio:yRatio];
[(PXKScroller *)[sub_views objectAtIndex:2] setRatio:xRatio];
/*
* determine the current value for each scroller
*/
min = [(PXKScroller *)[sub_views objectAtIndex:1] minValue];
max = [(PXKScroller *)[sub_views objectAtIndex:1] maxValue];
pos = (-1) * viewR.origin.y + clipR.size.height/2.0;
[(PXKScroller *)[sub_views objectAtIndex:1] setCurrentValue:
(max-min) * (pos / (float)viewR.size.height)];
min = [(PXKScroller *)[sub_views objectAtIndex:2] minValue];
max = [(PXKScroller *)[sub_views objectAtIndex:2] maxValue];
pos = (-1) * viewR.origin.x + clipR.size.width/2.0;
[(PXKScroller *)[sub_views objectAtIndex:1] setCurrentValue:
(max-min) * (pos / (float)viewR.size.width)];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.