1
0

Helios-Workspace.st 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. Smalltalk current createPackage: 'Helios-Workspace' properties: #{}!
  2. Object subclass: #HLCodeModel
  3. instanceVariableNames: 'announcer environment receiver'
  4. package: 'Helios-Workspace'!
  5. !HLCodeModel methodsFor: 'accessing'!
  6. announcer
  7. ^ announcer ifNil: [ announcer := Announcer new ]
  8. !
  9. environment
  10. ^ environment ifNil: [ HLManager current environment ]
  11. !
  12. environment: anEnvironment
  13. environment := anEnvironment
  14. !
  15. receiver
  16. ^ receiver ifNil: [ receiver := self defaultReceiver ]
  17. !
  18. receiver: anObject
  19. receiver := anObject
  20. ! !
  21. !HLCodeModel methodsFor: 'actions'!
  22. doIt: someCode
  23. ^ self environment eval: someCode on: self receiver
  24. !
  25. subscribe: aWidget
  26. aWidget subscribeTo: self announcer
  27. ! !
  28. !HLCodeModel methodsFor: 'defaults'!
  29. defaultReceiver
  30. ^ DoIt new
  31. ! !
  32. !HLCodeModel class methodsFor: 'actions'!
  33. on: anEnvironment
  34. ^ self new
  35. environment: anEnvironment;
  36. yourself
  37. ! !
  38. HLWidget subclass: #HLCodeWidget
  39. instanceVariableNames: 'model wrapper code editor'
  40. package: 'Helios-Workspace'!
  41. !HLCodeWidget methodsFor: 'accessing'!
  42. announcer
  43. ^ self model announcer
  44. !
  45. contents
  46. ^ editor getValue
  47. !
  48. contents: aString
  49. ^ editor setValue: aString
  50. !
  51. currentLine
  52. ^editor getLine: (editor getCursor line)
  53. !
  54. currentLineOrSelection
  55. ^editor somethingSelected
  56. ifFalse: [self currentLine]
  57. ifTrue: [self selection]
  58. !
  59. model
  60. ^ model ifNil: [ model := HLCodeModel new ]
  61. !
  62. model: aModel
  63. model := aModel
  64. !
  65. receiver
  66. ^ self model receiver
  67. !
  68. receiver: anObject
  69. self model receiver: anObject
  70. !
  71. selection
  72. ^editor getSelection
  73. !
  74. selectionEnd
  75. ^code element selectionEnd
  76. !
  77. selectionEnd: anInteger
  78. code element selectionEnd: anInteger
  79. !
  80. selectionStart
  81. ^code element selectionStart
  82. !
  83. selectionStart: anInteger
  84. code element selectionStart: anInteger
  85. !
  86. val
  87. ^ code getValue
  88. !
  89. val: aString
  90. code setValue: aString
  91. ! !
  92. !HLCodeWidget methodsFor: 'actions'!
  93. clear
  94. self val: ''
  95. !
  96. doIt
  97. | result |
  98. self announcer announce: (HLDoItRequested on: model).
  99. result:= model doIt: self currentLineOrSelection.
  100. self announcer announce: (HLDoItExecuted on: model).
  101. ^ result
  102. !
  103. editor
  104. ^editor
  105. !
  106. focus
  107. self editor focus
  108. !
  109. inspectIt
  110. | newInspector |
  111. self announcer announce: (HLInspectItRequested on: model).
  112. newInspector := self makeInspectorOn: self doIt.
  113. newInspector open
  114. !
  115. makeInspectorOn: anObject
  116. ^ HLInspector new
  117. inspect: anObject;
  118. yourself
  119. !
  120. observeWrapper
  121. wrapper onKeyDown: [ :e | self onKeyDown: e ]
  122. !
  123. print: aString
  124. | start stop |
  125. start := HashedCollection new.
  126. stop := HashedCollection new.
  127. start at: 'line' put: (editor getCursor: false) line.
  128. start at: 'ch' put: (editor getCursor: false) ch.
  129. stop at: 'line' put: (start at: 'line').
  130. stop at: 'ch' put: ((start at: 'ch') + aString size + 2).
  131. editor replaceSelection: (editor getSelection, ' ', aString, ' ').
  132. editor setCursor: (editor getCursor: true).
  133. editor setSelection: stop end: start
  134. !
  135. printIt
  136. | result |
  137. result:= self doIt.
  138. self announcer announce: (HLPrintItRequested on: model).
  139. self print: result printString.
  140. self focus.
  141. !
  142. setEditorOn: aTextarea
  143. <self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
  144. theme: 'amber',
  145. lineNumbers: true,
  146. enterMode: 'flat',
  147. matchBrackets: true,
  148. electricChars: false
  149. })>
  150. ! !
  151. !HLCodeWidget methodsFor: 'reactions'!
  152. onDoIt
  153. self doIt
  154. !
  155. onInspectIt
  156. self inspectIt
  157. !
  158. onKeyDown: anEvent
  159. <if(anEvent.ctrlKey) {
  160. if(anEvent.keyCode === 80) { //ctrl+p
  161. self._onPrintIt();
  162. anEvent.preventDefault();
  163. return false;
  164. }
  165. if(anEvent.keyCode === 68) { //ctrl+d
  166. self._onDoIt();
  167. anEvent.preventDefault();
  168. return false;
  169. }
  170. if(anEvent.keyCode === 73) { //ctrl+i
  171. self._onInspectIt();
  172. anEvent.preventDefault();
  173. return false;
  174. }
  175. }>
  176. !
  177. onPrintIt
  178. self printIt
  179. ! !
  180. !HLCodeWidget methodsFor: 'rendering'!
  181. renderContentOn: html
  182. code := html textarea.
  183. self setEditorOn: code element.
  184. self observeWrapper
  185. !
  186. renderOn: html
  187. wrapper := html div class: 'code'.
  188. self observeWrapper.
  189. wrapper with: [code := html textarea].
  190. self setEditorOn: code element.
  191. ! !
  192. HLWidget subclass: #HLWorkspace
  193. instanceVariableNames: 'model codeWidget'
  194. package: 'Helios-Workspace'!
  195. !HLWorkspace methodsFor: 'accessing'!
  196. codeWidget
  197. ^ codeWidget ifNil: [
  198. codeWidget := HLCodeWidget new
  199. model: self model code;
  200. yourself ]
  201. !
  202. model
  203. ^ model ifNil: [
  204. self model: HLWorkspaceModel new.
  205. model ]
  206. !
  207. model: aModel
  208. model := aModel.
  209. self codeWidget model: aModel code.
  210. self observeCodeWidget.
  211. ! !
  212. !HLWorkspace methodsFor: 'actions'!
  213. observeCodeWidget
  214. ! !
  215. !HLWorkspace methodsFor: 'reactions'!
  216. onDoIt
  217. !
  218. onInspectIt
  219. !
  220. onPrintIt
  221. ! !
  222. !HLWorkspace methodsFor: 'rendering'!
  223. renderContentOn: html
  224. html with: self codeWidget
  225. ! !
  226. !HLWorkspace class methodsFor: 'accessing'!
  227. tabLabel
  228. ^ 'Workspace'
  229. !
  230. tabPriority
  231. ^ 10
  232. ! !
  233. !HLWorkspace class methodsFor: 'testing'!
  234. canBeOpenAsTab
  235. ^ true
  236. ! !
  237. Object subclass: #HLWorkspaceModel
  238. instanceVariableNames: 'announcer environment code'
  239. package: 'Helios-Workspace'!
  240. !HLWorkspaceModel methodsFor: 'accessing'!
  241. announcer
  242. ^ announcer ifNil: [ announcer := Announcer new ]
  243. !
  244. code
  245. "Answers the code model working for this workspace model"
  246. ^ code ifNil:[ HLCodeModel on: self environment ]
  247. !
  248. environment
  249. ^ environment ifNil: [ HLManager current environment ]
  250. !
  251. environment: anEnvironment
  252. environment := anEnvironment
  253. ! !
  254. !HLWorkspaceModel methodsFor: 'actions'!
  255. subscribe: aWidget
  256. aWidget subscribeTo: self announcer
  257. ! !
  258. !HLWorkspaceModel methodsFor: 'reactions'!
  259. onKeyDown: anEvent
  260. <if(anEvent.ctrlKey) {
  261. if(anEvent.keyCode === 80) { //ctrl+p
  262. self._printIt();
  263. anEvent.preventDefault();
  264. return false;
  265. }
  266. if(anEvent.keyCode === 68) { //ctrl+d
  267. self._doIt();
  268. anEvent.preventDefault();
  269. return false;
  270. }
  271. if(anEvent.keyCode === 73) { //ctrl+i
  272. self._inspectIt();
  273. anEvent.preventDefault();
  274. return false;
  275. }
  276. }>
  277. ! !
  278. !HLWorkspaceModel class methodsFor: 'actions'!
  279. on: anEnvironment
  280. ^ self new
  281. environment: anEnvironment;
  282. yourself
  283. ! !