| 1 | /* |
| 2 | * Copyright (c) 2010, Wei Mingzhi <whistler@openoffice.org>. |
| 3 | * All Rights Reserved. |
| 4 | * |
| 5 | * Based on: HIDInput by Gil Pedersen. |
| 6 | * Copyright (c) 2004, Gil Pedersen. |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License as published by |
| 10 | * the Free Software Foundation; either version 2 of the License, or |
| 11 | * (at your option) any later version. |
| 12 | * |
| 13 | * This program is distributed in the hope that it will be useful, |
| 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | * GNU General Public License for more details. |
| 17 | * |
| 18 | * You should have received a copy of the GNU General Public License |
| 19 | * along with this program; if not, see <http://www.gnu.org/licenses>. |
| 20 | */ |
| 21 | |
| 22 | #import "MappingCell.h" |
| 23 | #import "ControllerList.h" |
| 24 | #import "cfg.h" |
| 25 | |
| 26 | @implementation MappingCell |
| 27 | |
| 28 | - (id)initTextCell:(NSString *)aString { |
| 29 | self = [super initTextCell:aString]; |
| 30 | [self setEditable:NO]; |
| 31 | return self; |
| 32 | } |
| 33 | |
| 34 | - (void)selectWithFrame:(NSRect)aRect inView:(NSView *)controlView editor:(NSText *)textObj delegate:(id)anObject start:(int)selStart length:(int)selLength |
| 35 | { |
| 36 | [super selectWithFrame:aRect inView:controlView editor:textObj delegate:anObject start:selStart length:selLength]; |
| 37 | |
| 38 | int whichPad = [ControllerList currentController]; |
| 39 | NSTableView *tableView = (NSTableView *)[self controlView]; |
| 40 | int i, changed = 0, row; |
| 41 | NSEvent *endEvent; |
| 42 | NSPoint where = {0.0, 0.0}; |
| 43 | |
| 44 | /* start a modal session */ |
| 45 | NSModalSession session = [NSApp beginModalSessionForWindow:[tableView window]]; |
| 46 | [NSApp runModalSession:session]; |
| 47 | |
| 48 | /* delay for a little while to allow user to release the button pressed to activate the element */ |
| 49 | [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.15]]; |
| 50 | |
| 51 | InitAxisPos(whichPad); |
| 52 | |
| 53 | /* wait for 10 seconds for user to press a key */ |
| 54 | for (i = 0; i < 10; i++) { |
| 55 | [NSApp runModalSession:session]; |
| 56 | row = [tableView selectedRow]; |
| 57 | if (row < DKEY_TOTAL) { |
| 58 | changed = ReadDKeyEvent(whichPad, [ControllerList getButtonOfRow:row]); |
| 59 | } else { |
| 60 | row -= DKEY_TOTAL; |
| 61 | changed = ReadAnalogEvent(whichPad, row / 4, row % 4); |
| 62 | } |
| 63 | |
| 64 | if (changed) break; |
| 65 | } |
| 66 | |
| 67 | [NSApp endModalSession:session]; |
| 68 | |
| 69 | /* move selection to the next list element */ |
| 70 | [self endEditing:textObj]; |
| 71 | if (changed == 1) { |
| 72 | int nextRow = [tableView selectedRow] + 1; |
| 73 | if (nextRow >= [tableView numberOfRows]) { |
| 74 | [tableView deselectAll:self]; |
| 75 | return; |
| 76 | } |
| 77 | [tableView selectRow:nextRow byExtendingSelection:NO]; |
| 78 | |
| 79 | /* discard any events we have received while waiting for the button press */ |
| 80 | endEvent = [NSEvent otherEventWithType:NSApplicationDefined location:where |
| 81 | modifierFlags:0 timestamp:(NSTimeInterval)0 |
| 82 | windowNumber:0 context:[NSGraphicsContext currentContext] subtype:0 data1:0 data2:0]; |
| 83 | [NSApp postEvent:endEvent atStart:NO]; |
| 84 | [NSApp discardEventsMatchingMask:NSAnyEventMask beforeEvent:endEvent]; |
| 85 | } |
| 86 | [[tableView window] makeFirstResponder:tableView]; |
| 87 | } |
| 88 | |
| 89 | @end |