AmberRack 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. data/.gitignore +74 -0
  2. data/.rvmrc +4 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +62 -0
  5. data/README.md +17 -0
  6. data/Rakefile +24 -0
  7. data/amber-rack.gemspec +33 -0
  8. data/app/amber_app.rb +35 -0
  9. data/app/javascripts/Benchfib.deploy.js +159 -0
  10. data/app/javascripts/Benchfib.js +159 -0
  11. data/app/javascripts/Canvas.deploy.js +1464 -0
  12. data/app/javascripts/Canvas.js +1464 -0
  13. data/app/javascripts/Compiler.deploy.js +1587 -0
  14. data/app/javascripts/Compiler.js +1587 -0
  15. data/app/javascripts/Examples.deploy.js +800 -0
  16. data/app/javascripts/Examples.js +800 -0
  17. data/app/javascripts/IDE.deploy.js +3457 -0
  18. data/app/javascripts/IDE.js +3457 -0
  19. data/app/javascripts/IDE.js.bak +3420 -0
  20. data/app/javascripts/JQuery.deploy.js +898 -0
  21. data/app/javascripts/JQuery.js +898 -0
  22. data/app/javascripts/Kernel.deploy.js +6761 -0
  23. data/app/javascripts/Kernel.js +6761 -0
  24. data/app/javascripts/Parser.deploy.js +1655 -0
  25. data/app/javascripts/Parser.js +1655 -0
  26. data/app/javascripts/Raphael-Core.js +0 -0
  27. data/app/javascripts/Raphael-Graph.js +0 -0
  28. data/app/javascripts/SUnit.deploy.js +1059 -0
  29. data/app/javascripts/SUnit.js +1059 -0
  30. data/app/javascripts/application.js +2 -0
  31. data/app/javascripts/boot.js +466 -0
  32. data/app/javascripts/init.js +2 -0
  33. data/app/javascripts/jquery-1.4.4.min.js +167 -0
  34. data/app/javascripts/jquery-ui-1.8.9.custom.min.js +781 -0
  35. data/app/javascripts/jquery.textarea.js +267 -0
  36. data/app/javascripts/jtalk.js +78 -0
  37. data/app/javascripts/lib/CodeMirror/LICENSE +19 -0
  38. data/app/javascripts/lib/CodeMirror/README.md +6 -0
  39. data/app/javascripts/lib/CodeMirror/compress.html +92 -0
  40. data/app/javascripts/lib/CodeMirror/css/baboon.png +0 -0
  41. data/app/javascripts/lib/CodeMirror/css/baboon_vector.svg +153 -0
  42. data/app/javascripts/lib/CodeMirror/css/docs.css +154 -0
  43. data/app/javascripts/lib/CodeMirror/demo/activeline.html +72 -0
  44. data/app/javascripts/lib/CodeMirror/demo/changemode.html +51 -0
  45. data/app/javascripts/lib/CodeMirror/demo/complete.html +79 -0
  46. data/app/javascripts/lib/CodeMirror/demo/complete.js +151 -0
  47. data/app/javascripts/lib/CodeMirror/demo/fullscreen.html +158 -0
  48. data/app/javascripts/lib/CodeMirror/demo/marker.html +53 -0
  49. data/app/javascripts/lib/CodeMirror/demo/mustache.html +57 -0
  50. data/app/javascripts/lib/CodeMirror/demo/preview.html +75 -0
  51. data/app/javascripts/lib/CodeMirror/demo/resize.html +44 -0
  52. data/app/javascripts/lib/CodeMirror/demo/runmode.html +50 -0
  53. data/app/javascripts/lib/CodeMirror/demo/search.html +106 -0
  54. data/app/javascripts/lib/CodeMirror/demo/theme.html +53 -0
  55. data/app/javascripts/lib/CodeMirror/index.html +239 -0
  56. data/app/javascripts/lib/CodeMirror/internals.html +389 -0
  57. data/app/javascripts/lib/CodeMirror/lib/codemirror.css +67 -0
  58. data/app/javascripts/lib/CodeMirror/lib/codemirror.js +2144 -0
  59. data/app/javascripts/lib/CodeMirror/lib/overlay.js +51 -0
  60. data/app/javascripts/lib/CodeMirror/lib/runmode.js +27 -0
  61. data/app/javascripts/lib/CodeMirror/manual.html +854 -0
  62. data/app/javascripts/lib/CodeMirror/mode/clike/clike.js +247 -0
  63. data/app/javascripts/lib/CodeMirror/mode/clike/index.html +102 -0
  64. data/app/javascripts/lib/CodeMirror/mode/css/css.js +124 -0
  65. data/app/javascripts/lib/CodeMirror/mode/css/index.html +56 -0
  66. data/app/javascripts/lib/CodeMirror/mode/diff/diff.css +3 -0
  67. data/app/javascripts/lib/CodeMirror/mode/diff/diff.js +13 -0
  68. data/app/javascripts/lib/CodeMirror/mode/diff/index.html +99 -0
  69. data/app/javascripts/lib/CodeMirror/mode/haskell/haskell.js +242 -0
  70. data/app/javascripts/lib/CodeMirror/mode/haskell/index.html +60 -0
  71. data/app/javascripts/lib/CodeMirror/mode/htmlmixed/htmlmixed.js +79 -0
  72. data/app/javascripts/lib/CodeMirror/mode/htmlmixed/index.html +52 -0
  73. data/app/javascripts/lib/CodeMirror/mode/javascript/index.html +78 -0
  74. data/app/javascripts/lib/CodeMirror/mode/javascript/javascript.js +348 -0
  75. data/app/javascripts/lib/CodeMirror/mode/lua/index.html +72 -0
  76. data/app/javascripts/lib/CodeMirror/mode/lua/lua.js +138 -0
  77. data/app/javascripts/lib/CodeMirror/mode/php/index.html +49 -0
  78. data/app/javascripts/lib/CodeMirror/mode/php/php.js +110 -0
  79. data/app/javascripts/lib/CodeMirror/mode/plsql/index.html +63 -0
  80. data/app/javascripts/lib/CodeMirror/mode/plsql/plsql.js +217 -0
  81. data/app/javascripts/lib/CodeMirror/mode/python/LICENSE.txt +21 -0
  82. data/app/javascripts/lib/CodeMirror/mode/python/index.html +123 -0
  83. data/app/javascripts/lib/CodeMirror/mode/python/python.js +321 -0
  84. data/app/javascripts/lib/CodeMirror/mode/rst/index.html +526 -0
  85. data/app/javascripts/lib/CodeMirror/mode/rst/rst.css +75 -0
  86. data/app/javascripts/lib/CodeMirror/mode/rst/rst.js +333 -0
  87. data/app/javascripts/lib/CodeMirror/mode/scheme/index.html +65 -0
  88. data/app/javascripts/lib/CodeMirror/mode/scheme/scheme.js +181 -0
  89. data/app/javascripts/lib/CodeMirror/mode/smalltalk/index.html +56 -0
  90. data/app/javascripts/lib/CodeMirror/mode/smalltalk/smalltalk.js +134 -0
  91. data/app/javascripts/lib/CodeMirror/mode/sparql/index.html +41 -0
  92. data/app/javascripts/lib/CodeMirror/mode/sparql/sparql.js +143 -0
  93. data/app/javascripts/lib/CodeMirror/mode/stex/index.html +96 -0
  94. data/app/javascripts/lib/CodeMirror/mode/stex/stex.js +167 -0
  95. data/app/javascripts/lib/CodeMirror/mode/xml/index.html +42 -0
  96. data/app/javascripts/lib/CodeMirror/mode/xml/xml.js +231 -0
  97. data/app/javascripts/lib/CodeMirror/mode/yaml/index.html +68 -0
  98. data/app/javascripts/lib/CodeMirror/mode/yaml/yaml.js +95 -0
  99. data/app/javascripts/lib/CodeMirror/oldrelease.html +178 -0
  100. data/app/javascripts/lib/CodeMirror/test/index.html +29 -0
  101. data/app/javascripts/lib/CodeMirror/test/test.js +249 -0
  102. data/app/javascripts/lib/CodeMirror/theme/default.css +18 -0
  103. data/app/javascripts/lib/CodeMirror/theme/elegant.css +9 -0
  104. data/app/javascripts/lib/CodeMirror/theme/jtalk.css +21 -0
  105. data/app/javascripts/lib/CodeMirror/theme/neat.css +8 -0
  106. data/app/javascripts/lib/CodeMirror/theme/night.css +20 -0
  107. data/app/javascripts/lib/jQuery/jquery-1.4.4.min.js +167 -0
  108. data/app/javascripts/lib/jQuery/jquery-ui-1.8.9.custom.min.js +781 -0
  109. data/app/javascripts/lib/jQuery/jquery.textarea.js +267 -0
  110. data/app/smalltalk/Canvas.st +481 -0
  111. data/app/smalltalk/IDE.st +1752 -0
  112. data/config.ru +2 -0
  113. data/lib/amber-rack.rb +4 -0
  114. data/lib/amber-rack/version.rb +3 -0
  115. data/public/CodeMirror/LICENSE +19 -0
  116. data/public/CodeMirror/README.md +6 -0
  117. data/public/CodeMirror/compress.html +92 -0
  118. data/public/CodeMirror/css/baboon.png +0 -0
  119. data/public/CodeMirror/css/baboon_vector.svg +153 -0
  120. data/public/CodeMirror/css/docs.css +154 -0
  121. data/public/CodeMirror/demo/activeline.html +72 -0
  122. data/public/CodeMirror/demo/changemode.html +51 -0
  123. data/public/CodeMirror/demo/complete.html +79 -0
  124. data/public/CodeMirror/demo/complete.js +151 -0
  125. data/public/CodeMirror/demo/fullscreen.html +158 -0
  126. data/public/CodeMirror/demo/marker.html +53 -0
  127. data/public/CodeMirror/demo/mustache.html +57 -0
  128. data/public/CodeMirror/demo/preview.html +75 -0
  129. data/public/CodeMirror/demo/resize.html +44 -0
  130. data/public/CodeMirror/demo/runmode.html +50 -0
  131. data/public/CodeMirror/demo/search.html +106 -0
  132. data/public/CodeMirror/demo/theme.html +53 -0
  133. data/public/CodeMirror/index.html +239 -0
  134. data/public/CodeMirror/internals.html +389 -0
  135. data/public/CodeMirror/lib/codemirror.css +67 -0
  136. data/public/CodeMirror/lib/codemirror.js +2144 -0
  137. data/public/CodeMirror/lib/overlay.js +51 -0
  138. data/public/CodeMirror/lib/runmode.js +27 -0
  139. data/public/CodeMirror/manual.html +854 -0
  140. data/public/CodeMirror/mode/clike/clike.js +247 -0
  141. data/public/CodeMirror/mode/clike/index.html +102 -0
  142. data/public/CodeMirror/mode/css/css.js +124 -0
  143. data/public/CodeMirror/mode/css/index.html +56 -0
  144. data/public/CodeMirror/mode/diff/diff.css +3 -0
  145. data/public/CodeMirror/mode/diff/diff.js +13 -0
  146. data/public/CodeMirror/mode/diff/index.html +99 -0
  147. data/public/CodeMirror/mode/haskell/haskell.js +242 -0
  148. data/public/CodeMirror/mode/haskell/index.html +60 -0
  149. data/public/CodeMirror/mode/htmlmixed/htmlmixed.js +79 -0
  150. data/public/CodeMirror/mode/htmlmixed/index.html +52 -0
  151. data/public/CodeMirror/mode/javascript/index.html +78 -0
  152. data/public/CodeMirror/mode/javascript/javascript.js +348 -0
  153. data/public/CodeMirror/mode/lua/index.html +72 -0
  154. data/public/CodeMirror/mode/lua/lua.js +138 -0
  155. data/public/CodeMirror/mode/php/index.html +49 -0
  156. data/public/CodeMirror/mode/php/php.js +110 -0
  157. data/public/CodeMirror/mode/plsql/index.html +63 -0
  158. data/public/CodeMirror/mode/plsql/plsql.js +217 -0
  159. data/public/CodeMirror/mode/python/LICENSE.txt +21 -0
  160. data/public/CodeMirror/mode/python/index.html +123 -0
  161. data/public/CodeMirror/mode/python/python.js +321 -0
  162. data/public/CodeMirror/mode/rst/index.html +526 -0
  163. data/public/CodeMirror/mode/rst/rst.css +75 -0
  164. data/public/CodeMirror/mode/rst/rst.js +333 -0
  165. data/public/CodeMirror/mode/scheme/index.html +65 -0
  166. data/public/CodeMirror/mode/scheme/scheme.js +181 -0
  167. data/public/CodeMirror/mode/smalltalk/index.html +56 -0
  168. data/public/CodeMirror/mode/smalltalk/smalltalk.js +134 -0
  169. data/public/CodeMirror/mode/sparql/index.html +41 -0
  170. data/public/CodeMirror/mode/sparql/sparql.js +143 -0
  171. data/public/CodeMirror/mode/stex/index.html +96 -0
  172. data/public/CodeMirror/mode/stex/stex.js +167 -0
  173. data/public/CodeMirror/mode/xml/index.html +42 -0
  174. data/public/CodeMirror/mode/xml/xml.js +231 -0
  175. data/public/CodeMirror/mode/yaml/index.html +68 -0
  176. data/public/CodeMirror/mode/yaml/yaml.js +95 -0
  177. data/public/CodeMirror/oldrelease.html +178 -0
  178. data/public/CodeMirror/test/index.html +29 -0
  179. data/public/CodeMirror/test/test.js +249 -0
  180. data/public/CodeMirror/theme/default.css +18 -0
  181. data/public/CodeMirror/theme/elegant.css +9 -0
  182. data/public/CodeMirror/theme/jtalk.css +21 -0
  183. data/public/CodeMirror/theme/neat.css +8 -0
  184. data/public/CodeMirror/theme/night.css +20 -0
  185. data/public/css/jtalk.css +362 -0
  186. data/public/css/style.css +456 -0
  187. data/public/css/sunit.css +66 -0
  188. data/public/ide/fork_me.png +0 -0
  189. data/public/ide/screen2.png +0 -0
  190. data/public/ide/style.css +456 -0
  191. data/public/ide/syntax.css +61 -0
  192. data/public/ide/text_header.png +0 -0
  193. data/public/ide/title_container1.png +0 -0
  194. data/public/images/background_box.png +0 -0
  195. data/public/images/background_header.png +0 -0
  196. data/public/images/balloon_header.png +0 -0
  197. data/views/index.haml +66 -0
  198. metadata +341 -0
@@ -0,0 +1,1752 @@
1
+ Widget subclass: #TabManager
2
+ instanceVariableNames: 'selectedTab tabs opened ul'
3
+ category: 'IDE'!
4
+
5
+ !TabManager methodsFor: 'accessing'!
6
+
7
+ tabs
8
+ ^tabs ifNil: [tabs := Array new]
9
+ ! !
10
+
11
+ !TabManager methodsFor: 'actions'!
12
+
13
+ updateBodyMargin
14
+ self setBodyMargin: '#jtalk' asJQuery height + 27
15
+ !
16
+
17
+ updatePosition
18
+ <jQuery('#jtalk').css('top', '').css('bottom', '27px')>
19
+ !
20
+
21
+ removeBodyMargin
22
+ self setBodyMargin: 0
23
+ !
24
+
25
+ setBodyMargin: anInteger
26
+ '.jtalkBody' asJQuery cssAt: 'margin-bottom' put: anInteger asString, 'px'
27
+ !
28
+
29
+ onResize: aBlock
30
+ <jQuery('#jtalk').resizable({
31
+ handles: 'n',
32
+ resize: aBlock,
33
+ minHeight: 230
34
+ })>
35
+ !
36
+
37
+ onWindowResize: aBlock
38
+ <jQuery(window).resize(aBlock)>
39
+ !
40
+
41
+ open
42
+ opened ifFalse: [
43
+ 'body' asJQuery addClass: 'jtalkBody'.
44
+ '#jtalk' asJQuery show.
45
+ ul asJQuery show.
46
+ self updateBodyMargin.
47
+ selectedTab show.
48
+ opened := true]
49
+ !
50
+
51
+ close
52
+ opened ifTrue: [
53
+ '#jtalk' asJQuery hide.
54
+ ul asJQuery hide.
55
+ selectedTab hide.
56
+ self removeBodyMargin.
57
+ 'body' asJQuery removeClass: 'jtalkBody'.
58
+ opened := false]
59
+ !
60
+
61
+ newBrowserTab
62
+ Browser open
63
+ !
64
+
65
+ selectTab: aWidget
66
+ self open.
67
+ selectedTab := aWidget.
68
+ self tabs do: [:each |
69
+ each hide].
70
+ aWidget show.
71
+
72
+ self update
73
+ !
74
+
75
+ closeTab: aWidget
76
+ self removeTab: aWidget.
77
+ self selectTab: self tabs last.
78
+ aWidget remove.
79
+ self update
80
+ ! !
81
+
82
+ !TabManager methodsFor: 'adding/Removing'!
83
+
84
+ addTab: aWidget
85
+ self tabs add: aWidget.
86
+ '#jtalk' asJQuery append: aWidget.
87
+ aWidget hide
88
+ !
89
+
90
+ removeTab: aWidget
91
+ self tabs remove: aWidget.
92
+ self update
93
+ ! !
94
+
95
+ !TabManager methodsFor: 'initialization'!
96
+
97
+ initialize
98
+ super initialize.
99
+ opened := true.
100
+ 'body' asJQuery
101
+ append: self;
102
+ append: [:html | html div id: 'jtalk'];
103
+ addClass: 'jtalkBody'.
104
+ self
105
+ addTab: Transcript current;
106
+ addTab: Workspace new.
107
+ self selectTab: self tabs last.
108
+ self
109
+ onResize: [self updateBodyMargin; updatePosition];
110
+ onWindowResize: [self updatePosition]
111
+ ! !
112
+
113
+ !TabManager methodsFor: 'rendering'!
114
+
115
+ renderOn: html
116
+ ul := html ul
117
+ id: 'jtalkTabs';
118
+ yourself.
119
+ self renderTabs
120
+ !
121
+
122
+ renderTabFor: aWidget on: html
123
+ | li |
124
+ li := html li.
125
+ selectedTab = aWidget ifTrue: [
126
+ li class: 'selected'].
127
+ li with: [
128
+ aWidget canBeClosed ifTrue: [
129
+ html span
130
+ class: 'close';
131
+ with: 'x';
132
+ onClick: [self closeTab: aWidget]].
133
+ html span
134
+ with: aWidget label;
135
+ onClick: [self selectTab: aWidget]]
136
+ !
137
+
138
+ renderTabs
139
+ ul contents: [:html |
140
+ html li
141
+ class: 'closeAll';
142
+ with: 'x';
143
+ onClick: [self close].
144
+ self tabs do: [:each |
145
+ self renderTabFor: each on: html].
146
+ html li
147
+ class: 'newtab';
148
+ with: ' + ';
149
+ onClick: [self newBrowserTab]]
150
+ ! !
151
+
152
+ !TabManager methodsFor: 'updating'!
153
+
154
+ update
155
+ self renderTabs
156
+ ! !
157
+
158
+ TabManager class instanceVariableNames: 'current'!
159
+
160
+ !TabManager class methodsFor: 'instance creation'!
161
+
162
+ current
163
+ ^current ifNil: [current := super new]
164
+ !
165
+
166
+ new
167
+ self shouldNotImplement
168
+ ! !
169
+
170
+ Widget subclass: #TabWidget
171
+ instanceVariableNames: 'div'
172
+ category: 'IDE'!
173
+
174
+ !TabWidget methodsFor: 'accessing'!
175
+
176
+ label
177
+ self subclassResponsibility
178
+ ! !
179
+
180
+ !TabWidget methodsFor: 'actions'!
181
+
182
+ open
183
+ TabManager current addTab: self.
184
+ TabManager current selectTab: self
185
+ !
186
+
187
+ show
188
+ div asJQuery show
189
+ !
190
+
191
+ hide
192
+ div asJQuery hide
193
+ !
194
+
195
+ remove
196
+ div asJQuery remove
197
+ ! !
198
+
199
+ !TabWidget methodsFor: 'rendering'!
200
+
201
+ renderOn: html
202
+ div := html div
203
+ class: 'jtalkTool';
204
+ yourself.
205
+ self renderTab
206
+ !
207
+
208
+ renderBoxOn: html
209
+ !
210
+
211
+ renderButtonsOn: html
212
+ !
213
+
214
+ update
215
+ self renderTab
216
+ !
217
+
218
+ renderTab
219
+ div contents: [:html |
220
+ html div
221
+ class: 'jt_box';
222
+ with: [self renderBoxOn: html].
223
+ html div
224
+ class: 'jt_buttons';
225
+ with: [self renderButtonsOn: html]]
226
+ ! !
227
+
228
+ !TabWidget methodsFor: 'testing'!
229
+
230
+ canBeClosed
231
+ ^false
232
+ ! !
233
+
234
+ !TabWidget class methodsFor: 'instance creation'!
235
+
236
+ open
237
+ ^self new open
238
+ ! !
239
+
240
+ TabWidget subclass: #Workspace
241
+ instanceVariableNames: 'sourceArea'
242
+ category: 'IDE'!
243
+
244
+ !Workspace methodsFor: 'accessing'!
245
+
246
+ label
247
+ ^'[Workspace]'
248
+ ! !
249
+
250
+ !Workspace methodsFor: 'actions'!
251
+
252
+ clearWorkspace
253
+ sourceArea clear
254
+ !
255
+
256
+ doIt
257
+ sourceArea doIt
258
+ !
259
+
260
+ printIt
261
+ sourceArea printIt
262
+ !
263
+
264
+ inspectIt
265
+ sourceArea inspectIt
266
+ ! !
267
+
268
+ !Workspace methodsFor: 'rendering'!
269
+
270
+ renderBoxOn: html
271
+ sourceArea := SourceArea new.
272
+ sourceArea renderOn: html
273
+ !
274
+
275
+ renderButtonsOn: html
276
+ html button
277
+ with: 'DoIt';
278
+ title: 'ctrl+d';
279
+ onClick: [self doIt].
280
+ html button
281
+ with: 'PrintIt';
282
+ title: 'ctrl+p';
283
+ onClick: [self printIt].
284
+ html button
285
+ with: 'InspectIt';
286
+ title: 'ctrl+i';
287
+ onClick: [self inspectIt].
288
+ html button
289
+ with: 'Clear workspace';
290
+ onClick: [self clearWorkspace]
291
+ ! !
292
+
293
+ TabWidget subclass: #Transcript
294
+ instanceVariableNames: 'textarea'
295
+ category: 'IDE'!
296
+
297
+ !Transcript methodsFor: 'accessing'!
298
+
299
+ label
300
+ ^'[Transcript]'
301
+ ! !
302
+
303
+ !Transcript methodsFor: 'actions'!
304
+
305
+ show: anObject
306
+ textarea asJQuery val: textarea asJQuery val, anObject asString.
307
+ !
308
+
309
+ cr
310
+ textarea asJQuery val: textarea asJQuery val, String cr.
311
+ !
312
+
313
+ clear
314
+ textarea asJQuery val: ''
315
+ ! !
316
+
317
+ !Transcript methodsFor: 'rendering'!
318
+
319
+ renderBoxOn: html
320
+ textarea := html textarea.
321
+ textarea asJQuery call: 'tabby'.
322
+ textarea
323
+ class: 'jt_transcript';
324
+ at: 'spellcheck' put: 'false'
325
+ !
326
+
327
+ renderButtonsOn: html
328
+ html button
329
+ with: 'Clear transcript';
330
+ onClick: [self clear]
331
+ ! !
332
+
333
+ Transcript class instanceVariableNames: 'current'!
334
+
335
+ !Transcript class methodsFor: 'instance creation'!
336
+
337
+ open
338
+ self current open
339
+ !
340
+
341
+ new
342
+ self shouldNotImplement
343
+ !
344
+
345
+ current
346
+ ^current ifNil: [current := super new]
347
+ ! !
348
+
349
+ !Transcript class methodsFor: 'printing'!
350
+
351
+ show: anObject
352
+ self current show: anObject
353
+ !
354
+
355
+ cr
356
+ self current show: String cr
357
+ !
358
+
359
+ clear
360
+ self current clear
361
+ ! !
362
+
363
+ TabWidget subclass: #Browser
364
+ instanceVariableNames: 'selectedCategory selectedClass selectedProtocol selectedMethod commitButton categoriesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges input'
365
+ category: 'IDE'!
366
+
367
+ !Browser methodsFor: 'accessing'!
368
+
369
+ label
370
+ ^selectedClass
371
+ ifNil: ['Browser (nil)']
372
+ ifNotNil: [selectedClass name]
373
+ !
374
+
375
+ categories
376
+ | categories |
377
+ categories := Array new.
378
+ Smalltalk current classes do: [:each |
379
+ (categories includes: each category) ifFalse: [
380
+ categories add: each category]].
381
+ ^categories sort
382
+ !
383
+
384
+ classes
385
+ ^(Smalltalk current classes
386
+ select: [:each | each category = selectedCategory])
387
+ sort: [:a :b | a name > b name]
388
+ !
389
+
390
+ protocols
391
+ | klass |
392
+ selectedClass ifNotNil: [
393
+ selectedTab = #comment ifTrue: [^#()].
394
+ klass := selectedTab = #instance
395
+ ifTrue: [selectedClass]
396
+ ifFalse: [selectedClass class].
397
+ klass methodDictionary isEmpty ifTrue: [
398
+ ^Array with: 'not yet classified'].
399
+ ^klass protocols].
400
+ ^Array new
401
+ !
402
+
403
+ methods
404
+ | klass |
405
+ selectedTab = #comment ifTrue: [^#()].
406
+ selectedClass ifNotNil: [
407
+ klass := selectedTab = #instance
408
+ ifTrue: [selectedClass]
409
+ ifFalse: [selectedClass class]].
410
+ ^(selectedProtocol
411
+ ifNil: [
412
+ klass
413
+ ifNil: [#()]
414
+ ifNotNil: [klass methodDictionary values]]
415
+ ifNotNil: [
416
+ klass methodDictionary values select: [:each |
417
+ each category = selectedProtocol]]) sort: [:a :b | a selector > b selector]
418
+ !
419
+
420
+ source
421
+ selectedTab = #comment ifFalse: [
422
+ ^(selectedProtocol notNil or: [selectedMethod notNil])
423
+ ifFalse: [self declarationSource]
424
+ ifTrue: [self methodSource]].
425
+ ^selectedClass
426
+ ifNil: ['']
427
+ ifNotNil: [self classCommentSource]
428
+ !
429
+
430
+ methodSource
431
+ ^selectedMethod
432
+ ifNil: [self dummyMethodSource]
433
+ ifNotNil: [selectedMethod source]
434
+ !
435
+
436
+ dummyMethodSource
437
+ ^'messageSelectorAndArgumentNames
438
+ "comment stating purpose of message"
439
+
440
+ | temporary variable names |
441
+ statements'
442
+ !
443
+
444
+ declarationSource
445
+ ^selectedTab = #instance
446
+ ifTrue: [self classDeclarationSource]
447
+ ifFalse: [self metaclassDeclarationSource]
448
+ !
449
+
450
+ classDeclarationSource
451
+ | stream |
452
+ stream := '' writeStream.
453
+ selectedClass ifNotNil: [
454
+ stream
455
+ nextPutAll: selectedClass superclass asString;
456
+ nextPutAll: ' subclass: #';
457
+ nextPutAll: selectedClass name;
458
+ nextPutAll: String lf, String tab;
459
+ nextPutAll: 'instanceVariableNames: '''.
460
+ selectedClass instanceVariableNames
461
+ do: [:each | stream nextPutAll: each]
462
+ separatedBy: [stream nextPutAll: ' '].
463
+ stream
464
+ nextPutAll: '''', String lf, String tab;
465
+ nextPutAll: 'category: ''';
466
+ nextPutAll: selectedClass category;
467
+ nextPutAll: ''''].
468
+ ^stream contents
469
+ !
470
+
471
+ metaclassDeclarationSource
472
+ | stream |
473
+ stream := '' writeStream.
474
+ selectedClass ifNotNil: [
475
+ stream
476
+ nextPutAll: selectedClass asString;
477
+ nextPutAll: ' class ';
478
+ nextPutAll: 'instanceVariableNames: '''.
479
+ selectedClass class instanceVariableNames
480
+ do: [:each | stream nextPutAll: each]
481
+ separatedBy: [stream nextPutAll: ' '].
482
+ stream nextPutAll: ''''].
483
+ ^stream contents
484
+ !
485
+
486
+ classCommentSource
487
+ ^selectedClass comment
488
+ !
489
+
490
+ selectedClass
491
+ ^selectedClass
492
+ ! !
493
+
494
+ !Browser methodsFor: 'actions'!
495
+
496
+ disableSaveButton
497
+ saveButton ifNotNil: [
498
+ saveButton at: 'disabled' put: true].
499
+ unsavedChanges := false
500
+ !
501
+
502
+ hideClassButtons
503
+ classButtons asJQuery hide
504
+ !
505
+
506
+ showClassButtons
507
+ classButtons asJQuery show
508
+ !
509
+
510
+ hideMethodButtons
511
+ methodButtons asJQuery hide
512
+ !
513
+
514
+ showMethodButtons
515
+ methodButtons asJQuery show
516
+ !
517
+
518
+ compile
519
+ self disableSaveButton.
520
+ selectedTab = #comment ifTrue: [
521
+ selectedClass ifNotNil: [
522
+ self compileClassComment]].
523
+ (selectedProtocol notNil or: [selectedMethod notNil])
524
+ ifFalse: [self compileDefinition]
525
+ ifTrue: [self compileMethodDefinition]
526
+ !
527
+
528
+ compileClassComment
529
+ selectedClass comment: sourceArea val
530
+ !
531
+
532
+ compileMethodDefinition
533
+ selectedTab = #instance
534
+ ifTrue: [self compileMethodDefinitionFor: selectedClass]
535
+ ifFalse: [self compileMethodDefinitionFor: selectedClass class]
536
+ !
537
+
538
+ compileMethodDefinitionFor: aClass
539
+ | compiler method source node |
540
+ source := sourceArea val.
541
+ selectedProtocol ifNil: [selectedProtocol := selectedMethod category].
542
+ compiler := Compiler new.
543
+ node := compiler parse: source.
544
+ node isParseFailure ifTrue: [
545
+ ^self alert: 'PARSE ERROR: ', node reason, ', position: ', node position asString].
546
+ compiler currentClass: aClass.
547
+ method := compiler eval: (compiler compileNode: node).
548
+ method category: selectedProtocol.
549
+ compiler unknownVariables do: [:each |
550
+ (self confirm: 'Declare ''', each, ''' as instance variable?') ifTrue: [
551
+ self addInstanceVariableNamed: each toClass: aClass.
552
+ ^self compileMethodDefinitionFor: aClass]].
553
+ aClass addCompiledMethod: method.
554
+ compiler setupClass: aClass.
555
+ self updateMethodsList.
556
+ self selectMethod: method
557
+ !
558
+
559
+ compileDefinition
560
+ | newClass |
561
+ newClass := Compiler new loadExpression: sourceArea val.
562
+ self
563
+ resetClassesList;
564
+ updateCategoriesList;
565
+ updateClassesList
566
+ !
567
+
568
+ commitCategory
569
+ selectedCategory ifNotNil: [
570
+ (Ajax url: self class commitPathJs, '/', selectedCategory, '.js')
571
+ at: 'type' put: 'PUT';
572
+ at: 'data' put: (Exporter new exportCategory: selectedCategory);
573
+ at: 'error' put: [self alert: 'Commit failed!!'];
574
+ send.
575
+ (Ajax url: self class commitPathJs, '/', selectedCategory, '.deploy.js')
576
+ at: 'type' put: 'PUT';
577
+ at: 'data' put: (Exporter new exportCategory: selectedCategory);
578
+ at: 'error' put: [self alert: 'Commit failed!!'];
579
+ send.
580
+ (Ajax url: self class commitPathSt, '/', selectedCategory, '.st')
581
+ at: 'type' put: 'PUT';
582
+ at: 'data' put: (ChunkExporter new exportCategory: selectedCategory);
583
+ at: 'error' put: [self alert: 'Commit failed!!'];
584
+ send]
585
+ !
586
+
587
+ cancelChanges
588
+ ^unsavedChanges
589
+ ifTrue: [self confirm: 'Cancel changes?']
590
+ ifFalse: [true]
591
+ !
592
+
593
+ removeClass
594
+ (self confirm: 'Do you really want to remove ', selectedClass name, '?')
595
+ ifTrue: [
596
+ Smalltalk current removeClass: selectedClass.
597
+ self resetClassesList.
598
+ self selectClass: nil]
599
+ !
600
+
601
+ removeMethod
602
+ self cancelChanges ifTrue: [
603
+ (self confirm: 'Do you really want to remove #', selectedMethod selector, '?')
604
+ ifTrue: [
605
+ selectedTab = #instance
606
+ ifTrue: [selectedClass removeCompiledMethod: selectedMethod]
607
+ ifFalse: [selectedClass class removeCompiledMethod: selectedMethod].
608
+ self selectMethod: nil]]
609
+ !
610
+
611
+ setMethodProtocol: aString
612
+ self cancelChanges ifTrue: [
613
+ (self protocols includes: aString)
614
+ ifFalse: [self addNewProtocol]
615
+ ifTrue: [
616
+ selectedMethod category: aString.
617
+ selectedProtocol := aString.
618
+ selectedMethod := selectedMethod.
619
+ self
620
+ updateProtocolsList;
621
+ updateMethodsList;
622
+ updateSourceAndButtons]]
623
+ !
624
+
625
+ addNewProtocol
626
+ | newProtocol |
627
+ newProtocol := self prompt: 'New method protocol'.
628
+ newProtocol notEmpty ifTrue: [
629
+ selectedMethod category: newProtocol.
630
+ self setMethodProtocol: newProtocol]
631
+ !
632
+
633
+ selectCategory: aCategory
634
+ self cancelChanges ifTrue: [
635
+ selectedCategory := aCategory.
636
+ selectedClass := selectedProtocol := selectedMethod := nil.
637
+ self resetClassesList.
638
+ self
639
+ updateCategoriesList;
640
+ updateClassesList;
641
+ updateProtocolsList;
642
+ updateMethodsList;
643
+ updateSourceAndButtons]
644
+ !
645
+
646
+ selectClass: aClass
647
+ self cancelChanges ifTrue: [
648
+ selectedClass := aClass.
649
+ selectedProtocol := selectedMethod := nil.
650
+ self
651
+ updateClassesList;
652
+ updateProtocolsList;
653
+ updateMethodsList;
654
+ updateSourceAndButtons]
655
+ !
656
+
657
+ selectProtocol: aString
658
+ self cancelChanges ifTrue: [
659
+ selectedProtocol := aString.
660
+ selectedMethod := nil.
661
+ self
662
+ updateProtocolsList;
663
+ updateMethodsList;
664
+ updateSourceAndButtons]
665
+ !
666
+
667
+ selectMethod: aMethod
668
+ self cancelChanges ifTrue: [
669
+ selectedMethod := aMethod.
670
+ self
671
+ updateProtocolsList;
672
+ updateMethodsList;
673
+ updateSourceAndButtons]
674
+ !
675
+
676
+ selectTab: aString
677
+ self cancelChanges ifTrue: [
678
+ selectedTab := aString.
679
+ self selectProtocol: nil.
680
+ self updateTabsList]
681
+ !
682
+
683
+ renameClass
684
+ | newName |
685
+ newName := self prompt: 'Rename class ', selectedClass name.
686
+ newName notEmpty ifTrue: [
687
+ selectedClass rename: newName.
688
+ self
689
+ updateClassesList;
690
+ updateSourceAndButtons]
691
+ !
692
+
693
+ addInstanceVariableNamed: aString toClass: aClass
694
+ ClassBuilder new
695
+ addSubclassOf: aClass superclass named: aClass name instanceVariableNames: (aClass instanceVariableNames copy add: aString; yourself)
696
+ !
697
+
698
+ searchReferencesOf: aString
699
+ ReferencesBrowser search: aString
700
+ !
701
+
702
+ searchClassReferences
703
+ ReferencesBrowser search: selectedClass name
704
+ !
705
+
706
+ search: aString
707
+ self cancelChanges ifTrue: [| searchedClass |
708
+ searchedClass := Smalltalk current at: aString.
709
+ searchedClass isClass
710
+ ifTrue: [self class openOn: searchedClass]
711
+ ifFalse: [self searchReferencesOf: aString]]
712
+ ! !
713
+
714
+ !Browser methodsFor: 'initialization'!
715
+
716
+ initialize
717
+ super initialize.
718
+ selectedTab := #instance.
719
+ unsavedChanges := false
720
+ ! !
721
+
722
+ !Browser methodsFor: 'rendering'!
723
+
724
+ renderBoxOn: html
725
+ self
726
+ renderTopPanelOn: html;
727
+ renderTabsOn: html;
728
+ renderBottomPanelOn: html
729
+ !
730
+
731
+ renderTopPanelOn: html
732
+ html div
733
+ class: 'top';
734
+ with: [
735
+ self renderInputOn: html.
736
+ categoriesList := html ul class: 'jt_column browser categories'.
737
+ commitButton := html button
738
+ class: 'jt_commit';
739
+ title: 'Commit classes in this category to disk';
740
+ onClick: [self commitCategory];
741
+ with: 'Commit category'.
742
+ classesList := ClassesList on: self.
743
+ classesList renderOn: html.
744
+ protocolsList := html ul class: 'jt_column browser protocols'.
745
+ methodsList := html ul class: 'jt_column browser methods'.
746
+ self
747
+ updateCategoriesList;
748
+ updateClassesList;
749
+ updateProtocolsList;
750
+ updateMethodsList.
751
+ html div class: 'jt_clear']
752
+ !
753
+
754
+ renderTabsOn: html
755
+ tabsList := html ul class: 'jt_tabs'.
756
+ self updateTabsList.
757
+ !
758
+
759
+ renderBottomPanelOn: html
760
+ html div
761
+ class: 'jt_sourceCode';
762
+ with: [
763
+ sourceArea := SourceArea new.
764
+ sourceArea renderOn: html.
765
+ sourceArea
766
+ onKeyUp: [self updateStatus]]
767
+ !
768
+
769
+ renderButtonsOn: html
770
+ saveButton := html button.
771
+ saveButton
772
+ with: 'Save';
773
+ onClick: [self compile].
774
+ methodButtons := html span.
775
+ classButtons := html span.
776
+ html div
777
+ class: 'right';
778
+ with: [
779
+ html button
780
+ with: 'DoIt';
781
+ onClick: [sourceArea doIt].
782
+ html button
783
+ with: 'PrintIt';
784
+ onClick: [sourceArea printIt].
785
+ html button with: 'InspectIt';
786
+ onClick: [sourceArea inspectit]].
787
+ self updateSourceAndButtons
788
+ !
789
+
790
+ renderInputOn: html
791
+ input := html input
792
+ class: 'implementors';
793
+ yourself.
794
+ input onKeyPress: [:event |
795
+ event keyCode = 13 ifTrue: [
796
+ self search: input asJQuery val]]
797
+ ! !
798
+
799
+ !Browser methodsFor: 'testing'!
800
+
801
+ canBeClosed
802
+ ^true
803
+ ! !
804
+
805
+ !Browser methodsFor: 'updating'!
806
+
807
+ updateCategoriesList
808
+ categoriesList contents: [:html |
809
+ self categories do: [:each || li label |
810
+ each isEmpty
811
+ ifTrue: [label := 'Unclassified']
812
+ ifFalse: [label := each].
813
+ li := html li.
814
+ selectedCategory = each ifTrue: [
815
+ li class: 'selected'].
816
+ li
817
+ with: label;
818
+ onClick: [self selectCategory: each]]]
819
+ !
820
+
821
+ updateClassesList
822
+ TabManager current update.
823
+ classesList updateNodes.
824
+ "classesList contents: [:html |
825
+ self classes do: [:each || li |
826
+ li := html li.
827
+ selectedClass = each ifTrue: [
828
+ li class: 'selected'].
829
+ li
830
+ with: each name;
831
+ onClick: [self selectClass: each]]]"
832
+ !
833
+
834
+ updateProtocolsList
835
+ protocolsList contents: [:html |
836
+ self protocols do: [:each || li |
837
+ li := html li.
838
+ selectedProtocol = each ifTrue: [
839
+ li class: 'selected'].
840
+ li
841
+ with: each;
842
+ onClick: [self selectProtocol: each]]]
843
+ !
844
+
845
+ updateMethodsList
846
+ methodsList contents: [:html |
847
+ self methods do: [:each || li |
848
+ li := html li.
849
+ selectedMethod = each ifTrue: [
850
+ li class: 'selected'].
851
+ li
852
+ with: each selector;
853
+ onClick: [self selectMethod: each]]]
854
+ !
855
+
856
+ updateTabsList
857
+ tabsList contents: [:html || li |
858
+ li := html li.
859
+ selectedTab = #instance ifTrue: [li class: 'selected'].
860
+ li
861
+ with: 'Instance';
862
+ onClick: [self selectTab: #instance].
863
+ li := html li.
864
+ selectedTab = #class ifTrue: [li class: 'selected'].
865
+ li
866
+ with: 'Class';
867
+ onClick: [self selectTab: #class].
868
+ li := html li.
869
+ selectedTab = #comment ifTrue: [li class: 'selected'].
870
+ li
871
+ with: 'Comment';
872
+ onClick: [self selectTab: #comment]]
873
+ !
874
+
875
+ updateSourceAndButtons
876
+ self disableSaveButton.
877
+ classButtons contents: [:html |
878
+ html button
879
+ with: 'Rename class';
880
+ onClick: [self renameClass].
881
+ html button
882
+ with: 'Remove class';
883
+ onClick: [self removeClass].
884
+ html button
885
+ with: 'References';
886
+ onClick: [self searchClassReferences]].
887
+ methodButtons contents: [:html |
888
+ html button
889
+ with: 'Remove method';
890
+ onClick: [self removeMethod].
891
+ html select
892
+ onChange: [:e :select | self setMethodProtocol: select val];
893
+ with: [
894
+ html option
895
+ with: 'Method protocol';
896
+ at: 'disabled' put: 'disabled'.
897
+ html option
898
+ class: 'important';
899
+ with: 'New...'.
900
+ self protocols do: [:each |
901
+ html option with: each]].
902
+ selectedMethod isNil ifFalse: [
903
+ html select
904
+ onChange: [:e :select | self searchReferencesOf: select val];
905
+ with: [
906
+ html option
907
+ with: 'References';
908
+ at: 'disabled' put: 'disabled'.
909
+ html option
910
+ class: 'important';
911
+ with: selectedMethod selector.
912
+ selectedMethod messageSends sorted do: [:each |
913
+ html option with: each]]]].
914
+ selectedMethod isNil
915
+ ifTrue: [
916
+ self hideMethodButtons.
917
+ (selectedClass isNil or: [selectedProtocol notNil])
918
+ ifTrue: [self hideClassButtons]
919
+ ifFalse: [self showClassButtons]]
920
+ ifFalse: [
921
+ self hideClassButtons.
922
+ self showMethodButtons].
923
+ sourceArea val: self source
924
+ !
925
+
926
+ updateStatus
927
+ sourceArea val = self source
928
+ ifTrue: [
929
+ saveButton ifNotNil: [
930
+ saveButton at: 'disabled' put: true].
931
+ unsavedChanges := false]
932
+ ifFalse: [
933
+ saveButton ifNotNil: [
934
+ saveButton removeAt: 'disabled'].
935
+ unsavedChanges := true]
936
+ !
937
+
938
+ resetClassesList
939
+ classesList resetNodes
940
+ ! !
941
+
942
+ !Browser class methodsFor: 'accessing'!
943
+
944
+ commitPathJs
945
+ ^'js'
946
+ !
947
+
948
+ commitPathSt
949
+ ^'st'
950
+ ! !
951
+
952
+ !Browser class methodsFor: 'convenience'!
953
+
954
+ openOn: aClass
955
+ ^self new
956
+ open;
957
+ selectCategory: aClass category;
958
+ selectClass: aClass
959
+ !
960
+
961
+ open
962
+ self new open
963
+ ! !
964
+
965
+ TabWidget subclass: #Inspector
966
+ instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea workspaceTextarea diveButton'
967
+ category: 'IDE'!
968
+
969
+ !Inspector methodsFor: 'accessing'!
970
+
971
+ label
972
+ ^label ifNil: ['Inspector (nil)']
973
+ !
974
+
975
+ variables
976
+ ^variables
977
+ !
978
+
979
+ setVariables: aCollection
980
+ variables := aCollection
981
+ !
982
+
983
+ setLabel: aString
984
+ label := aString
985
+ !
986
+
987
+ selectedVariable
988
+ ^selectedVariable
989
+ !
990
+
991
+ selectedVariable: aString
992
+ selectedVariable := aString
993
+ ! !
994
+
995
+ !Inspector methodsFor: 'actions'!
996
+
997
+ inspect: anObject
998
+ object := anObject.
999
+ variables := #().
1000
+ object inspectOn: self
1001
+ !
1002
+
1003
+ dive
1004
+ (self variables at: self selectedVariable) inspect
1005
+ !
1006
+
1007
+ refresh
1008
+ self
1009
+ inspect: object;
1010
+ updateVariablesList;
1011
+ updateValueTextarea
1012
+ ! !
1013
+
1014
+ !Inspector methodsFor: 'rendering'!
1015
+
1016
+ renderBoxOn: html
1017
+ self
1018
+ renderTopPanelOn: html;
1019
+ renderBottomPanelOn: html
1020
+ !
1021
+
1022
+ renderTopPanelOn: html
1023
+ html div
1024
+ class: 'top';
1025
+ with: [
1026
+ variablesList := html ul class: 'jt_column variables'.
1027
+ valueTextarea := html textarea class: 'jt_column value'; at: 'readonly' put: 'readonly'.
1028
+ self
1029
+ updateVariablesList;
1030
+ updateValueTextarea.
1031
+ html div class: 'jt_clear']
1032
+ !
1033
+
1034
+ renderBottomPanelOn: html
1035
+ html div
1036
+ class: 'jt_sourceCode';
1037
+ with: [
1038
+ workspaceTextarea := html textarea
1039
+ class: 'source';
1040
+ at: 'spellcheck' put: 'false'.
1041
+ workspaceTextarea asJQuery call: 'tabby']
1042
+ !
1043
+
1044
+ renderButtonsOn: html
1045
+ html button
1046
+ with: 'Refresh';
1047
+ onClick: [self refresh].
1048
+ diveButton := html button
1049
+ with: 'Dive';
1050
+ onClick: [self dive].
1051
+ self updateButtons
1052
+ ! !
1053
+
1054
+ !Inspector methodsFor: 'testing'!
1055
+
1056
+ canBeClosed
1057
+ ^true
1058
+ ! !
1059
+
1060
+ !Inspector methodsFor: 'updating'!
1061
+
1062
+ updateVariablesList
1063
+ variablesList contents: [:html |
1064
+ self variables keys do: [:each || li |
1065
+ li := html li.
1066
+ li
1067
+ with: each;
1068
+ onClick: [self selectVariable: each].
1069
+ self selectedVariable = each ifTrue: [
1070
+ li class: 'selected']]]
1071
+ !
1072
+
1073
+ selectVariable: aString
1074
+ self selectedVariable: aString.
1075
+ self
1076
+ updateVariablesList;
1077
+ updateValueTextarea;
1078
+ updateButtons
1079
+ !
1080
+
1081
+ updateValueTextarea
1082
+ valueTextarea asJQuery val: (self selectedVariable isNil
1083
+ ifTrue: ['']
1084
+ ifFalse: [(self variables at: self selectedVariable) printString])
1085
+ !
1086
+
1087
+ updateButtons
1088
+ (self selectedVariable notNil and: [(self variables at: self selectedVariable) notNil])
1089
+ ifFalse: [diveButton at: 'disabled' put: true]
1090
+ ifTrue: [diveButton removeAt: 'disabled']
1091
+ ! !
1092
+
1093
+ !Inspector class methodsFor: 'instance creation'!
1094
+
1095
+ on: anObject
1096
+ ^self new
1097
+ inspect: anObject;
1098
+ yourself
1099
+ ! !
1100
+
1101
+ TabWidget subclass: #ReferencesBrowser
1102
+ instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList'
1103
+ category: 'IDE'!
1104
+
1105
+ !ReferencesBrowser methodsFor: 'accessing'!
1106
+
1107
+ implementors
1108
+ ^implementors ifNil: [implementors := Array new]
1109
+ !
1110
+
1111
+ label
1112
+ ^'[ReferencesBrowser]'
1113
+ !
1114
+
1115
+ selector
1116
+ ^selector
1117
+ !
1118
+
1119
+ senders
1120
+ ^senders ifNil: [senders := Array new]
1121
+ !
1122
+
1123
+ classesAndMetaclasses
1124
+ ^Smalltalk current classes, (Smalltalk current classes collect: [:each | each class])
1125
+ !
1126
+
1127
+ referencedClasses
1128
+ ^referencedClasses ifNil: [referencedClasses := Array new]
1129
+ ! !
1130
+
1131
+ !ReferencesBrowser methodsFor: 'actions'!
1132
+
1133
+ openBrowserOn: aMethod
1134
+ | browser |
1135
+ browser := Browser openOn: (aMethod class isMetaclass
1136
+ ifTrue: [aMethod methodClass instanceClass] ifFalse: [aMethod methodClass]).
1137
+ aMethod methodClass isMetaclass ifTrue: [browser selectTab: #class].
1138
+ browser
1139
+ selectProtocol: aMethod category;
1140
+ selectMethod: aMethod
1141
+ !
1142
+
1143
+ searchReferencesFor: aString
1144
+ selector := aString.
1145
+ implementors := Array new.
1146
+ senders := Array new.
1147
+ referencedClasses := Array new.
1148
+ (selector match: '^[A-Z]')
1149
+ ifFalse: [self searchSelectorReferencesFor: selector]
1150
+ ifTrue: [self searchReferencedClassesFor: selector]
1151
+ !
1152
+
1153
+ search: aString
1154
+ self
1155
+ searchReferencesFor: aString;
1156
+ updateImplementorsList;
1157
+ updateSendersList;
1158
+ updateReferencedClassesList
1159
+ !
1160
+
1161
+ searchReferencedClassesFor: aString
1162
+ self classesAndMetaclasses do: [:each |
1163
+ each methodDictionary values do: [:value |
1164
+ (((value referencedClasses select: [:each | each notNil])collect: [:each | each name]) includes: selector) ifTrue: [
1165
+ self referencedClasses add: value]]]
1166
+ !
1167
+
1168
+ searchSelectorReferencesFor: aString
1169
+ self classesAndMetaclasses do: [:each |
1170
+ each methodDictionary keysAndValuesDo: [:key :value |
1171
+ key = selector ifTrue: [self implementors add: value]].
1172
+ each methodDictionary keysAndValuesDo: [:key :value |
1173
+ (value messageSends includes: selector) ifTrue: [
1174
+ self senders add: value]]]
1175
+ ! !
1176
+
1177
+ !ReferencesBrowser methodsFor: 'initialization'!
1178
+
1179
+ initialize
1180
+ super initialize.
1181
+ selector := ''
1182
+ ! !
1183
+
1184
+ !ReferencesBrowser methodsFor: 'private'!
1185
+
1186
+ setInputEvents
1187
+ input
1188
+ onKeyUp: [timer := [self search: input asJQuery val] valueWithTimeout: 100];
1189
+ onKeyDown: [timer ifNotNil: [timer clearTimeout]]
1190
+ ! !
1191
+
1192
+ !ReferencesBrowser methodsFor: 'rendering'!
1193
+
1194
+ renderBoxOn: html
1195
+ self
1196
+ renderInputOn: html;
1197
+ renderImplementorsOn: html;
1198
+ renderSendersOn: html;
1199
+ renderReferencedClassesOn: html
1200
+ !
1201
+
1202
+ renderInputOn: html
1203
+ input := html input
1204
+ class: 'implementors';
1205
+ yourself.
1206
+ input asJQuery val: selector.
1207
+ self setInputEvents
1208
+ !
1209
+
1210
+ renderImplementorsOn: html
1211
+ implementorsList := html ul class: 'jt_column implementors'.
1212
+ self updateImplementorsList
1213
+ !
1214
+
1215
+ renderSendersOn: html
1216
+ sendersList := html ul class: 'jt_column senders'.
1217
+ self updateSendersList
1218
+ !
1219
+
1220
+ renderReferencedClassesOn: html
1221
+ referencedClassesList := html ul class: 'jt_column referenced_classes'.
1222
+ self updateReferencedClassesList
1223
+ ! !
1224
+
1225
+ !ReferencesBrowser methodsFor: 'testing'!
1226
+
1227
+ canBeClosed
1228
+ ^true
1229
+ ! !
1230
+
1231
+ !ReferencesBrowser methodsFor: 'updating'!
1232
+
1233
+ updateImplementorsList
1234
+ implementorsList contents: [:html |
1235
+ html li
1236
+ class: 'column_label';
1237
+ with: 'Implementors (', self implementors size asString, ')';
1238
+ style: 'font-weight: bold'.
1239
+ self implementors do: [:each || li |
1240
+ li := html li.
1241
+ li
1242
+ with: (each methodClass asString, ' >> ', self selector);
1243
+ onClick: [self openBrowserOn: each]]]
1244
+ !
1245
+
1246
+ updateSendersList
1247
+ sendersList contents: [:html |
1248
+ html li
1249
+ class: 'column_label';
1250
+ with: 'Senders (', self senders size asString, ')';
1251
+ style: 'font-weight: bold'.
1252
+ self senders do: [:each |
1253
+ html li
1254
+ with: (each methodClass asString, ' >> ', each selector);
1255
+ onClick: [self openBrowserOn: each]]]
1256
+ !
1257
+
1258
+ updateReferencedClassesList
1259
+ referencedClassesList contents: [:html |
1260
+ html li
1261
+ class: 'column_label';
1262
+ with: 'Class references (', self referencedClasses size asString, ')';
1263
+ style: 'font-weight: bold'.
1264
+ self referencedClasses do: [:each |
1265
+ html li
1266
+ with: (each methodClass asString, ' >> ', each selector);
1267
+ onClick: [self openBrowserOn: each]]]
1268
+ ! !
1269
+
1270
+ !ReferencesBrowser class methodsFor: 'instance creation'!
1271
+
1272
+ search: aString
1273
+ ^self new
1274
+ searchReferencesFor: aString;
1275
+ open
1276
+ ! !
1277
+
1278
+ Widget subclass: #SourceArea
1279
+ instanceVariableNames: 'editor div'
1280
+ category: 'IDE'!
1281
+
1282
+ !SourceArea methodsFor: 'accessing'!
1283
+
1284
+ val
1285
+ ^editor getValue
1286
+ !
1287
+
1288
+ val: aString
1289
+ editor setValue: aString
1290
+ !
1291
+
1292
+ currentLine
1293
+ ^editor getLine: (editor getCursor line)
1294
+ !
1295
+
1296
+ selection
1297
+ ^editor getSelection
1298
+ !
1299
+
1300
+ selectionEnd
1301
+ ^textarea element selectionEnd
1302
+ !
1303
+
1304
+ selectionStart
1305
+ ^textarea element selectionStart
1306
+ !
1307
+
1308
+ selectionStart: anInteger
1309
+ textarea element selectionStart: anInteger
1310
+ !
1311
+
1312
+ selectionEnd: anInteger
1313
+ textarea element selectionEnd: anInteger
1314
+ !
1315
+
1316
+ setEditorOn: aTextarea
1317
+ <self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
1318
+ theme: 'jtalk',
1319
+ lineNumbers: true,
1320
+ enterMode: 'classic',
1321
+ matchBrackets: true,
1322
+ electricChars: false,
1323
+ })>
1324
+ !
1325
+
1326
+ editor
1327
+ ^editor
1328
+ ! !
1329
+
1330
+ !SourceArea methodsFor: 'actions'!
1331
+
1332
+ clear
1333
+ textarea asJQuery val: ''
1334
+ !
1335
+
1336
+ doIt
1337
+ | selection |
1338
+ editor somethingSelected
1339
+ ifFalse: [selection := self currentLine]
1340
+ ifTrue: [selection := self selection].
1341
+ ^self eval: selection
1342
+ !
1343
+
1344
+ eval: aString
1345
+ | compiler node |
1346
+ compiler := Compiler new.
1347
+ node := compiler parseExpression: aString.
1348
+ node isParseFailure ifTrue: [
1349
+ ^self alert: node reason, ', position: ', node position].
1350
+ ^compiler loadExpression: aString
1351
+ !
1352
+
1353
+ handleKeyDown: anEvent
1354
+ <if(anEvent.ctrlKey) {
1355
+ if(anEvent.keyCode === 80) { //ctrl+p
1356
+ self._printIt();
1357
+ anEvent.preventDefault();
1358
+ return false;
1359
+ }
1360
+ if(anEvent.keyCode === 68) { //ctrl+d
1361
+ self._doIt();
1362
+ anEvent.preventDefault();
1363
+ return false;
1364
+ }
1365
+ if(anEvent.keyCode === 73) { //ctrl+i
1366
+ self._inspectIt();
1367
+ anEvent.preventDefault();
1368
+ return false;
1369
+ }
1370
+ }>
1371
+ !
1372
+
1373
+ inspectIt
1374
+ self doIt inspect
1375
+ !
1376
+
1377
+ print: aString
1378
+ | start stop |
1379
+ start := Dictionary new.
1380
+ stop := Dictionary new.
1381
+ start at: 'line' put: (editor getCursor: false) line.
1382
+ start at: 'ch' put: (editor getCursor: false) ch.
1383
+ stop at: 'line' put: (start at: 'line').
1384
+ stop at: 'ch' put: ((start at: 'ch') + aString size + 2).
1385
+ editor replaceSelection: (editor getSelection, ' ', aString, ' ').
1386
+ editor setCursor: (editor getCursor: true).
1387
+ editor setSelection: stop end: start.
1388
+ console log: start; log: stop
1389
+ !
1390
+
1391
+ printIt
1392
+ self print: self doIt printString
1393
+ ! !
1394
+
1395
+ !SourceArea methodsFor: 'events'!
1396
+
1397
+ onKeyUp: aBlock
1398
+ div onKeyUp: aBlock
1399
+ !
1400
+
1401
+ onKeyDown: aBlock
1402
+ div onKeyDown: aBlock
1403
+ ! !
1404
+
1405
+ !SourceArea methodsFor: 'rendering'!
1406
+
1407
+ renderOn: html
1408
+ | textarea |
1409
+ div := html div class: 'source'.
1410
+ div with: [textarea := html textarea].
1411
+ self setEditorOn: textarea element.
1412
+ div onKeyDown: [:e | self handleKeyDown: e]
1413
+ ! !
1414
+
1415
+ Widget subclass: #ClassesList
1416
+ instanceVariableNames: 'browser ul nodes'
1417
+ category: 'IDE'!
1418
+
1419
+ !ClassesList methodsFor: 'accessing'!
1420
+
1421
+ category
1422
+ ^self browser selectedCategory
1423
+ !
1424
+
1425
+ nodes
1426
+ nodes ifNil: [nodes := self getNodes].
1427
+ ^nodes
1428
+ !
1429
+
1430
+ browser
1431
+ ^browser
1432
+ !
1433
+
1434
+ browser: aBrowser
1435
+
1436
+ browser := aBrowser
1437
+ !
1438
+
1439
+ getNodes
1440
+ | classes children others |
1441
+ classes := self browser classes.
1442
+ children := #().
1443
+ others := #().
1444
+ classes do: [:each |
1445
+ (classes includes: each superclass)
1446
+ ifFalse: [children add: each]
1447
+ ifTrue: [others add: each]].
1448
+ ^children collect: [:each |
1449
+ ClassesListNode on: each browser: self browser classes: others level: 0]
1450
+ !
1451
+
1452
+ resetNodes
1453
+ nodes := nil
1454
+ ! !
1455
+
1456
+ !ClassesList methodsFor: 'rendering'!
1457
+
1458
+ renderOn: html
1459
+ ul := html ul
1460
+ class: 'jt_column browser classes';
1461
+ yourself.
1462
+ self updateNodes
1463
+ !
1464
+
1465
+ updateNodes
1466
+ ul contents: [:html |
1467
+ self nodes do: [:each |
1468
+ each renderOn: html]]
1469
+ ! !
1470
+
1471
+ !ClassesList class methodsFor: 'instance creation'!
1472
+
1473
+ on: aBrowser
1474
+ ^self new
1475
+ browser: aBrowser;
1476
+ yourself
1477
+ ! !
1478
+
1479
+ Widget subclass: #ClassesListNode
1480
+ instanceVariableNames: 'browser theClass level nodes'
1481
+ category: 'IDE'!
1482
+
1483
+ !ClassesListNode methodsFor: 'accessing'!
1484
+
1485
+ nodes
1486
+ ^nodes
1487
+ !
1488
+
1489
+ theClass
1490
+ ^theClass
1491
+ !
1492
+
1493
+ theClass: aClass
1494
+ theClass := aClass
1495
+ !
1496
+
1497
+ browser
1498
+ ^browser
1499
+ !
1500
+
1501
+ browser: aBrowser
1502
+ browser := aBrowser
1503
+ !
1504
+
1505
+ level
1506
+ ^level
1507
+ !
1508
+
1509
+ level: anInteger
1510
+ level := anInteger
1511
+ !
1512
+
1513
+ label
1514
+ | str |
1515
+ str := String new writeStream.
1516
+ self level timesRepeat: [
1517
+ str nextPutAll: '&nbsp;&nbsp;&nbsp;&nbsp;'].
1518
+ str nextPutAll: self theClass name.
1519
+ ^str contents
1520
+ !
1521
+
1522
+ getNodesFrom: aCollection
1523
+ | children others |
1524
+ children := #().
1525
+ others := #().
1526
+ aCollection do: [:each |
1527
+ (each superclass = self theClass)
1528
+ ifTrue: [children add: each]
1529
+ ifFalse: [others add: each]].
1530
+ nodes:= children collect: [:each |
1531
+ ClassesListNode on: each browser: self browser classes: others level: self level + 1]
1532
+ ! !
1533
+
1534
+ !ClassesListNode methodsFor: 'rendering'!
1535
+
1536
+ renderOn: html
1537
+ | li |
1538
+ li := html li
1539
+ onClick: [self browser selectClass: self theClass].
1540
+ li asJQuery contents: self label.
1541
+ self browser selectedClass = self theClass ifTrue: [
1542
+ li class: 'selected'].
1543
+ self nodes do: [:each |
1544
+ each renderOn: html]
1545
+ ! !
1546
+
1547
+ !ClassesListNode class methodsFor: 'instance creation'!
1548
+
1549
+ on: aClass browser: aBrowser classes: aCollection level: anInteger
1550
+ ^self new
1551
+ theClass: aClass;
1552
+ browser: aBrowser;
1553
+ level: anInteger;
1554
+ getNodesFrom: aCollection;
1555
+ yourself
1556
+ ! !
1557
+
1558
+ TabWidget subclass: #Debugger
1559
+ instanceVariableNames: 'error selectedContext sourceArea ul'
1560
+ category: 'IDE'!
1561
+
1562
+ !Debugger methodsFor: 'accessing'!
1563
+
1564
+ error
1565
+ ^error
1566
+ !
1567
+
1568
+ error: anError
1569
+ error := anError
1570
+ !
1571
+
1572
+ label
1573
+ ^'[Debugger]'
1574
+ ! !
1575
+
1576
+ !Debugger methodsFor: 'actions'!
1577
+
1578
+ selectContext: aContext
1579
+ selectedContext := aContext.
1580
+ self updateContextsList.
1581
+ self updateSourceArea
1582
+ ! !
1583
+
1584
+ !Debugger methodsFor: 'rendering'!
1585
+
1586
+ renderBoxOn: html
1587
+ self
1588
+ renderTopPanelOn: html;
1589
+ renderBottomPanelOn: html
1590
+ !
1591
+
1592
+ renderTopPanelOn: html
1593
+ selectedContext := self error context.
1594
+ html div
1595
+ class: 'top';
1596
+ with: [
1597
+ html div
1598
+ class: 'label';
1599
+ with: self error messageText.
1600
+ ul := html ul
1601
+ class: 'jt_column debugger contexts';
1602
+ with: [self renderContext: self error context on: html]]
1603
+ !
1604
+
1605
+ renderContext: aContext on: html
1606
+ | li |
1607
+ li := html li.
1608
+ selectedContext = aContext ifTrue: [
1609
+ li class: 'selected'].
1610
+ li
1611
+ with: aContext asString;
1612
+ onClick: [self selectContext: aContext].
1613
+ aContext home ifNotNil: [self renderContext: aContext home on: html]
1614
+ !
1615
+
1616
+ renderBottomPanelOn: html
1617
+ html div
1618
+ class: 'jt_sourceCode';
1619
+ with: [
1620
+ sourceArea := SourceArea new.
1621
+ sourceArea renderOn: html].
1622
+ self updateSourceArea
1623
+ ! !
1624
+
1625
+ !Debugger methodsFor: 'testing'!
1626
+
1627
+ canBeClosed
1628
+ ^true
1629
+ ! !
1630
+
1631
+ !Debugger methodsFor: 'updating'!
1632
+
1633
+ updateContextsList
1634
+ ul contents: [:html |
1635
+ self renderContext: self error context on: html]
1636
+ !
1637
+
1638
+ updateSourceArea
1639
+ sourceArea val: (selectedContext receiver class methodAt: selectedContext selector) source
1640
+ ! !
1641
+
1642
+ ErrorHandler subclass: #DebugErrorHandler
1643
+ instanceVariableNames: ''
1644
+ category: 'IDE'!
1645
+
1646
+ !DebugErrorHandler methodsFor: 'error handling'!
1647
+
1648
+ handleError: anError
1649
+ [Debugger new
1650
+ error: anError;
1651
+ open] on: Error do: [:error |
1652
+ ErrorHandler new handleError: error]
1653
+ ! !
1654
+
1655
+ !DebugErrorHandler class methodsFor: 'initialization'!
1656
+
1657
+ initialize
1658
+ self register
1659
+ ! !
1660
+
1661
+ !Object methodsFor: '*IDE'!
1662
+
1663
+ inspect
1664
+ Inspector new
1665
+ inspect: self;
1666
+ open
1667
+ !
1668
+
1669
+ inspectOn: anInspector
1670
+ | variables |
1671
+ variables := Dictionary new.
1672
+ variables at: '#self' put: self.
1673
+ self class allInstanceVariableNames do: [:each |
1674
+ variables at: each put: (self instVarAt: each)].
1675
+ anInspector
1676
+ setLabel: self printString;
1677
+ setVariables: variables
1678
+ ! !
1679
+
1680
+ !Date methodsFor: '*IDE'!
1681
+
1682
+ inspectOn: anInspector
1683
+ | variables |
1684
+ variables := Dictionary new.
1685
+ variables at: '#self' put: self.
1686
+ variables at: '#year' put: self year.
1687
+ variables at: '#month' put: self month.
1688
+ variables at: '#day' put: self day.
1689
+ variables at: '#hours' put: self hours.
1690
+ variables at: '#minutes' put: self minutes.
1691
+ variables at: '#seconds' put: self seconds.
1692
+ variables at: '#milliseconds' put: self milliseconds.
1693
+ anInspector
1694
+ setLabel: self printString;
1695
+ setVariables: variables
1696
+ ! !
1697
+
1698
+ !Collection methodsFor: '*IDE'!
1699
+
1700
+ inspectOn: anInspector
1701
+ | variables |
1702
+ variables := Dictionary new.
1703
+ variables at: '#self' put: self.
1704
+ self withIndexDo: [:each :i |
1705
+ variables at: i put: each].
1706
+ anInspector
1707
+ setLabel: self printString;
1708
+ setVariables: variables
1709
+ ! !
1710
+
1711
+ !String methodsFor: '*IDE'!
1712
+
1713
+ inspectOn: anInspector
1714
+ | label |
1715
+ super inspectOn: anInspector.
1716
+ self printString size > 30
1717
+ ifTrue: [label := (self printString copyFrom: 1 to: 30), '...''']
1718
+ ifFalse: [label := self printString].
1719
+ anInspector setLabel: label
1720
+ ! !
1721
+
1722
+ !MethodContext methodsFor: '*IDE'!
1723
+
1724
+ inspectOn: anInspector
1725
+ | variables |
1726
+ variables := Dictionary new.
1727
+ variables at: '#self' put: self.
1728
+ variables at: '#home' put: self home.
1729
+ variables at: '#receiver' put: self receiver.
1730
+ variables at: '#selector' put: self selector.
1731
+ variables at: '#temps' put: self temps.
1732
+ self class instanceVariableNames do: [:each |
1733
+ variables at: each put: (self instVarAt: each)].
1734
+ anInspector
1735
+ setLabel: self printString;
1736
+ setVariables: variables
1737
+ ! !
1738
+
1739
+ !Dictionary methodsFor: '*IDE'!
1740
+
1741
+ inspectOn: anInspector
1742
+ | variables |
1743
+ variables := Dictionary new.
1744
+ variables at: '#self' put: self.
1745
+ variables at: '#keys' put: self keys.
1746
+ self keysAndValuesDo: [:key :value |
1747
+ variables at: key put: value].
1748
+ anInspector
1749
+ setLabel: self printString;
1750
+ setVariables: variables
1751
+ ! !
1752
+