| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 | Smalltalk current createPackage: 'Helios-Inspector'!HLWidget subclass: #HLInspector	instanceVariableNames: 'model variablesWidget displayWidget codeWidget label'	package: 'Helios-Inspector'!!HLInspector 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 ]!inspectee	^ self model inspectee!inspectee: anObject	self model inspectee: anObject!label    ^ label ifNil: [ model inspectee printString ]!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 ]! !!HLInspector 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: HLRefreshRequested do: [ :ann | self onRefresh ];        on: HLDiveRequested do:[ self onDive ]!open	HLManager current addTab: (HLTab on: self labelled: self tabLabel)!refresh	self inspect: self inspectee!refreshDisplayWidget	self displayWidget refresh!refreshVariablesWidget	self variablesWidget refresh!setLabel: aString	label := aString!setVariables: aDictionary	self model variables: aDictionary! !!HLInspector methodsFor: 'reactions'!onDive	self inspect: self model selectedInstVarObject!onDoneIt	self refresh!onInspectIt!onInstanceVariableSelected	self codeWidget receiver: self model selectedInstVarObject.	self refreshDisplayWidget!onPrintIt!onRefresh	self refresh! !!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 methodsFor: 'accessing'!tabLabel	^ 'Inspector'!tabPriority	^ 10! !!HLInspector class methodsFor: 'testing'!canBeOpenAsTab	^ false! !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 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!selectedInstVarObject	^ self instVarObjectAt: self selection!selection	^ selection ifNil:[ '' ]!selection: anObject	selection := anObject.	self announcer announce: (HLInstanceVariableSelected on: selection)!variables	^ variables!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 inspectee class name!model    ^ model!model: aModel    model := aModel!selection	^ model selection!variables	^ model variables! !!HLInspectorVariablesWidget methodsFor: 'actions'!refresh	self resetItems.    super refresh!resetItems	items := nil! !!HLInspectorVariablesWidget methodsFor: 'defaults'!defaultItems	^ self model variables keys! !!HLInspectorVariablesWidget methodsFor: 'reactions'!selectItem: anObject	super selectItem: anObject.    self model selectedInstVar: anObject! !!HLInspectorVariablesWidget methodsFor: 'rendering'!renderButtonsOn: html	html button		class: 'btn';		with: 'Refresh';		onClick: [ self announcer announce: HLRefreshRequested new ].	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! !
 |