This is PXKScrollButton.m in view mode; [Download] [Up]
/*
PXKScrollButton.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/PXKScrollButton.h>
#include <gnustep/xdps/PXKScroller.h>
#include <gnustep/xdps/PXKImage.h>
@implementation PXKScrollButton
- adjustLocation;
{
float min = [(PXKScroller *)super_view minValue];
float max = [(PXKScroller *)super_view maxValue];
float cur = [(PXKScroller *)super_view currentValue];
if (vertical) {
frame.origin.y = (scrollArea.origin.y +
scrollArea.size.height) * cur / (max-min) -
(frame.size.height/2.0);
} else {
frame.origin.x = (scrollArea.origin.x +
scrollArea.size.width) * cur / (max-min) -
(frame.size.width/2.0);
}
#if 0
if (vertical) {
fprintf(stdout, "after adjusting location x: %d y: %d w: %d h: %d\n",
frame.origin.x, frame.origin.y,
frame.size.width, frame.size.height);
}
#endif
[self moveTo:frame.origin.x :frame.origin.y];
return self;
}
- adjustSize;
{
if ((vertical = [super_view vertical]) == YES) {
// fprintf(stdout, "adjustSize Y scroller with ratio: %1.3f\n",ratio);
frame.origin.y = 0;
frame.origin.x = 2;
frame.size.width = scrollArea.size.width;
frame.size.height = ((float)scrollArea.size.height) * ratio;
} else {
// fprintf(stdout, "adjustSize X scroller with ratio: %1.3f\n",ratio);
frame.origin.x = 0;
frame.origin.y = 2;
frame.size.height = scrollArea.size.height;
frame.size.width = ((float)scrollArea.size.width) * ratio;
}
if (frame.size.height < PXK_ARROW_SIZE) {
frame.size.height = PXK_ARROW_SIZE;
}
if (frame.size.width < PXK_ARROW_SIZE) {
frame.size.width = PXK_ARROW_SIZE;
}
#if 0
if (vertical) {
fprintf(stdout, "after adjusting size x: %d y: %d w: %d h: %d\n",
frame.origin.x, frame.origin.y,
frame.size.width, frame.size.height);
}
#endif
[self setFrame:frame];
#if 0
fprintf(stdout, "New size: x: %d y: %d w: %d h: %d\n",
frame.origin.x,
frame.origin.y,
frame.size.width,
frame.size.height);
#endif
/* This line just for testing purposes */
//[self display];
//puts("after adjustSize");
return self;
}
#if 1
- setRatio:(float)r;
{
if ((r >= 0.0) && (r <= 1.0)) {
ratio = r;
[self adjustSize];
return self;
}
return nil;
}
#else
- setRatio:(float)r;
{
if ((ratio >= 0.0) && (ratio <= 1.0)) {
ratio = r;
[self adjustSize];
return self;
}
return nil;
}
#endif
- setScrollArea:(NSRect)area;
{
NSRect r = area;
scrollArea = r;
#if 0
if (vertical) {
fprintf(stdout, "Scroll area: %d %d %d %d\n",
scrollArea.origin.x, scrollArea.origin.y,
scrollArea.size.width, scrollArea.size.height);
}
#endif
[self adjustSize];
return self;
}
- init;
{
[super init];
#if 0
if (title) {
free(title);
title = (char *)NULL;
}
#endif
// continuous = YES;
// type = PXK_MOMENTARY_CHANGE_MODE;
// state = 0;
ratio = 1.0;
[self setTarget:self];
[self setAction:@selector(updateScroller)];
[self setImage:[PXKImage imageNamed:"pxkDimple"]];
return self;
}
- display;
{
[self adjustLocation];
[super display];
[self drawSelf];
return self;
}
- mouseDown:(XEvent *)e;
{
#if 0
fprintf(stdout, "mouse down\n");
// if (type == PXK_TOGGLE_MODE) {
if (NO) {
fprintf(stdout, "PXKButton mouseDown: (toggle mode)\n");
[self toggleState];
[self sendAction];
} else {
fprintf(stdout, "PXKButton mouseDown: (!toggle mode)\n");
state = 1;
}
#endif
[self display];
return self;
}
- mouseDragged:(XEvent *)e;
{
XEvent event = *e;
NSPoint location;
Window root, child;
int root_x, root_y, pos_x, pos_y;
unsigned int keys_buttons;
NSPoint hotSpot;
hotSpot.x = -1;
hotSpot.y = -1;
location.x = event.xmotion.x;
location.y = event.xmotion.y;
while (1) {
XNextEvent(pxkDisplay, &event);
if (event.type == MotionNotify) {
location.x = event.xmotion.x;
location.y = event.xmotion.y;
if (!XQueryPointer(pxkDisplay, event.xmotion.window,
&root, &child, &root_x, &root_y, &pos_x,
&pos_y, &keys_buttons))
/* pointer is on other screen */
break;
if (child == [super_view xWindow]) {
location.x = pos_x;
location.y = pos_y;
} else {
location.x = pos_x + frame.origin.x;
location.y = pos_y + frame.origin.y;
}
if ((location.x >= frame.origin.x) &&
(location.x < (frame.origin.x + frame.size.width)) &&
(hotSpot.x == -1))
{
hotSpot.x = location.x - frame.origin.x;
} else {
hotSpot.x = -1; /* invalid */
}
if ((location.y >= frame.origin.y) &&
(location.y < (frame.origin.y + frame.size.height)) &&
(hotSpot.y == -1))
{
hotSpot.y = location.y - frame.origin.x;
} else {
hotSpot.y = -1; /* invalid */
}
/* The following code, commented out, is seriously bogus. */
#if 0
if (hotSpot.x > 0) {
location.x -= hotSpot.x;
}
if (hotSpot.y > 0) {
location.y -= hotSpot.y;
}
#endif
[self moveTo:location.x :location.y];
if ([self isContinuous]) {
[self sendAction];
}
continue;
}
if (![self isContinuous]) {
[self sendAction];
}
break;
}
return self;
}
- mouseUp:(XEvent *)e;
{
#if 0
fprintf(stdout, "mouse up\n");
// if (type == PXK_MOMENTARY_PUSH_MODE) {
if (YES) {
fprintf(stdout, "PXKButton mouseUp: (momentary push mode)\n");
state = 0;
[self display];
[self sendAction];
}
#endif
return self;
}
/*
* This method overrides the PXKView's implementation.
* Since a scroll button can only move within the
* boundaries of the scroller's scroll area,
* this implementation of moveTo:: places the button
* as close as possible to the desired location.
*/
- moveTo:(int)x :(int)y;
{
if (vertical) {
if (y >= scrollArea.origin.y) {
if (y < (scrollArea.origin.y +
scrollArea.size.height -
frame.size.height))
{
frame.origin.y = y; /* Valid value */
} else {
/* Max */
frame.origin.y = scrollArea.origin.y +
scrollArea.size.height -
frame.size.height;
}
} else {
frame.origin.y = scrollArea.origin.y; /* Min */
}
} else {
if (scrollArea.origin.x < x) {
if ((scrollArea.origin.x + scrollArea.size.width) >
(x+frame.size.width)) {
frame.origin.x = x; /* Valid value */
} else {
/* Max */
frame.origin.x = scrollArea.origin.x +
scrollArea.size.width -
frame.size.width;
}
} else {
frame.origin.x = scrollArea.origin.x; /* Min */
}
}
[self moveBy:0:0];
return self;
}
- setFrame:(NSRect)newFrame;
{
NSRect r = newFrame;
[super setFrame:r];
if ([(PXKScroller *)super_view vertical]) {
vertical = YES;
} else {
vertical = NO;
}
return self;
}
- updateScroller;
{
float relativePosition;
float min = [(PXKScroller *)super_view minValue];
float max = [(PXKScroller *)super_view maxValue];
float newValue;
float frameMin;
float frameMax;
if (vertical) {
frameMin = scrollArea.origin.y;
frameMax = scrollArea.origin.y + scrollArea.size.height -
frame.size.height;
relativePosition = (frame.origin.y-scrollArea.origin.y)/
(frameMax-frameMin);
} else {
frameMin = scrollArea.origin.x + frame.size.width/2.0;
frameMax = scrollArea.origin.x + scrollArea.size.width -
frame.size.width/2.0;
relativePosition = (frame.origin.x-scrollArea.origin.x)/
(frameMax-frameMin);
}
#if 0
fprintf(stdout, "rel pos: %1.4f\n", relativePosition);
#endif
newValue = min +(max-min)*relativePosition;
[(PXKScroller *)super_view setCurrentValue:newValue];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.