apple2ix/Apple2Mac/DDHidLib/device_test/MousePaneController.m

212 lines
5.4 KiB
Objective-C

/*
* Copyright (c) 2007 Dave Dribin
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#import "MousePaneController.h"
#import "DDHidLib.h"
#import "ButtonState.h"
@interface MousePaneController (Private)
- (void) setMouseX: (int) mouseX;
- (void) setMouseY: (int) mouseY;
- (void) setMouseWheel: (int) mouseWheel;
@end
@implementation MousePaneController
static int sMaxValue = 2500;
static int applyDelta(int current, int delta)
{
int newValue = (current + delta) % sMaxValue;
if (newValue < 0)
newValue = sMaxValue + newValue;
return newValue;
}
- (void) awakeFromNib;
{
mCurrentMouse = 0;
mMouseButtons = [[NSMutableArray alloc] init];
NSArray * mice = [DDHidMouse allMice];
[mice makeObjectsPerformSelector: @selector(setDelegate:)
withObject: self];
[self setMice: mice];
[self setMouseIndex: 0];
}
//===========================================================
// mice
//===========================================================
- (NSArray *) mice
{
return mMice;
}
- (void) setMice: (NSArray *) theMice
{
if (mMice != theMice)
{
[mMice release];
mMice = [theMice retain];
}
}
- (NSArray *) mouseButtons;
{
return mMouseButtons;
}
- (BOOL) no;
{
return NO;
}
//===========================================================
// - mouseIndex
//===========================================================
- (NSUInteger) mouseIndex
{
return mMouseIndex;
}
//===========================================================
// - setMouseIndex:
//===========================================================
- (void) setMouseIndex: (NSUInteger) theMouseIndex
{
if (mCurrentMouse != nil)
{
[mCurrentMouse stopListening];
mCurrentMouse = nil;
}
mMouseIndex = theMouseIndex;
[mMiceController setSelectionIndex: mMouseIndex];
if (mMouseIndex != NSNotFound)
{
mCurrentMouse = [mMice objectAtIndex: mMouseIndex];
[mCurrentMouse startListening];
[self setMouseX: sMaxValue/2];
[self setMouseY: sMaxValue/2];
[self setMouseWheel: sMaxValue/2];
[self willChangeValueForKey: @"mouseButtons"];
[mMouseButtons removeAllObjects];
NSArray * buttons = [mCurrentMouse buttonElements];
NSEnumerator * e = [buttons objectEnumerator];
DDHidElement * element;
while (element = [e nextObject])
{
ButtonState * state = [[ButtonState alloc] initWithName: [[element usage] usageName]];
[state autorelease];
[mMouseButtons addObject: state];
}
[self didChangeValueForKey: @"mouseButtons"];
}
}
- (int) maxValue;
{
return sMaxValue;
}
//===========================================================
// - mouseX
//===========================================================
- (int) mouseX
{
return mMouseX;
}
//===========================================================
// - mouseY
//===========================================================
- (int) mouseY
{
return mMouseY;
}
//===========================================================
// - mouseWheel
//===========================================================
- (int) mouseWheel
{
return mMouseWheel;
}
- (void) ddhidMouse: (DDHidMouse *) mouse xChanged: (SInt32) deltaX;
{
[self setMouseX: applyDelta(mMouseX, deltaX)];
}
- (void) ddhidMouse: (DDHidMouse *) mouse yChanged: (SInt32) deltaY;
{
[self setMouseY: applyDelta(mMouseY, deltaY)];
}
- (void) ddhidMouse: (DDHidMouse *) mouse wheelChanged: (SInt32) deltaWheel;
{
// Some wheels only output -1 or +1, some output a more analog value.
// Normalize wheel to -1%/+1% movement.
deltaWheel = (deltaWheel/abs(deltaWheel))*(sMaxValue/100);
[self setMouseWheel: applyDelta(mMouseWheel, deltaWheel)];
}
- (void) ddhidMouse: (DDHidMouse *) mouse buttonDown: (unsigned) buttonNumber;
{
ButtonState * state = [mMouseButtons objectAtIndex: buttonNumber];
[state setPressed: YES];
}
- (void) ddhidMouse: (DDHidMouse *) mouse buttonUp: (unsigned) buttonNumber;
{
ButtonState * state = [mMouseButtons objectAtIndex: buttonNumber];
[state setPressed: NO];
}
@end
@implementation MousePaneController (Private)
- (void) setMouseX: (int) mouseX;
{
mMouseX = mouseX;
}
- (void) setMouseY: (int) mouseY;
{
mMouseY = mouseY;
}
- (void) setMouseWheel: (int) mouseWheel;
{
mMouseWheel = mouseWheel;
}
@end