mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 07:00:46 +00:00
NSStepper class : first implementation
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@10734 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
f17d36556d
commit
d001a1267e
2 changed files with 421 additions and 0 deletions
61
Headers/gnustep/gui/NSStepper.h
Normal file
61
Headers/gnustep/gui/NSStepper.h
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
NSStepper.h
|
||||
|
||||
The stepper class
|
||||
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
|
||||
Author: Pierre-Yves Rivaille <pyrivail@ens-lyon.fr>
|
||||
Date: August 2001
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef _GNUstep_H_NSStepper
|
||||
#define _GNUstep_H_NSStepper
|
||||
|
||||
#include <AppKit/NSControl.h>
|
||||
|
||||
@class NSEvent;
|
||||
|
||||
@interface NSStepper : NSControl
|
||||
{
|
||||
// Attributes
|
||||
}
|
||||
- (double) maxValue;
|
||||
- (void) setMaxValue: (double)maxValue;
|
||||
- (double) minValue;
|
||||
- (void) setMinValue: (double)minValue;
|
||||
- (double) increment;
|
||||
- (void) setIncrement: (double)increment;
|
||||
|
||||
|
||||
- (BOOL)autorepeat;
|
||||
- (void)setAutorepeat: (BOOL)autorepeat;
|
||||
- (BOOL)valueWraps;
|
||||
- (void)setValueWraps: (BOOL)valueWraps;
|
||||
|
||||
- (void)mouseDown:(NSEvent*)event;
|
||||
@end
|
||||
|
||||
@interface NSStepper (Private)
|
||||
- (void)_increment;
|
||||
- (void)_decrement;
|
||||
@end
|
||||
|
||||
#endif // _GNUstep_H_NSStepper
|
360
Source/NSStepper.m
Normal file
360
Source/NSStepper.m
Normal file
|
@ -0,0 +1,360 @@
|
|||
/*
|
||||
NSStepper.m
|
||||
|
||||
Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
|
||||
Author: Pierre-Yves Rivaille <pyrivail@ens-lyon.fr>
|
||||
Date: August 2001
|
||||
|
||||
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; see the file COPYING.LIB.
|
||||
If not, write to the Free Software Foundation,
|
||||
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include <gnustep/gui/config.h>
|
||||
|
||||
#include <Foundation/NSException.h>
|
||||
#include <AppKit/NSStepper.h>
|
||||
#include <AppKit/NSControl.h>
|
||||
#include <AppKit/NSColor.h>
|
||||
#include <AppKit/NSEvent.h>
|
||||
#include <AppKit/NSWindow.h>
|
||||
#include <AppKit/NSApplication.h>
|
||||
#include <AppKit/NSStepperCell.h>
|
||||
|
||||
//
|
||||
// class variables
|
||||
//
|
||||
id _nsstepperCellClass = nil;
|
||||
|
||||
@implementation NSStepper
|
||||
|
||||
//
|
||||
// Class methods
|
||||
//
|
||||
+ (void) initialize
|
||||
{
|
||||
if (self == [NSStepper class])
|
||||
{
|
||||
NSDebugLog(@"Initialize NSStepper class\n");
|
||||
[self setVersion: 1];
|
||||
[self setCellClass: [NSStepperCell class]];
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Initializing the NSStepper Factory
|
||||
//
|
||||
+ (Class) cellClass
|
||||
{
|
||||
return _nsstepperCellClass;
|
||||
}
|
||||
|
||||
+ (void) setCellClass: (Class)classId
|
||||
{
|
||||
_nsstepperCellClass = classId;
|
||||
}
|
||||
|
||||
//
|
||||
// Instance methods
|
||||
//
|
||||
|
||||
- (BOOL) acceptsFirstMouse: (NSEvent *)theEvent
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
//
|
||||
// Determining the first responder
|
||||
//
|
||||
- (BOOL) acceptsFirstResponder
|
||||
{
|
||||
return [self isEnabled];
|
||||
}
|
||||
|
||||
- (BOOL) becomeFirstResponder
|
||||
{
|
||||
[_cell setShowsFirstResponder: YES];
|
||||
[self setNeedsDisplay: YES];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL) resignFirstResponder
|
||||
{
|
||||
[_cell setShowsFirstResponder: NO];
|
||||
[self setNeedsDisplay: YES];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void) keyDown: (NSEvent*)theEvent
|
||||
{
|
||||
}
|
||||
|
||||
- (void) encodeWithCoder: (NSCoder *)aCoder
|
||||
{
|
||||
[super encodeWithCoder: aCoder];
|
||||
}
|
||||
|
||||
- (id) initWithCoder: (NSCoder *)aDecoder
|
||||
{
|
||||
[super initWithCoder: aDecoder];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (double) maxValue
|
||||
{
|
||||
return [_cell maxValue];
|
||||
}
|
||||
|
||||
- (void) setMaxValue: (double)maxValue
|
||||
{
|
||||
[_cell setMaxValue: maxValue];
|
||||
}
|
||||
|
||||
- (double) minValue
|
||||
{
|
||||
return [_cell minValue];
|
||||
}
|
||||
|
||||
- (void) setMinValue: (double)minValue
|
||||
{
|
||||
[_cell setMinValue: minValue];
|
||||
}
|
||||
|
||||
- (double) increment
|
||||
{
|
||||
return [_cell increment];
|
||||
}
|
||||
|
||||
- (void) setIncrement: (double)increment
|
||||
{
|
||||
[_cell setIncrement: increment];
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (BOOL)autorepeat
|
||||
{
|
||||
return [_cell autorepeat];
|
||||
}
|
||||
|
||||
- (void)setAutorepeat: (BOOL)autorepeat
|
||||
{
|
||||
[_cell setAutorepeat: autorepeat];
|
||||
}
|
||||
|
||||
- (BOOL)valueWraps
|
||||
{
|
||||
return [_cell valueWraps];
|
||||
}
|
||||
|
||||
- (void)setValueWraps: (BOOL)valueWraps
|
||||
{
|
||||
[_cell setValueWraps: valueWraps];
|
||||
}
|
||||
|
||||
- (void) mouseDown: (NSEvent *)event
|
||||
{
|
||||
NSPoint point = [event locationInWindow];
|
||||
NSRect upRect;
|
||||
NSRect downRect;
|
||||
NSRect rect;
|
||||
BOOL isDirectionUp;
|
||||
BOOL autorepeat = [_cell autorepeat];
|
||||
|
||||
if([event type] != NSLeftMouseDown)
|
||||
return;
|
||||
|
||||
upRect = [_cell upButtonRectWithFrame: _bounds];
|
||||
downRect = [_cell downButtonRectWithFrame: _bounds];
|
||||
point = [self convertPoint: point fromView: nil];
|
||||
|
||||
|
||||
if (NSMouseInRect(point, upRect, NO))
|
||||
{
|
||||
isDirectionUp = YES;
|
||||
rect = upRect;
|
||||
}
|
||||
else if (NSMouseInRect(point, downRect, NO))
|
||||
{
|
||||
isDirectionUp = NO;
|
||||
rect = downRect;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
BOOL overButton = YES;
|
||||
int ignore = 3;
|
||||
unsigned int eventMask = NSLeftMouseUpMask
|
||||
| NSLeftMouseDraggedMask
|
||||
| NSPeriodicMask;
|
||||
|
||||
NSDate *farAway = [NSDate distantFuture];
|
||||
[_window flushWindow];
|
||||
[_cell highlight: YES
|
||||
upButton: isDirectionUp
|
||||
withFrame: _bounds
|
||||
inView: self];
|
||||
[_window _captureMouse: self];
|
||||
|
||||
if (autorepeat)
|
||||
{
|
||||
[NSEvent startPeriodicEventsAfterDelay: 0.5 withPeriod: 0.025];
|
||||
if (isDirectionUp)
|
||||
[self _increment];
|
||||
else
|
||||
[self _decrement];
|
||||
[_cell drawWithFrame:_bounds
|
||||
inView:self];
|
||||
[_window flushWindow];
|
||||
}
|
||||
else
|
||||
[_window flushWindow];
|
||||
|
||||
event = [NSApp nextEventMatchingMask: eventMask
|
||||
untilDate: farAway
|
||||
inMode: NSEventTrackingRunLoopMode
|
||||
dequeue: YES];
|
||||
while([event type] != NSLeftMouseUp)
|
||||
{
|
||||
if ([event type] == NSPeriodic)
|
||||
{
|
||||
ignore ++;
|
||||
if (ignore == 4) ignore = 0;
|
||||
if (ignore == 0)
|
||||
{
|
||||
if (isDirectionUp)
|
||||
[self _increment];
|
||||
else
|
||||
[self _decrement];
|
||||
[_cell drawWithFrame:_bounds
|
||||
inView:self];
|
||||
[_window flushWindow];
|
||||
}
|
||||
}
|
||||
else if (NSMouseInRect(point, rect, NO) != overButton)
|
||||
{
|
||||
overButton = !overButton;
|
||||
if (overButton && autorepeat)
|
||||
{
|
||||
[NSEvent startPeriodicEventsAfterDelay: 0.5
|
||||
withPeriod: 0.025];
|
||||
ignore = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
[NSEvent stopPeriodicEvents];
|
||||
}
|
||||
[_cell highlight: overButton
|
||||
upButton: isDirectionUp
|
||||
withFrame: _bounds
|
||||
inView: self];
|
||||
[_window flushWindow];
|
||||
}
|
||||
event = [NSApp nextEventMatchingMask: eventMask
|
||||
untilDate: farAway
|
||||
inMode: NSEventTrackingRunLoopMode
|
||||
dequeue: YES];
|
||||
point = [self convertPoint: [event locationInWindow]
|
||||
fromView: nil];
|
||||
}
|
||||
if (overButton && autorepeat)
|
||||
[NSEvent stopPeriodicEvents];
|
||||
if (overButton && !autorepeat)
|
||||
{
|
||||
if (isDirectionUp)
|
||||
[self _increment];
|
||||
else
|
||||
[self _decrement];
|
||||
[_cell drawWithFrame:_bounds
|
||||
inView:self];
|
||||
}
|
||||
|
||||
[_cell highlight: NO
|
||||
upButton: isDirectionUp
|
||||
withFrame: _bounds
|
||||
inView: self];
|
||||
[_window flushWindow];
|
||||
[_window _releaseMouse: self];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_increment
|
||||
{
|
||||
double newValue;
|
||||
double maxValue = [_cell maxValue];
|
||||
double minValue = [_cell minValue];
|
||||
double increment = [_cell increment];
|
||||
newValue = [_cell doubleValue] + increment;
|
||||
if ([_cell valueWraps])
|
||||
{
|
||||
if (newValue > maxValue)
|
||||
[_cell setDoubleValue:
|
||||
newValue - maxValue + minValue - 1];
|
||||
else if (newValue < minValue)
|
||||
[_cell setDoubleValue:
|
||||
newValue + maxValue - minValue + 1];
|
||||
else
|
||||
[_cell setDoubleValue: newValue];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (newValue > maxValue)
|
||||
[_cell setDoubleValue: maxValue];
|
||||
else if (newValue < minValue)
|
||||
[_cell setDoubleValue: minValue];
|
||||
else
|
||||
[_cell setDoubleValue: newValue];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)_decrement
|
||||
{
|
||||
double newValue;
|
||||
double maxValue = [_cell maxValue];
|
||||
double minValue = [_cell minValue];
|
||||
double increment = [_cell increment];
|
||||
newValue = [_cell doubleValue] - increment;
|
||||
if ([_cell valueWraps])
|
||||
{
|
||||
if (newValue > maxValue)
|
||||
[_cell setDoubleValue:
|
||||
newValue - maxValue + minValue - 1];
|
||||
else if (newValue < minValue)
|
||||
[_cell setDoubleValue:
|
||||
newValue + maxValue - minValue + 1];
|
||||
else
|
||||
[_cell setDoubleValue: newValue];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (newValue > maxValue)
|
||||
[_cell setDoubleValue: maxValue];
|
||||
else if (newValue < minValue)
|
||||
[_cell setDoubleValue: minValue];
|
||||
else
|
||||
[_cell setDoubleValue: newValue];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
Loading…
Reference in a new issue