Преглед на файлове

fixes #833

- Cleans up HLCodeWidget announcements
- Adds the `Finder` service
- Adds `HLFinder`
- Adds polymorphic `#browse`
Nicolas Petton преди 10 години
родител
ревизия
896efd859f

+ 0 - 12
src/Helios-Announcements.js

@@ -118,18 +118,6 @@ smalltalk.addClass('HLDoItExecuted', globals.HLCodeHandled, [], 'Helios-Announce
 globals.HLDoItExecuted.comment="I am emitted by a `HLCodeWidget` after a DoIt has been executed.";
 globals.HLDoItExecuted.comment="I am emitted by a `HLCodeWidget` after a DoIt has been executed.";
 
 
 
 
-smalltalk.addClass('HLDoItRequested', globals.HLCodeHandled, [], 'Helios-Announcements');
-globals.HLDoItRequested.comment="I am emitted by a `HLCodeWidget` before a DoIt is executed.";
-
-
-smalltalk.addClass('HLInspectItRequested', globals.HLCodeHandled, [], 'Helios-Announcements');
-globals.HLInspectItRequested.comment="I am emitted by a `HLCodeWidget` before an object is inspected.";
-
-
-smalltalk.addClass('HLPrintItRequested', globals.HLCodeHandled, [], 'Helios-Announcements');
-globals.HLPrintItRequested.comment="I am emitted by a `HLCodeWidget` before an object is printed.";
-
-
 smalltalk.addClass('HLDebuggerAnnouncement', globals.HLAnnouncement, ['context'], 'Helios-Announcements');
 smalltalk.addClass('HLDebuggerAnnouncement', globals.HLAnnouncement, ['context'], 'Helios-Announcements');
 globals.HLDebuggerAnnouncement.comment="I am the root class of debugger announcements, and hold onto the debugged `context`.";
 globals.HLDebuggerAnnouncement.comment="I am the root class of debugger announcements, and hold onto the debugged `context`.";
 smalltalk.addMethod(
 smalltalk.addMethod(

+ 0 - 18
src/Helios-Announcements.st

@@ -62,24 +62,6 @@ HLCodeHandled subclass: #HLDoItExecuted
 !HLDoItExecuted commentStamp!
 !HLDoItExecuted commentStamp!
 I am emitted by a `HLCodeWidget` after a DoIt has been executed.!
 I am emitted by a `HLCodeWidget` after a DoIt has been executed.!
 
 
-HLCodeHandled subclass: #HLDoItRequested
-	instanceVariableNames: ''
-	package: 'Helios-Announcements'!
-!HLDoItRequested commentStamp!
-I am emitted by a `HLCodeWidget` before a DoIt is executed.!
-
-HLCodeHandled subclass: #HLInspectItRequested
-	instanceVariableNames: ''
-	package: 'Helios-Announcements'!
-!HLInspectItRequested commentStamp!
-I am emitted by a `HLCodeWidget` before an object is inspected.!
-
-HLCodeHandled subclass: #HLPrintItRequested
-	instanceVariableNames: ''
-	package: 'Helios-Announcements'!
-!HLPrintItRequested commentStamp!
-I am emitted by a `HLCodeWidget` before an object is printed.!
-
 HLAnnouncement subclass: #HLDebuggerAnnouncement
 HLAnnouncement subclass: #HLDebuggerAnnouncement
 	instanceVariableNames: 'context'
 	instanceVariableNames: 'context'
 	package: 'Helios-Announcements'!
 	package: 'Helios-Announcements'!

+ 95 - 3
src/Helios-Core.js

@@ -174,6 +174,74 @@ globals.HLModel);
 
 
 
 
 
 
+smalltalk.addClass('HLFinder', globals.HLModel, [], 'Helios-Core');
+globals.HLFinder.comment="I am the `Finder` service handler of Helios.\x0a\x0aFinding a class will open a new class browser, while finding a method will open a references browser.";
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findClass:",
+protocol: 'finding',
+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())._openClassNamed_(_st(aClass)._name());
+return self}, function($ctx1) {$ctx1.fill(self,"findClass:",{aClass:aClass},globals.HLFinder)})},
+args: ["aClass"],
+source: "findClass: aClass\x0a\x09HLBrowser openAsTab openClassNamed: aClass name",
+messageSends: ["openClassNamed:", "openAsTab", "name"],
+referencedClasses: ["HLBrowser"]
+}),
+globals.HLFinder);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findMethod:",
+protocol: 'finding',
+fn: function (aCompiledMethod){
+var self=this;
+function $HLBrowser(){return globals.HLBrowser||(typeof HLBrowser=="undefined"?nil:HLBrowser)}
+return smalltalk.withContext(function($ctx1) { 
+_st(_st($HLBrowser())._openAsTab())._openMethod_(aCompiledMethod);
+return self}, function($ctx1) {$ctx1.fill(self,"findMethod:",{aCompiledMethod:aCompiledMethod},globals.HLFinder)})},
+args: ["aCompiledMethod"],
+source: "findMethod: aCompiledMethod\x0a\x09HLBrowser openAsTab openMethod: aCompiledMethod",
+messageSends: ["openMethod:", "openAsTab"],
+referencedClasses: ["HLBrowser"]
+}),
+globals.HLFinder);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findString:",
+protocol: 'finding',
+fn: function (aString){
+var self=this;
+var foundClass;
+function $HLReferences(){return globals.HLReferences||(typeof HLReferences=="undefined"?nil:HLReferences)}
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+foundClass=_st(_st(self._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=foundClass;
+if(($receiver = $1) == nil || $receiver == null){
+_st(_st($HLReferences())._openAsTab())._search_(aString);
+} else {
+self._findClass_(foundClass);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"findString:",{aString:aString,foundClass:foundClass},globals.HLFinder)})},
+args: ["aString"],
+source: "findString: aString\x0a\x09| foundClass |\x0a\x09\x0a\x09foundClass := self environment classes \x0a\x09\x09detect: [ :each | each name = aString ]\x0a\x09\x09ifNone: [ nil ].\x0a\x09\x0a\x09foundClass \x0a\x09\x09ifNil: [ HLReferences openAsTab search: aString ]\x0a\x09\x09ifNotNil: [ self findClass: foundClass ]",
+messageSends: ["detect:ifNone:", "classes", "environment", "=", "name", "ifNil:ifNotNil:", "search:", "openAsTab", "findClass:"],
+referencedClasses: ["HLReferences"]
+}),
+globals.HLFinder);
+
+
+
 smalltalk.addClass('HLToolModel', globals.HLModel, ['selectedClass', 'selectedPackage', 'selectedProtocol', 'selectedSelector'], 'Helios-Core');
 smalltalk.addClass('HLToolModel', globals.HLModel, ['selectedClass', 'selectedPackage', 'selectedProtocol', 'selectedSelector'], 'Helios-Core');
 globals.HLToolModel.comment="I am a model specific to package and class manipulation. All browsers should either use me or a subclass as their model.\x0a\x0aI provide methods for package, class, protocol and method manipulation and access, forwarding to my environment.\x0a\x0aI also handle compilation of classes and methods as well as compilation and parsing errors.";
 globals.HLToolModel.comment="I am a model specific to package and class manipulation. All browsers should either use me or a subclass as their model.\x0a\x0aI provide methods for package, class, protocol and method manipulation and access, forwarding to my environment.\x0a\x0aI also handle compilation of classes and methods as well as compilation and parsing errors.";
 smalltalk.addMethod(
 smalltalk.addMethod(
@@ -3600,6 +3668,29 @@ referencedClasses: ["HLErrorHandler", "ErrorHandler"]
 }),
 }),
 globals.HLManager);
 globals.HLManager);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerFinder",
+protocol: 'services',
+fn: function (){
+var self=this;
+function $HLFinder(){return globals.HLFinder||(typeof HLFinder=="undefined"?nil:HLFinder)}
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=self._environment();
+$2=_st($HLFinder())._new();
+$ctx1.sendIdx["new"]=1;
+_st($1)._registerFinder_($2);
+_st($Finder())._register_(_st($HLFinder())._new());
+return self}, function($ctx1) {$ctx1.fill(self,"registerFinder",{},globals.HLManager)})},
+args: [],
+source: "registerFinder\x0a\x09self environment registerFinder: HLFinder new.\x0a\x09Finder register: HLFinder new",
+messageSends: ["registerFinder:", "environment", "new", "register:"],
+referencedClasses: ["HLFinder", "Finder"]
+}),
+globals.HLManager);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "registerInspector",
 selector: "registerInspector",
@@ -3653,11 +3744,12 @@ var $1;
 self._registerInspector();
 self._registerInspector();
 self._registerErrorHandler();
 self._registerErrorHandler();
 self._registerProgressHandler();
 self._registerProgressHandler();
-$1=self._registerTranscript();
+self._registerTranscript();
+$1=self._registerFinder();
 return self}, function($ctx1) {$ctx1.fill(self,"registerServices",{},globals.HLManager)})},
 return self}, function($ctx1) {$ctx1.fill(self,"registerServices",{},globals.HLManager)})},
 args: [],
 args: [],
-source: "registerServices\x0a\x09self\x0a\x09\x09registerInspector;\x0a\x09\x09registerErrorHandler;\x0a\x09\x09registerProgressHandler;\x0a\x09\x09registerTranscript",
-messageSends: ["registerInspector", "registerErrorHandler", "registerProgressHandler", "registerTranscript"],
+source: "registerServices\x0a\x09self\x0a\x09\x09registerInspector;\x0a\x09\x09registerErrorHandler;\x0a\x09\x09registerProgressHandler;\x0a\x09\x09registerTranscript;\x0a\x09\x09registrFinder",
+messageSends: ["registerInspector", "registerErrorHandler", "registerProgressHandler", "registerTranscript", "registrFinder"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLManager);
 globals.HLManager);

+ 37 - 1
src/Helios-Core.st

@@ -60,6 +60,36 @@ isToolModel
 	^ false
 	^ false
 ! !
 ! !
 
 
+HLModel subclass: #HLFinder
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+!HLFinder commentStamp!
+I am the `Finder` service handler of Helios.
+
+Finding a class will open a new class browser, while finding a method will open a references browser.!
+
+!HLFinder methodsFor: 'finding'!
+
+findClass: aClass
+	HLBrowser openAsTab openClassNamed: aClass name
+!
+
+findMethod: aCompiledMethod
+	HLBrowser openAsTab openMethod: aCompiledMethod
+!
+
+findString: aString
+	| foundClass |
+	
+	foundClass := self environment classes 
+		detect: [ :each | each name = aString ]
+		ifNone: [ nil ].
+	
+	foundClass 
+		ifNil: [ HLReferences openAsTab search: aString ]
+		ifNotNil: [ self findClass: foundClass ]
+! !
+
 HLModel subclass: #HLToolModel
 HLModel subclass: #HLToolModel
 	instanceVariableNames: 'selectedClass selectedPackage selectedProtocol selectedSelector'
 	instanceVariableNames: 'selectedClass selectedPackage selectedProtocol selectedSelector'
 	package: 'Helios-Core'!
 	package: 'Helios-Core'!
@@ -1260,7 +1290,8 @@ registerServices
 		registerInspector;
 		registerInspector;
 		registerErrorHandler;
 		registerErrorHandler;
 		registerProgressHandler;
 		registerProgressHandler;
-		registerTranscript
+		registerTranscript;
+		registrFinder
 !
 !
 
 
 setupEvents
 setupEvents
@@ -1344,6 +1375,11 @@ registerErrorHandler
 	ErrorHandler register: HLErrorHandler new
 	ErrorHandler register: HLErrorHandler new
 !
 !
 
 
+registerFinder
+	self environment registerFinder: HLFinder new.
+	Finder register: HLFinder new
+!
+
 registerInspector
 registerInspector
 	self environment registerInspector: HLInspector.
 	self environment registerInspector: HLInspector.
 	Inspector register: HLInspector
 	Inspector register: HLInspector

+ 86 - 115
src/Helios-Workspace.js

@@ -28,6 +28,22 @@ referencedClasses: ["Announcer"]
 }),
 }),
 globals.HLCodeModel);
 globals.HLCodeModel);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "browse:",
+protocol: 'actions',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(anObject)._browse();
+return self}, function($ctx1) {$ctx1.fill(self,"browse:",{anObject:anObject},globals.HLCodeModel)})},
+args: ["anObject"],
+source: "browse: anObject\x0a\x09anObject browse",
+messageSends: ["browse"],
+referencedClasses: []
+}),
+globals.HLCodeModel);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "defaultReceiver",
 selector: "defaultReceiver",
@@ -208,6 +224,22 @@ referencedClasses: []
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "browseIt",
+protocol: 'actions',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self._model())._browse_(self._doIt());
+return self}, function($ctx1) {$ctx1.fill(self,"browseIt",{},globals.HLCodeWidget)})},
+args: [],
+source: "browseIt\x0a\x09self model browse: self doIt",
+messageSends: ["browse:", "model", "doIt"],
+referencedClasses: []
+}),
+globals.HLCodeWidget);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "canHaveFocus",
 selector: "canHaveFocus",
@@ -272,7 +304,7 @@ return _st(event)._preventDefault();
 }, function($ctx2) {$ctx2.fillBlock({cm:cm,event:event,position:position,node:node},$ctx1,2)})}));
 }, function($ctx2) {$ctx2.fillBlock({cm:cm,event:event,position:position,node:node},$ctx1,2)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"configureEditor",{},globals.HLCodeWidget)})},
 return self}, function($ctx1) {$ctx1.fill(self,"configureEditor",{},globals.HLCodeWidget)})},
 args: [],
 args: [],
-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 ] ]",
+source: "configureEditor\x0a\x09self editor at: 'amberCodeWidget' put: self.\x0a\x09self editor on: 'change' do: [ self onChange ].\x0a\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"],
 messageSends: ["at:put:", "editor", "on:do:", "onChange", "ifTrue:", "at:", "coordsChar:", "clientX", "clientY", "onCtrlClickAt:", "+", "@", "line", "ch", "preventDefault"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
@@ -367,27 +399,20 @@ protocol: 'actions',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
 var result;
 var result;
-function $HLDoItRequested(){return globals.HLDoItRequested||(typeof HLDoItRequested=="undefined"?nil:HLDoItRequested)}
 function $HLDoItExecuted(){return globals.HLDoItExecuted||(typeof HLDoItExecuted=="undefined"?nil:HLDoItExecuted)}
 function $HLDoItExecuted(){return globals.HLDoItExecuted||(typeof HLDoItExecuted=="undefined"?nil:HLDoItExecuted)}
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1,$3,$4;
-$2=self._model();
+var $1,$2;
+$1=self._model();
 $ctx1.sendIdx["model"]=1;
 $ctx1.sendIdx["model"]=1;
-$1=_st($2)._announcer();
-$ctx1.sendIdx["announcer"]=1;
-$3=_st($HLDoItRequested())._on_(self["@model"]);
-$ctx1.sendIdx["on:"]=1;
-_st($1)._announce_($3);
-$ctx1.sendIdx["announce:"]=1;
-result=_st(self["@model"])._doIt_(self._currentLineOrSelection());
+result=_st($1)._doIt_(self._currentLineOrSelection());
 _st(_st(self._model())._announcer())._announce_(_st($HLDoItExecuted())._on_(self["@model"]));
 _st(_st(self._model())._announcer())._announce_(_st($HLDoItExecuted())._on_(self["@model"]));
-$4=result;
-return $4;
+$2=result;
+return $2;
 }, function($ctx1) {$ctx1.fill(self,"doIt",{result:result},globals.HLCodeWidget)})},
 }, function($ctx1) {$ctx1.fill(self,"doIt",{result:result},globals.HLCodeWidget)})},
 args: [],
 args: [],
-source: "doIt\x0a\x09| result |\x0a\x0a\x09self model announcer announce: (HLDoItRequested on: model).\x0a\x09result := model doIt: self currentLineOrSelection.\x0a\x09self model announcer announce: (HLDoItExecuted on: model).\x0a\x0a\x09^ result",
-messageSends: ["announce:", "announcer", "model", "on:", "doIt:", "currentLineOrSelection"],
-referencedClasses: ["HLDoItRequested", "HLDoItExecuted"]
+source: "doIt\x0a\x09| result |\x0a\x0a\x09result := self model doIt: self currentLineOrSelection.\x0a\x09self model announcer announce: (HLDoItExecuted on: model).\x0a\x0a\x09^ result",
+messageSends: ["doIt:", "model", "currentLineOrSelection", "announce:", "announcer", "on:"],
+referencedClasses: ["HLDoItExecuted"]
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
@@ -484,20 +509,13 @@ selector: "inspectIt",
 protocol: 'actions',
 protocol: 'actions',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
-var newInspector;
-function $HLInspectItRequested(){return globals.HLInspectItRequested||(typeof HLInspectItRequested=="undefined"?nil:HLInspectItRequested)}
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self._model();
-$ctx1.sendIdx["model"]=1;
-$1=_st($2)._announcer();
-_st($1)._announce_(_st($HLInspectItRequested())._on_(self["@model"]));
 _st(self._model())._inspect_(self._doIt());
 _st(self._model())._inspect_(self._doIt());
-return self}, function($ctx1) {$ctx1.fill(self,"inspectIt",{newInspector:newInspector},globals.HLCodeWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"inspectIt",{},globals.HLCodeWidget)})},
 args: [],
 args: [],
-source: "inspectIt\x0a\x09| newInspector |\x0a       \x0a\x09self model announcer announce: (HLInspectItRequested on: model).\x0a\x09self model inspect: self doIt",
-messageSends: ["announce:", "announcer", "model", "on:", "inspect:", "doIt"],
-referencedClasses: ["HLInspectItRequested"]
+source: "inspectIt\x0a\x09self model inspect: self doIt",
+messageSends: ["inspect:", "model", "doIt"],
+referencedClasses: []
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
@@ -574,43 +592,14 @@ selector: "navigateTo:",
 protocol: 'actions',
 protocol: 'actions',
 fn: function (aString){
 fn: function (aString){
 var self=this;
 var self=this;
-var navigationClass;
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
 return smalltalk.withContext(function($ctx1) { 
 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)})},
+_st($Finder())._findString_(aString);
+return self}, function($ctx1) {$ctx1.fill(self,"navigateTo:",{aString:aString},globals.HLCodeWidget)})},
 args: ["aString"],
 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"]
+source: "navigateTo: aString\x0a\x09Finder findString: aString",
+messageSends: ["findString:"],
+referencedClasses: ["Finder"]
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
@@ -688,22 +677,6 @@ referencedClasses: ["Smalltalk", "Error"]
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
-smalltalk.addMethod(
-smalltalk.method({
-selector: "onDoIt",
-protocol: 'reactions',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-self._doIt();
-return self}, function($ctx1) {$ctx1.fill(self,"onDoIt",{},globals.HLCodeWidget)})},
-args: [],
-source: "onDoIt\x0a\x09\x0a\x09self doIt",
-messageSends: ["doIt"],
-referencedClasses: []
-}),
-globals.HLCodeWidget);
-
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "onInspectIt",
 selector: "onInspectIt",
@@ -814,18 +787,14 @@ selector: "printIt",
 protocol: 'actions',
 protocol: 'actions',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
-var result;
-function $HLPrintItRequested(){return globals.HLPrintItRequested||(typeof HLPrintItRequested=="undefined"?nil:HLPrintItRequested)}
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-result=self._doIt();
-_st(_st(self._model())._announcer())._announce_(_st($HLPrintItRequested())._on_(self["@model"]));
-self._print_(_st(result)._printString());
+self._print_(_st(self._doIt())._printString());
 self._focus();
 self._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"printIt",{result:result},globals.HLCodeWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"printIt",{},globals.HLCodeWidget)})},
 args: [],
 args: [],
-source: "printIt\x0a\x09| result |\x0a\x0a\x09result := self doIt.       \x0a\x09self model announcer announce: (HLPrintItRequested on: model).\x0a\x09self print: result printString.\x0a\x09\x0a\x09self focus.",
-messageSends: ["doIt", "announce:", "announcer", "model", "on:", "print:", "printString", "focus"],
-referencedClasses: ["HLPrintItRequested"]
+source: "printIt\x0a\x09self print: self doIt printString.\x0a\x09self focus.",
+messageSends: ["print:", "printString", "doIt", "focus"],
+referencedClasses: []
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
 
 
@@ -870,7 +839,7 @@ protocol: 'rendering',
 fn: function (html){
 fn: function (html){
 var self=this;
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4,$5,$6;
+var $1,$2,$3,$4,$5,$6,$7,$8;
 $1=_st(html)._button();
 $1=_st(html)._button();
 $ctx1.sendIdx["button"]=1;
 $ctx1.sendIdx["button"]=1;
 _st($1)._class_("button");
 _st($1)._class_("button");
@@ -894,16 +863,27 @@ return self._printIt();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)})}));
 $ctx1.sendIdx["onClick:"]=2;
 $ctx1.sendIdx["onClick:"]=2;
 $5=_st(html)._button();
 $5=_st(html)._button();
+$ctx1.sendIdx["button"]=3;
 _st($5)._class_("button");
 _st($5)._class_("button");
+$ctx1.sendIdx["class:"]=3;
 _st($5)._with_("InspectIt");
 _st($5)._with_("InspectIt");
+$ctx1.sendIdx["with:"]=3;
 $6=_st($5)._onClick_((function(){
 $6=_st($5)._onClick_((function(){
 return smalltalk.withContext(function($ctx2) {
 return smalltalk.withContext(function($ctx2) {
 return self._inspectIt();
 return self._inspectIt();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)})}));
+$ctx1.sendIdx["onClick:"]=3;
+$7=_st(html)._button();
+_st($7)._class_("button");
+_st($7)._with_("BrowseIt");
+$8=_st($7)._onClick_((function(){
+return smalltalk.withContext(function($ctx2) {
+return self._browseIt();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,4)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},globals.HLCodeWidget)})},
 return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},globals.HLCodeWidget)})},
 args: ["html"],
 args: ["html"],
-source: "renderButtonsOn: html\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'DoIt';\x0a\x09\x09onClick: [ self doIt ].\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'PrintIt';\x0a\x09\x09onClick: [ self printIt ].\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'InspectIt';\x0a\x09\x09onClick: [ self inspectIt ]",
-messageSends: ["class:", "button", "with:", "onClick:", "doIt", "printIt", "inspectIt"],
+source: "renderButtonsOn: html\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'DoIt';\x0a\x09\x09onClick: [ self doIt ].\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'PrintIt';\x0a\x09\x09onClick: [ self printIt ].\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'InspectIt';\x0a\x09\x09onClick: [ self inspectIt ].\x0a\x09html button \x0a\x09\x09class: 'button';\x0a\x09\x09with: 'BrowseIt';\x0a\x09\x09onClick: [ self browseIt ]",
+messageSends: ["class:", "button", "with:", "onClick:", "doIt", "printIt", "inspectIt", "browseIt"],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
 globals.HLCodeWidget);
 globals.HLCodeWidget);
@@ -1230,11 +1210,11 @@ protocol: 'accessing',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
 var $1;
 var $1;
-$1=globals.HashedCollection._newFromPairs_(["Alt-Backspace","delWordBefore","Alt-Delete","delWordAfter","Alt-Left","goWordLeft","Alt-Right","goWordRight","Cmd-A","selectAll","Cmd-Alt-F","replace","Cmd-D","doIt","Cmd-Down","goDocEnd","Cmd-End","goDocEnd","Cmd-F","find","Cmd-G","findNext","Cmd-I","inspectIt","Cmd-Left","goLineStart","Cmd-P","printIt","Cmd-Right","goLineEnd","Cmd-S","saveIt","Cmd-Up","goDocStart","Cmd-Y","redo","Cmd-Z","undo","Cmd-[","indentLess","Cmd-]","indentMore","Ctrl-Alt-Backspace","delWordAfter","Shift-Cmd-Alt-F","replaceAll","Shift-Cmd-G","findPrev","Shift-Cmd-Z","redo","fallthrough",["basic","emacsy"]]);
+$1=globals.HashedCollection._newFromPairs_(["Alt-Backspace","delWordBefore","Alt-Delete","delWordAfter","Alt-Left","goWordLeft","Alt-Right","goWordRight","Cmd-A","selectAll","Cmd-Alt-F","replace","Cmd-D","doIt","Cmd-B","browseIt","Cmd-Down","goDocEnd","Cmd-End","goDocEnd","Cmd-F","find","Cmd-G","findNext","Cmd-I","inspectIt","Cmd-Left","goLineStart","Cmd-P","printIt","Cmd-Right","goLineEnd","Cmd-S","saveIt","Cmd-Up","goDocStart","Cmd-Y","redo","Cmd-Z","undo","Cmd-[","indentLess","Cmd-]","indentMore","Ctrl-Alt-Backspace","delWordAfter","Shift-Cmd-Alt-F","replaceAll","Shift-Cmd-G","findPrev","Shift-Cmd-Z","redo","fallthrough",["basic","emacsy"]]);
 return $1;
 return $1;
 },
 },
 args: [],
 args: [],
-source: "macKeyMap\x0a\x09^ #{\x0a\x09\x09'Alt-Backspace'\x09\x09\x09-> 'delWordBefore'.\x0a\x09\x09'Alt-Delete'\x09\x09\x09-> 'delWordAfter'. \x0a\x09\x09'Alt-Left'\x09\x09\x09\x09-> 'goWordLeft'.\x0a\x09\x09'Alt-Right'\x09\x09\x09\x09-> 'goWordRight'. \x0a\x09\x09'Cmd-A'\x09\x09\x09\x09\x09-> 'selectAll'. \x0a\x09\x09'Cmd-Alt-F'\x09\x09\x09\x09-> 'replace'. \x0a\x09\x09'Cmd-D'\x09\x09\x09\x09\x09-> 'doIt'. \x0a\x09\x09'Cmd-Down'\x09\x09\x09\x09-> 'goDocEnd'. \x0a\x09\x09'Cmd-End'\x09\x09\x09\x09-> 'goDocEnd'. \x0a\x09\x09'Cmd-F'\x09\x09\x09\x09\x09-> 'find'.\x0a\x09\x09'Cmd-G'\x09\x09\x09\x09\x09-> 'findNext'. \x0a\x09\x09'Cmd-I'\x09\x09\x09\x09\x09-> 'inspectIt'. \x0a\x09\x09'Cmd-Left'\x09\x09\x09\x09-> 'goLineStart'. \x0a\x09\x09'Cmd-P'\x09\x09\x09\x09\x09-> 'printIt'. \x0a\x09\x09'Cmd-Right'\x09\x09\x09\x09-> 'goLineEnd'. \x0a\x09\x09'Cmd-S'\x09\x09\x09\x09\x09-> 'saveIt'. \x0a\x09\x09'Cmd-Up'\x09\x09\x09\x09-> 'goDocStart'. \x0a\x09\x09'Cmd-Y'\x09\x09\x09\x09\x09-> 'redo'.\x0a\x09\x09'Cmd-Z'\x09\x09\x09\x09\x09-> 'undo'. \x0a\x09\x09'Cmd-['\x09\x09\x09\x09\x09-> 'indentLess'. \x0a\x09\x09'Cmd-]'\x09\x09\x09\x09\x09-> 'indentMore'.\x0a\x09\x09'Ctrl-Alt-Backspace'\x09-> 'delWordAfter'. \x0a\x09\x09'Shift-Cmd-Alt-F'\x09\x09-> 'replaceAll'.\x0a\x09\x09'Shift-Cmd-G'\x09\x09\x09-> 'findPrev'. \x0a\x09\x09'Shift-Cmd-Z'\x09\x09\x09-> 'redo'. \x0a    \x09'fallthrough' \x09\x09\x09-> { 'basic'. 'emacsy' }\x0a  }",
+source: "macKeyMap\x0a\x09^ #{\x0a\x09\x09'Alt-Backspace'\x09\x09\x09-> 'delWordBefore'.\x0a\x09\x09'Alt-Delete'\x09\x09\x09-> 'delWordAfter'. \x0a\x09\x09'Alt-Left'\x09\x09\x09\x09-> 'goWordLeft'.\x0a\x09\x09'Alt-Right'\x09\x09\x09\x09-> 'goWordRight'. \x0a\x09\x09'Cmd-A'\x09\x09\x09\x09\x09-> 'selectAll'. \x0a\x09\x09'Cmd-Alt-F'\x09\x09\x09\x09-> 'replace'. \x0a\x09\x09'Cmd-D'\x09\x09\x09\x09\x09-> 'doIt'. \x0a\x09\x09'Cmd-B'\x09\x09\x09\x09\x09-> 'browseIt'. \x0a\x09\x09'Cmd-Down'\x09\x09\x09\x09-> 'goDocEnd'. \x0a\x09\x09'Cmd-End'\x09\x09\x09\x09-> 'goDocEnd'. \x0a\x09\x09'Cmd-F'\x09\x09\x09\x09\x09-> 'find'.\x0a\x09\x09'Cmd-G'\x09\x09\x09\x09\x09-> 'findNext'. \x0a\x09\x09'Cmd-I'\x09\x09\x09\x09\x09-> 'inspectIt'. \x0a\x09\x09'Cmd-Left'\x09\x09\x09\x09-> 'goLineStart'. \x0a\x09\x09'Cmd-P'\x09\x09\x09\x09\x09-> 'printIt'. \x0a\x09\x09'Cmd-Right'\x09\x09\x09\x09-> 'goLineEnd'. \x0a\x09\x09'Cmd-S'\x09\x09\x09\x09\x09-> 'saveIt'. \x0a\x09\x09'Cmd-Up'\x09\x09\x09\x09-> 'goDocStart'. \x0a\x09\x09'Cmd-Y'\x09\x09\x09\x09\x09-> 'redo'.\x0a\x09\x09'Cmd-Z'\x09\x09\x09\x09\x09-> 'undo'. \x0a\x09\x09'Cmd-['\x09\x09\x09\x09\x09-> 'indentLess'. \x0a\x09\x09'Cmd-]'\x09\x09\x09\x09\x09-> 'indentMore'.\x0a\x09\x09'Ctrl-Alt-Backspace'\x09-> 'delWordAfter'. \x0a\x09\x09'Shift-Cmd-Alt-F'\x09\x09-> 'replaceAll'.\x0a\x09\x09'Shift-Cmd-G'\x09\x09\x09-> 'findPrev'. \x0a\x09\x09'Shift-Cmd-Z'\x09\x09\x09-> 'redo'. \x0a    \x09'fallthrough' \x09\x09\x09-> { 'basic'. 'emacsy' }\x0a  }",
 messageSends: [],
 messageSends: [],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
@@ -1265,11 +1245,11 @@ protocol: 'accessing',
 fn: function (){
 fn: function (){
 var self=this;
 var self=this;
 var $1;
 var $1;
-$1=globals.HashedCollection._newFromPairs_(["Alt-Left","goLineStart","Alt-Right","goLineEnd","Alt-Up","goDocStart","Ctrl-A","selectAll","Ctrl-Backspace","delWordBefore","Ctrl-D","doIt","Ctrl-Delete","delWordAfter","Ctrl-Down","goDocEnd","Ctrl-End","goDocEnd","Ctrl-F","find","Ctrl-G","findNext","Ctrl-I","inspectIt","Ctrl-Home","goDocStart","Ctrl-Left","goWordLeft","Ctrl-P","printIt","Ctrl-Right","goWordRight","Ctrl-S","saveIt","Ctrl-Y","redo","Ctrl-Z","undo","Ctrl-[","indentLess","Ctrl-]","indentMore","Shift-Ctrl-F","replace","Shift-Ctrl-G","findPrev","Shift-Ctrl-R","replaceAll","Shift-Ctrl-Z","redo","fallthrough",["basic"]]);
+$1=globals.HashedCollection._newFromPairs_(["Alt-Left","goLineStart","Alt-Right","goLineEnd","Alt-Up","goDocStart","Ctrl-A","selectAll","Ctrl-Backspace","delWordBefore","Ctrl-D","doIt","Ctrl-B","browseIt","Ctrl-Delete","delWordAfter","Ctrl-Down","goDocEnd","Ctrl-End","goDocEnd","Ctrl-F","find","Ctrl-G","findNext","Ctrl-I","inspectIt","Ctrl-Home","goDocStart","Ctrl-Left","goWordLeft","Ctrl-P","printIt","Ctrl-Right","goWordRight","Ctrl-S","saveIt","Ctrl-Y","redo","Ctrl-Z","undo","Ctrl-[","indentLess","Ctrl-]","indentMore","Shift-Ctrl-F","replace","Shift-Ctrl-G","findPrev","Shift-Ctrl-R","replaceAll","Shift-Ctrl-Z","redo","fallthrough",["basic"]]);
 return $1;
 return $1;
 },
 },
 args: [],
 args: [],
-source: "pcKeyMap\x0a\x09^ #{\x0a\x09\x09'Alt-Left' -> \x09\x09'goLineStart'. \x0a\x09\x09'Alt-Right' -> \x09\x09'goLineEnd'.\x0a\x09\x09'Alt-Up' -> \x09\x09'goDocStart'. \x0a\x09\x09'Ctrl-A' -> \x09\x09'selectAll'. \x0a\x09\x09'Ctrl-Backspace' -> 'delWordBefore'. \x0a\x09\x09'Ctrl-D' -> \x09\x09'doIt'. \x0a\x09\x09'Ctrl-Delete' -> \x09\x09'delWordAfter'. \x0a\x09\x09'Ctrl-Down' -> \x09\x09'goDocEnd'.\x0a\x09\x09'Ctrl-End' -> \x09\x09'goDocEnd'. \x0a\x09\x09'Ctrl-F' -> \x09\x09'find'.\x0a\x09\x09'Ctrl-G' -> \x09\x09'findNext'. \x0a\x09\x09'Ctrl-I' -> \x09\x09'inspectIt'.\x0a\x09\x09'Ctrl-Home' -> \x09\x09'goDocStart'. \x0a\x09\x09'Ctrl-Left' -> \x09\x09'goWordLeft'. \x0a\x09\x09'Ctrl-P' -> \x09\x09'printIt'.\x0a\x09\x09'Ctrl-Right' -> \x09'goWordRight'. \x0a\x09\x09'Ctrl-S' -> \x09\x09'saveIt'. \x0a\x09\x09'Ctrl-Y' -> \x09\x09'redo'.\x0a\x09\x09'Ctrl-Z' -> \x09\x09'undo'. \x0a\x09\x09'Ctrl-[' -> \x09\x09'indentLess'. \x0a\x09\x09'Ctrl-]' -> \x09\x09'indentMore'.\x0a\x09\x09'Shift-Ctrl-F' -> \x09'replace'. \x0a\x09\x09'Shift-Ctrl-G' -> \x09'findPrev'. \x0a\x09\x09'Shift-Ctrl-R' -> \x09'replaceAll'.\x0a\x09\x09'Shift-Ctrl-Z' -> \x09'redo'. \x0a\x09\x09'fallthrough' -> \x09#('basic')\x0a}",
+source: "pcKeyMap\x0a\x09^ #{\x0a\x09\x09'Alt-Left' -> \x09\x09'goLineStart'. \x0a\x09\x09'Alt-Right' -> \x09\x09'goLineEnd'.\x0a\x09\x09'Alt-Up' -> \x09\x09'goDocStart'. \x0a\x09\x09'Ctrl-A' -> \x09\x09'selectAll'. \x0a\x09\x09'Ctrl-Backspace' -> 'delWordBefore'. \x0a\x09\x09'Ctrl-D' -> \x09\x09'doIt'. \x0a\x09\x09'Ctrl-B' -> \x09\x09'browseIt'. \x0a\x09\x09'Ctrl-Delete' -> \x09\x09'delWordAfter'. \x0a\x09\x09'Ctrl-Down' -> \x09\x09'goDocEnd'.\x0a\x09\x09'Ctrl-End' -> \x09\x09'goDocEnd'. \x0a\x09\x09'Ctrl-F' -> \x09\x09'find'.\x0a\x09\x09'Ctrl-G' -> \x09\x09'findNext'. \x0a\x09\x09'Ctrl-I' -> \x09\x09'inspectIt'.\x0a\x09\x09'Ctrl-Home' -> \x09\x09'goDocStart'. \x0a\x09\x09'Ctrl-Left' -> \x09\x09'goWordLeft'. \x0a\x09\x09'Ctrl-P' -> \x09\x09'printIt'.\x0a\x09\x09'Ctrl-Right' -> \x09'goWordRight'. \x0a\x09\x09'Ctrl-S' -> \x09\x09'saveIt'. \x0a\x09\x09'Ctrl-Y' -> \x09\x09'redo'.\x0a\x09\x09'Ctrl-Z' -> \x09\x09'undo'. \x0a\x09\x09'Ctrl-[' -> \x09\x09'indentLess'. \x0a\x09\x09'Ctrl-]' -> \x09\x09'indentMore'.\x0a\x09\x09'Shift-Ctrl-F' -> \x09'replace'. \x0a\x09\x09'Shift-Ctrl-G' -> \x09'findPrev'. \x0a\x09\x09'Shift-Ctrl-R' -> \x09'replaceAll'.\x0a\x09\x09'Shift-Ctrl-Z' -> \x09'redo'. \x0a\x09\x09'fallthrough' -> \x09#('basic')\x0a}",
 messageSends: [],
 messageSends: [],
 referencedClasses: []
 referencedClasses: []
 }),
 }),
@@ -1304,7 +1284,7 @@ fn: function (){
 var self=this;
 var self=this;
 function $CodeMirror(){return globals.CodeMirror||(typeof CodeMirror=="undefined"?nil:CodeMirror)}
 function $CodeMirror(){return globals.CodeMirror||(typeof CodeMirror=="undefined"?nil:CodeMirror)}
 return smalltalk.withContext(function($ctx1) { 
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4,$5;
+var $1,$2,$3,$4,$5,$6;
 $1=_st($CodeMirror())._basicAt_("commands");
 $1=_st($CodeMirror())._basicAt_("commands");
 _st($1)._at_put_("doIt",(function(cm){
 _st($1)._at_put_("doIt",(function(cm){
 return smalltalk.withContext(function($ctx2) {
 return smalltalk.withContext(function($ctx2) {
@@ -1327,14 +1307,21 @@ $ctx2.sendIdx["amberCodeWidget"]=3;
 return _st($4)._printIt();
 return _st($4)._printIt();
 }, function($ctx2) {$ctx2.fillBlock({cm:cm},$ctx1,3)})}));
 }, function($ctx2) {$ctx2.fillBlock({cm:cm},$ctx1,3)})}));
 $ctx1.sendIdx["at:put:"]=3;
 $ctx1.sendIdx["at:put:"]=3;
-$5=_st($1)._at_put_("saveIt",(function(cm){
+_st($1)._at_put_("saveIt",(function(cm){
 return smalltalk.withContext(function($ctx2) {
 return smalltalk.withContext(function($ctx2) {
-return _st(_st(cm)._amberCodeWidget())._saveIt();
+$5=_st(cm)._amberCodeWidget();
+$ctx2.sendIdx["amberCodeWidget"]=4;
+return _st($5)._saveIt();
 }, function($ctx2) {$ctx2.fillBlock({cm:cm},$ctx1,4)})}));
 }, function($ctx2) {$ctx2.fillBlock({cm:cm},$ctx1,4)})}));
+$ctx1.sendIdx["at:put:"]=4;
+$6=_st($1)._at_put_("browseIt",(function(cm){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(cm)._amberCodeWidget())._browseIt();
+}, function($ctx2) {$ctx2.fillBlock({cm:cm},$ctx1,5)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"setupCommands",{},globals.HLCodeWidget.klass)})},
 return self}, function($ctx1) {$ctx1.fill(self,"setupCommands",{},globals.HLCodeWidget.klass)})},
 args: [],
 args: [],
-source: "setupCommands\x0a\x09(CodeMirror basicAt: 'commands') \x0a\x09\x09at: 'doIt' put: [ :cm | cm amberCodeWidget doIt ];\x0a\x09\x09at: 'inspectIt' put: [ :cm | cm amberCodeWidget inspectIt ];\x0a\x09\x09at: 'printIt' put: [ :cm | cm amberCodeWidget printIt ];\x0a\x09\x09at: 'saveIt' put: [ :cm | cm amberCodeWidget saveIt ]",
-messageSends: ["at:put:", "basicAt:", "doIt", "amberCodeWidget", "inspectIt", "printIt", "saveIt"],
+source: "setupCommands\x0a\x09(CodeMirror basicAt: 'commands') \x0a\x09\x09at: 'doIt' put: [ :cm | cm amberCodeWidget doIt ];\x0a\x09\x09at: 'inspectIt' put: [ :cm | cm amberCodeWidget inspectIt ];\x0a\x09\x09at: 'printIt' put: [ :cm | cm amberCodeWidget printIt ];\x0a\x09\x09at: 'saveIt' put: [ :cm | cm amberCodeWidget saveIt ];\x0a\x09\x09at: 'browseIt' put: [ :cm | cm amberCodeWidget browseIt ]",
+messageSends: ["at:put:", "basicAt:", "doIt", "amberCodeWidget", "inspectIt", "printIt", "saveIt", "browseIt"],
 referencedClasses: ["CodeMirror"]
 referencedClasses: ["CodeMirror"]
 }),
 }),
 globals.HLCodeWidget.klass);
 globals.HLCodeWidget.klass);
@@ -1571,22 +1558,6 @@ referencedClasses: []
 }),
 }),
 globals.HLBrowserCodeWidget);
 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.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "observeBrowserModel",
 selector: "observeBrowserModel",

+ 21 - 36
src/Helios-Workspace.st

@@ -27,6 +27,10 @@ receiver: anObject
 
 
 !HLCodeModel methodsFor: 'actions'!
 !HLCodeModel methodsFor: 'actions'!
 
 
+browse: anObject
+	anObject browse
+!
+
 doIt: aString
 doIt: aString
 	"Evaluate aString in the receiver's `environment`.
 	"Evaluate aString in the receiver's `environment`.
 	
 	
@@ -144,6 +148,10 @@ selectionStart: anInteger
 
 
 !HLCodeWidget methodsFor: 'actions'!
 !HLCodeWidget methodsFor: 'actions'!
 
 
+browseIt
+	self model browse: self doIt
+!
+
 clear
 clear
 	self contents: ''
 	self contents: ''
 !
 !
@@ -151,6 +159,7 @@ clear
 configureEditor
 configureEditor
 	self editor at: 'amberCodeWidget' put: self.
 	self editor at: 'amberCodeWidget' put: self.
 	self editor on: 'change' do: [ self onChange ].
 	self editor on: 'change' do: [ self onChange ].
+
 	self editor on: 'mousedown' do: [ :cm :event | | position node |
 	self editor on: 'mousedown' do: [ :cm :event | | position node |
 		(event at: 'ctrlKey') ifTrue: [
 		(event at: 'ctrlKey') ifTrue: [
 			position := self editor coordsChar: #{ 
 			position := self editor coordsChar: #{ 
@@ -164,8 +173,7 @@ configureEditor
 doIt
 doIt
 	| result |
 	| result |
 
 
-	self model announcer announce: (HLDoItRequested on: model).
-	result := model doIt: self currentLineOrSelection.
+	result := self model doIt: self currentLineOrSelection.
 	self model announcer announce: (HLDoItExecuted on: model).
 	self model announcer announce: (HLDoItExecuted on: model).
 
 
 	^ result
 	^ result
@@ -180,27 +188,11 @@ focus
 !
 !
 
 
 inspectIt
 inspectIt
-	| newInspector |
-       
-	self model announcer announce: (HLInspectItRequested on: model).
 	self model inspect: self doIt
 	self model inspect: self doIt
 !
 !
 
 
 navigateTo: aString
 navigateTo: aString
-	| navigationClass |
-	
-	navigationClass := self model environment classes 
-		detect: [ :each | each name = aString ]
-		ifNone: [ nil ].
-		
-	navigationClass 
-		ifNil: [ self navigateToReference: aString ]
-		ifNotNil: [ self navigateToClass: navigationClass ]
-!
-
-navigateToClass: aClass
-	(HLBrowser openAsTab)
-		browseClass: aClass
+	Finder findString: aString
 !
 !
 
 
 navigateToReference: aString
 navigateToReference: aString
@@ -229,12 +221,7 @@ print: aString
 !
 !
 
 
 printIt
 printIt
-	| result |
-
-	result := self doIt.       
-	self model announcer announce: (HLPrintItRequested on: model).
-	self print: result printString.
-	
+	self print: self doIt printString.
 	self focus.
 	self focus.
 !
 !
 
 
@@ -289,11 +276,6 @@ onCtrlClickAt: aPosition
 		self navigateTo: node navigationLink ]
 		self navigateTo: node navigationLink ]
 !
 !
 
 
-onDoIt
-	
-	self doIt
-!
-
 onInspectIt
 onInspectIt
 
 
 	self inspectIt
 	self inspectIt
@@ -322,7 +304,11 @@ renderButtonsOn: html
 	html button 
 	html button 
 		class: 'button';
 		class: 'button';
 		with: 'InspectIt';
 		with: 'InspectIt';
-		onClick: [ self inspectIt ]
+		onClick: [ self inspectIt ].
+	html button 
+		class: 'button';
+		with: 'BrowseIt';
+		onClick: [ self browseIt ]
 !
 !
 
 
 renderContentOn: html
 renderContentOn: html
@@ -379,6 +365,7 @@ macKeyMap
 		'Cmd-A'					-> 'selectAll'. 
 		'Cmd-A'					-> 'selectAll'. 
 		'Cmd-Alt-F'				-> 'replace'. 
 		'Cmd-Alt-F'				-> 'replace'. 
 		'Cmd-D'					-> 'doIt'. 
 		'Cmd-D'					-> 'doIt'. 
+		'Cmd-B'					-> 'browseIt'. 
 		'Cmd-Down'				-> 'goDocEnd'. 
 		'Cmd-Down'				-> 'goDocEnd'. 
 		'Cmd-End'				-> 'goDocEnd'. 
 		'Cmd-End'				-> 'goDocEnd'. 
 		'Cmd-F'					-> 'find'.
 		'Cmd-F'					-> 'find'.
@@ -409,6 +396,7 @@ pcKeyMap
 		'Ctrl-A' -> 		'selectAll'. 
 		'Ctrl-A' -> 		'selectAll'. 
 		'Ctrl-Backspace' -> 'delWordBefore'. 
 		'Ctrl-Backspace' -> 'delWordBefore'. 
 		'Ctrl-D' -> 		'doIt'. 
 		'Ctrl-D' -> 		'doIt'. 
+		'Ctrl-B' -> 		'browseIt'. 
 		'Ctrl-Delete' -> 		'delWordAfter'. 
 		'Ctrl-Delete' -> 		'delWordAfter'. 
 		'Ctrl-Down' -> 		'goDocEnd'.
 		'Ctrl-Down' -> 		'goDocEnd'.
 		'Ctrl-End' -> 		'goDocEnd'. 
 		'Ctrl-End' -> 		'goDocEnd'. 
@@ -487,7 +475,8 @@ setupCommands
 		at: 'doIt' put: [ :cm | cm amberCodeWidget doIt ];
 		at: 'doIt' put: [ :cm | cm amberCodeWidget doIt ];
 		at: 'inspectIt' put: [ :cm | cm amberCodeWidget inspectIt ];
 		at: 'inspectIt' put: [ :cm | cm amberCodeWidget inspectIt ];
 		at: 'printIt' put: [ :cm | cm amberCodeWidget printIt ];
 		at: 'printIt' put: [ :cm | cm amberCodeWidget printIt ];
-		at: 'saveIt' put: [ :cm | cm amberCodeWidget saveIt ]
+		at: 'saveIt' put: [ :cm | cm amberCodeWidget saveIt ];
+		at: 'browseIt' put: [ :cm | cm amberCodeWidget browseIt ]
 !
 !
 
 
 setupKeyMaps
 setupKeyMaps
@@ -565,10 +554,6 @@ browserModel: aBrowserModel
 
 
 !HLBrowserCodeWidget methodsFor: 'actions'!
 !HLBrowserCodeWidget methodsFor: 'actions'!
 
 
-navigateToClass: aClass
-	self browserModel openClassNamed: aClass name
-!
-
 observeBrowserModel
 observeBrowserModel
 	self browserModel announcer
 	self browserModel announcer
 		on: HLSaveSourceCode
 		on: HLSaveSourceCode

+ 17 - 0
src/Kernel-Classes.js

@@ -1124,6 +1124,23 @@ referencedClasses: []
 }),
 }),
 globals.Class);
 globals.Class);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "browse",
+protocol: 'browsing',
+fn: function (){
+var self=this;
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
+return smalltalk.withContext(function($ctx1) { 
+_st($Finder())._findClass_(self);
+return self}, function($ctx1) {$ctx1.fill(self,"browse",{},globals.Class)})},
+args: [],
+source: "browse\x0a\x09Finder findClass: self",
+messageSends: ["findClass:"],
+referencedClasses: ["Finder"]
+}),
+globals.Class);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "category",
 selector: "category",

+ 6 - 0
src/Kernel-Classes.st

@@ -412,6 +412,12 @@ subclasses
 	<return self.subclasses._copy()>
 	<return self.subclasses._copy()>
 ! !
 ! !
 
 
+!Class methodsFor: 'browsing'!
+
+browse
+	Finder findClass: self
+! !
+
 !Class methodsFor: 'class creation'!
 !Class methodsFor: 'class creation'!
 
 
 subclass: aString instanceVariableNames: anotherString
 subclass: aString instanceVariableNames: anotherString

+ 75 - 0
src/Kernel-Infrastructure.js

@@ -731,6 +731,23 @@ referencedClasses: ["ErrorHandler"]
 }),
 }),
 globals.Environment);
 globals.Environment);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerFinder:",
+protocol: 'services',
+fn: function (aFinder){
+var self=this;
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
+return smalltalk.withContext(function($ctx1) { 
+_st($Finder())._register_(aFinder);
+return self}, function($ctx1) {$ctx1.fill(self,"registerFinder:",{aFinder:aFinder},globals.Environment)})},
+args: ["aFinder"],
+source: "registerFinder: aFinder\x0a\x09Finder register: aFinder",
+messageSends: ["register:"],
+referencedClasses: ["Finder"]
+}),
+globals.Environment);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "registerInspector:",
 selector: "registerInspector:",
@@ -2209,6 +2226,64 @@ referencedClasses: []
 globals.ErrorHandler.klass);
 globals.ErrorHandler.klass);
 
 
 
 
+smalltalk.addClass('Finder', globals.Service, [], 'Kernel-Infrastructure');
+globals.Finder.comment="I am the service responsible for finding classes/methods.\x0a__There is no default finder.__\x0a\x0a## API\x0a\x0aUse `#browse` on an object to find it.";
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findClass:",
+protocol: 'finding',
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(self._current())._findClass_(aClass);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"findClass:",{aClass:aClass},globals.Finder.klass)})},
+args: ["aClass"],
+source: "findClass: aClass\x0a\x09^ self current findClass: aClass",
+messageSends: ["findClass:", "current"],
+referencedClasses: []
+}),
+globals.Finder.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findMethod:",
+protocol: 'finding',
+fn: function (aCompiledMethod){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(self._current())._findMethod_(aCompiledMethod);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"findMethod:",{aCompiledMethod:aCompiledMethod},globals.Finder.klass)})},
+args: ["aCompiledMethod"],
+source: "findMethod: aCompiledMethod\x0a\x09^ self current findMethod: aCompiledMethod",
+messageSends: ["findMethod:", "current"],
+referencedClasses: []
+}),
+globals.Finder.klass);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "findString:",
+protocol: 'finding',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(self._current())._findString_(aString);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"findString:",{aString:aString},globals.Finder.klass)})},
+args: ["aString"],
+source: "findString: aString\x0a\x09^ self current findString: aString",
+messageSends: ["findString:", "current"],
+referencedClasses: []
+}),
+globals.Finder.klass);
+
+
 smalltalk.addClass('Inspector', globals.Service, [], 'Kernel-Infrastructure');
 smalltalk.addClass('Inspector', globals.Service, [], 'Kernel-Infrastructure');
 globals.Inspector.comment="I am the service responsible for inspecting objects.\x0a\x0aThe default inspector object is the transcript.";
 globals.Inspector.comment="I am the service responsible for inspecting objects.\x0a\x0aThe default inspector object is the transcript.";
 
 

+ 29 - 0
src/Kernel-Infrastructure.st

@@ -273,6 +273,10 @@ registerErrorHandler: anErrorHandler
 	ErrorHandler register: anErrorHandler
 	ErrorHandler register: anErrorHandler
 !
 !
 
 
+registerFinder: aFinder
+	Finder register: aFinder
+!
+
 registerInspector: anInspector
 registerInspector: anInspector
 	Inspector register: anInspector
 	Inspector register: anInspector
 !
 !
@@ -840,6 +844,31 @@ handleError: anError
 	self current handleError: anError
 	self current handleError: anError
 ! !
 ! !
 
 
+Service subclass: #Finder
+	instanceVariableNames: ''
+	package: 'Kernel-Infrastructure'!
+!Finder commentStamp!
+I am the service responsible for finding classes/methods.
+__There is no default finder.__
+
+## API
+
+Use `#browse` on an object to find it.!
+
+!Finder class methodsFor: 'finding'!
+
+findClass: aClass
+	^ self current findClass: aClass
+!
+
+findMethod: aCompiledMethod
+	^ self current findMethod: aCompiledMethod
+!
+
+findString: aString
+	^ self current findString: aString
+! !
+
 Service subclass: #Inspector
 Service subclass: #Inspector
 	instanceVariableNames: ''
 	instanceVariableNames: ''
 	package: 'Kernel-Infrastructure'!
 	package: 'Kernel-Infrastructure'!

+ 17 - 0
src/Kernel-Methods.js

@@ -481,6 +481,23 @@ referencedClasses: []
 }),
 }),
 globals.CompiledMethod);
 globals.CompiledMethod);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "browse",
+protocol: 'browsing',
+fn: function (){
+var self=this;
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
+return smalltalk.withContext(function($ctx1) { 
+_st($Finder())._findMethod_(self);
+return self}, function($ctx1) {$ctx1.fill(self,"browse",{},globals.CompiledMethod)})},
+args: [],
+source: "browse\x0a\x09Finder findMethod: self",
+messageSends: ["findMethod:"],
+referencedClasses: ["Finder"]
+}),
+globals.CompiledMethod);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "category",
 selector: "category",

+ 6 - 0
src/Kernel-Methods.st

@@ -276,6 +276,12 @@ source: aString
 	self basicAt: 'source' put: aString
 	self basicAt: 'source' put: aString
 ! !
 ! !
 
 
+!CompiledMethod methodsFor: 'browsing'!
+
+browse
+	Finder findMethod: self
+! !
+
 !CompiledMethod methodsFor: 'defaults'!
 !CompiledMethod methodsFor: 'defaults'!
 
 
 defaultProtocol
 defaultProtocol

+ 17 - 0
src/Kernel-Objects.js

@@ -530,6 +530,23 @@ referencedClasses: []
 }),
 }),
 globals.Object);
 globals.Object);
 
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "browse",
+protocol: 'browsing',
+fn: function (){
+var self=this;
+function $Finder(){return globals.Finder||(typeof Finder=="undefined"?nil:Finder)}
+return smalltalk.withContext(function($ctx1) { 
+_st($Finder())._findClass_(self._class());
+return self}, function($ctx1) {$ctx1.fill(self,"browse",{},globals.Object)})},
+args: [],
+source: "browse\x0a\x09Finder findClass: self class",
+messageSends: ["findClass:", "class"],
+referencedClasses: ["Finder"]
+}),
+globals.Object);
+
 smalltalk.addMethod(
 smalltalk.addMethod(
 smalltalk.method({
 smalltalk.method({
 selector: "copy",
 selector: "copy",

+ 6 - 0
src/Kernel-Objects.st

@@ -182,6 +182,12 @@ value
 	<return self.valueOf()>
 	<return self.valueOf()>
 ! !
 ! !
 
 
+!Object methodsFor: 'browsing'!
+
+browse
+	Finder findClass: self class
+! !
+
 !Object methodsFor: 'converting'!
 !Object methodsFor: 'converting'!
 
 
 -> anObject
 -> anObject