1
0

Helios-Workspace.st 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  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: [ self initializeAnnouncer ]
  8. !
  9. environment
  10. ^ environment ifNil: [ self initializeEnvironment]
  11. !
  12. environment: anEnvironment
  13. environment := anEnvironment
  14. !
  15. receiver
  16. ^ receiver
  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: 'initialization'!
  29. initializeAnnouncer
  30. ^ announcer := Announcer new
  31. !
  32. initializeEnvironment
  33. ^ environment := Smalltalk current
  34. !
  35. initializeReceiver
  36. ^receiver := DoIt new
  37. ! !
  38. !HLCodeModel class methodsFor: 'actions'!
  39. on: anEnvironment
  40. ^ self new
  41. environment: anEnvironment;
  42. yourself
  43. ! !
  44. HLWidget subclass: #HLCodeWidget
  45. instanceVariableNames: 'model wrapper code editor'
  46. package: 'Helios-Workspace'!
  47. !HLCodeWidget methodsFor: 'accessing'!
  48. announcer
  49. ^ self model announcer
  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
  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. wrapper
  93. ^ wrapper
  94. ! !
  95. !HLCodeWidget methodsFor: 'actions'!
  96. clear
  97. self val: ''
  98. !
  99. doIt
  100. | result |
  101. self announcer announce: (HLDoItRequested on: model).
  102. result:= model doIt: self currentLineOrSelection.
  103. self announcer announce: (HLDoItExecuted on: model).
  104. ^ result
  105. !
  106. editor
  107. ^editor
  108. !
  109. focus
  110. self editor focus
  111. !
  112. inspectIt
  113. | result newInspector |
  114. result:= self doIt.
  115. self announcer announce: (HLInspectItRequested on: model).
  116. newInspector := self makeInspectorOn: result.
  117. newInspector open
  118. !
  119. makeInspectorOn: anObject
  120. ^ HLInspector new
  121. inspect: self;
  122. yourself
  123. !
  124. observeWrapper
  125. wrapper onKeyDown: [:e | self onKeyDown: e]
  126. !
  127. print: aString
  128. | start stop |
  129. start := HashedCollection new.
  130. stop := HashedCollection new.
  131. start at: 'line' put: (editor getCursor: false) line.
  132. start at: 'ch' put: (editor getCursor: false) ch.
  133. stop at: 'line' put: (start at: 'line').
  134. stop at: 'ch' put: ((start at: 'ch') + aString size + 2).
  135. editor replaceSelection: (editor getSelection, ' ', aString, ' ').
  136. editor setCursor: (editor getCursor: true).
  137. editor setSelection: stop end: start
  138. !
  139. printIt
  140. | result |
  141. result:= self doIt.
  142. self announcer announce: (HLPrintItRequested on: model).
  143. self print: result printString.
  144. self focus.
  145. !
  146. setEditorOn: aTextarea
  147. <self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
  148. theme: 'amber',
  149. lineNumbers: true,
  150. enterMode: 'flat',
  151. matchBrackets: true,
  152. electricChars: false
  153. })>
  154. ! !
  155. !HLCodeWidget methodsFor: 'reactions'!
  156. onDoIt
  157. self doIt
  158. !
  159. onInspectIt
  160. self inspectIt
  161. !
  162. onKeyDown: anEvent
  163. <if(anEvent.ctrlKey) {
  164. if(anEvent.keyCode === 80) { //ctrl+p
  165. self._onPrintIt();
  166. anEvent.preventDefault();
  167. return false;
  168. }
  169. if(anEvent.keyCode === 68) { //ctrl+d
  170. self._onDoIt();
  171. anEvent.preventDefault();
  172. return false;
  173. }
  174. if(anEvent.keyCode === 73) { //ctrl+i
  175. self._onInspectIt();
  176. anEvent.preventDefault();
  177. return false;
  178. }
  179. }>
  180. !
  181. onPrintIt
  182. self printIt
  183. ! !
  184. !HLCodeWidget methodsFor: 'rendering'!
  185. renderOn: html
  186. wrapper := html div class: 'code'.
  187. self observeWrapper
  188. wrapper with: [code := html textarea].
  189. self setEditorOn: code element.
  190. ! !
  191. HLWidget subclass: #HLWorkspace
  192. instanceVariableNames: 'model code'
  193. package: 'Helios-Workspace'!
  194. !HLWorkspace methodsFor: 'accessing'!
  195. code
  196. ^ code ifNil:[self initializeCode]
  197. !
  198. model
  199. ^ model ifNil:[self initializeModel]
  200. !
  201. model: aModel
  202. model := aModel.
  203. self code model: aModel code.
  204. self observeCode.
  205. ! !
  206. !HLWorkspace methodsFor: 'actions'!
  207. ensureModel
  208. "Sends the #model: initialization message if needed."
  209. model ifNil:[
  210. self model: self model]
  211. !
  212. makeCode
  213. ^ HLCodeWidget new
  214. model: model code;
  215. yourself
  216. !
  217. observeCode
  218. ! !
  219. !HLWorkspace methodsFor: 'initialization'!
  220. initializeCode
  221. ^ code := self makeCode.
  222. !
  223. initializeModel
  224. ^ model := HLWorkspaceModel new
  225. ! !
  226. !HLWorkspace methodsFor: 'reactions'!
  227. onDoIt
  228. !
  229. onInspectIt
  230. !
  231. onPrintIt
  232. ! !
  233. !HLWorkspace methodsFor: 'rendering'!
  234. renderContentOn: html
  235. self ensureModel.
  236. html with: self code
  237. ! !
  238. !HLWorkspace class methodsFor: 'accessing'!
  239. tabLabel
  240. ^ 'Workspace'
  241. !
  242. tabPriority
  243. ^ 10
  244. ! !
  245. !HLWorkspace class methodsFor: 'testing'!
  246. canBeOpenAsTab
  247. ^ true
  248. ! !
  249. Object subclass: #HLWorkspaceModel
  250. instanceVariableNames: 'announcer environment code'
  251. package: 'Helios-Workspace'!
  252. !HLWorkspaceModel methodsFor: 'accessing'!
  253. announcer
  254. ^ announcer ifNil: [ self initializeAnnouncer ]
  255. !
  256. code
  257. "Answers the code model working for this workspace model"
  258. ^ code ifNil:[self initializeCode]
  259. !
  260. environment
  261. ^ environment ifNil: [ self initializeEnvironment]
  262. !
  263. environment: anEnvironment
  264. environment := anEnvironment
  265. ! !
  266. !HLWorkspaceModel methodsFor: 'actions'!
  267. beLocal
  268. self initializeEnvironment
  269. !
  270. beRemoteOn: anIPAddress port: aPort
  271. "to-do"
  272. "environment := HLRemoteEnvironment on: anIPAddress port: aPort
  273. ...kind of stuff"
  274. !
  275. subscribe: aWidget
  276. aWidget subscribeTo: self announcer
  277. ! !
  278. !HLWorkspaceModel methodsFor: 'initialization'!
  279. initializeAnnouncer
  280. ^ announcer := Announcer new
  281. !
  282. initializeCode
  283. ^ code := HLCodeModel on: self environment
  284. !
  285. initializeEnvironment
  286. ^ environment := HLLocalEnvironment new
  287. ! !
  288. !HLWorkspaceModel methodsFor: 'reactions'!
  289. onKeyDown: anEvent
  290. <if(anEvent.ctrlKey) {
  291. if(anEvent.keyCode === 80) { //ctrl+p
  292. self._printIt();
  293. anEvent.preventDefault();
  294. return false;
  295. }
  296. if(anEvent.keyCode === 68) { //ctrl+d
  297. self._doIt();
  298. anEvent.preventDefault();
  299. return false;
  300. }
  301. if(anEvent.keyCode === 73) { //ctrl+i
  302. self._inspectIt();
  303. anEvent.preventDefault();
  304. return false;
  305. }
  306. }>
  307. ! !
  308. !HLWorkspaceModel class methodsFor: 'actions'!
  309. on: anEnvironment
  310. ^ self new
  311. environment: anEnvironment;
  312. yourself
  313. ! !