Benjamin Van Ryseghem 11 年之前
父節點
當前提交
774aa45adf

+ 30 - 10
js/Helios-Browser.deploy.js

@@ -468,7 +468,7 @@ smalltalk.method({
 selector: "onClassSelected:",
 fn: function (aClass){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
 _st(self)._selectedItem_(aClass);
 $1=aClass;
 if(($receiver = $1) == nil || $receiver == undefined){
@@ -477,9 +477,11 @@ return $2;
 } else {
 $1;
 };
-_st(self)._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"onClassSelected:",{aClass:aClass}, smalltalk.HLClassesListWidget)})},
-messageSends: ["selectedItem:", "ifNil:", "focus"]}),
+$3=self;
+_st($3)._selectListItem_(aClass);
+$4=_st($3)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"onClassSelected:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
+messageSends: ["selectedItem:", "ifNil:", "selectListItem:", "focus"]}),
 smalltalk.HLClassesListWidget);
 
 smalltalk.addMethod(
@@ -572,6 +574,7 @@ var self=this;
 var li;
 return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
 li=_st(html)._li();
+_st(self)._registerMappingFrom_to_(aClass,li);
 $1=li;
 _st($1)._at_put_("list-data",_st(_st(self)._items())._indexOf_(aClass));
 _st($1)._class_(_st(self)._cssClassForItem_(aClass));
@@ -589,8 +592,8 @@ return $4;
 _st(_st(self)._getChildrenOf_(aClass))._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
return _st(self)._renderItem_level_on_(each,_st(anInteger).__plus((1)),html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li}, smalltalk.HLClassesListWidget)})},
-messageSends: ["li", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li},smalltalk.HLClassesListWidget)})},
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"]}),
 smalltalk.HLClassesListWidget);
 
 smalltalk.addMethod(
@@ -1269,10 +1272,13 @@ smalltalk.method({
 selector: "onPackageSelected:",
 fn: function (aPackage){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._selectedItem_(aPackage);
-_st(self)._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"onPackageSelected:",{aPackage:aPackage}, smalltalk.HLPackagesListWidget)})},
-messageSends: ["selectedItem:", "focus"]}),
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+_st($1)._selectedItem_(aPackage);
+_st($1)._selectListItem_(aPackage);
+$2=_st($1)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"onPackageSelected:",{aPackage:aPackage},smalltalk.HLPackagesListWidget)})},
+messageSends: ["selectedItem:", "selectListItem:", "focus"]}),
 smalltalk.HLPackagesListWidget);
 
 smalltalk.addMethod(
@@ -1882,6 +1888,20 @@ return self}, function($ctx1) {$ctx1.fill(self,"moveMethodToProtocol:",{aProtoco
 messageSends: ["moveMethod:toProtocol:", "selectedMethod", "environment"]}),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_openClassNamed_",
+smalltalk.method({
+selector: "openClassNamed:",
+fn: function (aString){
+var self=this;
+var class_;
+return smalltalk.withContext(function($ctx1) { 
class_=_st(_st(self)._environment())._classNamed_(aString);
+_st(self)._selectedPackage_(_st(class_)._package());
+_st(self)._selectedClass_(class_);
+return self}, function($ctx1) {$ctx1.fill(self,"openClassNamed:",{aString:aString,class_:class_},smalltalk.HLBrowserModel)})},
+messageSends: ["classNamed:", "environment", "selectedPackage:", "package", "selectedClass:"]}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_packages",
 smalltalk.method({

+ 38 - 13
js/Helios-Browser.js

@@ -619,7 +619,7 @@ selector: "onClassSelected:",
 category: 'reactions',
 fn: function (aClass){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
 _st(self)._selectedItem_(aClass);
 $1=aClass;
 if(($receiver = $1) == nil || $receiver == undefined){
@@ -628,11 +628,13 @@ return $2;
 } else {
 $1;
 };
-_st(self)._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"onClassSelected:",{aClass:aClass}, smalltalk.HLClassesListWidget)})},
+$3=self;
+_st($3)._selectListItem_(aClass);
+$4=_st($3)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"onClassSelected:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
 args: ["aClass"],
-source: "onClassSelected: aClass\x0a\x09self selectedItem: aClass.\x0a\x09aClass ifNil: [ ^ self ].\x0a    \x0a    self focus",
-messageSends: ["selectedItem:", "ifNil:", "focus"],
+source: "onClassSelected: aClass\x0a\x09self selectedItem: aClass.\x0a\x09aClass ifNil: [ ^ self ].\x0a    \x0a\x09self \x0a\x09\x09selectListItem: aClass;\x0a\x09\x09focus",
+messageSends: ["selectedItem:", "ifNil:", "selectListItem:", "focus"],
 referencedClasses: []
 }),
 smalltalk.HLClassesListWidget);
@@ -748,6 +750,7 @@ var self=this;
 var li;
 return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
 li=_st(html)._li();
+_st(self)._registerMappingFrom_to_(aClass,li);
 $1=li;
 _st($1)._at_put_("list-data",_st(_st(self)._items())._indexOf_(aClass));
 _st($1)._class_(_st(self)._cssClassForItem_(aClass));
@@ -765,10 +768,10 @@ return $4;
 _st(_st(self)._getChildrenOf_(aClass))._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
return _st(self)._renderItem_level_on_(each,_st(anInteger).__plus((1)),html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li}, smalltalk.HLClassesListWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li},smalltalk.HLClassesListWidget)})},
 args: ["aClass", "anInteger", "html"],
-source: "renderItem: aClass level: anInteger on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a    li\x0a    \x09at: 'list-data' put: (self items indexOf: aClass);\x0a    \x09class: (self cssClassForItem: aClass);\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: aClass).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: aClass level: anInteger on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ].\x0a                    \x0a    (self getChildrenOf: aClass) do: [ :each |\x0a    \x09self renderItem: each level: anInteger + 1 on: html ]",
-messageSends: ["li", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"],
+source: "renderItem: aClass level: anInteger on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: aClass to: li.\x0a\x09\x0a    li\x0a    \x09at: 'list-data' put: (self items indexOf: aClass);\x0a    \x09class: (self cssClassForItem: aClass);\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: aClass).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: aClass level: anInteger on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ].\x0a                    \x0a    (self getChildrenOf: aClass) do: [ :each |\x0a    \x09self renderItem: each level: anInteger + 1 on: html ]",
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"],
 referencedClasses: []
 }),
 smalltalk.HLClassesListWidget);
@@ -1650,12 +1653,15 @@ selector: "onPackageSelected:",
 category: 'reactions',
 fn: function (aPackage){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._selectedItem_(aPackage);
-_st(self)._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"onPackageSelected:",{aPackage:aPackage}, smalltalk.HLPackagesListWidget)})},
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=self;
+_st($1)._selectedItem_(aPackage);
+_st($1)._selectListItem_(aPackage);
+$2=_st($1)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"onPackageSelected:",{aPackage:aPackage},smalltalk.HLPackagesListWidget)})},
 args: ["aPackage"],
-source: "onPackageSelected: aPackage\x0a\x09self selectedItem: aPackage.\x0a\x09self focus",
-messageSends: ["selectedItem:", "focus"],
+source: "onPackageSelected: aPackage\x0a\x09self \x0a\x09\x09selectedItem: aPackage;\x0a\x09\x09selectListItem: aPackage;\x0a\x09\x09focus",
+messageSends: ["selectedItem:", "selectListItem:", "focus"],
 referencedClasses: []
 }),
 smalltalk.HLPackagesListWidget);
@@ -2462,6 +2468,25 @@ referencedClasses: []
 }),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_openClassNamed_",
+smalltalk.method({
+selector: "openClassNamed:",
+category: 'commands actions',
+fn: function (aString){
+var self=this;
+var class_;
+return smalltalk.withContext(function($ctx1) { 
class_=_st(_st(self)._environment())._classNamed_(aString);
+_st(self)._selectedPackage_(_st(class_)._package());
+_st(self)._selectedClass_(class_);
+return self}, function($ctx1) {$ctx1.fill(self,"openClassNamed:",{aString:aString,class_:class_},smalltalk.HLBrowserModel)})},
+args: ["aString"],
+source: "openClassNamed: aString\x0a\x09| class |\x0a\x09\x0a\x09class := self environment classNamed: aString.\x0a\x09self selectedPackage: class package.\x0a\x09self selectedClass: class",
+messageSends: ["classNamed:", "environment", "selectedPackage:", "package", "selectedClass:"],
+referencedClasses: []
+}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_packages",
 smalltalk.method({

+ 107 - 0
js/Helios-Commands-Browser.deploy.js

@@ -270,6 +270,113 @@ messageSends: []}),
 smalltalk.HLCommitPackageCommand.klass);
 
 
+smalltalk.addClass('HLFindCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands-Browser');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (70);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLFindCommand.klass)})},
+messageSends: []}),
+smalltalk.HLFindCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Find";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLFindCommand.klass)})},
+messageSends: []}),
+smalltalk.HLFindCommand.klass);
+
+
+smalltalk.addClass('HLFindClassCommand', smalltalk.HLFindCommand, [], 'Helios-Commands-Browser');
+smalltalk.addMethod(
+"_displayLabel",
+smalltalk.method({
+selector: "displayLabel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "select a class";
+}, function($ctx1) {$ctx1.fill(self,"displayLabel",{},smalltalk.HLFindClassCommand)})},
+messageSends: []}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._openClassNamed_(_st(self)._input());
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLFindClassCommand)})},
+messageSends: ["openClassNamed:", "input", "model"]}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_inputCompletion",
+smalltalk.method({
+selector: "inputCompletion",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._model())._availableClassNames();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"inputCompletion",{},smalltalk.HLFindClassCommand)})},
+messageSends: ["availableClassNames", "model"]}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_inputLabel",
+smalltalk.method({
+selector: "inputLabel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Find a class";
+}, function($ctx1) {$ctx1.fill(self,"inputLabel",{},smalltalk.HLFindClassCommand)})},
+messageSends: []}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_isInputRequired",
+smalltalk.method({
+selector: "isInputRequired",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"isInputRequired",{},smalltalk.HLFindClassCommand)})},
+messageSends: []}),
+smalltalk.HLFindClassCommand);
+
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (67);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLFindClassCommand.klass)})},
+messageSends: []}),
+smalltalk.HLFindClassCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Class";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLFindClassCommand.klass)})},
+messageSends: []}),
+smalltalk.HLFindClassCommand.klass);
+
+
 smalltalk.addClass('HLMoveToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands-Browser');
 
 smalltalk.addMethod(

+ 152 - 0
js/Helios-Commands-Browser.js

@@ -380,6 +380,158 @@ referencedClasses: []
 smalltalk.HLCommitPackageCommand.klass);
 
 
+smalltalk.addClass('HLFindCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands-Browser');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (70);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLFindCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 70",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Find";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLFindCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Find'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindCommand.klass);
+
+
+smalltalk.addClass('HLFindClassCommand', smalltalk.HLFindCommand, [], 'Helios-Commands-Browser');
+smalltalk.addMethod(
+"_displayLabel",
+smalltalk.method({
+selector: "displayLabel",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "select a class";
+}, function($ctx1) {$ctx1.fill(self,"displayLabel",{},smalltalk.HLFindClassCommand)})},
+args: [],
+source: "displayLabel\x0a\x09^ 'select a class'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+category: 'executing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._openClassNamed_(_st(self)._input());
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLFindClassCommand)})},
+args: [],
+source: "execute\x0a\x09self model openClassNamed: self input",
+messageSends: ["openClassNamed:", "input", "model"],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_inputCompletion",
+smalltalk.method({
+selector: "inputCompletion",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._model())._availableClassNames();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"inputCompletion",{},smalltalk.HLFindClassCommand)})},
+args: [],
+source: "inputCompletion\x0a\x09^ self model availableClassNames",
+messageSends: ["availableClassNames", "model"],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_inputLabel",
+smalltalk.method({
+selector: "inputLabel",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Find a class";
+}, function($ctx1) {$ctx1.fill(self,"inputLabel",{},smalltalk.HLFindClassCommand)})},
+args: [],
+source: "inputLabel\x0a\x09^ 'Find a class'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand);
+
+smalltalk.addMethod(
+"_isInputRequired",
+smalltalk.method({
+selector: "isInputRequired",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"isInputRequired",{},smalltalk.HLFindClassCommand)})},
+args: [],
+source: "isInputRequired\x0a\x09^ true",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand);
+
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (67);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLFindClassCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 67",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Class";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLFindClassCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Class'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFindClassCommand.klass);
+
+
 smalltalk.addClass('HLMoveToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands-Browser');
 
 smalltalk.addMethod(

+ 69 - 6
js/Helios-Core.deploy.js

@@ -452,7 +452,7 @@ smalltalk.HLFocusableWidget);
 
 
 
-smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem'], 'Helios-Core');
+smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem', 'mapping'], 'Helios-Core');
 smalltalk.addMethod(
 "_activateFirstListItem",
 smalltalk.method({
@@ -464,6 +464,25 @@ return self}, function($ctx1) {$ctx1.fill(self,"activateFirstListItem",{}, small
 messageSends: ["activateListItem:", "jQuery:", "get:", "find:", "asJQuery"]}),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_activateItem_",
+smalltalk.method({
+selector: "activateItem:",
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+var $early={};
+try {
+_st(self)._activateListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+return smalltalk.withContext(function($ctx2) {
$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"activateItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: ["activateListItem:", "asJQuery", "at:ifAbsent:"]}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_activateListItem_",
 smalltalk.method({
@@ -557,6 +576,18 @@ return smalltalk.withContext(function($ctx1) { 
return "";
 messageSends: []}),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_initialize",
+smalltalk.method({
+selector: "initialize",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.HLFocusableWidget.fn.prototype._initialize.apply(_st(self), []);
+self["@mapping"]=_st((smalltalk.Dictionary || Dictionary))._new();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLListWidget)})},
+messageSends: ["initialize", "new"]}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_items",
 smalltalk.method({
@@ -600,6 +631,17 @@ return self}, function($ctx1) {$ctx1.fill(self,"positionOf:",{aListItem:aListIte
 messageSends: []}),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_registerMappingFrom_to_",
+smalltalk.method({
+selector: "registerMappingFrom:to:",
+fn: function (anObject,aTag){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(self["@mapping"])._at_put_(anObject,aTag);
+return self}, function($ctx1) {$ctx1.fill(self,"registerMappingFrom:to:",{anObject:anObject,aTag:aTag},smalltalk.HLListWidget)})},
+messageSends: ["at:put:"]}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_renderButtonsOn_",
 smalltalk.method({
@@ -641,6 +683,7 @@ var self=this;
 var li;
 return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
 li=_st(html)._li();
+_st(self)._registerMappingFrom_to_(anObject,li);
 $1=li;
 _st($1)._class_(_st(self)._cssClassForItem_(anObject));
 _st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
@@ -655,8 +698,8 @@ return smalltalk.withContext(function($ctx3) {
return _st(self)._activateListIte
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 return $4;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li}, smalltalk.HLListWidget)})},
-messageSends: ["li", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},smalltalk.HLListWidget)})},
+messageSends: ["li", "registerMappingFrom:to:", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
@@ -676,11 +719,12 @@ smalltalk.method({
 selector: "renderListOn:",
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._items())._do_((function(each){
+return smalltalk.withContext(function($ctx1) { 
self["@mapping"]=_st((smalltalk.Dictionary || Dictionary))._new();
+_st(_st(self)._items())._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
return _st(self)._renderItem_on_(each,html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html}, smalltalk.HLListWidget)})},
-messageSends: ["do:", "renderItem:on:", "items"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html},smalltalk.HLListWidget)})},
+messageSends: ["new", "do:", "renderItem:on:", "items"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
@@ -694,6 +738,25 @@ return self}, function($ctx1) {$ctx1.fill(self,"selectItem:",{anObject:anObject}
 messageSends: ["selectedItem:"]}),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_selectListItem_",
+smalltalk.method({
+selector: "selectListItem:",
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+var $early={};
+try {
+_st(self)._selectListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+return smalltalk.withContext(function($ctx2) {
$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"selectListItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: ["selectListItem:", "asJQuery", "at:ifAbsent:"]}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_selectedItem",
 smalltalk.method({

+ 92 - 9
js/Helios-Core.js

@@ -617,7 +617,7 @@ smalltalk.HLFocusableWidget);
 
 
 
-smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem'], 'Helios-Core');
+smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem', 'mapping'], 'Helios-Core');
 smalltalk.addMethod(
 "_activateFirstListItem",
 smalltalk.method({
@@ -634,6 +634,30 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_activateItem_",
+smalltalk.method({
+selector: "activateItem:",
+category: 'actions',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+var $early={};
+try {
+_st(self)._activateListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+return smalltalk.withContext(function($ctx2) {
$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"activateItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+args: ["anObject"],
+source: "activateItem: anObject\x0a\x09self activateListItem: (mapping \x0a\x09\x09at: anObject\x0a\x09\x09ifAbsent: [ ^ self ]) asJQuery",
+messageSends: ["activateListItem:", "asJQuery", "at:ifAbsent:"],
+referencedClasses: []
+}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_activateListItem_",
 smalltalk.method({
@@ -752,6 +776,23 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_initialize",
+smalltalk.method({
+selector: "initialize",
+category: 'initialization',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
smalltalk.HLFocusableWidget.fn.prototype._initialize.apply(_st(self), []);
+self["@mapping"]=_st((smalltalk.Dictionary || Dictionary))._new();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLListWidget)})},
+args: [],
+source: "initialize\x0a\x09super initialize.\x0a\x09\x0a\x09mapping := Dictionary new.",
+messageSends: ["initialize", "new"],
+referencedClasses: ["Dictionary"]
+}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_items",
 smalltalk.method({
@@ -810,6 +851,22 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_registerMappingFrom_to_",
+smalltalk.method({
+selector: "registerMappingFrom:to:",
+category: 'private',
+fn: function (anObject,aTag){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(self["@mapping"])._at_put_(anObject,aTag);
+return self}, function($ctx1) {$ctx1.fill(self,"registerMappingFrom:to:",{anObject:anObject,aTag:aTag},smalltalk.HLListWidget)})},
+args: ["anObject", "aTag"],
+source: "registerMappingFrom: anObject to: aTag\x0a\x09mapping at: anObject put: aTag",
+messageSends: ["at:put:"],
+referencedClasses: []
+}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_renderButtonsOn_",
 smalltalk.method({
@@ -862,6 +919,7 @@ var self=this;
 var li;
 return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
 li=_st(html)._li();
+_st(self)._registerMappingFrom_to_(anObject,li);
 $1=li;
 _st($1)._class_(_st(self)._cssClassForItem_(anObject));
 _st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
@@ -876,10 +934,10 @@ return smalltalk.withContext(function($ctx3) {
return _st(self)._activateListIte
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 return $4;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li}, smalltalk.HLListWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},smalltalk.HLListWidget)})},
 args: ["anObject", "html"],
-source: "renderItem: anObject on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a    li\x0a    \x09class: (self cssClassForItem: anObject);\x0a        at: 'list-data' put: (self items indexOf: anObject) asString;\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: anObject).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: anObject on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ]",
-messageSends: ["li", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"],
+source: "renderItem: anObject on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: anObject to: li.\x0a\x09\x0a    li\x0a    \x09class: (self cssClassForItem: anObject);\x0a        at: 'list-data' put: (self items indexOf: anObject) asString;\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: anObject).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: anObject on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ]",
+messageSends: ["li", "registerMappingFrom:to:", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.HLListWidget);
@@ -907,14 +965,15 @@ selector: "renderListOn:",
 category: 'rendering',
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._items())._do_((function(each){
+return smalltalk.withContext(function($ctx1) { 
self["@mapping"]=_st((smalltalk.Dictionary || Dictionary))._new();
+_st(_st(self)._items())._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
return _st(self)._renderItem_on_(each,html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html}, smalltalk.HLListWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html},smalltalk.HLListWidget)})},
 args: ["html"],
-source: "renderListOn: html\x0a\x09self items do: [ :each | \x0a    \x09self renderItem: each on: html ]",
-messageSends: ["do:", "renderItem:on:", "items"],
-referencedClasses: []
+source: "renderListOn: html\x0a\x09mapping := Dictionary new.\x0a\x09\x0a\x09self items do: [ :each | \x0a    \x09self renderItem: each on: html ]",
+messageSends: ["new", "do:", "renderItem:on:", "items"],
+referencedClasses: ["Dictionary"]
 }),
 smalltalk.HLListWidget);
 
@@ -934,6 +993,30 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+"_selectListItem_",
+smalltalk.method({
+selector: "selectListItem:",
+category: 'actions',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+var $early={};
+try {
+_st(self)._selectListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+return smalltalk.withContext(function($ctx2) {
$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"selectListItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+args: ["anObject"],
+source: "selectListItem: anObject\x0a\x09self selectListItem: (mapping \x0a\x09\x09at: anObject\x0a\x09\x09ifAbsent: [ ^ self ]) asJQuery\x0a",
+messageSends: ["selectListItem:", "asJQuery", "at:ifAbsent:"],
+referencedClasses: []
+}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 "_selectedItem",
 smalltalk.method({

+ 29 - 0
js/Helios-Environments.deploy.js

@@ -50,6 +50,17 @@ return $1;
 messageSends: ["subclassResponsibility"]}),
 smalltalk.HLEnvironment);
 
+smalltalk.addMethod(
+"_classNamed_",
+smalltalk.method({
+selector: "classNamed:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(self)._subclassResponsibility();
+return self}, function($ctx1) {$ctx1.fill(self,"classNamed:",{aString:aString},smalltalk.HLEnvironment)})},
+messageSends: ["subclassResponsibility"]}),
+smalltalk.HLEnvironment);
+
 smalltalk.addMethod(
 "_commitPackage_",
 smalltalk.method({
@@ -205,6 +216,24 @@ return $1;
 messageSends: ["new"]}),
 smalltalk.HLLocalEnvironment);
 
+smalltalk.addMethod(
+"_classNamed_",
+smalltalk.method({
+selector: "classNamed:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(_st((smalltalk.Smalltalk || Smalltalk))._current())._at_(_st(aString)._asSymbol());
+if(($receiver = $2) == nil || $receiver == undefined){
+$1=_st(self)._error_("Invalid class name");
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"classNamed:",{aString:aString},smalltalk.HLLocalEnvironment)})},
+messageSends: ["ifNil:", "error:", "at:", "asSymbol", "current"]}),
+smalltalk.HLLocalEnvironment);
+
 smalltalk.addMethod(
 "_commitPackage_",
 smalltalk.method({

+ 39 - 0
js/Helios-Environments.js

@@ -71,6 +71,22 @@ referencedClasses: []
 }),
 smalltalk.HLEnvironment);
 
+smalltalk.addMethod(
+"_classNamed_",
+smalltalk.method({
+selector: "classNamed:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(self)._subclassResponsibility();
+return self}, function($ctx1) {$ctx1.fill(self,"classNamed:",{aString:aString},smalltalk.HLEnvironment)})},
+args: ["aString"],
+source: "classNamed: aString\x0a\x09self subclassResponsibility",
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
+}),
+smalltalk.HLEnvironment);
+
 smalltalk.addMethod(
 "_commitPackage_",
 smalltalk.method({
@@ -286,6 +302,29 @@ referencedClasses: ["ClassBuilder"]
 }),
 smalltalk.HLLocalEnvironment);
 
+smalltalk.addMethod(
+"_classNamed_",
+smalltalk.method({
+selector: "classNamed:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(_st((smalltalk.Smalltalk || Smalltalk))._current())._at_(_st(aString)._asSymbol());
+if(($receiver = $2) == nil || $receiver == undefined){
+$1=_st(self)._error_("Invalid class name");
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"classNamed:",{aString:aString},smalltalk.HLLocalEnvironment)})},
+args: ["aString"],
+source: "classNamed: aString\x0a\x09^ (Smalltalk current at: aString asSymbol)\x0a\x09\x09ifNil: [ self error: 'Invalid class name' ]",
+messageSends: ["ifNil:", "error:", "at:", "asSymbol", "current"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.HLLocalEnvironment);
+
 smalltalk.addMethod(
 "_commitPackage_",
 smalltalk.method({

+ 17 - 3
st/Helios-Browser.st

@@ -251,7 +251,9 @@ onClassSelected: aClass
 	self selectedItem: aClass.
 	aClass ifNil: [ ^ self ].
     
-    self focus
+	self 
+		selectListItem: aClass;
+		focus
 !
 
 onClassesFocusRequested
@@ -301,6 +303,8 @@ renderItem: aClass level: anInteger on: html
 	| li |
     
 	li := html li.
+	self registerMappingFrom: aClass to: li.
+	
     li
     	at: 'list-data' put: (self items indexOf: aClass);
     	class: (self cssClassForItem: aClass);
@@ -582,8 +586,10 @@ selectItem: aPackage
 !HLPackagesListWidget methodsFor: 'reactions'!
 
 onPackageSelected: aPackage
-	self selectedItem: aPackage.
-	self focus
+	self 
+		selectedItem: aPackage;
+		selectListItem: aPackage;
+		focus
 !
 
 onPackagesFocusRequested
@@ -898,6 +904,14 @@ moveMethodToProtocol: aProtocol
 	self environment moveMethod: self selectedMethod toProtocol: aProtocol
 !
 
+openClassNamed: aString
+	| class |
+	
+	class := self environment classNamed: aString.
+	self selectedPackage: class package.
+	self selectedClass: class
+!
+
 removeMethod
 	(self manager confirm: 'Do you REALLY want to remove method ', self selectedMethod methodClass name,' >> #', self selectedMethod selector)
 		ifTrue: [ self environment removeMethod: self selectedMethod ]

+ 54 - 0
st/Helios-Commands-Browser.st

@@ -162,6 +162,60 @@ label
 	^ 'Commit package'
 ! !
 
+HLBrowserCommand subclass: #HLFindCommand
+	instanceVariableNames: ''
+	package: 'Helios-Commands-Browser'!
+
+!HLFindCommand class methodsFor: 'accessing'!
+
+key
+	^ 70
+!
+
+label
+	^ 'Find'
+! !
+
+HLFindCommand subclass: #HLFindClassCommand
+	instanceVariableNames: ''
+	package: 'Helios-Commands-Browser'!
+
+!HLFindClassCommand methodsFor: 'accessing'!
+
+displayLabel
+	^ 'select a class'
+!
+
+inputCompletion
+	^ self model availableClassNames
+!
+
+inputLabel
+	^ 'Find a class'
+! !
+
+!HLFindClassCommand methodsFor: 'executing'!
+
+execute
+	self model openClassNamed: self input
+! !
+
+!HLFindClassCommand methodsFor: 'testing'!
+
+isInputRequired
+	^ true
+! !
+
+!HLFindClassCommand class methodsFor: 'accessing'!
+
+key
+	^ 67
+!
+
+label
+	^ 'Class'
+! !
+
 HLBrowserCommand subclass: #HLMoveToCommand
 	instanceVariableNames: ''
 	package: 'Helios-Commands-Browser'!

+ 31 - 1
st/Helios-Core.st

@@ -198,7 +198,7 @@ canHaveFocus
 ! !
 
 HLFocusableWidget subclass: #HLListWidget
-	instanceVariableNames: 'items selectedItem'
+	instanceVariableNames: 'items selectedItem mapping'
 	package: 'Helios-Core'!
 
 !HLListWidget methodsFor: 'accessing'!
@@ -241,6 +241,12 @@ activateFirstListItem
 	self activateListItem: (window jQuery: ((wrapper asJQuery find: 'li') get: 0))
 !
 
+activateItem: anObject
+	self activateListItem: (mapping 
+		at: anObject
+		ifAbsent: [ ^ self ]) asJQuery
+!
+
 activateListItem: aListItem
 	| parent position |
     
@@ -270,6 +276,12 @@ focus
 
 selectItem: anObject
 	self selectedItem: anObject
+!
+
+selectListItem: anObject
+	self selectListItem: (mapping 
+		at: anObject
+		ifAbsent: [ ^ self ]) asJQuery
 ! !
 
 !HLListWidget methodsFor: 'defaults'!
@@ -294,6 +306,20 @@ setupKeyBindings
 			self activateListItem: next ] ]
 ! !
 
+!HLListWidget methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	
+	mapping := Dictionary new.
+! !
+
+!HLListWidget methodsFor: 'private'!
+
+registerMappingFrom: anObject to: aTag
+	mapping at: anObject put: aTag
+! !
+
 !HLListWidget methodsFor: 'rendering'!
 
 renderButtonsOn: html
@@ -313,6 +339,8 @@ renderItem: anObject on: html
 	| li |
     
 	li := html li.
+	self registerMappingFrom: anObject to: li.
+	
     li
     	class: (self cssClassForItem: anObject);
         at: 'list-data' put: (self items indexOf: anObject) asString;
@@ -330,6 +358,8 @@ renderItemLabel: anObject on: html
 !
 
 renderListOn: html
+	mapping := Dictionary new.
+	
 	self items do: [ :each | 
     	self renderItem: each on: html ]
 ! !

+ 9 - 0
st/Helios-Environments.st

@@ -19,6 +19,10 @@ classBuilder
 	^ self subclassResponsibility
 !
 
+classNamed: aString
+	self subclassResponsibility
+!
+
 packages
 	^ self subclassResponsibility
 ! !
@@ -93,6 +97,11 @@ classBuilder
 	^ ClassBuilder new
 !
 
+classNamed: aString
+	^ (Smalltalk current at: aString asSymbol)
+		ifNil: [ self error: 'Invalid class name' ]
+!
+
 packages
 	^ Smalltalk current packages
 ! !