Helios-KeyBindings.st 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. Smalltalk current createPackage: 'Helios-KeyBindings' properties: #{}!
  2. Object subclass: #HLBinding
  3. instanceVariableNames: 'key label'
  4. package: 'Helios-KeyBindings'!
  5. !HLBinding methodsFor: 'accessing'!
  6. key
  7. ^ key
  8. !
  9. key: anInteger
  10. key := anInteger
  11. !
  12. label
  13. ^ label
  14. !
  15. label: aString
  16. label := aString
  17. !
  18. shortcut
  19. ^ String fromCharCode: self key
  20. ! !
  21. !HLBinding methodsFor: 'testing'!
  22. isBindingAction
  23. ^ false
  24. !
  25. isBindingGroup
  26. ^ false
  27. ! !
  28. !HLBinding class methodsFor: 'instance creation'!
  29. on: anInteger labelled: aString
  30. ^ self new
  31. key: anInteger;
  32. label: aString;
  33. yourself
  34. ! !
  35. HLBinding subclass: #HLBindingAction
  36. instanceVariableNames: 'callback'
  37. package: 'Helios-KeyBindings'!
  38. !HLBindingAction methodsFor: 'accessing'!
  39. callback
  40. ^ callback
  41. !
  42. callback: aBlock
  43. callback := aBlock
  44. ! !
  45. !HLBindingAction methodsFor: 'testing'!
  46. isBindingAction
  47. ^ true
  48. ! !
  49. HLBinding subclass: #HLBindingGroup
  50. instanceVariableNames: 'bindings'
  51. package: 'Helios-KeyBindings'!
  52. !HLBindingGroup methodsFor: 'accessing'!
  53. add: aBinding
  54. ^ self bindings add: aBinding
  55. !
  56. addActionKey: anInteger labelled: aString callback: aBlock
  57. self add: ((HLBindingAction on: anInteger labelled: aString)
  58. callback: aBlock;
  59. yourself)
  60. !
  61. addGroupKey: anInteger labelled: aString
  62. self add: (HLBindingGroup on: anInteger labelled: aString)
  63. !
  64. at: aString
  65. ^ self bindings
  66. detect: [ :each | each label = aString ]
  67. ifNone: [ nil ]
  68. !
  69. atkey: anInteger
  70. ^ self bindings
  71. detect: [ :each | each key = anInteger ]
  72. ifNone: [ nil ]
  73. !
  74. bindings
  75. ^ bindings ifNil: [ bindings := OrderedCollection new ]
  76. ! !
  77. !HLBindingGroup methodsFor: 'testing'!
  78. isBindingGroup
  79. ^ true
  80. ! !
  81. Object subclass: #HLKeyBinder
  82. instanceVariableNames: 'modifierKey active helper bindings selectedBinding'
  83. package: 'Helios-KeyBindings'!
  84. !HLKeyBinder methodsFor: 'accessing'!
  85. bindings
  86. ^ bindings ifNil: [ bindings := HLBindingGroup new ]
  87. !
  88. helper
  89. ^ helper ifNil: [ helper := HLKeyBinderHelper on: self ]
  90. !
  91. modifierKey
  92. ^ modifierKey ifNil: [
  93. modifierKey = (navigator platform match: 'Mac')
  94. ifTrue: [ 91 ]
  95. ifFalse: [ 17 ] ]
  96. !
  97. selectedBinding
  98. ^ selectedBinding ifNil: [ self bindings ]
  99. ! !
  100. !HLKeyBinder methodsFor: 'actions'!
  101. activate
  102. active := true.
  103. self helper show
  104. !
  105. applyBinding: aBinding
  106. aBinding isBindingGroup
  107. ifTrue: [
  108. selectedBinding := aBinding.
  109. self helper refresh ]
  110. ifFalse: [
  111. aBinding callback value.
  112. self deactivate ]
  113. !
  114. deactivate
  115. active := false.
  116. selectedBinding := nil.
  117. self helper hide
  118. !
  119. flushBindings
  120. bindings := nil.
  121. helper := nil
  122. ! !
  123. !HLKeyBinder methodsFor: 'events'!
  124. handleBindingFor: anEvent
  125. | binding |
  126. binding := self selectedBinding atKey: anEvent which.
  127. binding ifNotNil: [
  128. self applyBinding: binding.
  129. anEvent preventDefault.
  130. ^ false ]
  131. !
  132. handleBindingKey: anInteger
  133. !
  134. handleKeyDown: event
  135. self isActive
  136. ifTrue: [
  137. self handleBindingKey: event which ]
  138. ifFalse: [
  139. event which = self modifierKey ifTrue: [
  140. self activate.
  141. event preventDefault.
  142. ^ false ] ]
  143. !
  144. handleKeyUp: event
  145. event which = self modifierKey ifTrue: [
  146. self deactivate ]
  147. !
  148. setupEvents
  149. (window jQuery: 'body') keydown: [ :event | self handleKeyDown: event ].
  150. (window jQuery: 'body') keyup: [ :event | self handleKeyUp: event ]
  151. ! !
  152. !HLKeyBinder methodsFor: 'initialization'!
  153. initialize
  154. super initialize.
  155. active := false
  156. ! !
  157. !HLKeyBinder methodsFor: 'testing'!
  158. isActive
  159. ^ active ifNil: [ false ]
  160. ! !
  161. HLWidget subclass: #HLKeyBinderHelper
  162. instanceVariableNames: 'keyBinder'
  163. package: 'Helios-KeyBindings'!
  164. !HLKeyBinderHelper methodsFor: 'accessing'!
  165. keyBinder
  166. ^ keyBinder
  167. !
  168. keyBinder: aKeyBinder
  169. keyBinder := aKeyBinder
  170. !
  171. selectedBinding
  172. ^ self keyBinder selectedBinding
  173. ! !
  174. !HLKeyBinderHelper methodsFor: 'actions'!
  175. hide
  176. (window jQuery: '.key_helper') remove
  177. !
  178. show
  179. self appendToJQuery: 'body' asJQuery
  180. ! !
  181. !HLKeyBinderHelper methodsFor: 'keyBindings'!
  182. registerBindings
  183. "Do nothing"
  184. ! !
  185. !HLKeyBinderHelper methodsFor: 'rendering'!
  186. renderBindingsOn: html
  187. self selectedBinding bindings do: [ :each |
  188. html span class: 'command'; with: [
  189. html span class: 'label'; with: each shortcut asLowercase.
  190. html span class: 'action'; with: each label ] ]
  191. !
  192. renderContentOn: html
  193. html div class: 'key_helper'; with: [
  194. self renderBindingsOn: html ]
  195. ! !
  196. !HLKeyBinderHelper class methodsFor: 'instance creation'!
  197. on: aKeyBinder
  198. ^ self new
  199. keyBinder: aKeyBinder;
  200. yourself
  201. ! !