This is PXKScroller.m in view mode; [Download] [Up]
/*
PXKScroller.m
NSScroller for GNUstep GUI X/DPS Backend
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/PXKScroller.h>
#include <gnustep/xdps/PXKScrollView.h>
#include <gnustep/xdps/PXKView.h>
#include <gnustep/xdps/PXKButton.h>
#include <gnustep/xdps/PXKImage.h>
@implementation PXKScroller
- (BOOL)arrowsAreVisible;
{
return showArrows;
}
- (float)currentValue;
{
return currentValue;
}
- decrement;
{
currentValue -= step;
if (currentValue < minValue) {
currentValue = minValue;
}
[(PXKScrollButton *)[sub_views objectAtIndex:0] adjustLocation];
return self;
}
- (void)display;
{
[self setBackgroundColor:"dark gray"];
[super display];
[self placeSubviews];
[self drawBorder];
XMapSubwindows(pxkDisplay, [(PXKView *)self xWindow]);
[sub_views makeObjectsPerform:@selector(display)];
XFlush(pxkDisplay);
}
- drawBorder;
{
// (void)load_font(&win_font);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
0, frame.size.height-1,
frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
frame.size.width-1,
0, frame.size.width-1, frame.size.height-1);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC, 0, 0,
frame.size.width-1, 0);
XDrawLine(pxkDisplay, [(PXKView *)self xWindow], pxkBlackGC,
0, 0, 0, frame.size.height-1);
#if 0
XDrawRectangle(pxkDisplay, xWindow, pxkBlackGC,
frame.origin.x+1, frame.origin.y+1,
frame.size.width-1,
frame.size.height-1);
#endif
return self;
}
- hideArrows;
{
showArrows = NO;
return self;
}
- increment;
{
currentValue += step;
if (currentValue > maxValue) {
currentValue = maxValue;
}
[(PXKScrollButton *)[sub_views objectAtIndex:0] adjustLocation];
return self;
}
- initWithSuperview:(PXKView *)aView;
{
PXKScrollButton *button;
[super initWithSuperview:aView];
maxValue = 1.0;
minValue = 0.0;
currentValue = 0.5;
showArrows = YES;
ratio = 1.0;
step = 0.1;
button = [[PXKScrollButton alloc] initWithSuperview:self];
[self addSubview:button];
[button setBackgroundColor:"light gray"];
button = [[PXKButton alloc] initWithSuperview:self];
[self addSubview:button];
[button setTitle:[[NSString alloc] initWithCString:""]];
[button setBackgroundColor:"light gray"];
[button setTarget:self];
[button setAction:@selector(decrement)];
button = [[PXKButton alloc] initWithSuperview:self];
[self addSubview:button];
[button setTitle:[[NSString alloc] initWithCString:""]];
[button setBackgroundColor:"light gray"];
[button setTarget:self];
[button setAction:@selector(increment)];
return self;
}
- (float)maxValue;
{
return maxValue;
}
- (float)minValue;
{
return minValue;
}
- mouseDown:(XEvent *)e;
{
XEvent event = *e;
[[sub_views objectAtIndex:0] moveTo:event.xmotion.x :event.xmotion.y];
return self;
}
- placeSubviews;
{
NSRect rect;
PXKScrollButton *button;
PXKButton *arrow;
puts("PXKScroller placeSubviews");
/*
* Place the origin (minimum value) arrow
*/
rect.origin.x = 2;
rect.origin.y = 2;
rect.size.width = PXK_ARROW_SIZE;
rect.size.height = PXK_ARROW_SIZE;
arrow = [sub_views objectAtIndex:1];
[arrow setFrame:rect];
[arrow setState:0];
/*
* Place the max value arrow
*/
arrow = [sub_views objectAtIndex:2];
if (vertical) {
rect.origin.y = frame.size.height - PXK_ARROW_SIZE - 2;
}
rect.origin.x = frame.size.width - PXK_ARROW_SIZE - 2;
[arrow setFrame:rect];
[arrow setState:0];
/*
* Set the scrolling area for the scroll button
*/
button = [sub_views objectAtIndex:0];
[button setState:0];
if (vertical) {
if (showArrows) {
rect.origin.y = PXK_ARROW_SIZE + 3;
rect.size.height = frame.size.height - 2*(PXK_ARROW_SIZE + 2) - 2;
} else {
rect.origin.y = 2;
rect.size.height = frame.size.width - 4;
}
rect.origin.x = 2;
rect.size.width = PXK_ARROW_SIZE;
} else {
if (showArrows) {
rect.origin.x = PXK_ARROW_SIZE + 3;
rect.size.width = frame.size.width - 2*(PXK_ARROW_SIZE + 2) - 2;
} else {
rect.origin.x = 2;
rect.size.width = frame.size.width - 4;
}
rect.origin.y = 2;
rect.size.height = PXK_ARROW_SIZE;
}
#if 0
fprintf(stdout, "sx: %d sy: %d w: %d h: %d\n", rect.origin.x,
rect.origin.y,rect.size.width, rect.size.height);
#endif
[button setScrollArea:rect];
[button setRatio:ratio];
[button setState:1];
if ((super_view != nil) && ([super_view class] == [PXKScrollView class]))
{
[super_view updateScrollers];
}
return self;
}
- (float)ratio;
{
return ratio;
}
- (float)relativePosition;
{
return currentValue/(maxValue-minValue);
}
- setCurrentValue:(float)value;
{
#if 0
fprintf(stdout, "Scroller: new current value: %f\n", value);
#endif
currentValue = value;
if (vertical) {
[super_view yScrolled];
} else {
[super_view xScrolled];
}
return self;
}
- setFrame:(NSRect)newFrame;
{
NSRect r = newFrame;
frame = r;
if (frame.size.width > frame.size.height) {
vertical = NO;
[[sub_views objectAtIndex:1] setImage:
[PXKImage imageNamed:"pxkLeftArrow"]];
[[sub_views objectAtIndex:2] setImage:
[PXKImage imageNamed:"pxkRightArrow"]];
} else {
vertical = YES;
[[sub_views objectAtIndex:1] setImage:
[PXKImage imageNamed:"pxkUpArrow"]];
[[sub_views objectAtIndex:2] setImage:
[PXKImage imageNamed:"pxkDownArrow"]];
}
#if 1
XMoveResizeWindow(pxkDisplay, [(PXKView *)self xWindow],
frame.origin.x, frame.origin.y,
frame.size.width, frame.size.height);
#else
XMoveWindow(pxkDisplay, xWindow, frame.origin.x, frame.origin.y);
XResizeWindow(pxkDisplay, xWindow, frame.size.width, frame.size.height);
#endif
//[self display];
return self;
}
- setMaxValue:(float)value;
{
maxValue = value;
return self;
}
- setMinValue:(float)value;
{
minValue = value;
return self;
}
- setRatio:(float)r;
{
ratio = r;
[[sub_views firstObject] setRatio:r];
return self;
}
- setStep:(float)s;
{
step = s;
return self;
}
- showArrows;
{
showArrows = YES;
return self;
}
- (float)step;
{
return step;
}
- (BOOL)vertical;
{
return vertical;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.