1Object extend [
2
3    gtkInspect [
4	"Open a GtkInspector on self"
5	<category: '*VisualGST'>
6
7	VisualGST.GtkInspector openOn: self
8    ]
9
10    inspectorView [
11	<category: '*VisualGST'>
12
13	^ VisualGST.GtkObjectInspectorView
14    ]
15
16    hasLiterals [
17	<category: '*VisualGST'>
18
19	^ false
20    ]
21]
22
23CompiledMethod class extend [
24    ExtensionIcon := nil.
25    OverrideIcon := nil.
26    OverriddenIcon := nil.
27
28    extensionIcon [
29        <category: '*VisualGST'>
30
31        ^ ExtensionIcon ifNil: [ ExtensionIcon := GTK.GdkPixbuf newFromFile: (VisualGST.GtkLauncher / 'Icons/extension.png') file displayString error: nil ]
32    ]
33
34    extensionsIcon: aGdkPixbuf [
35        <category: '*VisualGST'>
36
37        ExtensionIcon := aGdkPixbuf
38    ]
39
40    overrideIcon [
41        <category: '*VisualGST'>
42
43        ^ OverrideIcon ifNil: [ OverrideIcon := GTK.GdkPixbuf newFromFile: (VisualGST.GtkLauncher / 'Icons/override.png') file displayString error: nil ]
44    ]
45
46    overrideIcon: aGdkPixbuf [
47        <category: '*VisualGST'>
48
49        OverrideIcon := aGdkPixbuf
50    ]
51
52    overriddenIcon [
53        <category: '*VisualGST'>
54
55        ^ OverriddenIcon ifNil: [ OverriddenIcon := GTK.GdkPixbuf newFromFile: (VisualGST.GtkLauncher / 'Icons/overridden.png') file displayString error: nil ]
56    ]
57
58    overriddenIcon: aGdkPixbuf [
59        <category: '*VisualGST'>
60
61        OverriddenIcon := aGdkPixbuf
62    ]
63]
64
65CompiledMethod extend [
66    override [
67	<category: '*VisualGST'>
68
69	self methodClass superclass ifNil: [ ^ false ].
70	^ (self methodClass superclass lookupSelector: self selector) isNil not
71    ]
72
73    overridden [
74        <category: '*VisualGST'>
75
76	| set |
77	set := Set new.
78	set addAll: self methodClass subclasses.
79	set do: [ :each |
80	    each methodDictionary ifNotNil: [ :dic | dic at: self selector ifPresent: [ :mth | ^ true ] ] ].
81	^ false
82    ]
83
84    methodViewIcon [
85        <category: '*VisualGST'>
86
87	self methodCategory first = $* ifTrue: [ ^ self class extensionIcon ].
88        self overridden ifTrue: [ ^ self class overriddenIcon ].
89        self override ifTrue: [ ^ self class overrideIcon ].
90        ^ nil
91    ]
92
93    inspectorView [
94        <category: '*VisualGST'>
95
96        ^ VisualGST.GtkCompiledMethodInspectorView
97    ]
98]
99
100CompiledBlock extend [
101    inspectorView [
102        <category: '*VisualGST'>
103
104        ^ VisualGST.GtkCompiledBlockInspectorView
105    ]
106
107    methodRecompilationSourceString [
108	<category: '*VisualGST'>
109
110	^ self method methodRecompilationSourceString
111    ]
112]
113
114SequenceableCollection extend [
115    inspectorView [
116        <category: '*VisualGST'>
117
118        ^ VisualGST.GtkSequenceableCollectionInspectorView
119    ]
120]
121
122Set extend [
123    inspectorView [
124        <category: '*VisualGST'>
125
126        ^ VisualGST.GtkSetInspectorView
127    ]
128]
129
130Dictionary extend [
131    inspectorView [
132        <category: '*VisualGST'>
133
134        ^ VisualGST.GtkDictionaryInspectorView
135    ]
136]
137
138Character extend [
139    inspectorView [
140        <category: '*VisualGST'>
141
142        ^ VisualGST.GtkCharacterInspectorView
143    ]
144]
145
146Integer extend [
147    inspectorView [
148        <category: '*VisualGST'>
149
150        ^ VisualGST.GtkIntegerInspectorView
151    ]
152]
153
154Float extend [
155    inspectorView [
156        <category: '*VisualGST'>
157
158        ^ VisualGST.GtkFloatInspectorView
159    ]
160]
161
162Symbol extend [
163    hasLiterals [
164	<category: '*VisualGST'>
165
166	^ true
167    ]
168
169    symbolFromliterals [
170	<category: '*VisualGST'>
171
172	^ {self}
173    ]
174]
175
176Array extend [
177    hasLiterals [
178	<category: '*VisualGST'>
179
180	self do: [ :each |
181	    each hasLiterals ifTrue: [ ^ true ] ].
182	^ false
183    ]
184
185    symbolFromliterals [
186        <category: '*VisualGST'>
187
188	| result |
189	result := OrderedCollection new.
190	self do: [ :each |
191	    each hasLiterals ifTrue: [ result add: each symbolFromliterals first ] ].
192        ^ result
193    ]
194]
195
196Class extend [
197
198    subclass: classNameString environment: aNamespace [
199	<category: '*VisualGST'>
200
201        "Define a subclass of the receiver with the given name.  If the class
202	 is already defined, don't modify its instance or class variables
203         but still, if necessary, recompile everything needed."
204
205	| meta |
206	KernelInitialized ifFalse: [^Smalltalk at: classNameString].
207	meta := self metaclassFor: classNameString.
208	^ meta
209	    name: classNameString
210	    environment: aNamespace
211	    subclassOf: self
212    ]
213]
214
215CompiledCode extend [
216
217    hasLiterals [
218	<category: '*VisualGST'>
219
220	^ self literals isEmpty not
221    ]
222
223    isSendingWithSpecialSelector: aByteCode [
224	<category: '*VisualGST'>
225
226	^ aByteCode <= 31
227    ]
228
229    specialSelectorSended: aByteCode and: anOperand [
230	<category: '*VisualGST'>
231
232	(self isSendingWithSpecialSelector: aByteCode) ifFalse: [ ^ self error: 'bad byte code' ].
233	aByteCode <= 26 ifTrue: [ ^ self class specialSelectors at: aByteCode + 1 ].
234        (aByteCode = 30 or: [ aByteCode = 31 ]) ifTrue: [ ^ self class specialSelectors at: anOperand + 1 ].
235    ]
236
237    extractSpecialSelectors [
238	<category: '*VisualGST'>
239
240	| result |
241	result := Set new.
242        self allByteCodeIndicesDo: [ :i :bytecode :operand |
243	    (self isSendingWithSpecialSelector: bytecode) ifTrue: [
244		result add: (self specialSelectorSended: bytecode and: operand) ] ].
245	^ result
246    ]
247
248    literalsAndSpecialSelectors [
249	<category: '*VisualGST'>
250
251	"Answer whether the receiver refers to the given object"
252
253        | result |
254	result := Set new.
255	self literalsDo: [ :each |
256	    each hasLiterals ifTrue: [ result addAll: each symbolFromliterals ] ].
257
258        ^ result + self extractSpecialSelectors
259    ]
260
261    literalsAndSpecialSelectorsDo: aOneArgBlock [
262	<category: '*VisualGST'>
263
264	self literalsAndSpecialSelectors do: aOneArgBlock
265    ]
266
267]
268
269CompiledBlock extend [
270    symbolFromliterals [
271	<category: '*VisualGST'>
272
273	^ self extractSpecialSelectors
274    ]
275]
276
277MethodContext extend [
278    variables [
279        <category: '*VisualGST'>
280
281        | variables method |
282        method := self method method parserClass parseMethod: self method method methodSourceString onError: [ :aString :position | ^ variables:= #() ].
283        (variables := method argumentNames asOrderedCollection) addAll: method body temporaryNames.
284        ^ variables
285    ]
286]
287
288BlockContext extend [
289    variables [
290        <category: '*VisualGST'>
291
292        | variables method |
293        method := self method method parserClass parseMethod: self method method methodSourceString.
294        variables := method argumentNames,  method body temporaryNames.
295        ^ variables
296    ]
297]
298
299ContextPart extend [
300    parentContextAt: anInteger [
301	<category: '*VisualGST'>
302
303	| ctxt i |
304	anInteger <= 0 ifTrue: [ self error: 'Error indice <= 0' ].
305	self parentContext ifNil: [ self error: 'Error indice too high' ].
306	anInteger = 1 ifTrue: [ ^ self ].
307	i := 2.
308	ctxt := self parentContext.
309	[ i < anInteger and: [ ctxt parentContext isNil not ] ] whileTrue: [
310	    ctxt := ctxt parentContext.
311	    i := i + 1 ].
312	^ i = anInteger
313	    ifTrue: [ ctxt ]
314	    ifFalse: [ self error: 'Error indice too high' ]
315    ]
316
317    variables [
318	<category: '*VisualGST'>
319
320	^ 1 to: self numArgs + self numTemps collect: [ :each |
321	    each displayString ]
322    ]
323
324    variablesDo: aBlock [
325	<category: '*VisualGST'>
326
327	^ self variables do: aBlock
328    ]
329
330    stackInspectorView [
331        <category: '*VisualGST'>
332
333        ^ GtkStackInspectorView
334    ]
335]
336
337Debugger extend [
338
339    receiver [
340	<category: '*VisualGST'>
341
342	^ self suspendedContext receiver
343    ]
344
345    myStepInto [
346        "Run to the end of the current line in the inferior process or to the
347         next message send."
348
349	"TODO: Stop when affectation (get the current bytecode)"
350        <category: '*VisualGST'>
351        | context |
352        context := self suspendedContext.
353
354        [ self stepBytecode.
355          self suspendedContext == context ]
356                whileTrue
357    ]
358
359    myStep [
360        "Run to the end of the current line in the inferior process, skipping
361         over message sends."
362
363	"TODO: Stop when affectation (get the current bytecode)"
364        <category: '*VisualGST'>
365        | context |
366        context := self suspendedContext.
367
368        [ self stepBytecode.
369         (self suspendedContext notNil and: [ self suspendedContext parentContext == context ])
370                ifTrue: [ self finish: self suspendedContext. ^ self ].
371         self suspendedContext == context ]
372                whileTrue
373    ]
374]
375
376Behavior extend [
377
378    debuggerClass [
379	<category: '*VisualGST'>
380
381	"^ nil"
382	^ VisualGST.GtkDebugger
383    ]
384]
385
386VariableBinding extend [
387
388    hasLiterals [
389	<category: '*VisualGST'>
390
391	^ true
392    ]
393
394    symbolFromliterals [
395	<category: '*VisualGST'>
396
397	^ {self key}
398    ]
399]
400
401GTK.GtkButton class extend [
402
403    createButton: aStockId [
404        <category: 'instance creation'>
405
406        | image |
407        image := GTK.GtkImage newFromStock: aStockId size: GTK.Gtk gtkIconSizeMenu.
408        ^ (GTK.GtkButton new)
409                setImage: image;
410                setRelief: GTK.Gtk gtkReliefNone;
411                yourself
412    ]
413
414    closeButton [
415	<category: 'instance creation'>
416
417        ^ self createButton: GTK.Gtk gtkStockClose
418    ]
419
420    previousButton [
421	<category: 'instance creation'>
422
423        ^ self createButton: GTK.Gtk gtkStockGoBack
424    ]
425
426    nextButton [
427	<category: 'instance creation'>
428
429         ^ self createButton: GTK.Gtk gtkStockGoForward
430    ]
431
432    replaceButton [
433        <category: 'instance creation'>
434
435         ^ self createButton: GTK.Gtk gtkStockFindAndReplace
436    ]
437]
438
439Metaclass extend [
440    displaySymbol [
441	<category: '*VisualGST'>
442
443	^ self instanceClass name
444    ]
445]
446
447AbstractNamespace extend [
448    displaySymbol [
449	<category: '*VisualGST'>
450
451	^ self displayString asSymbol
452    ]
453]
454
455Symbol extend [
456    displaySymbol [
457	<category: '*VisualGST'>
458
459	^ self
460    ]
461]
462
463CharacterArray extend [
464
465    deindexOf: aCharacterArray matchCase: aBoolean startingAt: anIndex [
466	"Answer an Interval of indices in the receiver which match the aCharacterArray
467	 pattern. # in aCharacterArray means 'match any character', * in aCharacterArray means
468	 'match any sequence of characters'. The first item of the returned interval
469	 is >= anIndex. If aBoolean is false, the search is case-insensitive,
470	 else it is case-sensitive. If no Interval matches the pattern, answer nil."
471
472	<category: '*VisualGST'>
473	| result |
474	aBoolean
475	    ifFalse:
476		[ ^ self asLowercase
477		   deindexOf: aCharacterArray asLowercase
478		   matchCase: true
479		   startingAt: anIndex ].
480	1 to: anIndex do:
481		[ :i |
482		    result := aCharacterArray
483				matchSubstring: 1
484				in: self
485				at: anIndex - i + 1.
486		    result notNil ifTrue: [ ^ anIndex - i + 1 to: result ] ].
487	^ nil
488    ]
489]
490
491STInST.RBParser class extend [
492
493    selectedSymbol: aString [
494	<category: '*VisualGST'>
495
496        | stream parser node |
497        stream := aString readStream.
498        parser := STInST.RBBracketedMethodParser new.
499        parser errorBlock: [ :message :position | ^ nil ].
500        parser scanner: (parser scannerClass on: stream errorBlock: parser errorBlock).
501        node := parser parseExpression.
502        node := node bestNodeFor: (1 to: aString size).
503        [ node isNil ifTrue: [ ^ nil ].
504          node isMessage] whileFalse: [ node := node parent ].
505        ^ node selector
506    ]
507]
508
509GTK.GtkTreeModel class extend [
510    createModelWith: anArray [
511        <category: '*VisualGST'>
512
513        | model |
514        model := OrderedCollection new.
515        anArray do: [ :each | model addAll: (each collect: [ :elem | elem kind ]) ].
516        model addLast: VisualGST.GtkColumnOOPType kind.
517        ^ self new: model size varargs: model asArray
518    ]
519]
520
521GTK.GtkListStore class extend [
522    createModelWith: anArray [
523        <category: '*VisualGST'>
524
525        | model |
526        model := OrderedCollection new.
527        anArray do: [ :each | model addAll: (each collect: [ :elem | elem kind ]) ].
528        model addLast: VisualGST.GtkColumnOOPType kind.
529        ^ self new: model size varargs: model asArray
530    ]
531]
532
533GTK.GtkTreeStore class extend [
534    createModelWith: anArray [
535        <category: '*VisualGST'>
536
537        | model |
538        model := OrderedCollection new.
539        anArray do: [ :each | model addAll: (each collect: [ :elem | elem kind ]) ].
540        model addLast: VisualGST.GtkColumnOOPType kind.
541        ^ self new: model size varargs: model asArray
542    ]
543]
544
545GTK.GtkTreeView class extend [
546
547    createModel: aGtkStoreClass with: anArray [
548	<category: '*VisualGST'>
549
550	^ self newWithModel: (aGtkStoreClass createModelWith: anArray)
551    ]
552
553    createTreeViewWith: anArray [
554	<category: '*VisualGST'>
555
556        ^ self createModel: GtkTreeStore with: anArray
557    ]
558
559    createListViewWith: anArray [
560        <category: '*VisualGST'>
561
562        ^ self createModel: GtkListStore with: anArray
563    ]
564
565    createColumnsOn: aGtkTreeView with: anArray [
566        <category: '*VisualGST'>
567
568        | colView i render |
569        i := 0.
570        anArray do: [ :each |
571            colView := GtkTreeViewColumn new.
572            each do: [ :column |
573            column isVisible ifTrue: [
574                colView
575                    packStart: (render := column cellRenderer new) expand: false;
576                    addAttribute: render attribute: column kindName column: i.
577                column hasTitle ifTrue: [ colView setTitle: column title ].
578                i := i + 1 ] ].
579            aGtkTreeView insertColumn: colView position: -1 ]
580    ]
581
582    createListWithModel: anArray [
583        <category: '*VisualGST'>
584
585        | view |
586        view := self createListViewWith: anArray.
587        self createColumnsOn: view with: anArray.
588	^ view
589    ]
590
591    createTreeWithModel: anArray [
592	<category: '*VisualGST'>
593
594	| view |
595        view := self createTreeViewWith: anArray.
596        self createColumnsOn: view with: anArray.
597	^ view
598    ]
599]
600
601GTK.GtkTreeView extend [
602    | model |
603
604    model: aGtkModel [
605	<category: 'accessing'>
606
607	model := aGtkModel
608    ]
609
610    model [
611	<category: 'accessing'>
612
613	^ model
614    ]
615
616    selection [
617	<category: 'accessing'>
618
619        | iter string |
620        (iter := self selectedIter) ifNil: [ ^ self error: 'nothing is selected' ].
621	^ (self getModel at: iter) last
622    ]
623
624    selections [
625	<category: 'accessing'>
626
627	| glist result |
628	result := OrderedCollection new.
629	(glist := self getSelection getSelectedRows: nil) ifNil: [ ^ result ].
630	glist do: [ :each | | iter path |
631	    path := each castTo: GTK.GtkTreePath type.
632	    iter := self getModel getIter: path.
633	    result add: ((self getModel at: iter) last) ].
634	^ result
635    ]
636
637    select: anObject [
638	<category: 'accessing'>
639
640        self getSelection unselectAll.
641	self getModel do: [ :elem :iter |
642	    elem last = anObject ifTrue: [
643                    self scrollToCell: (self getModel getPath: iter) column: nil useAlign: false rowAlign: 0.5 colAlign: 0.5.
644                    ^ self getSelection selectIter: iter ] ].
645    ]
646
647    selectNth: anInteger [
648	<category: 'accessing'>
649
650        | path iter |
651        self getSelection unselectAll.
652        anInteger = 0 ifTrue: [^self].
653        path := GtkTreePath newFromIndices: {anInteger - 1. -1}.
654	(self getModel getIter: path) isNil ifTrue: [^self].
655        self scrollToCell: path column: nil useAlign: false rowAlign: 0.5 colAlign: 0.5.
656        self getSelection selectPath: path
657    ]
658
659    selectFirstItem [
660	<category: 'accessing'>
661
662	| selection |
663	(selection := self getSelection) unselectAll.
664        selection unselectAll.
665        selection selectIter: self getModel getIterFirst
666    ]
667
668    selectLastItem [
669	<category: 'accessing'>
670
671	| selection |
672	(selection := self getSelection) unselectAll.
673	selection unselectAll.
674        selection selectIter: self getModel getIterLast
675    ]
676]
677
678GTK.GtkDialog extend [
679
680    showModal [
681        <category: '*VisualGST'>
682
683        self
684            setModal: true;
685            showAll
686    ]
687
688    destroy: aGtkDialog [
689        <category: '*VisualGST'>
690
691	self destroy
692    ]
693
694    showModalOnAnswer: aBlock [
695        <category: '*VisualGST'>
696
697        self
698            setModal: true;
699            connectSignal: 'response' to: aBlock selector: #cull:cull:;
700            showAll
701    ]
702
703    showModalDestroy [
704        <category: '*VisualGST'>
705
706        self
707            setModal: true;
708            connectSignal: 'response' to: self selector: #destroy:;
709            showAll
710    ]
711
712    showOnAnswer: aBlock [
713        <category: '*VisualGST'>
714
715        self
716            setModal: false;
717            connectSignal: 'response' to: aBlock selector: #cull:cull:;
718            showAll
719    ]
720]
721
722GTK.GtkWidget extend [
723    getFocusChild [
724        <category: '*VisualGST'>
725        ^nil
726    ]
727]
728
729GTK.GtkPaned class extend [
730
731    addAll: anArray [
732
733	^ self addAll: anArray from: 1
734    ]
735
736    addAll: anArray from: anInteger [
737
738        ^ anArray size - anInteger = 0
739                ifTrue: [ self new
740                                pack1: (anArray at: anInteger) resize: true shrink: true;
741                                yourself ]
742                ifFalse: [
743                    anArray size - anInteger > 1 ifTrue: [
744					    self new
745                                                    pack1: (anArray at: anInteger) resize: true shrink: true;
746                                                    pack2: (self addAll: anArray from: anInteger + 1) resize: true shrink: false;
747                                                    yourself ]
748                                    ifFalse: [ self new
749                                                    pack1: (anArray at: anInteger) resize: true shrink: true;
750                                                    pack2: (anArray at: anInteger + 1) resize: true shrink: false;
751                                                    yourself ] ]
752    ]
753
754]
755
756GTK.GtkScrolledWindow class extend [
757
758    withViewport: aGtkWidget [
759	<category: 'instance creation'>
760
761	^ (GTK.GtkScrolledWindow new: nil vadjustment: nil)
762	    addWithViewport: aGtkWidget;
763	    setPolicy: GTK.Gtk gtkPolicyAutomatic vscrollbarPolicy: GTK.Gtk gtkPolicyAutomatic;
764	    yourself
765    ]
766]
767
768Smalltalk.PackageLoader class extend [
769    root [
770	<category: 'accessing'>
771
772	^ root
773    ]
774]
775