| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 | Smalltalk current createPackage: 'Helios-Inspector'!HLNavigationListWidget subclass: #HLInspectorDisplayWidget	instanceVariableNames: 'model'	package: 'Helios-Inspector'!!HLInspectorDisplayWidget methodsFor: 'accessing'!model	^ model!model: aModel	model := aModel! !!HLInspectorDisplayWidget methodsFor: 'rendering'!renderContentOn: html	    html div with: self selectionDisplayString!selectionDisplayString	|selection|	selection := model selection.    ^ (model variables keys includes: selection)    	ifTrue:[ (model instVarObjectAt: selection) printString ]      	ifFalse:[ '' ]! !Object subclass: #HLInspectorModel	instanceVariableNames: 'announcer environment inspectee code variables label selection'	package: 'Helios-Inspector'!!HLInspectorModel methodsFor: 'accessing'!announcer	^ announcer ifNil: [ announcer := Announcer new ]!code	"Answers the code model working for this workspace model"	^ code ifNil:[ code := HLCodeModel on: self environment ]!environment	^ environment ifNil: [ HLManager current environment ]!environment: anEnvironment	environment := anEnvironment!inspectee 	^ inspectee!inspectee: anObject 	inspectee := anObject!label    ^ label ifNil: [ self inspectee printString ]!label: aString    label := aString!selectedInstVarObject	^ self instVarObjectAt: self selection!selection	^ selection ifNil:[ '' ]!selection: anObject	selection := anObject.	self announcer announce: (HLInstanceVariableSelected on: selection)!variables	^ variables ifNil: [ Dictionary new ]!variables: aCollection	variables := aCollection! !!HLInspectorModel methodsFor: 'actions'!inspect: anObject on: anInspector	inspectee := anObject.	variables := #().	inspectee inspectOn: anInspector!instVarObjectAt: anInstVarName	^ self variables at: anInstVarName!selectedInstVar: anInstVarName    self selection: anInstVarName!subscribe: aWidget	aWidget subscribeTo: self announcer! !!HLInspectorModel methodsFor: 'reactions'!onKeyDown: 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;		}	}>! !!HLInspectorModel class methodsFor: 'actions'!on: anEnvironment	^ self new    	environment: anEnvironment;        yourself! !HLNavigationListWidget subclass: #HLInspectorVariablesWidget	instanceVariableNames: 'announcer model list diveButton'	package: 'Helios-Inspector'!!HLInspectorVariablesWidget methodsFor: 'accessing'!announcer	^ announcer ifNil:[ announcer := Announcer new ]!label	^ self model label!model    ^ model!model: aModel    model := aModel!selection	^ model selection!variables	^ self model variables keys! !!HLInspectorVariablesWidget methodsFor: 'actions'!refresh	self variables = self items ifFalse: [		self resetItems.    	super refresh ]!resetItems	items := nil! !!HLInspectorVariablesWidget methodsFor: 'defaults'!defaultItems	^ self variables! !!HLInspectorVariablesWidget methodsFor: 'reactions'!selectItem: anObject	super selectItem: anObject.    self model selectedInstVar: anObject! !!HLInspectorVariablesWidget methodsFor: 'rendering'!renderButtonsOn: html	diveButton := html button 		class: 'btn';		with: 'Dive'; 		onClick: [ self announcer announce: HLDiveRequested new ]!renderContentOn: html	self renderHeadOn: html.	super renderContentOn: html!renderHeadOn: html	html div 		class: 'list-label';		with: self label! !HLWidget subclass: #HLInspectorWidget	instanceVariableNames: 'model variablesWidget displayWidget codeWidget'	package: 'Helios-Inspector'!!HLInspectorWidget methodsFor: 'accessing'!codeWidget	^ codeWidget ifNil: [		codeWidget := HLCodeWidget new    		model: model code;        	receiver: model inspectee;        	yourself ]!displayWidget	^ displayWidget ifNil: [		displayWidget := HLInspectorDisplayWidget new    		model: self model;        	yourself ]!initialize	super initialize.	self register!inspectee	^ self model inspectee!inspectee: anObject	self model inspectee: anObject!label    ^ self model label!model	^ model ifNil: [     	self model: HLInspectorModel new.		model ]!model: aModel	model := aModel.     self codeWidget model: aModel code.        self         observeCodeWidget;    	observeVariablesWidget;        observeModel!tabLabel    ^ 'Inspector'!variablesWidget	^ variablesWidget ifNil: [		variablesWidget := HLInspectorVariablesWidget new    		model: self model;        	yourself ]! !!HLInspectorWidget methodsFor: 'actions'!inspect: anObject	self model inspect: anObject on: self.    	self     	refreshVariablesWidget;		refreshDisplayWidget!observeCodeWidget	self codeWidget announcer     	on: HLDoItExecuted         do: [ self onDoneIt ]!observeModel	self model announcer        on: HLInstanceVariableSelected		send: #onInstanceVariableSelected		to: self!observeVariablesWidget	self variablesWidget announcer         on: HLDiveRequested do:[ self onDive ]!refresh	self inspect: self inspectee!refreshDisplayWidget	self displayWidget refresh!refreshVariablesWidget	self variablesWidget refresh!setLabel: aString	self model label: aString!setVariables: aDictionary	self model variables: aDictionary! !!HLInspectorWidget methodsFor: 'reactions'!onDive	HLInspector new 		inspect: self model selectedInstVarObject;		openAsTab!onDoneIt	self refresh!onInspectIt!onInstanceVariableSelected	self codeWidget receiver: self model selectedInstVarObject.	self refreshDisplayWidget!onPrintIt! !!HLInspectorWidget methodsFor: 'registration'!register	HLInspector register: self!unregister	super unregister.	HLInspector unregister: self! !!HLInspectorWidget methodsFor: 'rendering'!renderContentOn: html   	html with: (HLHorizontalSplitter    	with: (HLVerticalSplitter             with: self variablesWidget            with: self displayWidget)        with: self codeWidget)! !HLInspectorWidget subclass: #HLInspector	instanceVariableNames: ''	package: 'Helios-Inspector'!!HLInspector methodsFor: 'rendering'!renderContentOn: html   	html with: (HLContainer with: (HLHorizontalSplitter    	with: (HLVerticalSplitter             with: self variablesWidget            with: self displayWidget)        with: self codeWidget)).		self variablesWidget focus! !HLInspector class instanceVariableNames: 'inspectors'!!HLInspector class methodsFor: 'accessing'!inspectors	^ inspectors ifNil: [ inspectors := OrderedCollection new ]!tabClass	^ 'inspector'!tabLabel	^ 'Inspector'!tabPriority	^ 10! !!HLInspector class methodsFor: 'actions'!inspect: anObject	self new		openAsTab;		inspect: anObject! !!HLInspector class methodsFor: 'initialization'!initialize	super initialize.	self watchChanges!watchChanges	[ self inspectors do: [ :each | each refresh ] ]		valueWithInterval: 500! !!HLInspector class methodsFor: 'registration'!register: anInspector	self inspectors add: anInspector!unregister: anInspector	self inspectors remove: anInspector! !!HLInspector class methodsFor: 'testing'!canBeOpenAsTab	^ false! !
 |