-
-
Notifications
You must be signed in to change notification settings - Fork 353
/
KeyboardEvent.class.st
241 lines (198 loc) · 6.03 KB
/
KeyboardEvent.class.st
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
"
I am a keyboard event. I contain the char code of the event pressed, the modifiers pressed, and the keycode of the key pressed.
"
Class {
#name : #KeyboardEvent,
#superclass : #UserInputEvent,
#instVars : [
'keyValue',
'charCode',
'scanCode'
],
#category : #'Morphic-Core-Events'
}
{ #category : #comparing }
KeyboardEvent >> = aMorphicEvent [
super = aMorphicEvent ifFalse:[^false].
buttons = aMorphicEvent buttons ifFalse: [^ false].
keyValue = aMorphicEvent keyValue ifFalse: [^ false].
^ true
]
{ #category : #keymapping }
KeyboardEvent >> asKeyCombination [
^ KMKeyCombination fromKeyboardEvent: self
]
{ #category : #keymapping }
KeyboardEvent >> asShortcut [
^ self asKeyCombination
]
{ #category : #testing }
KeyboardEvent >> hasSpecialCTRLKeyValue [
"
4 - Character end
1 - Character home
"
^ self controlKeyPressed and: [ keyValue <= 26 & (keyValue ~= 4) & (keyValue ~= 1) ]
]
{ #category : #comparing }
KeyboardEvent >> hash [
^buttons hash + keyValue hash
]
{ #category : #testing }
KeyboardEvent >> isKeyDown [
^self type == #keyDown
]
{ #category : #testing }
KeyboardEvent >> isKeyUp [
^self type == #keyUp
]
{ #category : #testing }
KeyboardEvent >> isKeyboard [
^true
]
{ #category : #testing }
KeyboardEvent >> isKeystroke [
^self type == #keystroke
]
{ #category : #testing }
KeyboardEvent >> isMouseMove [
^false
]
{ #category : #testing }
KeyboardEvent >> isUserInterrupt [
^ UserInterruptHandler cmdDotEnabled and: [ self keyCharacter = $. and: [ self commandKeyPressed ] ].
]
{ #category : #keyboard }
KeyboardEvent >> key [
^Smalltalk os keyForValue: keyValue
]
{ #category : #keyboard }
KeyboardEvent >> keyCharacter [
"Answer the character corresponding this keystroke. This is defined only for keystroke events."
^Unicode value: charCode
]
{ #category : #keyboard }
KeyboardEvent >> keyString [
"Answer the string value for this keystroke. This is defined only for keystroke events."
^ String streamContents: [ :s | self printKeyStringOn: s ]
]
{ #category : #keyboard }
KeyboardEvent >> keyValue [
"Answer the ascii value for this keystroke. This is defined only for keystroke events."
^ keyValue
]
{ #category : #keymapping }
KeyboardEvent >> modifiedCharacter [
self flag: #hack.
"Hack me. When Ctrl is pressed, the key ascii value is not right and we have to do something ugly"
^(self hasSpecialCTRLKeyValue and: [ (#(MacOSX Windows) includes: Smalltalk os current platformFamily) ])
ifTrue: [ (self keyValue + $a asciiValue - 1) asCharacter ]
ifFalse: [
Smalltalk os isWindows
ifTrue: [ self keyCharacter asLowercase ]
ifFalse: [ self keyCharacter ] ]
]
{ #category : #printing }
KeyboardEvent >> printKeyStringOn: aStream [
"Print a readable string representing the receiver on a given stream"
| kc inBrackets firstBracket keyString |
kc := self keyCharacter.
inBrackets := false.
firstBracket := [ inBrackets ifFalse: [ aStream nextPut: $<. inBrackets := true ]].
self controlKeyPressed ifTrue: [ firstBracket value. aStream nextPutAll: 'Ctrl-' ].
self commandKeyPressed ifTrue: [ firstBracket value. aStream nextPutAll: 'Cmd-' ].
(buttons anyMask: 32) ifTrue: [ firstBracket value. aStream nextPutAll: 'Opt-' ].
(self shiftPressed and: [ keyValue between: 1 and: 31 ])
ifTrue: [ firstBracket value. aStream nextPutAll: 'Shift-' ].
self hasSpecialCTRLKeyValue
ifTrue:
[aStream nextPut: (keyValue + $a asciiValue - 1) asCharacter]
ifFalse:
[keyString := (kc caseOf: {
[ Character space ] -> [ ' ' ].
[ Character tab ] -> [ 'tab' ].
[ Character cr ] -> [ 'cr' ].
[ Character lf ] -> [ 'lf' ].
[ Character enter ] -> [ 'enter' ].
[ Character backspace ] -> [ 'backspace' ].
[ Character delete ] -> [ 'delete' ].
[ Character escape ] -> [ 'escape' ].
[ Character arrowDown ] -> [ 'down' ].
[ Character arrowUp ] -> [ 'up' ].
[ Character arrowLeft ] -> [ 'left' ].
[ Character arrowRight ] -> [ 'right' ].
[ Character end ] -> [ 'end' ].
[ Character home ] -> [ 'home' ].
[ Character pageDown ] -> [ 'pageDown' ].
[ Character pageUp ] -> [ 'pageUp' ].
[ Character euro ] -> [ 'euro' ].
[ Character insert ] -> [ 'insert' ].
} otherwise: [ String with: kc ]).
keyString size > 1 ifTrue: [ firstBracket value ].
aStream nextPutAll: keyString].
inBrackets ifTrue: [aStream nextPut: $> ]
]
{ #category : #printing }
KeyboardEvent >> printOn: aStream [
"Print the receiver on a stream"
aStream nextPut: $[.
aStream nextPutAll: type; nextPutAll: ' '''.
self printKeyStringOn: aStream.
aStream nextPut: $'.
aStream nextPut: $]
]
{ #category : #keyboard }
KeyboardEvent >> scanCode [
^scanCode
]
{ #category : #initialize }
KeyboardEvent >> scanCode: anInt [
scanCode := anInt
]
{ #category : #dispatching }
KeyboardEvent >> sentTo: anObject [
"Dispatch the receiver into anObject"
type == #keystroke ifTrue:[^anObject handleKeystroke: self].
type == #keyDown ifTrue:[^anObject handleKeyDown: self].
type == #keyUp ifTrue:[^anObject handleKeyUp: self].
^super sentTo: anObject.
]
{ #category : #private }
KeyboardEvent >> setType: aSymbol buttons: anInteger position: pos keyValue: aValue charCode: anInt hand: aHand stamp: stamp [
type := aSymbol.
buttons := anInteger.
position := pos.
keyValue := aValue.
charCode := anInt.
source := aHand.
wasHandled := false.
timeStamp := stamp.
]
{ #category : #private }
KeyboardEvent >> setType: aSymbol buttons: anInteger position: pos keyValue: aValue hand: aHand stamp: stamp [
type := aSymbol.
buttons := anInteger.
position := pos.
keyValue := aValue.
source := aHand.
wasHandled := false.
timeStamp := stamp.
]
{ #category : #printing }
KeyboardEvent >> storeOn: aStream [
aStream nextPutAll: type.
aStream space.
self timeStamp storeOn: aStream.
aStream space.
position x asInteger storeOn: aStream.
aStream space.
position y asInteger storeOn: aStream.
aStream space.
buttons storeOn: aStream.
aStream space.
keyValue storeOn: aStream.
aStream space.
charCode storeOn: aStream.
aStream space.
scanCode storeOn: aStream.
]