resin 0.0.7 → 0.0.8
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.
- data/amber/css/amber-normalize.css +468 -0
- data/amber/css/amber-normalize.less +501 -0
- data/amber/css/amber.css +9 -6
- data/amber/js/IDE.deploy.js +443 -440
- data/amber/js/IDE.js +704 -701
- data/amber/js/Kernel-Collections.deploy.js +399 -363
- data/amber/js/Kernel-Collections.js +466 -415
- data/amber/js/Kernel-Objects.deploy.js +55 -10
- data/amber/js/Kernel-Objects.js +80 -15
- data/amber/js/Kernel-Tests.deploy.js +216 -166
- data/amber/js/Kernel-Tests.js +266 -196
- data/amber/js/amber.js +7 -2
- data/amber/js/init.js +2 -1
- data/amber/st/IDE.st +362 -360
- data/amber/st/Kernel-Collections.st +85 -62
- data/amber/st/Kernel-Objects.st +29 -2
- data/amber/st/Kernel-Tests.st +63 -38
- metadata +20 -18
data/amber/st/IDE.st
CHANGED
@@ -1,185 +1,295 @@
|
|
1
1
|
Smalltalk current createPackage: 'IDE' properties: #{}!
|
2
|
-
|
3
|
-
instanceVariableNames: ''
|
4
|
-
category: 'IDE'!
|
5
|
-
|
6
|
-
!DebugErrorHandler methodsFor: 'error handling'!
|
7
|
-
|
8
|
-
handleError: anError
|
9
|
-
[Debugger new
|
10
|
-
error: anError;
|
11
|
-
open] on: Error do: [:error |
|
12
|
-
ErrorHandler new handleError: error]
|
13
|
-
! !
|
14
|
-
|
15
|
-
!DebugErrorHandler class methodsFor: 'initialization'!
|
16
|
-
|
17
|
-
initialize
|
18
|
-
self register
|
19
|
-
! !
|
20
|
-
|
21
|
-
Widget subclass: #ClassesListNode
|
22
|
-
instanceVariableNames: 'browser theClass level nodes'
|
2
|
+
Widget subclass: #TabManager
|
3
|
+
instanceVariableNames: 'selectedTab tabs opened ul input'
|
23
4
|
category: 'IDE'!
|
24
5
|
|
25
|
-
!
|
26
|
-
|
27
|
-
renderOn: html
|
28
|
-
| li cssClass |
|
29
|
-
cssClass := ''.
|
30
|
-
li := html li
|
31
|
-
onClick: [self browser selectClass: self theClass].
|
32
|
-
li asJQuery html: self label.
|
33
|
-
|
34
|
-
self browser selectedClass = self theClass ifTrue: [
|
35
|
-
cssClass := cssClass, ' selected'].
|
36
|
-
|
37
|
-
self theClass comment isEmpty ifFalse: [
|
38
|
-
cssClass := cssClass, ' commented'].
|
6
|
+
!TabManager methodsFor: 'accessing'!
|
39
7
|
|
40
|
-
|
8
|
+
tabs
|
9
|
+
^tabs ifNil: [tabs := Array new]
|
10
|
+
!
|
41
11
|
|
42
|
-
|
43
|
-
|
12
|
+
labelFor: aWidget
|
13
|
+
| label maxSize |
|
14
|
+
maxSize := 15.
|
15
|
+
label := aWidget label copyFrom: 0 to: (aWidget label size min: maxSize).
|
16
|
+
aWidget label size > maxSize ifTrue: [
|
17
|
+
label := label, '...'].
|
18
|
+
^label
|
44
19
|
! !
|
45
20
|
|
46
|
-
!
|
47
|
-
|
48
|
-
nodes
|
49
|
-
^nodes
|
50
|
-
!
|
51
|
-
|
52
|
-
theClass
|
53
|
-
^theClass
|
54
|
-
!
|
21
|
+
!TabManager methodsFor: 'actions'!
|
55
22
|
|
56
|
-
|
57
|
-
|
23
|
+
updateBodyMargin
|
24
|
+
self setBodyMargin: '#jtalk' asJQuery height
|
58
25
|
!
|
59
26
|
|
60
|
-
|
61
|
-
|
27
|
+
updatePosition
|
28
|
+
<jQuery('#jtalk').css('top', '').css('bottom', '0px')>
|
62
29
|
!
|
63
30
|
|
64
|
-
|
65
|
-
|
31
|
+
removeBodyMargin
|
32
|
+
self setBodyMargin: 0
|
66
33
|
!
|
67
34
|
|
68
|
-
|
69
|
-
|
35
|
+
setBodyMargin: anInteger
|
36
|
+
'.jtalkBody' asJQuery css: 'margin-bottom' put: anInteger asString, 'px'
|
70
37
|
!
|
71
38
|
|
72
|
-
|
73
|
-
|
39
|
+
onResize: aBlock
|
40
|
+
<jQuery('#jtalk').resizable({
|
41
|
+
handles: 'n',
|
42
|
+
resize: aBlock,
|
43
|
+
minHeight: 230
|
44
|
+
})>
|
74
45
|
!
|
75
46
|
|
76
|
-
|
77
|
-
|
78
|
-
str := String new writeStream.
|
79
|
-
self level timesRepeat: [
|
80
|
-
str nextPutAll: ' '].
|
81
|
-
str nextPutAll: self theClass name.
|
82
|
-
^str contents
|
47
|
+
onWindowResize: aBlock
|
48
|
+
<jQuery(window).resize(aBlock)>
|
83
49
|
!
|
84
50
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
nodes:= children collect: [:each |
|
94
|
-
ClassesListNode on: each browser: self browser classes: others level: self level + 1]
|
95
|
-
! !
|
96
|
-
|
97
|
-
!ClassesListNode class methodsFor: 'instance creation'!
|
98
|
-
|
99
|
-
on: aClass browser: aBrowser classes: aCollection level: anInteger
|
100
|
-
^self new
|
101
|
-
theClass: aClass;
|
102
|
-
browser: aBrowser;
|
103
|
-
level: anInteger;
|
104
|
-
getNodesFrom: aCollection;
|
105
|
-
yourself
|
106
|
-
! !
|
107
|
-
|
108
|
-
Widget subclass: #ClassesList
|
109
|
-
instanceVariableNames: 'browser ul nodes'
|
110
|
-
category: 'IDE'!
|
111
|
-
|
112
|
-
!ClassesList methodsFor: 'accessing'!
|
113
|
-
|
114
|
-
category
|
115
|
-
^self browser selectedPackage
|
51
|
+
open
|
52
|
+
opened ifFalse: [
|
53
|
+
'body' asJQuery addClass: 'jtalkBody'.
|
54
|
+
'#jtalk' asJQuery show.
|
55
|
+
ul asJQuery show.
|
56
|
+
self updateBodyMargin.
|
57
|
+
selectedTab show.
|
58
|
+
opened := true]
|
116
59
|
!
|
117
60
|
|
118
|
-
|
119
|
-
|
120
|
-
|
61
|
+
close
|
62
|
+
opened ifTrue: [
|
63
|
+
'#jtalk' asJQuery hide.
|
64
|
+
ul asJQuery hide.
|
65
|
+
selectedTab hide.
|
66
|
+
self removeBodyMargin.
|
67
|
+
'body' asJQuery removeClass: 'jtalkBody'.
|
68
|
+
opened := false]
|
121
69
|
!
|
122
70
|
|
123
|
-
|
124
|
-
|
71
|
+
newBrowserTab
|
72
|
+
Browser open
|
125
73
|
!
|
126
74
|
|
127
|
-
|
128
|
-
|
75
|
+
selectTab: aWidget
|
76
|
+
self open.
|
77
|
+
selectedTab := aWidget.
|
78
|
+
self tabs do: [:each |
|
79
|
+
each hide].
|
80
|
+
aWidget show.
|
81
|
+
|
82
|
+
self update
|
129
83
|
!
|
130
84
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
classes do: [:each |
|
137
|
-
(classes includes: each superclass)
|
138
|
-
ifFalse: [children add: each]
|
139
|
-
ifTrue: [others add: each]].
|
140
|
-
^children collect: [:each |
|
141
|
-
ClassesListNode on: each browser: self browser classes: others level: 0]
|
85
|
+
closeTab: aWidget
|
86
|
+
self removeTab: aWidget.
|
87
|
+
self selectTab: self tabs last.
|
88
|
+
aWidget remove.
|
89
|
+
self update
|
142
90
|
!
|
143
91
|
|
144
|
-
|
145
|
-
|
92
|
+
search: aString
|
93
|
+
| searchedClass |
|
94
|
+
searchedClass := Smalltalk current at: aString.
|
95
|
+
searchedClass isClass
|
96
|
+
ifTrue: [Browser openOn: searchedClass]
|
97
|
+
ifFalse: [ReferencesBrowser search: aString]
|
146
98
|
! !
|
147
99
|
|
148
|
-
!
|
100
|
+
!TabManager methodsFor: 'adding/Removing'!
|
149
101
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
self updateNodes
|
102
|
+
addTab: aWidget
|
103
|
+
self tabs add: aWidget.
|
104
|
+
aWidget appendToJQuery: '#jtalk' asJQuery.
|
105
|
+
aWidget hide
|
155
106
|
!
|
156
107
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
each renderOn: html]]
|
108
|
+
removeTab: aWidget
|
109
|
+
self tabs remove: aWidget.
|
110
|
+
self update
|
161
111
|
! !
|
162
112
|
|
163
|
-
!
|
113
|
+
!TabManager methodsFor: 'initialization'!
|
164
114
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
115
|
+
initialize
|
116
|
+
super initialize.
|
117
|
+
opened := true.
|
118
|
+
[:html | html div id: 'jtalk'] appendToJQuery: 'body' asJQuery.
|
119
|
+
'body' asJQuery
|
120
|
+
addClass: 'jtalkBody'.
|
121
|
+
self appendToJQuery: '#jtalk' asJQuery.
|
122
|
+
self
|
123
|
+
addTab: IDETranscript current;
|
124
|
+
addTab: Workspace new;
|
125
|
+
addTab: TestRunner new.
|
126
|
+
self selectTab: self tabs last.
|
127
|
+
self
|
128
|
+
onResize: [self updateBodyMargin; updatePosition];
|
129
|
+
onWindowResize: [self updatePosition]
|
169
130
|
! !
|
170
131
|
|
171
|
-
|
172
|
-
instanceVariableNames: 'editor div receiver onDoIt'
|
173
|
-
category: 'IDE'!
|
174
|
-
|
175
|
-
!SourceArea methodsFor: 'accessing'!
|
132
|
+
!TabManager methodsFor: 'rendering'!
|
176
133
|
|
177
|
-
|
178
|
-
|
134
|
+
renderOn: html
|
135
|
+
html div id: 'logo'.
|
136
|
+
self renderToolbarOn: html.
|
137
|
+
ul := html ul
|
138
|
+
id: 'jtalkTabs';
|
139
|
+
yourself.
|
140
|
+
self renderTabs
|
179
141
|
!
|
180
142
|
|
181
|
-
|
182
|
-
|
143
|
+
renderTabFor: aWidget on: html
|
144
|
+
| li |
|
145
|
+
li := html li.
|
146
|
+
selectedTab = aWidget ifTrue: [
|
147
|
+
li class: 'selected'].
|
148
|
+
li with: [
|
149
|
+
html span class: 'ltab'.
|
150
|
+
html span
|
151
|
+
class: 'mtab';
|
152
|
+
with: [
|
153
|
+
aWidget canBeClosed ifTrue: [
|
154
|
+
html span
|
155
|
+
class: 'close';
|
156
|
+
with: 'x';
|
157
|
+
onClick: [self closeTab: aWidget]].
|
158
|
+
html span with: (self labelFor: aWidget)].
|
159
|
+
html span class: 'rtab'];
|
160
|
+
onClick: [self selectTab: aWidget]
|
161
|
+
!
|
162
|
+
|
163
|
+
renderTabs
|
164
|
+
ul contents: [:html |
|
165
|
+
self tabs do: [:each |
|
166
|
+
self renderTabFor: each on: html].
|
167
|
+
html li
|
168
|
+
class: 'newtab';
|
169
|
+
with: [
|
170
|
+
html span class: 'ltab'.
|
171
|
+
html span class: 'mtab'; with: ' + '.
|
172
|
+
html span class: 'rtab'];
|
173
|
+
onClick: [self newBrowserTab]]
|
174
|
+
!
|
175
|
+
|
176
|
+
renderToolbarOn: html
|
177
|
+
html div
|
178
|
+
id: 'jt_toolbar';
|
179
|
+
with: [
|
180
|
+
input := html input
|
181
|
+
class: 'implementors';
|
182
|
+
yourself.
|
183
|
+
input onKeyPress: [:event |
|
184
|
+
event keyCode = 13 ifTrue: [
|
185
|
+
self search: input asJQuery val]].
|
186
|
+
html div id: 'jt_close'; onClick: [self close]]
|
187
|
+
! !
|
188
|
+
|
189
|
+
!TabManager methodsFor: 'updating'!
|
190
|
+
|
191
|
+
update
|
192
|
+
self renderTabs
|
193
|
+
! !
|
194
|
+
|
195
|
+
TabManager class instanceVariableNames: 'current'!
|
196
|
+
|
197
|
+
!TabManager class methodsFor: 'instance creation'!
|
198
|
+
|
199
|
+
current
|
200
|
+
^current ifNil: [current := super new]
|
201
|
+
!
|
202
|
+
|
203
|
+
new
|
204
|
+
self shouldNotImplement
|
205
|
+
! !
|
206
|
+
|
207
|
+
Widget subclass: #TabWidget
|
208
|
+
instanceVariableNames: 'div'
|
209
|
+
category: 'IDE'!
|
210
|
+
|
211
|
+
!TabWidget methodsFor: 'accessing'!
|
212
|
+
|
213
|
+
label
|
214
|
+
self subclassResponsibility
|
215
|
+
! !
|
216
|
+
|
217
|
+
!TabWidget methodsFor: 'actions'!
|
218
|
+
|
219
|
+
open
|
220
|
+
TabManager current addTab: self.
|
221
|
+
TabManager current selectTab: self
|
222
|
+
!
|
223
|
+
|
224
|
+
show
|
225
|
+
div asJQuery show
|
226
|
+
!
|
227
|
+
|
228
|
+
hide
|
229
|
+
div asJQuery hide
|
230
|
+
!
|
231
|
+
|
232
|
+
remove
|
233
|
+
div asJQuery remove
|
234
|
+
!
|
235
|
+
|
236
|
+
close
|
237
|
+
TabManager current closeTab: self
|
238
|
+
! !
|
239
|
+
|
240
|
+
!TabWidget methodsFor: 'rendering'!
|
241
|
+
|
242
|
+
renderOn: html
|
243
|
+
div := html div
|
244
|
+
class: 'jtalkTool';
|
245
|
+
yourself.
|
246
|
+
self renderTab
|
247
|
+
!
|
248
|
+
|
249
|
+
renderBoxOn: html
|
250
|
+
!
|
251
|
+
|
252
|
+
renderButtonsOn: html
|
253
|
+
!
|
254
|
+
|
255
|
+
update
|
256
|
+
self renderTab
|
257
|
+
!
|
258
|
+
|
259
|
+
renderTab
|
260
|
+
div contents: [:html |
|
261
|
+
html div
|
262
|
+
class: 'jt_box';
|
263
|
+
with: [self renderBoxOn: html].
|
264
|
+
html div
|
265
|
+
class: 'jt_buttons';
|
266
|
+
with: [self renderButtonsOn: html]]
|
267
|
+
! !
|
268
|
+
|
269
|
+
!TabWidget methodsFor: 'testing'!
|
270
|
+
|
271
|
+
canBeClosed
|
272
|
+
^false
|
273
|
+
! !
|
274
|
+
|
275
|
+
!TabWidget class methodsFor: 'instance creation'!
|
276
|
+
|
277
|
+
open
|
278
|
+
^self new open
|
279
|
+
! !
|
280
|
+
|
281
|
+
Widget subclass: #SourceArea
|
282
|
+
instanceVariableNames: 'editor div receiver onDoIt'
|
283
|
+
category: 'IDE'!
|
284
|
+
|
285
|
+
!SourceArea methodsFor: 'accessing'!
|
286
|
+
|
287
|
+
val
|
288
|
+
^editor getValue
|
289
|
+
!
|
290
|
+
|
291
|
+
val: aString
|
292
|
+
editor setValue: aString
|
183
293
|
!
|
184
294
|
|
185
295
|
currentLine
|
@@ -328,283 +438,173 @@ renderOn: html
|
|
328
438
|
div onKeyDown: [:e | self handleKeyDown: e]
|
329
439
|
! !
|
330
440
|
|
331
|
-
Widget subclass: #
|
332
|
-
instanceVariableNames: '
|
441
|
+
Widget subclass: #ClassesList
|
442
|
+
instanceVariableNames: 'browser ul nodes'
|
333
443
|
category: 'IDE'!
|
334
444
|
|
335
|
-
!
|
336
|
-
|
337
|
-
label
|
338
|
-
self subclassResponsibility
|
339
|
-
! !
|
445
|
+
!ClassesList methodsFor: 'accessing'!
|
340
446
|
|
341
|
-
|
447
|
+
category
|
448
|
+
^self browser selectedPackage
|
449
|
+
!
|
342
450
|
|
343
|
-
|
344
|
-
|
345
|
-
|
451
|
+
nodes
|
452
|
+
nodes ifNil: [nodes := self getNodes].
|
453
|
+
^nodes
|
346
454
|
!
|
347
455
|
|
348
|
-
|
349
|
-
|
456
|
+
browser
|
457
|
+
^browser
|
350
458
|
!
|
351
459
|
|
352
|
-
|
353
|
-
|
460
|
+
browser: aBrowser
|
461
|
+
browser := aBrowser
|
354
462
|
!
|
355
463
|
|
356
|
-
|
357
|
-
|
464
|
+
getNodes
|
465
|
+
| classes children others |
|
466
|
+
classes := self browser classes.
|
467
|
+
children := #().
|
468
|
+
others := #().
|
469
|
+
classes do: [:each |
|
470
|
+
(classes includes: each superclass)
|
471
|
+
ifFalse: [children add: each]
|
472
|
+
ifTrue: [others add: each]].
|
473
|
+
^children collect: [:each |
|
474
|
+
ClassesListNode on: each browser: self browser classes: others level: 0]
|
358
475
|
!
|
359
476
|
|
360
|
-
|
361
|
-
|
477
|
+
resetNodes
|
478
|
+
nodes := nil
|
362
479
|
! !
|
363
480
|
|
364
|
-
!
|
481
|
+
!ClassesList methodsFor: 'rendering'!
|
365
482
|
|
366
483
|
renderOn: html
|
367
|
-
|
368
|
-
class: '
|
484
|
+
ul := html ul
|
485
|
+
class: 'jt_column browser classes';
|
369
486
|
yourself.
|
370
|
-
self
|
371
|
-
!
|
372
|
-
|
373
|
-
renderBoxOn: html
|
374
|
-
!
|
375
|
-
|
376
|
-
renderButtonsOn: html
|
377
|
-
!
|
378
|
-
|
379
|
-
update
|
380
|
-
self renderTab
|
487
|
+
self updateNodes
|
381
488
|
!
|
382
489
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
with: [self renderBoxOn: html].
|
388
|
-
html div
|
389
|
-
class: 'jt_buttons';
|
390
|
-
with: [self renderButtonsOn: html]]
|
391
|
-
! !
|
392
|
-
|
393
|
-
!TabWidget methodsFor: 'testing'!
|
394
|
-
|
395
|
-
canBeClosed
|
396
|
-
^false
|
490
|
+
updateNodes
|
491
|
+
ul contents: [:html |
|
492
|
+
self nodes do: [:each |
|
493
|
+
each renderOn: html]]
|
397
494
|
! !
|
398
495
|
|
399
|
-
!
|
496
|
+
!ClassesList class methodsFor: 'instance creation'!
|
400
497
|
|
401
|
-
|
402
|
-
|
498
|
+
on: aBrowser
|
499
|
+
^self new
|
500
|
+
browser: aBrowser;
|
501
|
+
yourself
|
403
502
|
! !
|
404
503
|
|
405
|
-
Widget subclass: #
|
406
|
-
instanceVariableNames: '
|
504
|
+
Widget subclass: #ClassesListNode
|
505
|
+
instanceVariableNames: 'browser theClass level nodes'
|
407
506
|
category: 'IDE'!
|
408
507
|
|
409
|
-
!
|
410
|
-
|
411
|
-
tabs
|
412
|
-
^tabs ifNil: [tabs := Array new]
|
413
|
-
!
|
508
|
+
!ClassesListNode methodsFor: ''!
|
414
509
|
|
415
|
-
|
416
|
-
|
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
^label
|
422
|
-
! !
|
510
|
+
renderOn: html
|
511
|
+
| li cssClass |
|
512
|
+
cssClass := ''.
|
513
|
+
li := html li
|
514
|
+
onClick: [self browser selectClass: self theClass].
|
515
|
+
li asJQuery html: self label.
|
423
516
|
|
424
|
-
|
517
|
+
self browser selectedClass = self theClass ifTrue: [
|
518
|
+
cssClass := cssClass, ' selected'].
|
425
519
|
|
426
|
-
|
427
|
-
|
428
|
-
!
|
520
|
+
self theClass comment isEmpty ifFalse: [
|
521
|
+
cssClass := cssClass, ' commented'].
|
429
522
|
|
430
|
-
|
431
|
-
<jQuery('#jtalk').css('top', '').css('bottom', '0px')>
|
432
|
-
!
|
523
|
+
li class: cssClass.
|
433
524
|
|
434
|
-
|
435
|
-
|
436
|
-
!
|
525
|
+
self nodes do: [:each |
|
526
|
+
each renderOn: html]
|
527
|
+
! !
|
437
528
|
|
438
|
-
|
439
|
-
'.jtalkBody' asJQuery css: 'margin-bottom' put: anInteger asString, 'px'
|
440
|
-
!
|
529
|
+
!ClassesListNode methodsFor: 'accessing'!
|
441
530
|
|
442
|
-
|
443
|
-
|
444
|
-
handles: 'n',
|
445
|
-
resize: aBlock,
|
446
|
-
minHeight: 230
|
447
|
-
})>
|
531
|
+
nodes
|
532
|
+
^nodes
|
448
533
|
!
|
449
534
|
|
450
|
-
|
451
|
-
|
535
|
+
theClass
|
536
|
+
^theClass
|
452
537
|
!
|
453
538
|
|
454
|
-
|
455
|
-
|
456
|
-
'body' asJQuery addClass: 'jtalkBody'.
|
457
|
-
'#jtalk' asJQuery show.
|
458
|
-
ul asJQuery show.
|
459
|
-
self updateBodyMargin.
|
460
|
-
selectedTab show.
|
461
|
-
opened := true]
|
539
|
+
theClass: aClass
|
540
|
+
theClass := aClass
|
462
541
|
!
|
463
542
|
|
464
|
-
|
465
|
-
|
466
|
-
'#jtalk' asJQuery hide.
|
467
|
-
ul asJQuery hide.
|
468
|
-
selectedTab hide.
|
469
|
-
self removeBodyMargin.
|
470
|
-
'body' asJQuery removeClass: 'jtalkBody'.
|
471
|
-
opened := false]
|
543
|
+
browser
|
544
|
+
^browser
|
472
545
|
!
|
473
546
|
|
474
|
-
|
475
|
-
|
547
|
+
browser: aBrowser
|
548
|
+
browser := aBrowser
|
476
549
|
!
|
477
550
|
|
478
|
-
|
479
|
-
|
480
|
-
selectedTab := aWidget.
|
481
|
-
self tabs do: [:each |
|
482
|
-
each hide].
|
483
|
-
aWidget show.
|
484
|
-
|
485
|
-
self update
|
551
|
+
level
|
552
|
+
^level
|
486
553
|
!
|
487
554
|
|
488
|
-
|
489
|
-
|
490
|
-
self selectTab: self tabs last.
|
491
|
-
aWidget remove.
|
492
|
-
self update
|
555
|
+
level: anInteger
|
556
|
+
level := anInteger
|
493
557
|
!
|
494
558
|
|
495
|
-
|
496
|
-
|
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
!TabManager methodsFor: 'adding/Removing'!
|
504
|
-
|
505
|
-
addTab: aWidget
|
506
|
-
self tabs add: aWidget.
|
507
|
-
aWidget appendToJQuery: '#jtalk' asJQuery.
|
508
|
-
aWidget hide
|
559
|
+
label
|
560
|
+
| str |
|
561
|
+
str := String new writeStream.
|
562
|
+
self level timesRepeat: [
|
563
|
+
str nextPutAll: ' '].
|
564
|
+
str nextPutAll: self theClass name.
|
565
|
+
^str contents
|
509
566
|
!
|
510
567
|
|
511
|
-
|
512
|
-
|
513
|
-
|
568
|
+
getNodesFrom: aCollection
|
569
|
+
| children others |
|
570
|
+
children := #().
|
571
|
+
others := #().
|
572
|
+
aCollection do: [:each |
|
573
|
+
(each superclass = self theClass)
|
574
|
+
ifTrue: [children add: each]
|
575
|
+
ifFalse: [others add: each]].
|
576
|
+
nodes:= children collect: [:each |
|
577
|
+
ClassesListNode on: each browser: self browser classes: others level: self level + 1]
|
514
578
|
! !
|
515
579
|
|
516
|
-
!
|
580
|
+
!ClassesListNode class methodsFor: 'instance creation'!
|
517
581
|
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
self
|
526
|
-
addTab: IDETranscript current;
|
527
|
-
addTab: Workspace new;
|
528
|
-
addTab: TestRunner new.
|
529
|
-
self selectTab: self tabs last.
|
530
|
-
self
|
531
|
-
onResize: [self updateBodyMargin; updatePosition];
|
532
|
-
onWindowResize: [self updatePosition]
|
582
|
+
on: aClass browser: aBrowser classes: aCollection level: anInteger
|
583
|
+
^self new
|
584
|
+
theClass: aClass;
|
585
|
+
browser: aBrowser;
|
586
|
+
level: anInteger;
|
587
|
+
getNodesFrom: aCollection;
|
588
|
+
yourself
|
533
589
|
! !
|
534
590
|
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
html div id: 'logo'.
|
539
|
-
self renderToolbarOn: html.
|
540
|
-
ul := html ul
|
541
|
-
id: 'jtalkTabs';
|
542
|
-
yourself.
|
543
|
-
self renderTabs
|
544
|
-
!
|
545
|
-
|
546
|
-
renderTabFor: aWidget on: html
|
547
|
-
| li |
|
548
|
-
li := html li.
|
549
|
-
selectedTab = aWidget ifTrue: [
|
550
|
-
li class: 'selected'].
|
551
|
-
li with: [
|
552
|
-
html span class: 'ltab'.
|
553
|
-
html span
|
554
|
-
class: 'mtab';
|
555
|
-
with: [
|
556
|
-
aWidget canBeClosed ifTrue: [
|
557
|
-
html span
|
558
|
-
class: 'close';
|
559
|
-
with: 'x';
|
560
|
-
onClick: [self closeTab: aWidget]].
|
561
|
-
html span with: (self labelFor: aWidget)].
|
562
|
-
html span class: 'rtab'];
|
563
|
-
onClick: [self selectTab: aWidget]
|
564
|
-
!
|
565
|
-
|
566
|
-
renderTabs
|
567
|
-
ul contents: [:html |
|
568
|
-
self tabs do: [:each |
|
569
|
-
self renderTabFor: each on: html].
|
570
|
-
html li
|
571
|
-
class: 'newtab';
|
572
|
-
with: [
|
573
|
-
html span class: 'ltab'.
|
574
|
-
html span class: 'mtab'; with: ' + '.
|
575
|
-
html span class: 'rtab'];
|
576
|
-
onClick: [self newBrowserTab]]
|
577
|
-
!
|
578
|
-
|
579
|
-
renderToolbarOn: html
|
580
|
-
html div
|
581
|
-
id: 'jt_toolbar';
|
582
|
-
with: [
|
583
|
-
input := html input
|
584
|
-
class: 'implementors';
|
585
|
-
yourself.
|
586
|
-
input onKeyPress: [:event |
|
587
|
-
event keyCode = 13 ifTrue: [
|
588
|
-
self search: input asJQuery val]].
|
589
|
-
html div id: 'jt_close'; onClick: [self close]]
|
590
|
-
! !
|
591
|
+
ErrorHandler subclass: #DebugErrorHandler
|
592
|
+
instanceVariableNames: ''
|
593
|
+
category: 'IDE'!
|
591
594
|
|
592
|
-
!
|
595
|
+
!DebugErrorHandler methodsFor: 'error handling'!
|
593
596
|
|
594
|
-
|
595
|
-
|
597
|
+
handleError: anError
|
598
|
+
[Debugger new
|
599
|
+
error: anError;
|
600
|
+
open] on: Error do: [:error |
|
601
|
+
ErrorHandler new handleError: error]
|
596
602
|
! !
|
597
603
|
|
598
|
-
|
599
|
-
|
600
|
-
!TabManager class methodsFor: 'instance creation'!
|
601
|
-
|
602
|
-
current
|
603
|
-
^current ifNil: [current := super new]
|
604
|
-
!
|
604
|
+
!DebugErrorHandler class methodsFor: 'initialization'!
|
605
605
|
|
606
|
-
|
607
|
-
|
606
|
+
initialize
|
607
|
+
self register
|
608
608
|
! !
|
609
609
|
|
610
610
|
TabWidget subclass: #Workspace
|
@@ -1098,7 +1098,7 @@ ajaxPutAt: anURL data: aString
|
|
1098
1098
|
jQuery
|
1099
1099
|
ajax: anURL options: #{ 'type' -> 'PUT'.
|
1100
1100
|
'data' -> aString.
|
1101
|
-
'contentType' -> 'text/plain'.
|
1101
|
+
'contentType' -> 'text/plain;charset=UTF-8'.
|
1102
1102
|
'error' -> [window alert: 'PUT request failed at: ', anURL] }
|
1103
1103
|
! !
|
1104
1104
|
|
@@ -1289,12 +1289,13 @@ updateSourceAndButtons
|
|
1289
1289
|
class: 'important';
|
1290
1290
|
with: 'New...'.
|
1291
1291
|
self protocols do: [:each |
|
1292
|
-
html option with: each
|
1292
|
+
option := html option with: each.
|
1293
|
+
selectedProtocol = each ifTrue: [ option at: 'selected' put: 'selected' ] ]].
|
1293
1294
|
selectedMethod isNil ifFalse: [
|
1294
1295
|
referencesSelect := html select.
|
1295
1296
|
referencesSelect
|
1296
1297
|
onChange: [self searchReferencesOf: referencesSelect asJQuery val];
|
1297
|
-
with: [
|
1298
|
+
with: [ |option|
|
1298
1299
|
html option
|
1299
1300
|
with: 'References';
|
1300
1301
|
at: 'disabled' put: 'disabled'.
|
@@ -2194,6 +2195,7 @@ cr
|
|
2194
2195
|
!
|
2195
2196
|
|
2196
2197
|
show: anObject
|
2198
|
+
textarea ifNil: [self open].
|
2197
2199
|
textarea asJQuery val: textarea asJQuery val, anObject asString.
|
2198
2200
|
!
|
2199
2201
|
|