Reset target settings in UI when switching target types.
[enjoyable.git] / KeyInputTextView.m
1 //
2 // KeyInputTextView.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 #import "KeyInputTextView.h"
9
10 #import "TargetController.h"
11
12 @implementation KeyInputTextView {
13 int vk;
14 BOOL enabled;
15 }
16
17 @synthesize descr;
18
19 - (id)initWithFrame:(NSRect)frameRect {
20 if ((self = [super initWithFrame:frameRect])) {
21 self.alignment = NSCenterTextAlignment;
22 [self setEditable:NO];
23 [self setSelectable:NO];
24 }
25 return self;
26 }
27
28 - (void)clear {
29 self.vk = -1;
30 }
31
32 - (BOOL)hasKey {
33 return self.vk >= 0;
34 }
35
36 + (NSString *)stringForKeyCode:(int)keycode {
37 switch(keycode) {
38 case -1: return @"";
39 case 0x7a: return @"F1";
40 case 0x78: return @"F2";
41 case 0x63: return @"F3";
42 case 0x76: return @"F4";
43 case 0x60: return @"F5";
44 case 0x61: return @"F6";
45 case 0x62: return @"F7";
46 case 0x64: return @"F8";
47 case 0x65: return @"F9";
48 case 0x6d: return @"F10";
49 case 0x67: return @"F11";
50 case 0x6f: return @"F12";
51 case 0x69: return @"F13";
52 case 0x6b: return @"F14";
53 case 0x71: return @"F15";
54 case 0x6a: return @"F16";
55 case 0x40: return @"F17";
56 case 0x4f: return @"F18";
57 case 0x50: return @"F19";
58
59 case 0x35: return @"Esc";
60 case 0x32: return @"`";
61
62 case 0x12: return @"1";
63 case 0x13: return @"2";
64 case 0x14: return @"3";
65 case 0x15: return @"4";
66 case 0x17: return @"5";
67 case 0x16: return @"6";
68 case 0x1a: return @"7";
69 case 0x1c: return @"8";
70 case 0x19: return @"9";
71 case 0x1d: return @"0";
72 case 0x1b: return @"-";
73 case 0x18: return @"=";
74
75 case 0x3f: return @"Fn";
76 case 0x39: return @"Caps Lock";
77 case 0x38: return @"Left Shift";
78 case 0x3b: return @"Left Control";
79 case 0x3a: return @"Left Option";
80 case 0x37: return @"Left Command";
81 case 0x36: return @"Right Command";
82 case 0x3d: return @"Right Option";
83 case 0x3e: return @"Right Control";
84 case 0x3c: return @"Right Shift";
85
86 case 0x73: return @"Home";
87 case 0x74: return @"Page Up";
88 case 0x75: return @"Delete";
89 case 0x77: return @"End";
90 case 0x79: return @"Page Down";
91
92 case 0x30: return @"Tab";
93 case 0x33: return @"Backspace";
94 case 0x24: return @"Return";
95 case 0x31: return @"Space";
96
97 case 0x0c: return @"Q";
98 case 0x0d: return @"W";
99 case 0x0e: return @"E";
100 case 0x0f: return @"R";
101 case 0x11: return @"T";
102 case 0x10: return @"Y";
103 case 0x20: return @"U";
104 case 0x22: return @"I";
105 case 0x1f: return @"O";
106 case 0x23: return @"P";
107 case 0x21: return @"[";
108 case 0x1e: return @"]";
109 case 0x2a: return @"\\";
110 case 0x00: return @"A";
111 case 0x01: return @"S";
112 case 0x02: return @"D";
113 case 0x03: return @"F";
114 case 0x05: return @"G";
115 case 0x04: return @"H";
116 case 0x26: return @"J";
117 case 0x28: return @"K";
118 case 0x25: return @"L";
119 case 0x29: return @";";
120 case 0x27: return @"'";
121 case 0x06: return @"Z";
122 case 0x07: return @"X";
123 case 0x08: return @"C";
124 case 0x09: return @"V";
125 case 0x0b: return @"B";
126 case 0x2d: return @"N";
127 case 0x2e: return @"M";
128 case 0x2b: return @",";
129 case 0x2f: return @".";
130 case 0x2c: return @"/";
131
132 case 0x47: return @"Clear";
133 case 0x51: return @"Keypad =";
134 case 0x4b: return @"Keypad /";
135 case 0x43: return @"Keypad *";
136 case 0x59: return @"Keypad 7";
137 case 0x5b: return @"Keypad 8";
138 case 0x5c: return @"Keypad 9";
139 case 0x4e: return @"Keypad -";
140 case 0x56: return @"Keypad 4";
141 case 0x57: return @"Keypad 5";
142 case 0x58: return @"Keypad 6";
143 case 0x45: return @"Keypad +";
144 case 0x53: return @"Keypad 1";
145 case 0x54: return @"Keypad 2";
146 case 0x55: return @"Keypad 3";
147 case 0x52: return @"Keypad 0";
148 case 0x41: return @"Keypad .";
149 case 0x4c: return @"Enter";
150
151 case 0x7e: return @"Up";
152 case 0x7d: return @"Down";
153 case 0x7b: return @"Left";
154 case 0x7c: return @"Right";
155 }
156 return [[NSString alloc] initWithFormat: @"Key 0x%x",keycode];
157 }
158
159 - (BOOL)acceptsFirstResponder {
160 return enabled;
161 }
162
163 - (BOOL)becomeFirstResponder {
164 [self setBackgroundColor:[NSColor selectedTextBackgroundColor]];
165 return [super becomeFirstResponder];
166 }
167
168 - (BOOL)resignFirstResponder {
169 [self setBackgroundColor:[NSColor textBackgroundColor]];
170 return [super resignFirstResponder];
171 }
172
173 - (void)setBackgroundColor:(NSColor *)color {
174 [super setBackgroundColor:color];
175 }
176
177 - (void)setVk:(int)key {
178 vk = key;
179 descr = [KeyInputTextView stringForKeyCode:key];
180 [self setStringValue:descr];
181 if (self.hasKey)
182 [targetController keyChanged];
183 }
184
185 - (int)vk {
186 return vk;
187 }
188
189 - (void)keyDown:(NSEvent *)evt {
190 if (!evt.isARepeat) {
191 self.vk = evt.keyCode;
192 [[self window] makeFirstResponder:nil];
193 }
194 }
195
196 - (void)flagsChanged:(NSEvent *)evt {
197 self.vk = evt.keyCode;
198 [[self window] makeFirstResponder:nil];
199 }
200
201 - (void)setEnabled:(BOOL)newEnabled {
202 enabled = newEnabled;
203
204 if (!enabled && window.firstResponder == self)
205 [window makeFirstResponder:nil];
206 }
207
208 - (BOOL)enabled {
209 return enabled;
210 }
211
212
213 @end