|  | @@ -246,18 +246,34 @@ protocol: 'actions',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $1;
 | 
	
		
			
				|  |  | +var $1,$2,$3,$4;
 | 
	
		
			
				|  |  |  $1=self._editor();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["editor"]=1;
 | 
	
		
			
				|  |  |  _st($1)._at_put_("amberCodeWidget",self);
 | 
	
		
			
				|  |  | -_st(self._editor())._on_do_("change",(function(){
 | 
	
		
			
				|  |  | +$2=self._editor();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["editor"]=2;
 | 
	
		
			
				|  |  | +_st($2)._on_do_("change",(function(){
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  |  return self._onChange();
 | 
	
		
			
				|  |  |  }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["on:do:"]=1;
 | 
	
		
			
				|  |  | +$3=self._editor();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["editor"]=3;
 | 
	
		
			
				|  |  | +_st($3)._on_do_("mousedown",(function(cm,event){
 | 
	
		
			
				|  |  | +var position,node;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +$4=_st(event)._at_("ctrlKey");
 | 
	
		
			
				|  |  | +if(smalltalk.assert($4)){
 | 
	
		
			
				|  |  | +position=_st(self._editor())._coordsChar_(globals.HashedCollection._newFromPairs_(["left",_st(event)._clientX(),"top",_st(event)._clientY()]));
 | 
	
		
			
				|  |  | +position;
 | 
	
		
			
				|  |  | +self._onCtrlClickAt_(_st(_st(_st(position)._line()).__at(_st(position)._ch())).__plus((1)));
 | 
	
		
			
				|  |  | +return _st(event)._preventDefault();
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({cm:cm,event:event,position:position,node:node},$ctx1,2)})}));
 | 
	
		
			
				|  |  |  return self}, function($ctx1) {$ctx1.fill(self,"configureEditor",{},globals.HLCodeWidget)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "configureEditor\x0a\x09self editor at: 'amberCodeWidget' put: self.\x0a\x09self editor on: 'change' do: [ self onChange ]",
 | 
	
		
			
				|  |  | -messageSends: ["at:put:", "editor", "on:do:", "onChange"],
 | 
	
		
			
				|  |  | +source: "configureEditor\x0a\x09self editor at: 'amberCodeWidget' put: self.\x0a\x09self editor on: 'change' do: [ self onChange ].\x0a\x09self editor on: 'mousedown' do: [ :cm :event | | position node |\x0a\x09\x09(event at: 'ctrlKey') ifTrue: [\x0a\x09\x09\x09position := self editor coordsChar: #{ \x0a\x09\x09\x09\x09'left' -> event clientX.\x0a\x09\x09\x09\x09'top' -> event clientY\x0a\x09\x09\x09}.\x0a\x09\x09\x09self onCtrlClickAt: (position line @ position ch) + 1.\x0a\x09\x09\x09event preventDefault ] ]",
 | 
	
		
			
				|  |  | +messageSends: ["at:put:", "editor", "on:do:", "onChange", "ifTrue:", "at:", "coordsChar:", "clientX", "clientY", "onCtrlClickAt:", "+", "@", "line", "ch", "preventDefault"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.HLCodeWidget);
 | 
	
	
		
			
				|  | @@ -552,6 +568,69 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.HLCodeWidget);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "navigateTo:",
 | 
	
		
			
				|  |  | +protocol: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aString){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var navigationClass;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +var $1;
 | 
	
		
			
				|  |  | +navigationClass=_st(_st(_st(self._model())._environment())._classes())._detect_ifNone_((function(each){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +return _st(_st(each)._name()).__eq(aString);
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}),(function(){
 | 
	
		
			
				|  |  | +return nil;
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +$1=navigationClass;
 | 
	
		
			
				|  |  | +if(($receiver = $1) == nil || $receiver == null){
 | 
	
		
			
				|  |  | +self._navigateToReference_(aString);
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +self._navigateToClass_(navigationClass);
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"navigateTo:",{aString:aString,navigationClass:navigationClass},globals.HLCodeWidget)})},
 | 
	
		
			
				|  |  | +args: ["aString"],
 | 
	
		
			
				|  |  | +source: "navigateTo: aString\x0a\x09| navigationClass |\x0a\x09\x0a\x09navigationClass := self model environment classes \x0a\x09\x09detect: [ :each | each name = aString ]\x0a\x09\x09ifNone: [ nil ].\x0a\x09\x09\x0a\x09navigationClass \x0a\x09\x09ifNil: [ self navigateToReference: aString ]\x0a\x09\x09ifNotNil: [ self navigateToClass: navigationClass ]",
 | 
	
		
			
				|  |  | +messageSends: ["detect:ifNone:", "classes", "environment", "model", "=", "name", "ifNil:ifNotNil:", "navigateToReference:", "navigateToClass:"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.HLCodeWidget);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "navigateToClass:",
 | 
	
		
			
				|  |  | +protocol: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aClass){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +function $HLBrowser(){return globals.HLBrowser||(typeof HLBrowser=="undefined"?nil:HLBrowser)}
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +_st(_st($HLBrowser())._openAsTab())._browseClass_(aClass);
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"navigateToClass:",{aClass:aClass},globals.HLCodeWidget)})},
 | 
	
		
			
				|  |  | +args: ["aClass"],
 | 
	
		
			
				|  |  | +source: "navigateToClass: aClass\x0a\x09(HLBrowser openAsTab)\x0a\x09\x09browseClass: aClass",
 | 
	
		
			
				|  |  | +messageSends: ["browseClass:", "openAsTab"],
 | 
	
		
			
				|  |  | +referencedClasses: ["HLBrowser"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.HLCodeWidget);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "navigateToReference:",
 | 
	
		
			
				|  |  | +protocol: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aString){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +function $HLReferences(){return globals.HLReferences||(typeof HLReferences=="undefined"?nil:HLReferences)}
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +_st(_st($HLReferences())._openAsTab())._search_(aString);
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"navigateToReference:",{aString:aString},globals.HLCodeWidget)})},
 | 
	
		
			
				|  |  | +args: ["aString"],
 | 
	
		
			
				|  |  | +source: "navigateToReference: aString\x0a\x09(HLReferences openAsTab)\x0a\x09\x09search: aString",
 | 
	
		
			
				|  |  | +messageSends: ["search:", "openAsTab"],
 | 
	
		
			
				|  |  | +referencedClasses: ["HLReferences"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.HLCodeWidget);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "onChange",
 | 
	
	
		
			
				|  | @@ -568,6 +647,47 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.HLCodeWidget);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "onCtrlClickAt:",
 | 
	
		
			
				|  |  | +protocol: 'reactions',
 | 
	
		
			
				|  |  | +fn: function (aPosition){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var ast,node;
 | 
	
		
			
				|  |  | +function $Smalltalk(){return globals.Smalltalk||(typeof Smalltalk=="undefined"?nil:Smalltalk)}
 | 
	
		
			
				|  |  | +function $Error(){return globals.Error||(typeof Error=="undefined"?nil:Error)}
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +var $1,$2;
 | 
	
		
			
				|  |  | +var $early={};
 | 
	
		
			
				|  |  | +try {
 | 
	
		
			
				|  |  | +ast=_st((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +return _st($Smalltalk())._parse_(_st(self._editor())._getValue());
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}))._on_do_($Error(),(function(error){
 | 
	
		
			
				|  |  | +throw $early=[self];
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +node=_st(ast)._atPosition_(aPosition);
 | 
	
		
			
				|  |  | +_st(console)._log_(node);
 | 
	
		
			
				|  |  | +$1=node;
 | 
	
		
			
				|  |  | +if(($receiver = $1) == nil || $receiver == null){
 | 
	
		
			
				|  |  | +return self;
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +$1;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +$2=_st(node)._isNavigationNode();
 | 
	
		
			
				|  |  | +if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  | +self._navigateTo_(_st(node)._navigationLink());
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +return self}
 | 
	
		
			
				|  |  | +catch(e) {if(e===$early)return e[0]; throw e}
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"onCtrlClickAt:",{aPosition:aPosition,ast:ast,node:node},globals.HLCodeWidget)})},
 | 
	
		
			
				|  |  | +args: ["aPosition"],
 | 
	
		
			
				|  |  | +source: "onCtrlClickAt: aPosition\x0a\x09| ast node |\x0a\x09\x0a\x09ast := [ Smalltalk parse: self editor getValue ] \x0a\x09\x09on: Error \x0a\x09\x09do: [ :error | ^ self ].\x0a\x09\x0a\x09node := (ast atPosition: aPosition).\x0a\x09console log: node.\x0a\x09node ifNil: [ ^ self ].\x0a\x09\x0a\x09node isNavigationNode ifTrue: [ \x0a\x09\x09self navigateTo: node navigationLink ]",
 | 
	
		
			
				|  |  | +messageSends: ["on:do:", "parse:", "getValue", "editor", "atPosition:", "log:", "ifNil:", "ifTrue:", "isNavigationNode", "navigateTo:", "navigationLink"],
 | 
	
		
			
				|  |  | +referencedClasses: ["Smalltalk", "Error"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.HLCodeWidget);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "onDoIt",
 | 
	
	
		
			
				|  | @@ -1451,6 +1571,22 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.HLBrowserCodeWidget);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "navigateToClass:",
 | 
	
		
			
				|  |  | +protocol: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aClass){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +_st(self._browserModel())._openClassNamed_(_st(aClass)._name());
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"navigateToClass:",{aClass:aClass},globals.HLBrowserCodeWidget)})},
 | 
	
		
			
				|  |  | +args: ["aClass"],
 | 
	
		
			
				|  |  | +source: "navigateToClass: aClass\x0a\x09self browserModel openClassNamed: aClass name",
 | 
	
		
			
				|  |  | +messageSends: ["openClassNamed:", "browserModel", "name"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.HLBrowserCodeWidget);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "observeBrowserModel",
 |