|  | @@ -1,2397 +0,0 @@
 | 
	
		
			
				|  |  | -Smalltalk createPackage: 'IDE'!
 | 
	
		
			
				|  |  | -Widget subclass: #ClassesList
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'browser ul nodes'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesList methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -browser
 | 
	
		
			
				|  |  | -	^ browser
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -browser: aBrowser
 | 
	
		
			
				|  |  | -	browser := aBrowser
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -category
 | 
	
		
			
				|  |  | -	^ self browser selectedPackage
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -getNodes
 | 
	
		
			
				|  |  | -	| classes children others |
 | 
	
		
			
				|  |  | -	classes := self browser classes.
 | 
	
		
			
				|  |  | -	children := #().
 | 
	
		
			
				|  |  | -	others := #().
 | 
	
		
			
				|  |  | -	classes do: [ :each |
 | 
	
		
			
				|  |  | -		(classes includes: each superclass)
 | 
	
		
			
				|  |  | -			ifFalse: [ children add: each ]
 | 
	
		
			
				|  |  | -			ifTrue: [ others add: each ]].
 | 
	
		
			
				|  |  | -	^ children collect: [ :each |
 | 
	
		
			
				|  |  | -		ClassesListNode on: each browser: self browser classes: others level: 0 ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -nodes
 | 
	
		
			
				|  |  | -	nodes ifNil: [ nodes := self getNodes ].
 | 
	
		
			
				|  |  | -	^ nodes
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -resetNodes
 | 
	
		
			
				|  |  | -	nodes := nil
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesList methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	ul := html ul
 | 
	
		
			
				|  |  | -		class: 'amber_column browser classes';
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -	self updateNodes
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateNodes
 | 
	
		
			
				|  |  | -	ul contents: [ :html |
 | 
	
		
			
				|  |  | -		self nodes do: [ :each |
 | 
	
		
			
				|  |  | -			each renderOn: html ]]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesList class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -on: aBrowser
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -		browser: aBrowser;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Widget subclass: #ClassesListNode
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'browser theClass level nodes'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesListNode methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -browser
 | 
	
		
			
				|  |  | -	^ browser
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -browser: aBrowser
 | 
	
		
			
				|  |  | -	browser := aBrowser
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -getNodesFrom: aCollection
 | 
	
		
			
				|  |  | -	| children others |
 | 
	
		
			
				|  |  | -	children := #().
 | 
	
		
			
				|  |  | -	others := #().
 | 
	
		
			
				|  |  | -	aCollection do: [ :each |
 | 
	
		
			
				|  |  | -		(each superclass = self theClass)
 | 
	
		
			
				|  |  | -			ifTrue: [ children add: each ]
 | 
	
		
			
				|  |  | -			ifFalse: [ others add: each ]].
 | 
	
		
			
				|  |  | -	nodes:= children collect: [ :each |
 | 
	
		
			
				|  |  | -		ClassesListNode on: each browser: self browser classes: others level: self level + 1 ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	| str |
 | 
	
		
			
				|  |  | -	str := String new writeStream.
 | 
	
		
			
				|  |  | -	self level timesRepeat: [
 | 
	
		
			
				|  |  | -		str nextPutAll: '    ' ].
 | 
	
		
			
				|  |  | -	str nextPutAll: self theClass name.
 | 
	
		
			
				|  |  | -	^ str contents
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -level
 | 
	
		
			
				|  |  | -	^ level
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -level: anInteger
 | 
	
		
			
				|  |  | -	level := anInteger
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -nodes
 | 
	
		
			
				|  |  | -	^ nodes
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -theClass
 | 
	
		
			
				|  |  | -	^ theClass
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -theClass: aClass
 | 
	
		
			
				|  |  | -	theClass := aClass
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesListNode methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	| li cssClass |
 | 
	
		
			
				|  |  | -	cssClass := ''.
 | 
	
		
			
				|  |  | -	li := html li
 | 
	
		
			
				|  |  | -		onClick: [ self browser selectClass: self theClass ].
 | 
	
		
			
				|  |  | -	li asJQuery html: self label.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self browser selectedClass = self theClass ifTrue: [
 | 
	
		
			
				|  |  | -		cssClass := cssClass, ' selected' ].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self theClass comment isEmpty ifFalse: [
 | 
	
		
			
				|  |  | -		cssClass := cssClass, ' commented' ].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	li class: cssClass.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self nodes do: [ :each |
 | 
	
		
			
				|  |  | -		each renderOn: html ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ClassesListNode class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -on: aClass browser: aBrowser classes: aCollection level: anInteger
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -		theClass: aClass;
 | 
	
		
			
				|  |  | -		browser: aBrowser;
 | 
	
		
			
				|  |  | -		level: anInteger;
 | 
	
		
			
				|  |  | -		getNodesFrom: aCollection;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Object subclass: #DebugErrorHandler
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!DebugErrorHandler methodsFor: 'error handling'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -handleError: anError
 | 
	
		
			
				|  |  | -	[ Debugger new
 | 
	
		
			
				|  |  | -		error: anError;
 | 
	
		
			
				|  |  | -		open ] on: Error do: [ :error |
 | 
	
		
			
				|  |  | -			ConsoleErrorHandler new handleError: error ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!DebugErrorHandler class methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	ErrorHandler register: self new
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Widget subclass: #SourceArea
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'editor div receiver onDoIt'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -currentLine
 | 
	
		
			
				|  |  | -	^ editor getLine: (editor getCursor line)
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -currentLineOrSelection
 | 
	
		
			
				|  |  | -	^ editor somethingSelected
 | 
	
		
			
				|  |  | -	ifFalse: [ self currentLine ]
 | 
	
		
			
				|  |  | -	ifTrue: [ self selection ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -editor
 | 
	
		
			
				|  |  | -	^ editor
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onDoIt
 | 
	
		
			
				|  |  | -	^ onDoIt
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onDoIt: aBlock
 | 
	
		
			
				|  |  | -	onDoIt := aBlock
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -receiver
 | 
	
		
			
				|  |  | -	^ receiver ifNil: [ DoIt new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -receiver: anObject
 | 
	
		
			
				|  |  | -	receiver := anObject
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selection
 | 
	
		
			
				|  |  | -	^ editor getSelection
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setEditorOn: aTextarea
 | 
	
		
			
				|  |  | -	<self['@editor'] = self._class()._codeMirror().fromTextArea(aTextarea, {
 | 
	
		
			
				|  |  | -		theme: 'ide.codeMirrorTheme'._settingValueIfAbsent_('default'),
 | 
	
		
			
				|  |  | -		mode: 'text/x-stsrc',
 | 
	
		
			
				|  |  | -		lineNumbers: true,
 | 
	
		
			
				|  |  | -		enterMode: 'flat',
 | 
	
		
			
				|  |  | -		indentWithTabs: true,
 | 
	
		
			
				|  |  | -		indentUnit: 4,
 | 
	
		
			
				|  |  | -		matchBrackets: true,
 | 
	
		
			
				|  |  | -		electricChars: false
 | 
	
		
			
				|  |  | -	})>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -val
 | 
	
		
			
				|  |  | -	^ editor getValue
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -val: aString
 | 
	
		
			
				|  |  | -	editor setValue: aString
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -clear
 | 
	
		
			
				|  |  | -	self val: ''
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -doIt
 | 
	
		
			
				|  |  | -	| result |
 | 
	
		
			
				|  |  | -	result := self eval: self currentLineOrSelection.
 | 
	
		
			
				|  |  | -	self onDoIt ifNotNil: [ self onDoIt value ].
 | 
	
		
			
				|  |  | -	^ result
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -eval: aString
 | 
	
		
			
				|  |  | -	| compiler |
 | 
	
		
			
				|  |  | -	compiler := Compiler new.
 | 
	
		
			
				|  |  | -	[ compiler parseExpression: aString ] on: Error do: [ :ex |
 | 
	
		
			
				|  |  | -		^ self alert: ex messageText ].
 | 
	
		
			
				|  |  | -	^ compiler evaluateExpression: aString on: self receiver
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -fileIn
 | 
	
		
			
				|  |  | -	Importer new import: self currentLineOrSelection readStream
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -focus
 | 
	
		
			
				|  |  | -	self editor focus.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -handleKeyDown: anEvent
 | 
	
		
			
				|  |  | -	<if(anEvent.ctrlKey) {
 | 
	
		
			
				|  |  | -		if(anEvent.keyCode === 80) { //ctrl+p
 | 
	
		
			
				|  |  | -			self._printIt();
 | 
	
		
			
				|  |  | -			anEvent.preventDefault();
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if(anEvent.keyCode === 68) { //ctrl+d
 | 
	
		
			
				|  |  | -			self._doIt();
 | 
	
		
			
				|  |  | -			anEvent.preventDefault();
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if(anEvent.keyCode === 73) { //ctrl+i
 | 
	
		
			
				|  |  | -			self._inspectIt();
 | 
	
		
			
				|  |  | -			anEvent.preventDefault();
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectIt
 | 
	
		
			
				|  |  | -	self doIt inspect
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -print: aString
 | 
	
		
			
				|  |  | -	| start stop currentLine |
 | 
	
		
			
				|  |  | -	currentLine := (editor getCursor: false) line.
 | 
	
		
			
				|  |  | -	start := HashedCollection new.
 | 
	
		
			
				|  |  | -	start at: 'line' put: currentLine.
 | 
	
		
			
				|  |  | -	start at: 'ch' put: (editor getCursor: false) ch.
 | 
	
		
			
				|  |  | -	(editor getSelection) ifEmpty: [
 | 
	
		
			
				|  |  | -		"select current line if selection is empty"
 | 
	
		
			
				|  |  | -		start at: 'ch' put: (editor getLine: currentLine) size.
 | 
	
		
			
				|  |  | -		editor setSelection: #{'line' -> currentLine. 'ch' -> 0} end: start.
 | 
	
		
			
				|  |  | -	].
 | 
	
		
			
				|  |  | -	stop := HashedCollection new.
 | 
	
		
			
				|  |  | -	stop at: 'line' put: currentLine.
 | 
	
		
			
				|  |  | -	stop at: 'ch' put: ((start at: 'ch') + aString size + 2).
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	editor replaceSelection: (editor getSelection, ' ', aString, ' ').
 | 
	
		
			
				|  |  | -	editor setCursor: (editor getCursor: true).
 | 
	
		
			
				|  |  | -	editor setSelection: stop end: start
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printIt
 | 
	
		
			
				|  |  | -	self print: self doIt printString.
 | 
	
		
			
				|  |  | -	self focus.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea methodsFor: 'events'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onKeyDown: aBlock
 | 
	
		
			
				|  |  | -	div onKeyDown: aBlock
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onKeyUp: aBlock
 | 
	
		
			
				|  |  | -	div onKeyUp: aBlock
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	| textarea |
 | 
	
		
			
				|  |  | -	div := html div class: 'source'.
 | 
	
		
			
				|  |  | -	div with: [ textarea := html textarea ].
 | 
	
		
			
				|  |  | -	self setEditorOn: textarea element.
 | 
	
		
			
				|  |  | -	div onKeyDown: [ :e | self handleKeyDown: e ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea class methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -codeMirror
 | 
	
		
			
				|  |  | -	^ require value: 'codemirror/lib/codemirror'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!SourceArea class methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	self setupCodeMirror
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setupCodeMirror
 | 
	
		
			
				|  |  | -	< self._codeMirror().keyMap["default"].fallthrough = ["basic"] >
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Widget subclass: #TabManager
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'selectedTab tabs opened ul input'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -labelFor: aWidget
 | 
	
		
			
				|  |  | -	| label maxSize |
 | 
	
		
			
				|  |  | -	maxSize := 15.
 | 
	
		
			
				|  |  | -	label := aWidget label copyFrom: 0 to: (aWidget label size min: maxSize).
 | 
	
		
			
				|  |  | -	aWidget label size > maxSize ifTrue: [
 | 
	
		
			
				|  |  | -		label := label, '...' ].
 | 
	
		
			
				|  |  | -	^ label
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -tabs
 | 
	
		
			
				|  |  | -	^ tabs ifNil: [ tabs := Array new ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -close
 | 
	
		
			
				|  |  | -	opened ifTrue: [
 | 
	
		
			
				|  |  | -	'#amber' asJQuery hide.
 | 
	
		
			
				|  |  | -	ul asJQuery hide.
 | 
	
		
			
				|  |  | -	selectedTab hide.
 | 
	
		
			
				|  |  | -	self removeBodyMargin.
 | 
	
		
			
				|  |  | -	'body' asJQuery removeClass: 'amberBody'.
 | 
	
		
			
				|  |  | -	opened := false ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -closeTab: aWidget
 | 
	
		
			
				|  |  | -	self removeTab: aWidget.
 | 
	
		
			
				|  |  | -	self selectTab: self tabs last.
 | 
	
		
			
				|  |  | -	aWidget remove.
 | 
	
		
			
				|  |  | -	self update
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -newBrowserTab
 | 
	
		
			
				|  |  | -	Browser open
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onResize: aBlock
 | 
	
		
			
				|  |  | -	'#amber' asJQuery resizable: #{
 | 
	
		
			
				|  |  | -		'handles' -> 'n'.
 | 
	
		
			
				|  |  | -		'resize' -> aBlock.
 | 
	
		
			
				|  |  | -		'minHeight' -> 230
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -onWindowResize: aBlock
 | 
	
		
			
				|  |  | -	window asJQuery resize: aBlock
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	opened ifFalse: [
 | 
	
		
			
				|  |  | -	'body' asJQuery addClass: 'amberBody'.
 | 
	
		
			
				|  |  | -	'#amber' asJQuery show.
 | 
	
		
			
				|  |  | -	ul asJQuery show.
 | 
	
		
			
				|  |  | -	self updateBodyMargin.
 | 
	
		
			
				|  |  | -	selectedTab show.
 | 
	
		
			
				|  |  | -	opened := true ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -removeBodyMargin
 | 
	
		
			
				|  |  | -	self setBodyMargin: 0
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -search: aString
 | 
	
		
			
				|  |  | -	| searchedClass |
 | 
	
		
			
				|  |  | -	searchedClass := Smalltalk globals at: aString.
 | 
	
		
			
				|  |  | -		searchedClass isClass
 | 
	
		
			
				|  |  | -			ifTrue: [ Browser openOn: searchedClass ]
 | 
	
		
			
				|  |  | -			ifFalse: [ ReferencesBrowser search: aString ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectTab: aWidget
 | 
	
		
			
				|  |  | -	self open.
 | 
	
		
			
				|  |  | -	selectedTab := aWidget.
 | 
	
		
			
				|  |  | -	self tabs do: [ :each |
 | 
	
		
			
				|  |  | -	each hide ].
 | 
	
		
			
				|  |  | -	aWidget show.
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	self update
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setBodyMargin: anInteger
 | 
	
		
			
				|  |  | -	'.amberBody' asJQuery css: 'margin-bottom' put: anInteger asString, 'px'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateBodyMargin
 | 
	
		
			
				|  |  | -	self setBodyMargin: '#amber' asJQuery height
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updatePosition
 | 
	
		
			
				|  |  | -	'#amber' asJQuery
 | 
	
		
			
				|  |  | -		css: 'top' put: '';
 | 
	
		
			
				|  |  | -		css: 'bottom' put: '0px'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'adding/Removing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -addTab: aWidget
 | 
	
		
			
				|  |  | -	self tabs add: aWidget.
 | 
	
		
			
				|  |  | -	aWidget appendToJQuery: '#amber' asJQuery.
 | 
	
		
			
				|  |  | -	aWidget hide
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -removeTab: aWidget
 | 
	
		
			
				|  |  | -	self tabs remove: aWidget.
 | 
	
		
			
				|  |  | -	self update
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	Inspector register: IDEInspector.
 | 
	
		
			
				|  |  | -	opened := true.
 | 
	
		
			
				|  |  | -	[ :html | html div id: 'amber' ] appendToJQuery: 'body' asJQuery.
 | 
	
		
			
				|  |  | -	'body' asJQuery
 | 
	
		
			
				|  |  | -	addClass: 'amberBody'.
 | 
	
		
			
				|  |  | -	self appendToJQuery: '#amber' asJQuery.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -	addTab: IDETranscript current;
 | 
	
		
			
				|  |  | -	addTab: Workspace new;
 | 
	
		
			
				|  |  | -	addTab: TestRunner new.
 | 
	
		
			
				|  |  | -	self selectTab: self tabs last.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -	onResize: [ self updateBodyMargin; updatePosition ];
 | 
	
		
			
				|  |  | -	onWindowResize: [ self updatePosition ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	html div id: 'logo'.
 | 
	
		
			
				|  |  | -	self renderToolbarOn: html.
 | 
	
		
			
				|  |  | -	ul := html ul
 | 
	
		
			
				|  |  | -		id: 'amberTabs';
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -	self renderTabs
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTabFor: aWidget on: html
 | 
	
		
			
				|  |  | -	| li |
 | 
	
		
			
				|  |  | -	li := html li.
 | 
	
		
			
				|  |  | -	selectedTab = aWidget ifTrue: [
 | 
	
		
			
				|  |  | -	li class: 'selected' ].
 | 
	
		
			
				|  |  | -	li with: [
 | 
	
		
			
				|  |  | -		html span class: 'ltab'.
 | 
	
		
			
				|  |  | -		html span
 | 
	
		
			
				|  |  | -			class: 'mtab';
 | 
	
		
			
				|  |  | -			with: [
 | 
	
		
			
				|  |  | -				aWidget canBeClosed ifTrue: [
 | 
	
		
			
				|  |  | -					html span
 | 
	
		
			
				|  |  | -						class: 'close';
 | 
	
		
			
				|  |  | -						with: 'x';
 | 
	
		
			
				|  |  | -					onClick: [ self closeTab: aWidget ]].
 | 
	
		
			
				|  |  | -			html span with: (self labelFor: aWidget) ].
 | 
	
		
			
				|  |  | -		html span class: 'rtab' ];
 | 
	
		
			
				|  |  | -	onClick: [ self selectTab: aWidget ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTabs
 | 
	
		
			
				|  |  | -	ul contents: [ :html |
 | 
	
		
			
				|  |  | -		self tabs do: [ :each |
 | 
	
		
			
				|  |  | -		self renderTabFor: each on: html ].
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -		class: 'newtab';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			html span class: 'ltab'.
 | 
	
		
			
				|  |  | -			html span class: 'mtab'; with: ' + '.
 | 
	
		
			
				|  |  | -			html span class: 'rtab' ];
 | 
	
		
			
				|  |  | -		onClick: [ self newBrowserTab ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderToolbarOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		id: 'amber_toolbar';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			input := html input
 | 
	
		
			
				|  |  | -				class: 'implementors';
 | 
	
		
			
				|  |  | -				yourself.
 | 
	
		
			
				|  |  | -			input onKeyPress: [ :event |
 | 
	
		
			
				|  |  | -				event keyCode = 13 ifTrue: [
 | 
	
		
			
				|  |  | -				self search: input asJQuery val ]].
 | 
	
		
			
				|  |  | -			html div id: 'amber_close'; onClick: [ self close ]]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -update
 | 
	
		
			
				|  |  | -	self renderTabs
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabManager class instanceVariableNames: 'current'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager class methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -toggleAmberIDE
 | 
	
		
			
				|  |  | -	'#amber' asJQuery length = 0
 | 
	
		
			
				|  |  | -		ifTrue: [ Browser open ]
 | 
	
		
			
				|  |  | -		ifFalse: [
 | 
	
		
			
				|  |  | -			('#amber' asJQuery is: ':visible')
 | 
	
		
			
				|  |  | -				ifTrue: [ TabManager current close ]
 | 
	
		
			
				|  |  | -				ifFalse: [ TabManager current open ] ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabManager class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -current
 | 
	
		
			
				|  |  | -	^ current ifNil: [ current := super new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -new
 | 
	
		
			
				|  |  | -	self shouldNotImplement
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Widget subclass: #TabWidget
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'div'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabWidget methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	self subclassResponsibility
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabWidget methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -close
 | 
	
		
			
				|  |  | -	TabManager current closeTab: self
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -hide
 | 
	
		
			
				|  |  | -	div asJQuery hide
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	TabManager current addTab: self.
 | 
	
		
			
				|  |  | -	TabManager current selectTab: self
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -remove
 | 
	
		
			
				|  |  | -	div asJQuery remove
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -show
 | 
	
		
			
				|  |  | -	div asJQuery show
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabWidget methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	div := html div
 | 
	
		
			
				|  |  | -		class: 'amberTool';
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -	self renderTab
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTab
 | 
	
		
			
				|  |  | -	div contents: [ :html |
 | 
	
		
			
				|  |  | -		html div
 | 
	
		
			
				|  |  | -		class: 'amber_box';
 | 
	
		
			
				|  |  | -		with: [ self renderBoxOn: html ].
 | 
	
		
			
				|  |  | -		html div
 | 
	
		
			
				|  |  | -		class: 'amber_buttons';
 | 
	
		
			
				|  |  | -		with: [ self renderButtonsOn: html ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -update
 | 
	
		
			
				|  |  | -	self renderTab
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabWidget methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -canBeClosed
 | 
	
		
			
				|  |  | -	^ false
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TabWidget class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	^ self new open
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #Browser
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'selectedPackage selectedClass selectedProtocol selectedMethod packagesList classesList protocolsList methodsList sourceArea tabsList selectedTab saveButton classButtons methodButtons unsavedChanges'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classCommentSource
 | 
	
		
			
				|  |  | -	^ selectedClass comment
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classDeclarationSource
 | 
	
		
			
				|  |  | -	| stream |
 | 
	
		
			
				|  |  | -	stream := '' writeStream.
 | 
	
		
			
				|  |  | -	selectedClass ifNil: [ ^ self classDeclarationTemplate ].
 | 
	
		
			
				|  |  | -	stream
 | 
	
		
			
				|  |  | -		nextPutAll: selectedClass superclass asString;
 | 
	
		
			
				|  |  | -		nextPutAll: ' subclass: #';
 | 
	
		
			
				|  |  | -		nextPutAll: selectedClass name;
 | 
	
		
			
				|  |  | -		nextPutAll: String lf, String tab;
 | 
	
		
			
				|  |  | -		nextPutAll: 'instanceVariableNames: '''.
 | 
	
		
			
				|  |  | -	selectedClass instanceVariableNames
 | 
	
		
			
				|  |  | -		do: [ :each | stream nextPutAll: each ]
 | 
	
		
			
				|  |  | -		separatedBy: [ stream nextPutAll: ' ' ].
 | 
	
		
			
				|  |  | -	stream
 | 
	
		
			
				|  |  | -		nextPutAll: '''', String lf, String tab;
 | 
	
		
			
				|  |  | -		nextPutAll: 'package: ''';
 | 
	
		
			
				|  |  | -		nextPutAll: selectedClass category;
 | 
	
		
			
				|  |  | -		nextPutAll: ''''.
 | 
	
		
			
				|  |  | -	^ stream contents
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classDeclarationTemplate
 | 
	
		
			
				|  |  | -	^ 'Object subclass: #NameOfSubclass
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''''
 | 
	
		
			
				|  |  | -	package: ''', self selectedPackage, ''''
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classes
 | 
	
		
			
				|  |  | -	^ ((Smalltalk classes
 | 
	
		
			
				|  |  | -	select: [ :each | each category = selectedPackage ])
 | 
	
		
			
				|  |  | -	sort: [ :a :b | a name < b name ]) asSet
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -declarationSource
 | 
	
		
			
				|  |  | -	^ selectedTab = #instance
 | 
	
		
			
				|  |  | -	ifTrue: [ self classDeclarationSource ]
 | 
	
		
			
				|  |  | -	ifFalse: [ self metaclassDeclarationSource ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -dummyMethodSource
 | 
	
		
			
				|  |  | -	^ 'messageSelectorAndArgumentNames
 | 
	
		
			
				|  |  | -	"comment stating purpose of message"
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	| temporary variable names |
 | 
	
		
			
				|  |  | -	statements'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ selectedClass
 | 
	
		
			
				|  |  | -	ifNil: [ 'Browser (nil)' ]
 | 
	
		
			
				|  |  | -	ifNotNil: [ 'Browser: ', selectedClass name ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -metaclassDeclarationSource
 | 
	
		
			
				|  |  | -	| stream |
 | 
	
		
			
				|  |  | -	stream := '' writeStream.
 | 
	
		
			
				|  |  | -	selectedClass ifNotNil: [
 | 
	
		
			
				|  |  | -	stream
 | 
	
		
			
				|  |  | -		nextPutAll: selectedClass asString;
 | 
	
		
			
				|  |  | -		nextPutAll: ' class ';
 | 
	
		
			
				|  |  | -		nextPutAll: 'instanceVariableNames: '''.
 | 
	
		
			
				|  |  | -	selectedClass class instanceVariableNames
 | 
	
		
			
				|  |  | -		do: [ :each | stream nextPutAll: each ]
 | 
	
		
			
				|  |  | -		separatedBy: [ stream nextPutAll: ' ' ].
 | 
	
		
			
				|  |  | -	stream nextPutAll: '''' ].
 | 
	
		
			
				|  |  | -	^ stream contents
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -methodSource
 | 
	
		
			
				|  |  | -	^ selectedMethod
 | 
	
		
			
				|  |  | -	ifNil: [ self dummyMethodSource ]
 | 
	
		
			
				|  |  | -	ifNotNil: [ selectedMethod source ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -methods
 | 
	
		
			
				|  |  | -	| klass |
 | 
	
		
			
				|  |  | -	selectedTab = #comment ifTrue: [ ^ #() ].
 | 
	
		
			
				|  |  | -	selectedClass ifNotNil: [
 | 
	
		
			
				|  |  | -	klass := selectedTab = #instance
 | 
	
		
			
				|  |  | -		ifTrue: [ selectedClass ]
 | 
	
		
			
				|  |  | -		ifFalse: [ selectedClass class ]].
 | 
	
		
			
				|  |  | -	^ (selectedProtocol
 | 
	
		
			
				|  |  | -	ifNil: [
 | 
	
		
			
				|  |  | -		klass
 | 
	
		
			
				|  |  | -		ifNil: [ #() ]
 | 
	
		
			
				|  |  | -		ifNotNil: [ klass methodDictionary values ]]
 | 
	
		
			
				|  |  | -	ifNotNil: [
 | 
	
		
			
				|  |  | -		klass methodsInProtocol: selectedProtocol ]) 
 | 
	
		
			
				|  |  | -				sort: [ :a :b | a selector < b selector ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -packages
 | 
	
		
			
				|  |  | -	| packages |
 | 
	
		
			
				|  |  | -	packages := Array new.
 | 
	
		
			
				|  |  | -	Smalltalk classes do: [ :each |
 | 
	
		
			
				|  |  | -	(packages includes: each category) ifFalse: [
 | 
	
		
			
				|  |  | -		packages add: each category ]].
 | 
	
		
			
				|  |  | -	^ packages sort
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -protocols
 | 
	
		
			
				|  |  | -	| klass |
 | 
	
		
			
				|  |  | -	selectedClass ifNotNil: [
 | 
	
		
			
				|  |  | -	selectedTab = #comment ifTrue: [ ^ #() ].
 | 
	
		
			
				|  |  | -	klass := selectedTab = #instance
 | 
	
		
			
				|  |  | -		ifTrue: [ selectedClass ]
 | 
	
		
			
				|  |  | -		ifFalse: [ selectedClass class ].
 | 
	
		
			
				|  |  | -	klass methodDictionary isEmpty ifTrue: [
 | 
	
		
			
				|  |  | -		^ Array with: 'not yet classified' ].
 | 
	
		
			
				|  |  | -	^ klass protocols ].
 | 
	
		
			
				|  |  | -	^ Array new
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedClass
 | 
	
		
			
				|  |  | -	^ selectedClass
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedPackage
 | 
	
		
			
				|  |  | -	^ selectedPackage
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -source
 | 
	
		
			
				|  |  | -	selectedTab = #comment ifFalse: [
 | 
	
		
			
				|  |  | -	^ (selectedProtocol notNil or: [ selectedMethod notNil ])
 | 
	
		
			
				|  |  | -		ifFalse: [ self declarationSource ]
 | 
	
		
			
				|  |  | -		ifTrue: [ self methodSource ]].
 | 
	
		
			
				|  |  | -	^ selectedClass
 | 
	
		
			
				|  |  | -	ifNil: [ '' ]
 | 
	
		
			
				|  |  | -	ifNotNil: [ self classCommentSource ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -addInstanceVariableNamed: aString toClass: aClass
 | 
	
		
			
				|  |  | -	ClassBuilder new
 | 
	
		
			
				|  |  | -		addSubclassOf: aClass superclass
 | 
	
		
			
				|  |  | -		named: aClass name
 | 
	
		
			
				|  |  | -		instanceVariableNames: (aClass instanceVariableNames copy add: aString; yourself)
 | 
	
		
			
				|  |  | -		package: aClass package name
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -addNewClass
 | 
	
		
			
				|  |  | -	| className |
 | 
	
		
			
				|  |  | -	className := self prompt: 'New class'.
 | 
	
		
			
				|  |  | -	(className notNil and: [ className notEmpty ]) ifTrue: [
 | 
	
		
			
				|  |  | -		Object subclass: className instanceVariableNames: '' package: self selectedPackage.
 | 
	
		
			
				|  |  | -			self
 | 
	
		
			
				|  |  | -			resetClassesList;
 | 
	
		
			
				|  |  | -			updateClassesList.
 | 
	
		
			
				|  |  | -		self selectClass: (Smalltalk globals at: className) ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -addNewProtocol
 | 
	
		
			
				|  |  | -	| newProtocol |
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	newProtocol := self prompt: 'New method protocol'.
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	(newProtocol notNil and: [ newProtocol notEmpty ]) ifTrue: [
 | 
	
		
			
				|  |  | -		selectedMethod protocol: newProtocol.
 | 
	
		
			
				|  |  | -		self setMethodProtocol: newProtocol ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cancelChanges
 | 
	
		
			
				|  |  | -	^ unsavedChanges
 | 
	
		
			
				|  |  | -	ifTrue: [ self confirm: 'Cancel changes?' ]
 | 
	
		
			
				|  |  | -	ifFalse: [ true ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -commitPackage
 | 
	
		
			
				|  |  | -	selectedPackage ifNotNil: [
 | 
	
		
			
				|  |  | -		(Package named: selectedPackage) commit ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -compile
 | 
	
		
			
				|  |  | -	| currentEditLine |
 | 
	
		
			
				|  |  | -	self disableSaveButton.
 | 
	
		
			
				|  |  | -	currentEditLine := sourceArea editor getCursor.
 | 
	
		
			
				|  |  | -	selectedTab = #comment
 | 
	
		
			
				|  |  | -	ifTrue: [
 | 
	
		
			
				|  |  | -			selectedClass ifNotNil: [
 | 
	
		
			
				|  |  | -				self compileClassComment ]]
 | 
	
		
			
				|  |  | -	ifFalse: [
 | 
	
		
			
				|  |  | -			(selectedProtocol notNil or: [ selectedMethod notNil ])
 | 
	
		
			
				|  |  | -				ifFalse: [ self compileDefinition ]
 | 
	
		
			
				|  |  | -				ifTrue: [ self compileMethodDefinition ]].
 | 
	
		
			
				|  |  | -	sourceArea editor setCursor: currentEditLine.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -compileClassComment
 | 
	
		
			
				|  |  | -	selectedClass comment: sourceArea val
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -compileDefinition
 | 
	
		
			
				|  |  | -	| newClass |
 | 
	
		
			
				|  |  | -	newClass := Compiler new evaluateExpression: sourceArea val.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -	resetClassesList;
 | 
	
		
			
				|  |  | -	updateCategoriesList;
 | 
	
		
			
				|  |  | -	updateClassesList.
 | 
	
		
			
				|  |  | -	self selectClass: newClass
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -compileMethodDefinition
 | 
	
		
			
				|  |  | -	selectedTab = #instance
 | 
	
		
			
				|  |  | -	ifTrue: [ self compileMethodDefinitionFor: selectedClass ]
 | 
	
		
			
				|  |  | -	ifFalse: [ self compileMethodDefinitionFor: selectedClass class ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -compileMethodDefinitionFor: aClass
 | 
	
		
			
				|  |  | -	| compiler method source node |
 | 
	
		
			
				|  |  | -	source := sourceArea val.
 | 
	
		
			
				|  |  | -	selectedProtocol ifNil: [ selectedProtocol := selectedMethod protocol ].
 | 
	
		
			
				|  |  | -	compiler := Compiler new.
 | 
	
		
			
				|  |  | -	compiler source: source.
 | 
	
		
			
				|  |  | -	node := compiler parse: source.
 | 
	
		
			
				|  |  | -	node isParseFailure ifTrue: [
 | 
	
		
			
				|  |  | -	^ self alert: 'PARSE ERROR: ', node reason, ', position: ', node position asString ].
 | 
	
		
			
				|  |  | -	compiler currentClass: aClass.
 | 
	
		
			
				|  |  | -	method := compiler eval: (compiler compileNode: node).
 | 
	
		
			
				|  |  | -	compiler unknownVariables do: [ :each |
 | 
	
		
			
				|  |  | -		"Do not try to redeclare javascript's objects"
 | 
	
		
			
				|  |  | -		(PlatformInterface existsGlobal: each) ifFalse: [
 | 
	
		
			
				|  |  | -		(self confirm: 'Declare ''', each, ''' as instance variable?') ifTrue: [
 | 
	
		
			
				|  |  | -			self addInstanceVariableNamed: each toClass: aClass.
 | 
	
		
			
				|  |  | -			^ self compileMethodDefinitionFor: aClass ]] ].
 | 
	
		
			
				|  |  | -	ClassBuilder new installMethod: method forClass: aClass protocol: selectedProtocol.
 | 
	
		
			
				|  |  | -	self updateMethodsList.
 | 
	
		
			
				|  |  | -	self selectMethod: method
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -copyClass
 | 
	
		
			
				|  |  | -	| className |
 | 
	
		
			
				|  |  | -	className := self prompt: 'Copy class'.
 | 
	
		
			
				|  |  | -	(className notNil and: [ className notEmpty ]) ifTrue: [
 | 
	
		
			
				|  |  | -		ClassBuilder new copyClass: self selectedClass named: className.
 | 
	
		
			
				|  |  | -			self
 | 
	
		
			
				|  |  | -			resetClassesList;
 | 
	
		
			
				|  |  | -			updateClassesList.
 | 
	
		
			
				|  |  | -		self selectClass: (Smalltalk globals at: className) ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -disableSaveButton
 | 
	
		
			
				|  |  | -	saveButton ifNotNil: [
 | 
	
		
			
				|  |  | -	saveButton at: 'disabled' put: true ].
 | 
	
		
			
				|  |  | -	unsavedChanges := false
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -handleSourceAreaKeyDown: anEvent
 | 
	
		
			
				|  |  | -	<if(anEvent.ctrlKey) {
 | 
	
		
			
				|  |  | -		if(anEvent.keyCode === 83) { //ctrl+s
 | 
	
		
			
				|  |  | -			self._compile();
 | 
	
		
			
				|  |  | -			anEvent.preventDefault();
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	>
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -hideClassButtons
 | 
	
		
			
				|  |  | -	classButtons asJQuery hide
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -hideMethodButtons
 | 
	
		
			
				|  |  | -	methodButtons asJQuery hide
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -removeClass
 | 
	
		
			
				|  |  | -	(self confirm: 'Do you really want to remove ', selectedClass name, '?')
 | 
	
		
			
				|  |  | -	ifTrue: [
 | 
	
		
			
				|  |  | -		Smalltalk removeClass: selectedClass.
 | 
	
		
			
				|  |  | -		self resetClassesList.
 | 
	
		
			
				|  |  | -		self selectClass: nil ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -removeMethod
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	(self confirm: 'Do you really want to remove #', selectedMethod selector, '?')
 | 
	
		
			
				|  |  | -		ifTrue: [
 | 
	
		
			
				|  |  | -		selectedTab = #instance
 | 
	
		
			
				|  |  | -			ifTrue: [ selectedClass removeCompiledMethod: selectedMethod ]
 | 
	
		
			
				|  |  | -			ifFalse: [ selectedClass class removeCompiledMethod: selectedMethod ].
 | 
	
		
			
				|  |  | -		self selectMethod: nil ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -removePackage
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	(self confirm: 'Do you really want to remove the whole package ', selectedPackage, ' with all its classes?')
 | 
	
		
			
				|  |  | -	ifTrue: [
 | 
	
		
			
				|  |  | -		Smalltalk removePackage: selectedPackage.
 | 
	
		
			
				|  |  | -		self updateCategoriesList ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renameClass
 | 
	
		
			
				|  |  | -	| newName |
 | 
	
		
			
				|  |  | -	newName := self prompt: 'Rename class ', selectedClass name.
 | 
	
		
			
				|  |  | -	(newName notNil and: [ newName notEmpty ]) ifTrue: [
 | 
	
		
			
				|  |  | -	selectedClass rename: newName.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateClassesList;
 | 
	
		
			
				|  |  | -		updateSourceAndButtons ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renamePackage
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	| newName |
 | 
	
		
			
				|  |  | -	newName := self prompt: 'Rename package ', selectedPackage.
 | 
	
		
			
				|  |  | -	newName ifNotNil: [
 | 
	
		
			
				|  |  | -	newName notEmpty ifTrue: [
 | 
	
		
			
				|  |  | -	Smalltalk renamePackage: selectedPackage to: newName.
 | 
	
		
			
				|  |  | -	self updateCategoriesList ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -search: aString
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [ | searchedClass |
 | 
	
		
			
				|  |  | -		searchedClass := Smalltalk globals at: aString.
 | 
	
		
			
				|  |  | -		searchedClass isClass
 | 
	
		
			
				|  |  | -			ifTrue: [ self class openOn: searchedClass ]
 | 
	
		
			
				|  |  | -			ifFalse: [ self searchReferencesOf: aString ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchClassReferences
 | 
	
		
			
				|  |  | -	ReferencesBrowser search: selectedClass name
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchReferencesOf: aString
 | 
	
		
			
				|  |  | -	ReferencesBrowser search: aString
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectCategory: aCategory
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	selectedPackage := aCategory.
 | 
	
		
			
				|  |  | -	selectedClass := selectedProtocol := selectedMethod := nil.
 | 
	
		
			
				|  |  | -	self resetClassesList.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateCategoriesList;
 | 
	
		
			
				|  |  | -		updateClassesList;
 | 
	
		
			
				|  |  | -		updateProtocolsList;
 | 
	
		
			
				|  |  | -		updateMethodsList;
 | 
	
		
			
				|  |  | -		updateSourceAndButtons ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectClass: aClass
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	selectedClass := aClass.
 | 
	
		
			
				|  |  | -	selectedProtocol := selectedMethod := nil.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateClassesList;
 | 
	
		
			
				|  |  | -		updateProtocolsList;
 | 
	
		
			
				|  |  | -		updateMethodsList;
 | 
	
		
			
				|  |  | -		updateSourceAndButtons ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectMethod: aMethod
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	selectedMethod := aMethod.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateProtocolsList;
 | 
	
		
			
				|  |  | -		updateMethodsList;
 | 
	
		
			
				|  |  | -		updateSourceAndButtons ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectProtocol: aString
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	selectedProtocol := aString.
 | 
	
		
			
				|  |  | -	selectedMethod := nil.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateProtocolsList;
 | 
	
		
			
				|  |  | -		updateMethodsList;
 | 
	
		
			
				|  |  | -		updateSourceAndButtons ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectTab: aString
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	selectedTab := aString.
 | 
	
		
			
				|  |  | -	self selectProtocol: nil.
 | 
	
		
			
				|  |  | -	self updateTabsList ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setMethodProtocol: aString
 | 
	
		
			
				|  |  | -	self cancelChanges ifTrue: [
 | 
	
		
			
				|  |  | -	(self protocols includes: aString)
 | 
	
		
			
				|  |  | -		ifFalse: [ self addNewProtocol ]
 | 
	
		
			
				|  |  | -		ifTrue: [
 | 
	
		
			
				|  |  | -		selectedMethod protocol: aString.
 | 
	
		
			
				|  |  | -		selectedProtocol := aString.
 | 
	
		
			
				|  |  | -		selectedMethod := selectedMethod.
 | 
	
		
			
				|  |  | -		self
 | 
	
		
			
				|  |  | -			updateProtocolsList;
 | 
	
		
			
				|  |  | -			updateMethodsList;
 | 
	
		
			
				|  |  | -			updateSourceAndButtons ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -showClassButtons
 | 
	
		
			
				|  |  | -	classButtons asJQuery show
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -showMethodButtons
 | 
	
		
			
				|  |  | -	methodButtons asJQuery show
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	selectedTab := #instance.
 | 
	
		
			
				|  |  | -	selectedPackage := self packages first.
 | 
	
		
			
				|  |  | -	unsavedChanges := false
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -	class: 'amber_sourceCode';
 | 
	
		
			
				|  |  | -	with: [
 | 
	
		
			
				|  |  | -		sourceArea := SourceArea new.
 | 
	
		
			
				|  |  | -		sourceArea renderOn: html.
 | 
	
		
			
				|  |  | -			sourceArea onKeyDown: [ :e |
 | 
	
		
			
				|  |  | -				self handleSourceAreaKeyDown: e ].
 | 
	
		
			
				|  |  | -		sourceArea onKeyUp: [ self updateStatus ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -	renderTopPanelOn: html;
 | 
	
		
			
				|  |  | -	renderTabsOn: html;
 | 
	
		
			
				|  |  | -	renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	saveButton := html button.
 | 
	
		
			
				|  |  | -	saveButton
 | 
	
		
			
				|  |  | -	with: 'Save';
 | 
	
		
			
				|  |  | -	onClick: [ self compile ].
 | 
	
		
			
				|  |  | -	methodButtons := html span.
 | 
	
		
			
				|  |  | -	classButtons := html span.
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -	class: 'right';
 | 
	
		
			
				|  |  | -	with: [
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'DoIt';
 | 
	
		
			
				|  |  | -			onClick: [ sourceArea doIt ].
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'PrintIt';
 | 
	
		
			
				|  |  | -			onClick: [ sourceArea printIt ].
 | 
	
		
			
				|  |  | -		html button with: 'InspectIt';
 | 
	
		
			
				|  |  | -			onClick: [ sourceArea inspectIt ]].
 | 
	
		
			
				|  |  | -	self updateSourceAndButtons
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTabsOn: html
 | 
	
		
			
				|  |  | -	tabsList := html ul class: 'amber_tabs amber_browser'.
 | 
	
		
			
				|  |  | -	self updateTabsList.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTopPanelOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'top';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			packagesList := html ul class: 'amber_column browser packages'.
 | 
	
		
			
				|  |  | -				html div class: 'amber_packagesButtons'; with: [
 | 
	
		
			
				|  |  | -				html button
 | 
	
		
			
				|  |  | -					title: 'Commit classes in this package to disk';
 | 
	
		
			
				|  |  | -					onClick: [ self commitPackage ];
 | 
	
		
			
				|  |  | -					with: 'Commit'.
 | 
	
		
			
				|  |  | -					html button
 | 
	
		
			
				|  |  | -					title: 'Rename package';
 | 
	
		
			
				|  |  | -					onClick: [ self renamePackage ];
 | 
	
		
			
				|  |  | -					with: 'Rename'.
 | 
	
		
			
				|  |  | -					html button
 | 
	
		
			
				|  |  | -					title: 'Remove this package from the system';
 | 
	
		
			
				|  |  | -					onClick: [ self removePackage ];
 | 
	
		
			
				|  |  | -					with: 'Remove' ].
 | 
	
		
			
				|  |  | -			classesList := ClassesList on: self.
 | 
	
		
			
				|  |  | -			classesList renderOn: html.
 | 
	
		
			
				|  |  | -			protocolsList := html ul class: 'amber_column browser protocols'.
 | 
	
		
			
				|  |  | -			methodsList := html ul class: 'amber_column browser methods'.
 | 
	
		
			
				|  |  | -			self
 | 
	
		
			
				|  |  | -				updateCategoriesList;
 | 
	
		
			
				|  |  | -				updateClassesList;
 | 
	
		
			
				|  |  | -				updateProtocolsList;
 | 
	
		
			
				|  |  | -				updateMethodsList.
 | 
	
		
			
				|  |  | -			html div class: 'amber_clear' ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -canBeClosed
 | 
	
		
			
				|  |  | -	^ true
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -resetClassesList
 | 
	
		
			
				|  |  | -	classesList resetNodes
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateCategoriesList
 | 
	
		
			
				|  |  | -	packagesList contents: [ :html |
 | 
	
		
			
				|  |  | -	self packages do: [ :each || li label |
 | 
	
		
			
				|  |  | -		each isEmpty
 | 
	
		
			
				|  |  | -		ifTrue: [ label := 'Unclassified' ]
 | 
	
		
			
				|  |  | -		ifFalse: [ label := each ].
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		selectedPackage = each ifTrue: [
 | 
	
		
			
				|  |  | -		li class: 'selected' ].
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: label;
 | 
	
		
			
				|  |  | -		onClick: [ self selectCategory: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateClassesList
 | 
	
		
			
				|  |  | -	TabManager current update.
 | 
	
		
			
				|  |  | -	classesList updateNodes
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateMethodsList
 | 
	
		
			
				|  |  | -	methodsList contents: [ :html |
 | 
	
		
			
				|  |  | -	self methods do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		selectedMethod = each ifTrue: [
 | 
	
		
			
				|  |  | -		li class: 'selected' ].
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: each selector;
 | 
	
		
			
				|  |  | -		onClick: [ self selectMethod: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateProtocolsList
 | 
	
		
			
				|  |  | -	protocolsList contents: [ :html |
 | 
	
		
			
				|  |  | -	self protocols do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		selectedProtocol = each ifTrue: [
 | 
	
		
			
				|  |  | -		li class: 'selected' ].
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: each;
 | 
	
		
			
				|  |  | -		onClick: [ self selectProtocol: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateSourceAndButtons
 | 
	
		
			
				|  |  | -	| currentProtocol |
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self disableSaveButton.
 | 
	
		
			
				|  |  | -	classButtons contents: [ :html |
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			title: 'Create a new class';
 | 
	
		
			
				|  |  | -			onClick: [ self addNewClass ];
 | 
	
		
			
				|  |  | -			with: 'New class'.
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'Rename class';
 | 
	
		
			
				|  |  | -			onClick: [ self renameClass ].
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'Copy class';
 | 
	
		
			
				|  |  | -			onClick: [ self copyClass ].
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'Remove class';
 | 
	
		
			
				|  |  | -			onClick: [ self removeClass ].
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'References';
 | 
	
		
			
				|  |  | -			onClick: [ self searchClassReferences ]].
 | 
	
		
			
				|  |  | -	methodButtons contents: [ :html | | protocolSelect referencesSelect |
 | 
	
		
			
				|  |  | -		html button
 | 
	
		
			
				|  |  | -			with: 'Remove method';
 | 
	
		
			
				|  |  | -			onClick: [ self removeMethod ].
 | 
	
		
			
				|  |  | -		protocolSelect := html select.
 | 
	
		
			
				|  |  | -				protocolSelect
 | 
	
		
			
				|  |  | -			onChange: [ self setMethodProtocol: protocolSelect asJQuery val ];
 | 
	
		
			
				|  |  | -			with: [
 | 
	
		
			
				|  |  | -				html option
 | 
	
		
			
				|  |  | -					with: 'Method protocol';
 | 
	
		
			
				|  |  | -					at: 'disabled' put: 'disabled'.
 | 
	
		
			
				|  |  | -				html option
 | 
	
		
			
				|  |  | -					class: 'important';
 | 
	
		
			
				|  |  | -					with: 'New...'.
 | 
	
		
			
				|  |  | -				currentProtocol := selectedProtocol.
 | 
	
		
			
				|  |  | -				(currentProtocol isNil and: [ selectedMethod notNil ])
 | 
	
		
			
				|  |  | -					ifTrue: [ currentProtocol := selectedMethod category ].
 | 
	
		
			
				|  |  | -				self protocols do: [ :each | | option |
 | 
	
		
			
				|  |  | -					option := html option with: each.
 | 
	
		
			
				|  |  | -					currentProtocol = each ifTrue: [ option at: 'selected' put: 'selected' ] ] ].
 | 
	
		
			
				|  |  | -		selectedMethod isNil ifFalse: [
 | 
	
		
			
				|  |  | -			referencesSelect := html select.
 | 
	
		
			
				|  |  | -						referencesSelect
 | 
	
		
			
				|  |  | -				onChange: [ self searchReferencesOf: referencesSelect asJQuery val ];
 | 
	
		
			
				|  |  | -				with: [ |option|
 | 
	
		
			
				|  |  | -					html option
 | 
	
		
			
				|  |  | -						with: 'References';
 | 
	
		
			
				|  |  | -						at: 'disabled' put: 'disabled';
 | 
	
		
			
				|  |  | -						at: 'selected' put: 'selected'.
 | 
	
		
			
				|  |  | -					html option
 | 
	
		
			
				|  |  | -						class: 'important';
 | 
	
		
			
				|  |  | -						with: selectedMethod selector.
 | 
	
		
			
				|  |  | -					selectedMethod messageSends sorted do: [ :each |
 | 
	
		
			
				|  |  | -						html option with: each ]] ]].
 | 
	
		
			
				|  |  | -	selectedMethod isNil
 | 
	
		
			
				|  |  | -		ifTrue: [
 | 
	
		
			
				|  |  | -			self hideMethodButtons.
 | 
	
		
			
				|  |  | -				(selectedClass isNil or: [ selectedProtocol notNil ])
 | 
	
		
			
				|  |  | -					ifTrue: [ self hideClassButtons ]
 | 
	
		
			
				|  |  | -					ifFalse: [ self showClassButtons ]]
 | 
	
		
			
				|  |  | -		ifFalse: [
 | 
	
		
			
				|  |  | -			self hideClassButtons.
 | 
	
		
			
				|  |  | -			self showMethodButtons ].
 | 
	
		
			
				|  |  | -	sourceArea val: self source
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateStatus
 | 
	
		
			
				|  |  | -	sourceArea val = self source
 | 
	
		
			
				|  |  | -		ifTrue: [
 | 
	
		
			
				|  |  | -			saveButton ifNotNil: [
 | 
	
		
			
				|  |  | -				saveButton at: 'disabled' put: true ].
 | 
	
		
			
				|  |  | -				unsavedChanges := false ]
 | 
	
		
			
				|  |  | -		ifFalse: [
 | 
	
		
			
				|  |  | -			saveButton ifNotNil: [
 | 
	
		
			
				|  |  | -				saveButton removeAt: 'disabled' ].
 | 
	
		
			
				|  |  | -			unsavedChanges := true ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateTabsList
 | 
	
		
			
				|  |  | -	tabsList contents: [ :html || li |
 | 
	
		
			
				|  |  | -	li := html li.
 | 
	
		
			
				|  |  | -	selectedTab = #instance ifTrue: [ li class: 'selected' ].
 | 
	
		
			
				|  |  | -	li
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -		html span class: 'ltab'.
 | 
	
		
			
				|  |  | -		html span class: 'mtab'; with: 'Instance'.
 | 
	
		
			
				|  |  | -		html span class: 'rtab' ];
 | 
	
		
			
				|  |  | -		onClick: [ self selectTab: #instance ].
 | 
	
		
			
				|  |  | -	li := html li.
 | 
	
		
			
				|  |  | -	selectedTab = #class ifTrue: [ li class: 'selected' ].
 | 
	
		
			
				|  |  | -	li
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -		html span class: 'ltab'.
 | 
	
		
			
				|  |  | -		html span class: 'mtab'; with: 'Class'.
 | 
	
		
			
				|  |  | -		html span class: 'rtab' ];
 | 
	
		
			
				|  |  | -		onClick: [ self selectTab: #class ].
 | 
	
		
			
				|  |  | -	li := html li.
 | 
	
		
			
				|  |  | -	selectedTab = #comment ifTrue: [ li class: 'selected' ].
 | 
	
		
			
				|  |  | -	li
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -		html span class: 'ltab'.
 | 
	
		
			
				|  |  | -		html span class: 'mtab'; with: 'Comment'.
 | 
	
		
			
				|  |  | -		html span class: 'rtab' ];
 | 
	
		
			
				|  |  | -		onClick: [ self selectTab: #comment ]]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Browser class methodsFor: 'convenience'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	self new open
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -openOn: aClass
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -	open;
 | 
	
		
			
				|  |  | -	selectCategory: aClass category;
 | 
	
		
			
				|  |  | -	selectClass: aClass
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #Debugger
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'error selectedContext sourceArea ul ul2 inspector saveButton unsavedChanges selectedVariable selectedVariableName inspectButton'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -allVariables
 | 
	
		
			
				|  |  | -	| all |
 | 
	
		
			
				|  |  | -	all := Dictionary new.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self receiver class allInstanceVariableNames do: [ :each |
 | 
	
		
			
				|  |  | -		all at: each put: (self receiver instVarAt: each) ].
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	selectedContext locals keysAndValuesDo: [ :key :value |
 | 
	
		
			
				|  |  | -		all at: key put: value ].
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	^ all
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -error
 | 
	
		
			
				|  |  | -	^ error
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -error: anError
 | 
	
		
			
				|  |  | -	error := anError
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ '[ Debugger ]'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -method
 | 
	
		
			
				|  |  | -	^ selectedContext method
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -receiver
 | 
	
		
			
				|  |  | -	^ selectedContext receiver
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -source
 | 
	
		
			
				|  |  | -	^ self method
 | 
	
		
			
				|  |  | -		ifNil: [ 'Method doesn''t exist!!' ]
 | 
	
		
			
				|  |  | -		ifNotNil: [ self method source ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectSelectedVariable
 | 
	
		
			
				|  |  | -	selectedVariable inspect
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -proceed
 | 
	
		
			
				|  |  | -	self close.
 | 
	
		
			
				|  |  | -	selectedContext receiver perform: selectedContext selector withArguments: selectedContext locals
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -save
 | 
	
		
			
				|  |  | -	| protocol |
 | 
	
		
			
				|  |  | -	protocol := (selectedContext receiver class methodDictionary at: selectedContext selector) category.
 | 
	
		
			
				|  |  | -	selectedContext receiver class compile: sourceArea val protocol: protocol.
 | 
	
		
			
				|  |  | -	self updateStatus
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectContext: aContext
 | 
	
		
			
				|  |  | -	selectedContext := aContext.
 | 
	
		
			
				|  |  | -	selectedVariable := nil.
 | 
	
		
			
				|  |  | -	selectedVariableName := nil.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateContextsList;
 | 
	
		
			
				|  |  | -		updateSourceArea;
 | 
	
		
			
				|  |  | -		updateInspector;
 | 
	
		
			
				|  |  | -		updateVariablesList;
 | 
	
		
			
				|  |  | -		updateStatus
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectVariable: anObject named: aString
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	selectedVariable := anObject.
 | 
	
		
			
				|  |  | -	selectedVariableName := aString.
 | 
	
		
			
				|  |  | -	inspector contents: [ :html | html with: anObject printString ].
 | 
	
		
			
				|  |  | -	self updateVariablesList
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	unsavedChanges = false
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'amber_sourceCode debugger';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			sourceArea := SourceArea new.
 | 
	
		
			
				|  |  | -			sourceArea renderOn: html ].
 | 
	
		
			
				|  |  | -	ul2 := html ul class: 'amber_column debugger variables'.
 | 
	
		
			
				|  |  | -	inspector := html div class: 'amber_column debugger inspector'.
 | 
	
		
			
				|  |  | -	sourceArea
 | 
	
		
			
				|  |  | -		onKeyUp: [ self updateStatus ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		renderTopPanelOn: html;
 | 
	
		
			
				|  |  | -		renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	saveButton := html button
 | 
	
		
			
				|  |  | -		with: 'Save';
 | 
	
		
			
				|  |  | -		onClick: [ self save ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'DoIt';
 | 
	
		
			
				|  |  | -		onClick: [ sourceArea doIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'PrintIt';
 | 
	
		
			
				|  |  | -		onClick: [ sourceArea printIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'InspectIt';
 | 
	
		
			
				|  |  | -		onClick: [ sourceArea inspectIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'Proceed';
 | 
	
		
			
				|  |  | -		onClick: [ self proceed ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'Abandon';
 | 
	
		
			
				|  |  | -		onClick: [ self close ].
 | 
	
		
			
				|  |  | -	inspectButton := html button
 | 
	
		
			
				|  |  | -		class: 'amber_button debugger inspect';
 | 
	
		
			
				|  |  | -		with: 'Inspect';
 | 
	
		
			
				|  |  | -		onClick: [ self inspectSelectedVariable ].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateSourceArea;
 | 
	
		
			
				|  |  | -		updateStatus;
 | 
	
		
			
				|  |  | -		updateVariablesList;
 | 
	
		
			
				|  |  | -		updateInspector
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderContext: aContext on: html
 | 
	
		
			
				|  |  | -	| li |
 | 
	
		
			
				|  |  | -	li := html li.
 | 
	
		
			
				|  |  | -	selectedContext = aContext ifTrue: [
 | 
	
		
			
				|  |  | -		li class: 'selected' ].
 | 
	
		
			
				|  |  | -	li
 | 
	
		
			
				|  |  | -		with: aContext asString;
 | 
	
		
			
				|  |  | -		onClick: [ self selectContext: aContext ].
 | 
	
		
			
				|  |  | -	aContext outerContext ifNotNil: [ self renderContext: aContext outerContext on: html ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTopPanelOn: html
 | 
	
		
			
				|  |  | -	selectedContext := self error context.
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'top';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			html div
 | 
	
		
			
				|  |  | -				class: 'label';
 | 
	
		
			
				|  |  | -				with: self error messageText.
 | 
	
		
			
				|  |  | -			ul := html ul
 | 
	
		
			
				|  |  | -				class: 'amber_column debugger contexts';
 | 
	
		
			
				|  |  | -				with: [ self renderContext: self error context on: html ]]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -canBeClosed
 | 
	
		
			
				|  |  | -	^ true
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Debugger methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateContextsList
 | 
	
		
			
				|  |  | -	ul contents: [ :html |
 | 
	
		
			
				|  |  | -		self renderContext: self error context on: html ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateInspector
 | 
	
		
			
				|  |  | -	inspector contents: [ :html | ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateSourceArea
 | 
	
		
			
				|  |  | -	sourceArea val: self source
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateStatus
 | 
	
		
			
				|  |  | -	sourceArea val = self source
 | 
	
		
			
				|  |  | -		ifTrue: [
 | 
	
		
			
				|  |  | -			saveButton ifNotNil: [
 | 
	
		
			
				|  |  | -				saveButton at: 'disabled' put: true ].
 | 
	
		
			
				|  |  | -			unsavedChanges := false ]
 | 
	
		
			
				|  |  | -		ifFalse: [
 | 
	
		
			
				|  |  | -			saveButton ifNotNil: [
 | 
	
		
			
				|  |  | -				saveButton removeAt: 'disabled' ].
 | 
	
		
			
				|  |  | -			unsavedChanges := true ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateVariablesList
 | 
	
		
			
				|  |  | -	ul2 contents: [ :html | | li |
 | 
	
		
			
				|  |  | -		li := html li
 | 
	
		
			
				|  |  | -			with: 'self';
 | 
	
		
			
				|  |  | -			onClick: [ self selectVariable: self receiver named: 'self' ].
 | 
	
		
			
				|  |  | -				selectedVariableName = 'self' ifTrue: [ li class: 'selected' ].
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		self allVariables keysAndValuesDo: [ :key :value |
 | 
	
		
			
				|  |  | -						li := html li
 | 
	
		
			
				|  |  | -							with: key;
 | 
	
		
			
				|  |  | -							onClick: [ self selectVariable: value named: key ].
 | 
	
		
			
				|  |  | -						selectedVariableName = key ifTrue: [
 | 
	
		
			
				|  |  | -							li class: 'selected' ] ] ].
 | 
	
		
			
				|  |  | -							
 | 
	
		
			
				|  |  | -	selectedVariable
 | 
	
		
			
				|  |  | -		ifNil: [ inspectButton at: 'disabled' put: true ]
 | 
	
		
			
				|  |  | -		ifNotNil: [ inspectButton removeAt: 'disabled' ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #IDEInspector
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'label variables object selectedVariable variablesList valueTextarea diveButton sourceArea'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ label ifNil: [ 'Inspector (nil)' ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedVariable
 | 
	
		
			
				|  |  | -	^ selectedVariable
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedVariable: aString
 | 
	
		
			
				|  |  | -	selectedVariable := aString
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setLabel: aString
 | 
	
		
			
				|  |  | -	label := aString
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setVariables: aCollection
 | 
	
		
			
				|  |  | -	variables := aCollection
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -sourceArea
 | 
	
		
			
				|  |  | -	^ sourceArea
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -variables
 | 
	
		
			
				|  |  | -	^ variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -dive
 | 
	
		
			
				|  |  | -	(self variables at: self selectedVariable) inspect
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspect: anObject
 | 
	
		
			
				|  |  | -	object := anObject.
 | 
	
		
			
				|  |  | -	variables := #().
 | 
	
		
			
				|  |  | -	object inspectOn: self
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -refresh
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		inspect: object;
 | 
	
		
			
				|  |  | -		updateVariablesList;
 | 
	
		
			
				|  |  | -		updateValueTextarea
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -	class: 'amber_sourceCode';
 | 
	
		
			
				|  |  | -	with: [
 | 
	
		
			
				|  |  | -		sourceArea := SourceArea new
 | 
	
		
			
				|  |  | -		receiver: object;
 | 
	
		
			
				|  |  | -		onDoIt: [ self refresh ];
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -			sourceArea renderOn: html ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		renderTopPanelOn: html;
 | 
	
		
			
				|  |  | -		renderBottomPanelOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'DoIt';
 | 
	
		
			
				|  |  | -		onClick: [ self sourceArea doIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'PrintIt';
 | 
	
		
			
				|  |  | -		onClick: [ self sourceArea printIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -		with: 'InspectIt';
 | 
	
		
			
				|  |  | -		onClick: [ self sourceArea inspectIt ].
 | 
	
		
			
				|  |  | -	self updateButtons
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderTopPanelOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'top';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			variablesList := html ul class: 'amber_column variables'.
 | 
	
		
			
				|  |  | -			valueTextarea := html textarea class: 'amber_column value'; at: 'readonly' put: 'readonly'; yourself.
 | 
	
		
			
				|  |  | -			html div class: 'amber_tabs inspector'; with: [
 | 
	
		
			
				|  |  | -				html button
 | 
	
		
			
				|  |  | -					class: 'amber_button inspector refresh';
 | 
	
		
			
				|  |  | -					with: 'Refresh';
 | 
	
		
			
				|  |  | -					onClick: [ self refresh ].
 | 
	
		
			
				|  |  | -				diveButton := html button
 | 
	
		
			
				|  |  | -					class: 'amber_button inspector dive';
 | 
	
		
			
				|  |  | -					with: 'Dive';
 | 
	
		
			
				|  |  | -					onClick: [ self dive ]].
 | 
	
		
			
				|  |  | -			html div class: 'amber_clear' ].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateVariablesList;
 | 
	
		
			
				|  |  | -		updateValueTextarea.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -canBeClosed
 | 
	
		
			
				|  |  | -	^ true
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectVariable: aString
 | 
	
		
			
				|  |  | -	self selectedVariable: aString.
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateVariablesList;
 | 
	
		
			
				|  |  | -		updateValueTextarea;
 | 
	
		
			
				|  |  | -		updateButtons
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateButtons
 | 
	
		
			
				|  |  | -	(self selectedVariable notNil and: [ (self variables at: self selectedVariable) notNil ])
 | 
	
		
			
				|  |  | -		ifFalse: [ diveButton at: 'disabled' put: true ]
 | 
	
		
			
				|  |  | -		ifTrue: [ diveButton removeAt: 'disabled' ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateValueTextarea
 | 
	
		
			
				|  |  | -	valueTextarea asJQuery val: (self selectedVariable isNil
 | 
	
		
			
				|  |  | -		ifTrue: [ '' ]
 | 
	
		
			
				|  |  | -		ifFalse: [ (self variables at: self selectedVariable) printString ])
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateVariablesList
 | 
	
		
			
				|  |  | -	variablesList contents: [ :html |
 | 
	
		
			
				|  |  | -		self variables keysDo: [ :each || li |
 | 
	
		
			
				|  |  | -			li := html li.
 | 
	
		
			
				|  |  | -			li
 | 
	
		
			
				|  |  | -				with: each;
 | 
	
		
			
				|  |  | -				onClick: [ self selectVariable: each ].
 | 
	
		
			
				|  |  | -			self selectedVariable = each ifTrue: [
 | 
	
		
			
				|  |  | -				li class: 'selected' ]] ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDEInspector class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspect: anObject
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -		inspect: anObject;
 | 
	
		
			
				|  |  | -		open;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -on: anObject
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -		inspect: anObject;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #IDETranscript
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'textarea'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDETranscript methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ 'Transcript'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDETranscript methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -clear
 | 
	
		
			
				|  |  | -	textarea asJQuery val: ''
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cr
 | 
	
		
			
				|  |  | -	textarea asJQuery val: textarea asJQuery val, String cr.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	TabManager current
 | 
	
		
			
				|  |  | -	open;
 | 
	
		
			
				|  |  | -	selectTab: self
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -show: anObject
 | 
	
		
			
				|  |  | -	textarea ifNil: [ self open ].
 | 
	
		
			
				|  |  | -	textarea asJQuery val: textarea asJQuery val, anObject asString.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDETranscript methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	textarea := html textarea.
 | 
	
		
			
				|  |  | -	textarea
 | 
	
		
			
				|  |  | -	class: 'amber_transcript';
 | 
	
		
			
				|  |  | -	at: 'spellcheck' put: 'false'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'Clear transcript';
 | 
	
		
			
				|  |  | -	onClick: [ self clear ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -IDETranscript class instanceVariableNames: 'current'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDETranscript class methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	Transcript register: self current
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!IDETranscript class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -current
 | 
	
		
			
				|  |  | -	^ current ifNil: [ current := super new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -new
 | 
	
		
			
				|  |  | -	self shouldNotImplement
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -open
 | 
	
		
			
				|  |  | -	TabManager current
 | 
	
		
			
				|  |  | -		open;
 | 
	
		
			
				|  |  | -		selectTab: self current
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #ProgressBar
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'percent progressDiv div'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ProgressBar methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -percent
 | 
	
		
			
				|  |  | -	^ percent ifNil: [ 0 ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -percent: aNumber
 | 
	
		
			
				|  |  | -	percent := aNumber
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ProgressBar methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	div := html div
 | 
	
		
			
				|  |  | -		class: 'progress_bar';
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -	self renderProgressBar
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderProgressBar
 | 
	
		
			
				|  |  | -	div contents: [ :html |
 | 
	
		
			
				|  |  | -		html div
 | 
	
		
			
				|  |  | -			class: 'progress';
 | 
	
		
			
				|  |  | -			style: 'width:', self percent asString, '%' ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ProgressBar methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updatePercent: aNumber
 | 
	
		
			
				|  |  | -	self percent: aNumber.
 | 
	
		
			
				|  |  | -	self renderProgressBar
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #ReferencesBrowser
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList matches matchesList'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classesAndMetaclasses
 | 
	
		
			
				|  |  | -	^ Smalltalk classes, (Smalltalk classes collect: [ :each | each class ])
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -implementors
 | 
	
		
			
				|  |  | -	^ implementors ifNil: [ implementors := Array new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ '[ References ]'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -matches
 | 
	
		
			
				|  |  | -	^ matches ifNil: [ matches := Array new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -referencedClasses
 | 
	
		
			
				|  |  | -	^ referencedClasses ifNil: [ referencedClasses := Array new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selector
 | 
	
		
			
				|  |  | -	^ selector
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -senders
 | 
	
		
			
				|  |  | -	^ senders ifNil: [ senders := Array new ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -openBrowserOn: aMethod
 | 
	
		
			
				|  |  | -	| browser |
 | 
	
		
			
				|  |  | -	browser := Browser openOn: (aMethod methodClass isMetaclass
 | 
	
		
			
				|  |  | -		ifTrue: [ aMethod methodClass instanceClass ] ifFalse: [ aMethod methodClass ]).
 | 
	
		
			
				|  |  | -	aMethod methodClass isMetaclass ifTrue: [ browser selectTab: #class ].
 | 
	
		
			
				|  |  | -	browser
 | 
	
		
			
				|  |  | -		selectProtocol: aMethod category;
 | 
	
		
			
				|  |  | -		selectMethod: aMethod
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -search: aString
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		searchReferencesFor: aString;
 | 
	
		
			
				|  |  | -		updateImplementorsList;
 | 
	
		
			
				|  |  | -		updateSendersList;
 | 
	
		
			
				|  |  | -		updateReferencedClassesList;
 | 
	
		
			
				|  |  | -		updateMatchesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchMethodSource
 | 
	
		
			
				|  |  | -	| regex |
 | 
	
		
			
				|  |  | -	regex := selector allButFirst.
 | 
	
		
			
				|  |  | -	self classesAndMetaclasses do: [ :each |
 | 
	
		
			
				|  |  | -		each methodDictionary valuesDo: [ :value |
 | 
	
		
			
				|  |  | -			(value source match: regex) ifTrue: [
 | 
	
		
			
				|  |  | -				self matches add: value ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchReferencedClasses
 | 
	
		
			
				|  |  | -	self classesAndMetaclasses do: [ :each |
 | 
	
		
			
				|  |  | -		each methodDictionary valuesDo: [ :value |
 | 
	
		
			
				|  |  | -			(value referencedClasses includes: selector) ifTrue: [
 | 
	
		
			
				|  |  | -				self referencedClasses add: value ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchReferencesFor: aString
 | 
	
		
			
				|  |  | -	selector := aString.
 | 
	
		
			
				|  |  | -	implementors := Array new.
 | 
	
		
			
				|  |  | -	senders := Array new.
 | 
	
		
			
				|  |  | -	referencedClasses := Array new.
 | 
	
		
			
				|  |  | -	matches := Array new.
 | 
	
		
			
				|  |  | -	self searchMethodSource.
 | 
	
		
			
				|  |  | -	(selector match: '^[A-Z]')
 | 
	
		
			
				|  |  | -		ifFalse: [ self searchSelectorReferences ]
 | 
	
		
			
				|  |  | -		ifTrue: [ self searchReferencedClasses ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -searchSelectorReferences
 | 
	
		
			
				|  |  | -	self classesAndMetaclasses do: [ :each |
 | 
	
		
			
				|  |  | -		each methodDictionary keysAndValuesDo: [ :key :value |
 | 
	
		
			
				|  |  | -			key = selector ifTrue: [ self implementors add: value ].
 | 
	
		
			
				|  |  | -			(value messageSends includes: selector) ifTrue: [
 | 
	
		
			
				|  |  | -				self senders add: value ]] ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	selector := ''
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'private'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -setInputEvents
 | 
	
		
			
				|  |  | -	input
 | 
	
		
			
				|  |  | -		onKeyUp: [ timer := [ self search: input asJQuery val ] valueWithTimeout: 100 ];
 | 
	
		
			
				|  |  | -		onKeyDown: [ timer ifNotNil: [ timer clearTimeout ]]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		renderInputOn: html;
 | 
	
		
			
				|  |  | -		renderImplementorsOn: html;
 | 
	
		
			
				|  |  | -		renderSendersOn: html;
 | 
	
		
			
				|  |  | -		renderReferencedClassesOn: html;
 | 
	
		
			
				|  |  | -		renderMatchesOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderImplementorsOn: html
 | 
	
		
			
				|  |  | -	implementorsList := html ul class: 'amber_column implementors'.
 | 
	
		
			
				|  |  | -	self updateImplementorsList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderInputOn: html
 | 
	
		
			
				|  |  | -	input := html input
 | 
	
		
			
				|  |  | -		class: 'implementors';
 | 
	
		
			
				|  |  | -		yourself.
 | 
	
		
			
				|  |  | -	input asJQuery val: selector.
 | 
	
		
			
				|  |  | -	self setInputEvents
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderMatchesOn: html
 | 
	
		
			
				|  |  | -	matchesList := html ul class: 'amber_column matches'.
 | 
	
		
			
				|  |  | -	self updateMatchesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderReferencedClassesOn: html
 | 
	
		
			
				|  |  | -	referencedClassesList := html ul class: 'amber_column referenced_classes'.
 | 
	
		
			
				|  |  | -	self updateReferencedClassesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSendersOn: html
 | 
	
		
			
				|  |  | -	sendersList := html ul class: 'amber_column senders'.
 | 
	
		
			
				|  |  | -	self updateSendersList
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -canBeClosed
 | 
	
		
			
				|  |  | -	^ true
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateImplementorsList
 | 
	
		
			
				|  |  | -	implementorsList contents: [ :html |
 | 
	
		
			
				|  |  | -	html li
 | 
	
		
			
				|  |  | -		class: 'column_label';
 | 
	
		
			
				|  |  | -		with: 'Implementors (', self implementors size asString, ')';
 | 
	
		
			
				|  |  | -		style: 'font-weight: bold'.
 | 
	
		
			
				|  |  | -	self implementors do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: (each methodClass asString, ' >> ', self selector);
 | 
	
		
			
				|  |  | -		onClick: [ self openBrowserOn: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateMatchesList
 | 
	
		
			
				|  |  | -	matchesList contents: [ :html |
 | 
	
		
			
				|  |  | -	html li
 | 
	
		
			
				|  |  | -		class: 'column_label';
 | 
	
		
			
				|  |  | -		with: 'Regex matches (', self matches size asString, ')';
 | 
	
		
			
				|  |  | -		style: 'font-weight: bold'.
 | 
	
		
			
				|  |  | -	self matches do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: (each methodClass asString, ' >> ', each selector);
 | 
	
		
			
				|  |  | -		onClick: [ self openBrowserOn: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateReferencedClassesList
 | 
	
		
			
				|  |  | -	referencedClassesList contents: [ :html |
 | 
	
		
			
				|  |  | -	html li
 | 
	
		
			
				|  |  | -		class: 'column_label';
 | 
	
		
			
				|  |  | -		with: 'Class references (', self referencedClasses size asString, ')';
 | 
	
		
			
				|  |  | -		style: 'font-weight: bold'.
 | 
	
		
			
				|  |  | -	self referencedClasses do: [ :each |
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -			with: (each methodClass asString, ' >> ', each selector);
 | 
	
		
			
				|  |  | -			onClick: [ self openBrowserOn: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateSendersList
 | 
	
		
			
				|  |  | -	sendersList contents: [ :html |
 | 
	
		
			
				|  |  | -	html li
 | 
	
		
			
				|  |  | -		class: 'column_label';
 | 
	
		
			
				|  |  | -		with: 'Senders (', self senders size asString, ')';
 | 
	
		
			
				|  |  | -		style: 'font-weight: bold'.
 | 
	
		
			
				|  |  | -	self senders do: [ :each |
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -			with: (each methodClass asString, ' >> ', each selector);
 | 
	
		
			
				|  |  | -			onClick: [ self openBrowserOn: each ]] ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!ReferencesBrowser class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -search: aString
 | 
	
		
			
				|  |  | -	^ self new
 | 
	
		
			
				|  |  | -		searchReferencesFor: aString;
 | 
	
		
			
				|  |  | -		open
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #TestRunner
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'selectedCategories packagesList selectedClasses classesList selectedMethods progressBar methodsList result statusDiv'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -allClasses
 | 
	
		
			
				|  |  | -	^ TestCase allSubclasses select: [ :each | each isAbstract not ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -classes
 | 
	
		
			
				|  |  | -	^ (self allClasses
 | 
	
		
			
				|  |  | -	select: [ :each | self selectedCategories includes: each category ])
 | 
	
		
			
				|  |  | -	sort: [ :a :b | a name > b name ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ 'SUnit'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -packages
 | 
	
		
			
				|  |  | -	| packages |
 | 
	
		
			
				|  |  | -	packages := Array new.
 | 
	
		
			
				|  |  | -	self allClasses do: [ :each |
 | 
	
		
			
				|  |  | -	(packages includes: each category) ifFalse: [
 | 
	
		
			
				|  |  | -		packages add: each category ]].
 | 
	
		
			
				|  |  | -	^ packages sort
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -progressBar
 | 
	
		
			
				|  |  | -	^ progressBar ifNil: [ progressBar := ProgressBar new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -result
 | 
	
		
			
				|  |  | -	^ result
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedCategories
 | 
	
		
			
				|  |  | -	^ selectedCategories ifNil: [ selectedCategories := Array new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectedClasses
 | 
	
		
			
				|  |  | -	^ selectedClasses ifNil: [ selectedClasses := Array new ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -statusInfo
 | 
	
		
			
				|  |  | -	^ self printTotal, self printPasses, self printErrors, self printFailures
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -testCases
 | 
	
		
			
				|  |  | -	| testCases |
 | 
	
		
			
				|  |  | -	testCases := #().
 | 
	
		
			
				|  |  | -	(self selectedClasses
 | 
	
		
			
				|  |  | -		select: [ :each | self selectedCategories includes: each category ])
 | 
	
		
			
				|  |  | -		do: [ :each | testCases addAll: each buildSuite ].
 | 
	
		
			
				|  |  | -	^ testCases
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -performFailure: aTestCase
 | 
	
		
			
				|  |  | -	aTestCase runCase
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -run: aCollection
 | 
	
		
			
				|  |  | -| worker |
 | 
	
		
			
				|  |  | -	worker := TestSuiteRunner on: aCollection.
 | 
	
		
			
				|  |  | -	result := worker result.
 | 
	
		
			
				|  |  | -	worker announcer on: ResultAnnouncement do: [ :ann |
 | 
	
		
			
				|  |  | -		ann result == result ifTrue: [
 | 
	
		
			
				|  |  | -			self progressBar updatePercent: result runs / result total * 100.
 | 
	
		
			
				|  |  | -			self updateStatusDiv.
 | 
	
		
			
				|  |  | -			self updateMethodsList
 | 
	
		
			
				|  |  | -		]
 | 
	
		
			
				|  |  | -	].
 | 
	
		
			
				|  |  | -	worker run
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectAllCategories
 | 
	
		
			
				|  |  | -	self packages do: [ :each |
 | 
	
		
			
				|  |  | -		(selectedCategories includes: each) ifFalse: [
 | 
	
		
			
				|  |  | -			self selectedCategories add: each ]].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateCategoriesList;
 | 
	
		
			
				|  |  | -		updateClassesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -selectAllClasses
 | 
	
		
			
				|  |  | -	self classes do: [ :each |
 | 
	
		
			
				|  |  | -		(selectedClasses includes: each) ifFalse: [
 | 
	
		
			
				|  |  | -			self selectedClasses add: each ]].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateCategoriesList;
 | 
	
		
			
				|  |  | -		updateClassesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -toggleCategory: aCategory
 | 
	
		
			
				|  |  | -	(self isSelectedCategory: aCategory)
 | 
	
		
			
				|  |  | -		ifFalse: [ selectedCategories add: aCategory ]
 | 
	
		
			
				|  |  | -		ifTrue: [ selectedCategories remove: aCategory ].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateCategoriesList;
 | 
	
		
			
				|  |  | -		updateClassesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -toggleClass: aClass
 | 
	
		
			
				|  |  | -	(self isSelectedClass: aClass)
 | 
	
		
			
				|  |  | -		ifFalse: [ selectedClasses add: aClass ]
 | 
	
		
			
				|  |  | -		ifTrue: [ selectedClasses remove: aClass ].
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -		updateClassesList
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -initialize
 | 
	
		
			
				|  |  | -	super initialize.
 | 
	
		
			
				|  |  | -	result := TestResult new
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'printing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printErrors
 | 
	
		
			
				|  |  | -	^ self result errors size asString , ' errors, '
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printFailures
 | 
	
		
			
				|  |  | -	^ self result failures size asString, ' failures'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printPasses
 | 
	
		
			
				|  |  | -	^ (self result runs - self result errors size - self result failures size) asString , ' passes, '
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printTotal
 | 
	
		
			
				|  |  | -	^ self result total asString, ' runs, '
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	self
 | 
	
		
			
				|  |  | -	renderCategoriesOn: html;
 | 
	
		
			
				|  |  | -	renderClassesOn: html;
 | 
	
		
			
				|  |  | -	renderResultsOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'Run selected';
 | 
	
		
			
				|  |  | -	onClick: [ self run: self testCases ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderCategoriesOn: html
 | 
	
		
			
				|  |  | -	packagesList := html ul class: 'amber_column sunit packages'.
 | 
	
		
			
				|  |  | -	self updateCategoriesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderClassesOn: html
 | 
	
		
			
				|  |  | -	classesList := html ul class: 'amber_column sunit classes'.
 | 
	
		
			
				|  |  | -	self updateClassesList
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderErrorsOn: html
 | 
	
		
			
				|  |  | -	self result errors do: [ :each |
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -			class: 'errors';
 | 
	
		
			
				|  |  | -			with: each class name, ' >> ', each selector;
 | 
	
		
			
				|  |  | -						onClick: [ self performFailure: each ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderFailuresOn: html
 | 
	
		
			
				|  |  | -	self result failures do: [ :each |
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -			class: 'failures';
 | 
	
		
			
				|  |  | -			with: each class name, ' >> ', each selector;
 | 
	
		
			
				|  |  | -						onClick: [ self performFailure: each ]]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderResultsOn: html
 | 
	
		
			
				|  |  | -	statusDiv := html div.
 | 
	
		
			
				|  |  | -	html with: self progressBar.
 | 
	
		
			
				|  |  | -	methodsList := html ul class: 'amber_column sunit results'.
 | 
	
		
			
				|  |  | -	self updateMethodsList.
 | 
	
		
			
				|  |  | -	self updateStatusDiv
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'testing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -isSelectedCategory: aCategory
 | 
	
		
			
				|  |  | -	^ (self selectedCategories includes: aCategory)
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -isSelectedClass: aClass
 | 
	
		
			
				|  |  | -	^ (self selectedClasses includes: aClass)
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!TestRunner methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateCategoriesList
 | 
	
		
			
				|  |  | -	packagesList contents: [ :html |
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -		class: 'all';
 | 
	
		
			
				|  |  | -		with: 'All';
 | 
	
		
			
				|  |  | -		onClick: [ self selectAllCategories ].
 | 
	
		
			
				|  |  | -	self packages do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		(self selectedCategories includes: each) ifTrue: [
 | 
	
		
			
				|  |  | -		li class: 'selected' ].
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -		with: each;
 | 
	
		
			
				|  |  | -		onClick: [ self toggleCategory: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateClassesList
 | 
	
		
			
				|  |  | -	classesList contents: [ :html |
 | 
	
		
			
				|  |  | -	(self selectedCategories isEmpty) ifFalse: [
 | 
	
		
			
				|  |  | -		html li
 | 
	
		
			
				|  |  | -			class: 'all';
 | 
	
		
			
				|  |  | -			with: 'All';
 | 
	
		
			
				|  |  | -			onClick: [ self selectAllClasses ]].
 | 
	
		
			
				|  |  | -	self classes do: [ :each || li |
 | 
	
		
			
				|  |  | -		li := html li.
 | 
	
		
			
				|  |  | -		(self selectedClasses includes: each) ifTrue: [
 | 
	
		
			
				|  |  | -			li class: 'selected' ].
 | 
	
		
			
				|  |  | -		li
 | 
	
		
			
				|  |  | -			with: each name;
 | 
	
		
			
				|  |  | -			onClick: [ self toggleClass: each ]] ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateMethodsList
 | 
	
		
			
				|  |  | -	methodsList contents: [ :html |
 | 
	
		
			
				|  |  | -		self renderErrorsOn: html.
 | 
	
		
			
				|  |  | -				self renderFailuresOn: html ]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateStatusDiv
 | 
	
		
			
				|  |  | -	statusDiv class: 'sunit status ', result status.
 | 
	
		
			
				|  |  | -	statusDiv contents: [ :html |
 | 
	
		
			
				|  |  | -		html span with: self statusInfo ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -TabWidget subclass: #Workspace
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'sourceArea'
 | 
	
		
			
				|  |  | -	package: 'IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Workspace methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -label
 | 
	
		
			
				|  |  | -	^ 'Workspace'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Workspace methodsFor: 'actions'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -clearWorkspace
 | 
	
		
			
				|  |  | -	sourceArea clear
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -doIt
 | 
	
		
			
				|  |  | -	sourceArea doIt
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -fileIn
 | 
	
		
			
				|  |  | -	sourceArea fileIn
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectIt
 | 
	
		
			
				|  |  | -	sourceArea inspectIt
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -printIt
 | 
	
		
			
				|  |  | -	sourceArea printIt
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -show
 | 
	
		
			
				|  |  | -	super show.
 | 
	
		
			
				|  |  | -	sourceArea focus.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Workspace methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBoxOn: html
 | 
	
		
			
				|  |  | -	sourceArea := SourceArea new.
 | 
	
		
			
				|  |  | -	sourceArea renderOn: html
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderButtonsOn: html
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'DoIt';
 | 
	
		
			
				|  |  | -	title: 'ctrl+d';
 | 
	
		
			
				|  |  | -	onClick: [ self doIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'PrintIt';
 | 
	
		
			
				|  |  | -	title: 'ctrl+p';
 | 
	
		
			
				|  |  | -	onClick: [ self printIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'InspectIt';
 | 
	
		
			
				|  |  | -	title: 'ctrl+i';
 | 
	
		
			
				|  |  | -	onClick: [ self inspectIt ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'FileIn';
 | 
	
		
			
				|  |  | -	title: 'ctrl+f';
 | 
	
		
			
				|  |  | -	onClick: [ self fileIn ].
 | 
	
		
			
				|  |  | -	html button
 | 
	
		
			
				|  |  | -	with: 'Clear workspace';
 | 
	
		
			
				|  |  | -	onClick: [ self clearWorkspace ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!AssociativeCollection methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| variables |
 | 
	
		
			
				|  |  | -	variables := Dictionary new.
 | 
	
		
			
				|  |  | -	variables at: '#self' put: self.
 | 
	
		
			
				|  |  | -	variables at: '#keys' put: self keys.
 | 
	
		
			
				|  |  | -	self keysAndValuesDo: [ :key :value |
 | 
	
		
			
				|  |  | -		variables at: key put: value ].
 | 
	
		
			
				|  |  | -	anInspector
 | 
	
		
			
				|  |  | -		setLabel: self printString;
 | 
	
		
			
				|  |  | -		setVariables: variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Collection methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| variables |
 | 
	
		
			
				|  |  | -	variables := Dictionary new.
 | 
	
		
			
				|  |  | -	variables at: '#self' put: self.
 | 
	
		
			
				|  |  | -	self withIndexDo: [ :each :i |
 | 
	
		
			
				|  |  | -		variables at: i put: each ].
 | 
	
		
			
				|  |  | -	anInspector
 | 
	
		
			
				|  |  | -		setLabel: self printString;
 | 
	
		
			
				|  |  | -		setVariables: variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Date methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| variables |
 | 
	
		
			
				|  |  | -	variables := Dictionary new.
 | 
	
		
			
				|  |  | -	variables at: '#self' put: self.
 | 
	
		
			
				|  |  | -	variables at: '#year' put: self year.
 | 
	
		
			
				|  |  | -	variables at: '#month' put: self month.
 | 
	
		
			
				|  |  | -	variables at: '#day' put: self day.
 | 
	
		
			
				|  |  | -	variables at: '#hours' put: self hours.
 | 
	
		
			
				|  |  | -	variables at: '#minutes' put: self minutes.
 | 
	
		
			
				|  |  | -	variables at: '#seconds' put: self seconds.
 | 
	
		
			
				|  |  | -	variables at: '#milliseconds' put: self milliseconds.
 | 
	
		
			
				|  |  | -	anInspector
 | 
	
		
			
				|  |  | -		setLabel: self printString;
 | 
	
		
			
				|  |  | -		setVariables: variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!MethodContext methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| variables |
 | 
	
		
			
				|  |  | -	variables := Dictionary new.
 | 
	
		
			
				|  |  | -	variables at: '#self' put: self.
 | 
	
		
			
				|  |  | -	variables at: '#home' put: self home.
 | 
	
		
			
				|  |  | -	variables at: '#receiver' put: self receiver.
 | 
	
		
			
				|  |  | -	variables at: '#selector' put: self selector.
 | 
	
		
			
				|  |  | -	variables at: '#locals' put: self locals.
 | 
	
		
			
				|  |  | -	self class instanceVariableNames do: [ :each |
 | 
	
		
			
				|  |  | -		variables at: each put: (self instVarAt: each) ].
 | 
	
		
			
				|  |  | -	anInspector
 | 
	
		
			
				|  |  | -		setLabel: self printString;
 | 
	
		
			
				|  |  | -		setVariables: variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!Set methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| variables i |
 | 
	
		
			
				|  |  | -	variables := Dictionary new.
 | 
	
		
			
				|  |  | -	variables at: '#self' put: self.
 | 
	
		
			
				|  |  | -	i := 1.
 | 
	
		
			
				|  |  | -	self do: [ :each |
 | 
	
		
			
				|  |  | -		variables at: i put: each.
 | 
	
		
			
				|  |  | -		i := i + 1 ].
 | 
	
		
			
				|  |  | -	anInspector
 | 
	
		
			
				|  |  | -		setLabel: self printString;
 | 
	
		
			
				|  |  | -		setVariables: variables
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!String methodsFor: '*IDE'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -inspectOn: anInspector
 | 
	
		
			
				|  |  | -	| label |
 | 
	
		
			
				|  |  | -	super inspectOn: anInspector.
 | 
	
		
			
				|  |  | -	self printString size > 30
 | 
	
		
			
				|  |  | -		ifTrue: [ label := (self printString copyFrom: 1 to: 30), '...''' ]
 | 
	
		
			
				|  |  | -		ifFalse: [ label := self printString ].
 | 
	
		
			
				|  |  | -	anInspector setLabel: label
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 |