Browse Source

Commands and keybindings refactoring

Nicolas Petton 11 years ago
parent
commit
bc37c7e3af

+ 15 - 20
js/Helios-Browser.deploy.js

@@ -153,21 +153,9 @@ smalltalk.method({
 selector: "registerBindingsOn:",
 fn: function (aBindingGroup){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
-$1=aBindingGroup;
-_st($1)._addGroupKey_labelled_((66),"Browse");
-_st($1)._addGroupKey_labelled_((71),"Go to");
-$2=_st($1)._addGroupKey_labelled_((84),"Toggle");
-_st(_st((smalltalk.HLBrowserCommand || HLBrowserCommand))._withAllSubclasses())._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$3=_st(each)._key();
-if(($receiver = $3) == nil || $receiver == undefined){
-return $3;
-} else {
-return _st(_st(aBindingGroup)._at_(_st(each)._bindingGroup()))._add_(_st(_st(each)._on_(_st(self)._model()))._asBinding());
-};
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"registerBindingsOn:",{aBindingGroup:aBindingGroup}, smalltalk.HLBrowser)})},
-messageSends: ["addGroupKey:labelled:", "do:", "ifNotNil:", "add:", "asBinding", "on:", "model", "at:", "bindingGroup", "key", "withAllSubclasses"]}),
+return smalltalk.withContext(function($ctx1) { 
_st((smalltalk.HLBrowserCommand || HLBrowserCommand))._registerConcreteClassesOn_for_(aBindingGroup,_st(self)._model());
+return self}, function($ctx1) {$ctx1.fill(self,"registerBindingsOn:",{aBindingGroup:aBindingGroup},smalltalk.HLBrowser)})},
+messageSends: ["registerConcreteClassesOn:for:", "model"]}),
 smalltalk.HLBrowser);
 
 smalltalk.addMethod(
@@ -2352,20 +2340,27 @@ smalltalk.method({
 selector: "onMethodModified:",
 fn: function (aMethod){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6;
 $1=_st(_st(_st(self)._model())._selectedClass()).__eq(_st(aMethod)._methodClass());
 if(! smalltalk.assert($1)){
 $2=self;
 return $2;
 };
-$3=_st(_st(_st(_st(self)._model())._selectedMethod())._selector()).__eq(_st(aMethod)._selector());
-if(! smalltalk.assert($3)){
+$3=_st(_st(self)._model())._selectedMethod();
+if(($receiver = $3) == nil || $receiver == undefined){
 $4=self;
 return $4;
+} else {
+$3;
+};
+$5=_st(_st(_st(_st(self)._model())._selectedMethod())._selector()).__eq(_st(aMethod)._selector());
+if(! smalltalk.assert($5)){
+$6=self;
+return $6;
 };
 _st(self)._refresh();
-return self}, function($ctx1) {$ctx1.fill(self,"onMethodModified:",{aMethod:aMethod}, smalltalk.HLBrowserSourceWidget)})},
-messageSends: ["ifFalse:", "=", "methodClass", "selectedClass", "model", "selector", "selectedMethod", "refresh"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"onMethodModified:",{aMethod:aMethod},smalltalk.HLBrowserSourceWidget)})},
+messageSends: ["ifFalse:", "=", "methodClass", "selectedClass", "model", "ifNil:", "selectedMethod", "selector", "refresh"]}),
 smalltalk.HLBrowserSourceWidget);
 
 smalltalk.addMethod(

+ 17 - 22
js/Helios-Browser.js

@@ -199,23 +199,11 @@ selector: "registerBindingsOn:",
 category: 'keybindings',
 fn: function (aBindingGroup){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3;
-$1=aBindingGroup;
-_st($1)._addGroupKey_labelled_((66),"Browse");
-_st($1)._addGroupKey_labelled_((71),"Go to");
-$2=_st($1)._addGroupKey_labelled_((84),"Toggle");
-_st(_st((smalltalk.HLBrowserCommand || HLBrowserCommand))._withAllSubclasses())._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
$3=_st(each)._key();
-if(($receiver = $3) == nil || $receiver == undefined){
-return $3;
-} else {
-return _st(_st(aBindingGroup)._at_(_st(each)._bindingGroup()))._add_(_st(_st(each)._on_(_st(self)._model()))._asBinding());
-};
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"registerBindingsOn:",{aBindingGroup:aBindingGroup}, smalltalk.HLBrowser)})},
+return smalltalk.withContext(function($ctx1) { 
_st((smalltalk.HLBrowserCommand || HLBrowserCommand))._registerConcreteClassesOn_for_(aBindingGroup,_st(self)._model());
+return self}, function($ctx1) {$ctx1.fill(self,"registerBindingsOn:",{aBindingGroup:aBindingGroup},smalltalk.HLBrowser)})},
 args: ["aBindingGroup"],
-source: "registerBindingsOn: aBindingGroup\x0a\x09aBindingGroup \x0a    \x09addGroupKey: 66 labelled: 'Browse';\x0a        addGroupKey: 71 labelled: 'Go to';\x0a        addGroupKey: 84 labelled: 'Toggle'.\x0a        \x0a   \x09HLBrowserCommand withAllSubclasses do: [ :each |\x0a   \x09\x09each key ifNotNil: [\x0a  \x09\x09\x09(aBindingGroup at: each bindingGroup) \x0a  \x09\x09\x09\x09add: (each on: self model) asBinding ] ]",
-messageSends: ["addGroupKey:labelled:", "do:", "ifNotNil:", "add:", "asBinding", "on:", "model", "at:", "bindingGroup", "key", "withAllSubclasses"],
+source: "registerBindingsOn: aBindingGroup\x0a\x09HLBrowserCommand registerConcreteClassesOn: aBindingGroup for: self model\x0a\x09\x0a\x09\x22aBindingGroup \x0a    \x09addGroupKey: 66 labelled: 'Browse';\x0a        addGroupKey: 71 labelled: 'Go to';\x0a        addGroupKey: 84 labelled: 'Toggle';\x0a\x09\x09addGroupKey: 77 labelled: 'Move'.\x0a\x09\x09\x09\x0a\x09(aBindingGroup at: 'Move')\x0a\x09\x09addGroupKey: 77 labelled: 'Method';\x0a\x09\x09addGroupKey: 67 labelled: 'Class';\x0a\x09\x09addGroupKey: 80 labelled: 'Protocol'.\x0a        \x0a\x09HLMoveMethodToCommand concreteClasses do: [ :each |\x0a  \x09\x09\x09(aBindingGroup at: 'Move') \x0a\x09\x09\x09\x09at: each bindingGroup \x0a  \x09\x09\x09\x09add: (each on: self model) asBinding ].\x0a\x09\x09\x09\x0a   \x09HLBrowserCommand concreteClasses do: [ :each |\x0a  \x09\x09\x09aBindingGroup \x0a\x09\x09\x09\x09at: each bindingGroup\x0a  \x09\x09\x09\x09add: (each on: self model) asBinding ]\x22",
+messageSends: ["registerConcreteClassesOn:for:", "model"],
 referencedClasses: ["HLBrowserCommand"]
 }),
 smalltalk.HLBrowser);
@@ -3063,22 +3051,29 @@ selector: "onMethodModified:",
 category: 'reactions',
 fn: function (aMethod){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2,$3,$4,$5,$6;
 $1=_st(_st(_st(self)._model())._selectedClass()).__eq(_st(aMethod)._methodClass());
 if(! smalltalk.assert($1)){
 $2=self;
 return $2;
 };
-$3=_st(_st(_st(_st(self)._model())._selectedMethod())._selector()).__eq(_st(aMethod)._selector());
-if(! smalltalk.assert($3)){
+$3=_st(_st(self)._model())._selectedMethod();
+if(($receiver = $3) == nil || $receiver == undefined){
 $4=self;
 return $4;
+} else {
+$3;
+};
+$5=_st(_st(_st(_st(self)._model())._selectedMethod())._selector()).__eq(_st(aMethod)._selector());
+if(! smalltalk.assert($5)){
+$6=self;
+return $6;
 };
 _st(self)._refresh();
-return self}, function($ctx1) {$ctx1.fill(self,"onMethodModified:",{aMethod:aMethod}, smalltalk.HLBrowserSourceWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"onMethodModified:",{aMethod:aMethod},smalltalk.HLBrowserSourceWidget)})},
 args: ["aMethod"],
-source: "onMethodModified: aMethod\x0a\x0a\x09self model selectedClass = aMethod methodClass ifFalse: [ ^ self ].\x0a    self model selectedMethod selector = aMethod selector ifFalse: [ ^ self ].\x0a\x0a    self refresh",
-messageSends: ["ifFalse:", "=", "methodClass", "selectedClass", "model", "selector", "selectedMethod", "refresh"],
+source: "onMethodModified: aMethod\x0a\x0a\x09self model selectedClass = aMethod methodClass ifFalse: [ ^ self ].\x0a\x09self model selectedMethod ifNil: [ ^ self ].\x0a    self model selectedMethod selector = aMethod selector ifFalse: [ ^ self ].\x0a\x0a    self refresh",
+messageSends: ["ifFalse:", "=", "methodClass", "selectedClass", "model", "ifNil:", "selectedMethod", "selector", "refresh"],
 referencedClasses: []
 }),
 smalltalk.HLBrowserSourceWidget);

+ 391 - 82
js/Helios-Commands.deploy.js

@@ -1,9 +1,9 @@
 smalltalk.addPackage('Helios-Commands');
 smalltalk.addClass('HLCommand', smalltalk.Object, [], 'Helios-Commands');
 smalltalk.addMethod(
-"_asBinding",
+"_asActionBinding",
 smalltalk.method({
-selector: "asBinding",
+selector: "asActionBinding",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
@@ -11,10 +11,41 @@ $1=_st(_st((smalltalk.HLBindingAction || HLBindingAction))._on_labelled_(_st(sel
 return smalltalk.withContext(function($ctx2) {
return _st(self)._execute();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"asBinding",{}, smalltalk.HLCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"asActionBinding",{},smalltalk.HLCommand)})},
 messageSends: ["callback:", "execute", "on:labelled:", "key", "label"]}),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_asBinding",
+smalltalk.method({
+selector: "asBinding",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(self)._isBindingGroup();
+if(smalltalk.assert($2)){
+$1=_st(self)._asGroupBinding();
+} else {
+$1=_st(self)._asActionBinding();
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"asBinding",{},smalltalk.HLCommand)})},
+messageSends: ["ifTrue:ifFalse:", "asGroupBinding", "asActionBinding", "isBindingGroup"]}),
+smalltalk.HLCommand);
+
+smalltalk.addMethod(
+"_asGroupBinding",
+smalltalk.method({
+selector: "asGroupBinding",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st((smalltalk.HLBindingGroup || HLBindingGroup))._on_labelled_(_st(self)._key(),_st(self)._label());
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"asGroupBinding",{},smalltalk.HLCommand)})},
+messageSends: ["on:labelled:", "key", "label"]}),
+smalltalk.HLCommand);
+
 smalltalk.addMethod(
 "_documentation",
 smalltalk.method({
@@ -38,6 +69,19 @@ return smalltalk.withContext(function($ctx1) { 
return self}, function($ctx1) {$
 messageSends: []}),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_isBindingGroup",
+smalltalk.method({
+selector: "isBindingGroup",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(_st(self)._class())._methodDictionary())._includesKey_("execute"))._not();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isBindingGroup",{},smalltalk.HLCommand)})},
+messageSends: ["not", "includesKey:", "methodDictionary", "class"]}),
+smalltalk.HLCommand);
+
 smalltalk.addMethod(
 "_key",
 smalltalk.method({
@@ -64,16 +108,33 @@ return $1;
 messageSends: ["label", "class"]}),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_registerOn_",
+smalltalk.method({
+selector: "registerOn:",
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(aBinding)._add_(_st(self)._asBinding());
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:",{aBinding:aBinding},smalltalk.HLCommand)})},
+messageSends: ["add:", "asBinding"]}),
+smalltalk.HLCommand);
+
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_concreteSubclasses",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "concreteSubclasses",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return nil;
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLCommand.klass)})},
-messageSends: []}),
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._subclasses())._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
return _st(each)._isConcrete();
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"concreteSubclasses",{},smalltalk.HLCommand.klass)})},
+messageSends: ["select:", "isConcrete", "subclasses"]}),
 smalltalk.HLCommand.klass);
 
 smalltalk.addMethod(
@@ -87,6 +148,19 @@ return smalltalk.withContext(function($ctx1) { 
return "";
 messageSends: []}),
 smalltalk.HLCommand.klass);
 
+smalltalk.addMethod(
+"_isConcrete",
+smalltalk.method({
+selector: "isConcrete",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._key())._notNil();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isConcrete",{},smalltalk.HLCommand.klass)})},
+messageSends: ["notNil", "key"]}),
+smalltalk.HLCommand.klass);
+
 smalltalk.addMethod(
 "_key",
 smalltalk.method({
@@ -109,8 +183,77 @@ return smalltalk.withContext(function($ctx1) { 
return "";
 messageSends: []}),
 smalltalk.HLCommand.klass);
 
+smalltalk.addMethod(
+"_registerConcreteClassesOn_",
+smalltalk.method({
+selector: "registerConcreteClassesOn:",
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(_st(self)._concreteSubclasses())._do_((function(each){
+var binding;
+return smalltalk.withContext(function($ctx2) {
binding=_st(each)._registerOn_(aBinding);
+binding;
+$1=_st(binding)._isBindingGroup();
+if(smalltalk.assert($1)){
+return _st(each)._registerConcreteClassesOn_(binding);
+};
+}, function($ctx2) {$ctx2.fillBlock({each:each,binding:binding},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"registerConcreteClassesOn:",{aBinding:aBinding},smalltalk.HLCommand.klass)})},
+messageSends: ["do:", "registerOn:", "ifTrue:", "registerConcreteClassesOn:", "isBindingGroup", "concreteSubclasses"]}),
+smalltalk.HLCommand.klass);
 
-smalltalk.addClass('HLBrowserCommand', smalltalk.HLCommand, ['model'], 'Helios-Commands');
+smalltalk.addMethod(
+"_registerOn_",
+smalltalk.method({
+selector: "registerOn:",
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._new())._registerOn_(aBinding);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:",{aBinding:aBinding},smalltalk.HLCommand.klass)})},
+messageSends: ["registerOn:", "new"]}),
+smalltalk.HLCommand.klass);
+
+
+smalltalk.addClass('HLCloseTabCommand', smalltalk.HLCommand, [], 'Helios-Commands');
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.HLManager || HLManager))._current())._removeActiveTab();
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLCloseTabCommand)})},
+messageSends: ["removeActiveTab", "current"]}),
+smalltalk.HLCloseTabCommand);
+
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (87);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLCloseTabCommand.klass)})},
+messageSends: []}),
+smalltalk.HLCloseTabCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Close tab";
+}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLCloseTabCommand.klass)})},
+messageSends: []}),
+smalltalk.HLCloseTabCommand.klass);
+
+
+smalltalk.addClass('HLModelCommand', smalltalk.HLCommand, ['model'], 'Helios-Commands');
 smalltalk.addMethod(
 "_model",
 smalltalk.method({
@@ -120,26 +263,75 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
 $1=self["@model"];
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"model",{}, smalltalk.HLBrowserCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"model",{},smalltalk.HLModelCommand)})},
 messageSends: []}),
-smalltalk.HLBrowserCommand);
+smalltalk.HLModelCommand);
 
 smalltalk.addMethod(
 "_model_",
 smalltalk.method({
 selector: "model:",
-fn: function (aBrowserModel){
+fn: function (aModel){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@model"]=aBrowserModel;
-return self}, function($ctx1) {$ctx1.fill(self,"model:",{aBrowserModel:aBrowserModel}, smalltalk.HLBrowserCommand)})},
+return smalltalk.withContext(function($ctx1) { 
self["@model"]=aModel;
+return self}, function($ctx1) {$ctx1.fill(self,"model:",{aModel:aModel},smalltalk.HLModelCommand)})},
 messageSends: []}),
-smalltalk.HLBrowserCommand);
+smalltalk.HLModelCommand);
+
+
+smalltalk.addMethod(
+"_for_",
+smalltalk.method({
+selector: "for:",
+fn: function (aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(self)._new();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"for:",{aModel:aModel},smalltalk.HLModelCommand.klass)})},
+messageSends: ["new"]}),
+smalltalk.HLModelCommand.klass);
 
+smalltalk.addMethod(
+"_registerConcreteClassesOn_for_",
+smalltalk.method({
+selector: "registerConcreteClassesOn:for:",
+fn: function (aBinding,aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(_st(self)._concreteSubclasses())._do_((function(each){
+var binding;
+return smalltalk.withContext(function($ctx2) {
binding=_st(each)._registerOn_for_(aBinding,aModel);
+binding;
+$1=_st(binding)._isBindingGroup();
+if(smalltalk.assert($1)){
+return _st(each)._registerConcreteClassesOn_for_(binding,aModel);
+};
+}, function($ctx2) {$ctx2.fillBlock({each:each,binding:binding},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"registerConcreteClassesOn:for:",{aBinding:aBinding,aModel:aModel},smalltalk.HLModelCommand.klass)})},
+messageSends: ["do:", "registerOn:for:", "ifTrue:", "registerConcreteClassesOn:for:", "isBindingGroup", "concreteSubclasses"]}),
+smalltalk.HLModelCommand.klass);
 
 smalltalk.addMethod(
-"_on_",
+"_registerOn_for_",
 smalltalk.method({
-selector: "on:",
+selector: "registerOn:for:",
+fn: function (aBinding,aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._for_(aModel))._registerOn_(aBinding);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:for:",{aBinding:aBinding,aModel:aModel},smalltalk.HLModelCommand.klass)})},
+messageSends: ["registerOn:", "for:"]}),
+smalltalk.HLModelCommand.klass);
+
+
+smalltalk.addClass('HLBrowserCommand', smalltalk.HLModelCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_for_",
+smalltalk.method({
+selector: "for:",
 fn: function (aBrowserModel){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $2,$3,$1;
@@ -148,7 +340,7 @@ _st($2)._model_(aBrowserModel);
 $3=_st($2)._yourself();
 $1=$3;
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"on:",{aBrowserModel:aBrowserModel}, smalltalk.HLBrowserCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"for:",{aBrowserModel:aBrowserModel},smalltalk.HLBrowserCommand.klass)})},
 messageSends: ["model:", "new", "yourself"]}),
 smalltalk.HLBrowserCommand.klass);
 
@@ -156,13 +348,24 @@ smalltalk.HLBrowserCommand.klass);
 smalltalk.addClass('HLGoToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (71);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToCommand.klass)})},
+messageSends: []}),
+smalltalk.HLGoToCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Go to";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLGoToCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToCommand.klass);
 
@@ -175,7 +378,7 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnClasses();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToClassesCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToClassesCommand)})},
 messageSends: ["focusOnClasses", "model"]}),
 smalltalk.HLGoToClassesCommand);
 
@@ -187,7 +390,7 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (67);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToClassesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToClassesCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToClassesCommand.klass);
 
@@ -198,7 +401,7 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Classes";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToClassesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToClassesCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToClassesCommand.klass);
 
@@ -211,7 +414,7 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnMethods();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToMethodsCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToMethodsCommand)})},
 messageSends: ["focusOnMethods", "model"]}),
 smalltalk.HLGoToMethodsCommand);
 
@@ -223,7 +426,7 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (77);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToMethodsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToMethodsCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToMethodsCommand.klass);
 
@@ -234,7 +437,7 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Methods";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToMethodsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToMethodsCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToMethodsCommand.klass);
 
@@ -247,7 +450,7 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnPackages();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToPackagesCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToPackagesCommand)})},
 messageSends: ["focusOnPackages", "model"]}),
 smalltalk.HLGoToPackagesCommand);
 
@@ -259,7 +462,7 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (80);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToPackagesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToPackagesCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToPackagesCommand.klass);
 
@@ -270,7 +473,7 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Packages";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToPackagesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToPackagesCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToPackagesCommand.klass);
 
@@ -283,7 +486,7 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnProtocols();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToProtocolsCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToProtocolsCommand)})},
 messageSends: ["focusOnProtocols", "model"]}),
 smalltalk.HLGoToProtocolsCommand);
 
@@ -295,7 +498,7 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (84);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToProtocolsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToProtocolsCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToProtocolsCommand.klass);
 
@@ -306,7 +509,7 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Protocols";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToProtocolsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToProtocolsCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToProtocolsCommand.klass);
 
@@ -319,7 +522,7 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnSourceCode();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToSourceCodeCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToSourceCodeCommand)})},
 messageSends: ["focusOnSourceCode", "model"]}),
 smalltalk.HLGoToSourceCodeCommand);
 
@@ -331,7 +534,7 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (83);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToSourceCodeCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToSourceCodeCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToSourceCodeCommand.klass);
 
@@ -342,36 +545,71 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Source code";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToSourceCodeCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToSourceCodeCommand.klass)})},
 messageSends: []}),
 smalltalk.HLGoToSourceCodeCommand.klass);
 
 
-smalltalk.addClass('HLToggleCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLMoveToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Toggle";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLToggleCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (77);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveToCommand.klass)})},
 messageSends: []}),
-smalltalk.HLToggleCommand.klass);
+smalltalk.HLMoveToCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Move";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveToCommand.klass)})},
+messageSends: []}),
+smalltalk.HLMoveToCommand.klass);
 
 
-smalltalk.addClass('HLToggleClassSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLMoveMethodToCommand', smalltalk.HLMoveToCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (77);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToCommand.klass)})},
+messageSends: []}),
+smalltalk.HLMoveMethodToCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Method";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToCommand.klass)})},
+messageSends: []}),
+smalltalk.HLMoveMethodToCommand.klass);
+
+
+smalltalk.addClass('HLMoveMethodToClassCommand', smalltalk.HLMoveMethodToCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
 selector: "execute",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(false);
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLToggleClassSideCommand)})},
-messageSends: ["showInstance:", "model"]}),
-smalltalk.HLToggleClassSideCommand);
+return smalltalk.withContext(function($ctx1) { 
return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLMoveMethodToClassCommand)})},
+messageSends: []}),
+smalltalk.HLMoveMethodToClassCommand);
 
 
 smalltalk.addMethod(
@@ -381,9 +619,9 @@ selector: "key",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (67);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLToggleClassSideCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToClassCommand.klass)})},
 messageSends: []}),
-smalltalk.HLToggleClassSideCommand.klass);
+smalltalk.HLMoveMethodToClassCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -391,23 +629,22 @@ smalltalk.method({
 selector: "label",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Class side";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLToggleClassSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "to class";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToClassCommand.klass)})},
 messageSends: []}),
-smalltalk.HLToggleClassSideCommand.klass);
+smalltalk.HLMoveMethodToClassCommand.klass);
 
 
-smalltalk.addClass('HLToggleInstanceSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLMoveMethodToProtocolCommand', smalltalk.HLMoveMethodToCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
 selector: "execute",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(true);
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLToggleInstanceSideCommand)})},
-messageSends: ["showInstance:", "model"]}),
-smalltalk.HLToggleInstanceSideCommand);
+return smalltalk.withContext(function($ctx1) { 
return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLMoveMethodToProtocolCommand)})},
+messageSends: []}),
+smalltalk.HLMoveMethodToProtocolCommand);
 
 
 smalltalk.addMethod(
@@ -416,10 +653,10 @@ smalltalk.method({
 selector: "key",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return (73);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLToggleInstanceSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (84);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToProtocolCommand.klass)})},
 messageSends: []}),
-smalltalk.HLToggleInstanceSideCommand.klass);
+smalltalk.HLMoveMethodToProtocolCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -427,35 +664,85 @@ smalltalk.method({
 selector: "label",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Instance side";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLToggleInstanceSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "to protocol";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToProtocolCommand.klass)})},
 messageSends: []}),
-smalltalk.HLToggleInstanceSideCommand.klass);
+smalltalk.HLMoveMethodToProtocolCommand.klass);
 
 
-smalltalk.addClass('HLCloseTabCommand', smalltalk.HLCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLToggleCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (84);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleCommand.klass)})},
+messageSends: []}),
+smalltalk.HLToggleCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Toggle";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleCommand.klass)})},
+messageSends: []}),
+smalltalk.HLToggleCommand.klass);
+
+
+smalltalk.addClass('HLToggleClassSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
 selector: "execute",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.HLManager || HLManager))._current())._removeActiveTab();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLCloseTabCommand)})},
-messageSends: ["removeActiveTab", "current"]}),
-smalltalk.HLCloseTabCommand);
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(false);
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLToggleClassSideCommand)})},
+messageSends: ["showInstance:", "model"]}),
+smalltalk.HLToggleClassSideCommand);
 
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Close";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (67);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleClassSideCommand.klass)})},
 messageSends: []}),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleClassSideCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Class side";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleClassSideCommand.klass)})},
+messageSends: []}),
+smalltalk.HLToggleClassSideCommand.klass);
+
+
+smalltalk.addClass('HLToggleInstanceSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(true);
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLToggleInstanceSideCommand)})},
+messageSends: ["showInstance:", "model"]}),
+smalltalk.HLToggleInstanceSideCommand);
+
 
 smalltalk.addMethod(
 "_key",
@@ -463,10 +750,10 @@ smalltalk.method({
 selector: "key",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return (87);
-}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (73);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleInstanceSideCommand.klass)})},
 messageSends: []}),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleInstanceSideCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -474,22 +761,33 @@ smalltalk.method({
 selector: "label",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Close tab";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "Instance side";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleInstanceSideCommand.klass)})},
 messageSends: []}),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleInstanceSideCommand.klass);
 
 
 smalltalk.addClass('HLOpenCommand', smalltalk.HLCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (79);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLOpenCommand.klass)})},
+messageSends: []}),
+smalltalk.HLOpenCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Open";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLOpenCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLOpenCommand.klass)})},
 messageSends: []}),
 smalltalk.HLOpenCommand.klass);
 
@@ -610,4 +908,15 @@ smalltalk.HLOpenWorkspaceCommand.klass);
 
 smalltalk.addClass('HLViewCommand', smalltalk.HLCommand, [], 'Helios-Commands');
 
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "View";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLViewCommand.klass)})},
+messageSends: []}),
+smalltalk.HLViewCommand.klass);
+
 

+ 525 - 101
js/Helios-Commands.js

@@ -1,9 +1,9 @@
 smalltalk.addPackage('Helios-Commands');
 smalltalk.addClass('HLCommand', smalltalk.Object, [], 'Helios-Commands');
 smalltalk.addMethod(
-"_asBinding",
+"_asActionBinding",
 smalltalk.method({
-selector: "asBinding",
+selector: "asActionBinding",
 category: 'converting',
 fn: function (){
 var self=this;
@@ -12,14 +12,55 @@ $1=_st(_st((smalltalk.HLBindingAction || HLBindingAction))._on_labelled_(_st(sel
 return smalltalk.withContext(function($ctx2) {
return _st(self)._execute();
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"asBinding",{}, smalltalk.HLCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"asActionBinding",{},smalltalk.HLCommand)})},
 args: [],
-source: "asBinding\x0a\x09^ (HLBindingAction on: self key labelled: self label)\x0a    \x09callback: [ self execute ]",
+source: "asActionBinding\x0a\x09^ (HLBindingAction on: self key labelled: self label)\x0a    \x09callback: [ self execute ]",
 messageSends: ["callback:", "execute", "on:labelled:", "key", "label"],
 referencedClasses: ["HLBindingAction"]
 }),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_asBinding",
+smalltalk.method({
+selector: "asBinding",
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(self)._isBindingGroup();
+if(smalltalk.assert($2)){
+$1=_st(self)._asGroupBinding();
+} else {
+$1=_st(self)._asActionBinding();
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"asBinding",{},smalltalk.HLCommand)})},
+args: [],
+source: "asBinding\x0a\x09^ self isBindingGroup\x0a\x09\x09ifTrue: [ self asGroupBinding ]\x0a\x09\x09ifFalse: [ self asActionBinding ]",
+messageSends: ["ifTrue:ifFalse:", "asGroupBinding", "asActionBinding", "isBindingGroup"],
+referencedClasses: []
+}),
+smalltalk.HLCommand);
+
+smalltalk.addMethod(
+"_asGroupBinding",
+smalltalk.method({
+selector: "asGroupBinding",
+category: 'converting',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st((smalltalk.HLBindingGroup || HLBindingGroup))._on_labelled_(_st(self)._key(),_st(self)._label());
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"asGroupBinding",{},smalltalk.HLCommand)})},
+args: [],
+source: "asGroupBinding\x0a\x09^ HLBindingGroup \x0a\x09\x09on: self key \x0a\x09\x09labelled: self label",
+messageSends: ["on:labelled:", "key", "label"],
+referencedClasses: ["HLBindingGroup"]
+}),
+smalltalk.HLCommand);
+
 smalltalk.addMethod(
 "_documentation",
 smalltalk.method({
@@ -53,6 +94,24 @@ referencedClasses: []
 }),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_isBindingGroup",
+smalltalk.method({
+selector: "isBindingGroup",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(_st(self)._class())._methodDictionary())._includesKey_("execute"))._not();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isBindingGroup",{},smalltalk.HLCommand)})},
+args: [],
+source: "isBindingGroup\x0a\x09^ (self class methodDictionary includesKey: 'execute') not",
+messageSends: ["not", "includesKey:", "methodDictionary", "class"],
+referencedClasses: []
+}),
+smalltalk.HLCommand);
+
 smalltalk.addMethod(
 "_key",
 smalltalk.method({
@@ -89,19 +148,41 @@ referencedClasses: []
 }),
 smalltalk.HLCommand);
 
+smalltalk.addMethod(
+"_registerOn_",
+smalltalk.method({
+selector: "registerOn:",
+category: 'registration',
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(aBinding)._add_(_st(self)._asBinding());
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:",{aBinding:aBinding},smalltalk.HLCommand)})},
+args: ["aBinding"],
+source: "registerOn: aBinding\x0a\x09^ aBinding add: self asBinding",
+messageSends: ["add:", "asBinding"],
+referencedClasses: []
+}),
+smalltalk.HLCommand);
+
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_concreteSubclasses",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "concreteSubclasses",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return nil;
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._subclasses())._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
return _st(each)._isConcrete();
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"concreteSubclasses",{},smalltalk.HLCommand.klass)})},
 args: [],
-source: "bindingGroup\x0a\x09^ nil",
-messageSends: [],
+source: "concreteSubclasses\x0a\x09^ self subclasses select: [ :each |\x0a\x09\x09each isConcrete ]",
+messageSends: ["select:", "isConcrete", "subclasses"],
 referencedClasses: []
 }),
 smalltalk.HLCommand.klass);
@@ -122,6 +203,24 @@ referencedClasses: []
 }),
 smalltalk.HLCommand.klass);
 
+smalltalk.addMethod(
+"_isConcrete",
+smalltalk.method({
+selector: "isConcrete",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._key())._notNil();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"isConcrete",{},smalltalk.HLCommand.klass)})},
+args: [],
+source: "isConcrete\x0a\x09^ self key notNil",
+messageSends: ["notNil", "key"],
+referencedClasses: []
+}),
+smalltalk.HLCommand.klass);
+
 smalltalk.addMethod(
 "_key",
 smalltalk.method({
@@ -154,8 +253,102 @@ referencedClasses: []
 }),
 smalltalk.HLCommand.klass);
 
+smalltalk.addMethod(
+"_registerConcreteClassesOn_",
+smalltalk.method({
+selector: "registerConcreteClassesOn:",
+category: 'registration',
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(_st(self)._concreteSubclasses())._do_((function(each){
+var binding;
+return smalltalk.withContext(function($ctx2) {
binding=_st(each)._registerOn_(aBinding);
+binding;
+$1=_st(binding)._isBindingGroup();
+if(smalltalk.assert($1)){
+return _st(each)._registerConcreteClassesOn_(binding);
+};
+}, function($ctx2) {$ctx2.fillBlock({each:each,binding:binding},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"registerConcreteClassesOn:",{aBinding:aBinding},smalltalk.HLCommand.klass)})},
+args: ["aBinding"],
+source: "registerConcreteClassesOn: aBinding\x0a\x09self concreteSubclasses do: [ :each | | binding |\x0a\x09\x09binding := each registerOn: aBinding.\x0a\x09\x09binding isBindingGroup ifTrue: [\x0a\x09\x09\x09each registerConcreteClassesOn: binding ] ]",
+messageSends: ["do:", "registerOn:", "ifTrue:", "registerConcreteClassesOn:", "isBindingGroup", "concreteSubclasses"],
+referencedClasses: []
+}),
+smalltalk.HLCommand.klass);
+
+smalltalk.addMethod(
+"_registerOn_",
+smalltalk.method({
+selector: "registerOn:",
+category: 'registration',
+fn: function (aBinding){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._new())._registerOn_(aBinding);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:",{aBinding:aBinding},smalltalk.HLCommand.klass)})},
+args: ["aBinding"],
+source: "registerOn: aBinding\x0a\x09^ self new registerOn: aBinding",
+messageSends: ["registerOn:", "new"],
+referencedClasses: []
+}),
+smalltalk.HLCommand.klass);
+
+
+smalltalk.addClass('HLCloseTabCommand', smalltalk.HLCommand, [], 'Helios-Commands');
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+category: 'executing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.HLManager || HLManager))._current())._removeActiveTab();
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLCloseTabCommand)})},
+args: [],
+source: "execute\x0a\x09HLManager current removeActiveTab",
+messageSends: ["removeActiveTab", "current"],
+referencedClasses: ["HLManager"]
+}),
+smalltalk.HLCloseTabCommand);
+
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (87);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLCloseTabCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 87",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLCloseTabCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Close tab";
+}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLCloseTabCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Close tab'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLCloseTabCommand.klass);
+
 
-smalltalk.addClass('HLBrowserCommand', smalltalk.HLCommand, ['model'], 'Helios-Commands');
+smalltalk.addClass('HLModelCommand', smalltalk.HLCommand, ['model'], 'Helios-Commands');
 smalltalk.addMethod(
 "_model",
 smalltalk.method({
@@ -166,35 +359,99 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
 $1=self["@model"];
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"model",{}, smalltalk.HLBrowserCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"model",{},smalltalk.HLModelCommand)})},
 args: [],
 source: "model\x0a\x09^ model",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLBrowserCommand);
+smalltalk.HLModelCommand);
 
 smalltalk.addMethod(
 "_model_",
 smalltalk.method({
 selector: "model:",
 category: 'accessing',
-fn: function (aBrowserModel){
+fn: function (aModel){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@model"]=aBrowserModel;
-return self}, function($ctx1) {$ctx1.fill(self,"model:",{aBrowserModel:aBrowserModel}, smalltalk.HLBrowserCommand)})},
-args: ["aBrowserModel"],
-source: "model: aBrowserModel\x0a\x09model := aBrowserModel",
+return smalltalk.withContext(function($ctx1) { 
self["@model"]=aModel;
+return self}, function($ctx1) {$ctx1.fill(self,"model:",{aModel:aModel},smalltalk.HLModelCommand)})},
+args: ["aModel"],
+source: "model: aModel\x0a\x09model := aModel",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLBrowserCommand);
+smalltalk.HLModelCommand);
+
+
+smalltalk.addMethod(
+"_for_",
+smalltalk.method({
+selector: "for:",
+category: 'instance creation',
+fn: function (aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(self)._new();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"for:",{aModel:aModel},smalltalk.HLModelCommand.klass)})},
+args: ["aModel"],
+source: "for: aModel\x0a\x09^ self new",
+messageSends: ["new"],
+referencedClasses: []
+}),
+smalltalk.HLModelCommand.klass);
 
+smalltalk.addMethod(
+"_registerConcreteClassesOn_for_",
+smalltalk.method({
+selector: "registerConcreteClassesOn:for:",
+category: 'registration',
+fn: function (aBinding,aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+_st(_st(self)._concreteSubclasses())._do_((function(each){
+var binding;
+return smalltalk.withContext(function($ctx2) {
binding=_st(each)._registerOn_for_(aBinding,aModel);
+binding;
+$1=_st(binding)._isBindingGroup();
+if(smalltalk.assert($1)){
+return _st(each)._registerConcreteClassesOn_for_(binding,aModel);
+};
+}, function($ctx2) {$ctx2.fillBlock({each:each,binding:binding},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"registerConcreteClassesOn:for:",{aBinding:aBinding,aModel:aModel},smalltalk.HLModelCommand.klass)})},
+args: ["aBinding", "aModel"],
+source: "registerConcreteClassesOn: aBinding for: aModel\x0a\x09self concreteSubclasses do: [ :each | | binding |\x0a\x09\x09binding := each registerOn: aBinding for: aModel.\x0a\x09\x09binding isBindingGroup ifTrue: [\x0a\x09\x09\x09each registerConcreteClassesOn: binding for: aModel ] ]",
+messageSends: ["do:", "registerOn:for:", "ifTrue:", "registerConcreteClassesOn:for:", "isBindingGroup", "concreteSubclasses"],
+referencedClasses: []
+}),
+smalltalk.HLModelCommand.klass);
 
 smalltalk.addMethod(
-"_on_",
+"_registerOn_for_",
 smalltalk.method({
-selector: "on:",
+selector: "registerOn:for:",
+category: 'registration',
+fn: function (aBinding,aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._for_(aModel))._registerOn_(aBinding);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"registerOn:for:",{aBinding:aBinding,aModel:aModel},smalltalk.HLModelCommand.klass)})},
+args: ["aBinding", "aModel"],
+source: "registerOn: aBinding for: aModel\x0a\x09^ (self for: aModel) registerOn: aBinding",
+messageSends: ["registerOn:", "for:"],
+referencedClasses: []
+}),
+smalltalk.HLModelCommand.klass);
+
+
+smalltalk.addClass('HLBrowserCommand', smalltalk.HLModelCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_for_",
+smalltalk.method({
+selector: "for:",
 category: 'instance creation',
 fn: function (aBrowserModel){
 var self=this;
@@ -204,9 +461,9 @@ _st($2)._model_(aBrowserModel);
 $3=_st($2)._yourself();
 $1=$3;
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"on:",{aBrowserModel:aBrowserModel}, smalltalk.HLBrowserCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"for:",{aBrowserModel:aBrowserModel},smalltalk.HLBrowserCommand.klass)})},
 args: ["aBrowserModel"],
-source: "on: aBrowserModel\x0a\x09^ self new\x0a    \x09model: aBrowserModel;\x0a        yourself",
+source: "for: aBrowserModel\x0a\x09^ self new\x0a    \x09model: aBrowserModel;\x0a        yourself",
 messageSends: ["model:", "new", "yourself"],
 referencedClasses: []
 }),
@@ -216,16 +473,32 @@ smalltalk.HLBrowserCommand.klass);
 smalltalk.addClass('HLGoToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (71);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 71",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLGoToCommand.klass);
+
+smalltalk.addMethod(
+"_label",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "label",
 category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Go to";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLGoToCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToCommand.klass)})},
 args: [],
-source: "bindingGroup\x0a\x09^ 'Go to'",
+source: "label\x0a\x09^ 'Go to'",
 messageSends: [],
 referencedClasses: []
 }),
@@ -241,7 +514,7 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnClasses();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToClassesCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToClassesCommand)})},
 args: [],
 source: "execute\x0a\x09self model focusOnClasses",
 messageSends: ["focusOnClasses", "model"],
@@ -258,7 +531,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (67);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToClassesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToClassesCommand.klass)})},
 args: [],
 source: "key\x0a\x09\x22c\x22\x0a    \x0a\x09^ 67",
 messageSends: [],
@@ -274,7 +547,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Classes";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToClassesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToClassesCommand.klass)})},
 args: [],
 source: "label\x0a\x09^ 'Classes'",
 messageSends: [],
@@ -292,7 +565,7 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnMethods();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToMethodsCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToMethodsCommand)})},
 args: [],
 source: "execute\x0a\x09self model focusOnMethods",
 messageSends: ["focusOnMethods", "model"],
@@ -309,7 +582,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (77);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToMethodsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToMethodsCommand.klass)})},
 args: [],
 source: "key\x0a\x09\x22m\x22\x0a    \x0a\x09^ 77",
 messageSends: [],
@@ -325,7 +598,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Methods";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToMethodsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToMethodsCommand.klass)})},
 args: [],
 source: "label\x0a\x09^ 'Methods'",
 messageSends: [],
@@ -343,7 +616,7 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnPackages();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToPackagesCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToPackagesCommand)})},
 args: [],
 source: "execute\x0a\x09self model focusOnPackages",
 messageSends: ["focusOnPackages", "model"],
@@ -360,7 +633,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (80);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToPackagesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToPackagesCommand.klass)})},
 args: [],
 source: "key\x0a\x09\x22p\x22\x0a    \x0a\x09^ 80",
 messageSends: [],
@@ -376,7 +649,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Packages";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToPackagesCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToPackagesCommand.klass)})},
 args: [],
 source: "label\x0a\x09^ 'Packages'",
 messageSends: [],
@@ -394,7 +667,7 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnProtocols();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToProtocolsCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToProtocolsCommand)})},
 args: [],
 source: "execute\x0a\x09self model focusOnProtocols",
 messageSends: ["focusOnProtocols", "model"],
@@ -411,7 +684,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (84);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToProtocolsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToProtocolsCommand.klass)})},
 args: [],
 source: "key\x0a\x09\x22p\x22\x0a    \x0a\x09^ 84",
 messageSends: [],
@@ -427,7 +700,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Protocols";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToProtocolsCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToProtocolsCommand.klass)})},
 args: [],
 source: "label\x0a\x09^ 'Protocols'",
 messageSends: [],
@@ -445,7 +718,7 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._focusOnSourceCode();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLGoToSourceCodeCommand)})},
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLGoToSourceCodeCommand)})},
 args: [],
 source: "execute\x0a\x09self model focusOnSourceCode",
 messageSends: ["focusOnSourceCode", "model"],
@@ -462,7 +735,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (83);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLGoToSourceCodeCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLGoToSourceCodeCommand.klass)})},
 args: [],
 source: "key\x0a\x09\x22s\x22\x0a    \x0a\x09^ 83",
 messageSends: [],
@@ -478,7 +751,7 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Source code";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLGoToSourceCodeCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLGoToSourceCodeCommand.klass)})},
 args: [],
 source: "label\x0a\x09^ 'Source code'",
 messageSends: [],
@@ -487,26 +760,77 @@ referencedClasses: []
 smalltalk.HLGoToSourceCodeCommand.klass);
 
 
-smalltalk.addClass('HLToggleCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLMoveToCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Toggle";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLToggleCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (77);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveToCommand.klass)})},
 args: [],
-source: "bindingGroup\x0a\x09^ 'Toggle'",
+source: "key\x0a\x09^ 77",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleCommand.klass);
+smalltalk.HLMoveToCommand.klass);
 
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Move";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveToCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Move'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLMoveToCommand.klass);
 
-smalltalk.addClass('HLToggleClassSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+
+smalltalk.addClass('HLMoveMethodToCommand', smalltalk.HLMoveToCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (77);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 77",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLMoveMethodToCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Method";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Method'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLMoveMethodToCommand.klass);
+
+
+smalltalk.addClass('HLMoveMethodToClassCommand', smalltalk.HLMoveMethodToCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
@@ -514,14 +838,13 @@ selector: "execute",
 category: 'executing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(false);
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLToggleClassSideCommand)})},
+return smalltalk.withContext(function($ctx1) { 
return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLMoveMethodToClassCommand)})},
 args: [],
-source: "execute\x0a\x09self model showInstance: false",
-messageSends: ["showInstance:", "model"],
+source: "execute",
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleClassSideCommand);
+smalltalk.HLMoveMethodToClassCommand);
 
 
 smalltalk.addMethod(
@@ -532,13 +855,13 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return (67);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLToggleClassSideCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToClassCommand.klass)})},
 args: [],
-source: "key\x0a\x09\x22c\x22\x0a    \x0a\x09^ 67",
+source: "key\x0a\x09^ 67",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleClassSideCommand.klass);
+smalltalk.HLMoveMethodToClassCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -547,17 +870,17 @@ selector: "label",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Class side";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLToggleClassSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "to class";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToClassCommand.klass)})},
 args: [],
-source: "label\x0a\x09^ 'Class side'",
+source: "label\x09\x0a\x09^ 'to class'",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleClassSideCommand.klass);
+smalltalk.HLMoveMethodToClassCommand.klass);
 
 
-smalltalk.addClass('HLToggleInstanceSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLMoveMethodToProtocolCommand', smalltalk.HLMoveMethodToCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
@@ -565,14 +888,13 @@ selector: "execute",
 category: 'executing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(true);
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLToggleInstanceSideCommand)})},
+return smalltalk.withContext(function($ctx1) { 
return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLMoveMethodToProtocolCommand)})},
 args: [],
-source: "execute\x0a\x09self model showInstance: true",
-messageSends: ["showInstance:", "model"],
+source: "execute",
+messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleInstanceSideCommand);
+smalltalk.HLMoveMethodToProtocolCommand);
 
 
 smalltalk.addMethod(
@@ -582,14 +904,14 @@ selector: "key",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return (73);
-}, function($ctx1) {$ctx1.fill(self,"key",{}, smalltalk.HLToggleInstanceSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (84);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLMoveMethodToProtocolCommand.klass)})},
 args: [],
-source: "key\x0a\x09\x22i\x22\x0a    \x0a\x09^ 73",
+source: "key\x0a\x09^ 84",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleInstanceSideCommand.klass);
+smalltalk.HLMoveMethodToProtocolCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -598,17 +920,52 @@ selector: "label",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Instance side";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLToggleInstanceSideCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "to protocol";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLMoveMethodToProtocolCommand.klass)})},
 args: [],
-source: "label\x0a\x09^ 'Instance side'",
+source: "label\x0a\x09^ 'to protocol'",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLToggleInstanceSideCommand.klass);
+smalltalk.HLMoveMethodToProtocolCommand.klass);
 
 
-smalltalk.addClass('HLCloseTabCommand', smalltalk.HLCommand, [], 'Helios-Commands');
+smalltalk.addClass('HLToggleCommand', smalltalk.HLBrowserCommand, [], 'Helios-Commands');
+
+smalltalk.addMethod(
+"_key",
+smalltalk.method({
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (84);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 84",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLToggleCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Toggle";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Toggle'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLToggleCommand.klass);
+
+
+smalltalk.addClass('HLToggleClassSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
 smalltalk.addMethod(
 "_execute",
 smalltalk.method({
@@ -616,31 +973,66 @@ selector: "execute",
 category: 'executing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(_st((smalltalk.HLManager || HLManager))._current())._removeActiveTab();
-return self}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLCloseTabCommand)})},
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(false);
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLToggleClassSideCommand)})},
 args: [],
-source: "execute\x0a\x09HLManager current removeActiveTab",
-messageSends: ["removeActiveTab", "current"],
-referencedClasses: ["HLManager"]
+source: "execute\x0a\x09self model showInstance: false",
+messageSends: ["showInstance:", "model"],
+referencedClasses: []
 }),
-smalltalk.HLCloseTabCommand);
+smalltalk.HLToggleClassSideCommand);
 
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Close";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (67);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleClassSideCommand.klass)})},
 args: [],
-source: "bindingGroup\x0a\x09^ 'Close'",
+source: "key\x0a\x09\x22c\x22\x0a    \x0a\x09^ 67",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleClassSideCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "Class side";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleClassSideCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'Class side'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLToggleClassSideCommand.klass);
+
+
+smalltalk.addClass('HLToggleInstanceSideCommand', smalltalk.HLToggleCommand, [], 'Helios-Commands');
+smalltalk.addMethod(
+"_execute",
+smalltalk.method({
+selector: "execute",
+category: 'executing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._model())._showInstance_(true);
+return self}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLToggleInstanceSideCommand)})},
+args: [],
+source: "execute\x0a\x09self model showInstance: true",
+messageSends: ["showInstance:", "model"],
+referencedClasses: []
+}),
+smalltalk.HLToggleInstanceSideCommand);
+
 
 smalltalk.addMethod(
 "_key",
@@ -649,14 +1041,14 @@ selector: "key",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return (87);
-}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return (73);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLToggleInstanceSideCommand.klass)})},
 args: [],
-source: "key\x0a\x09^ 87",
+source: "key\x0a\x09\x22i\x22\x0a    \x0a\x09^ 73",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleInstanceSideCommand.klass);
 
 smalltalk.addMethod(
 "_label",
@@ -665,29 +1057,45 @@ selector: "label",
 category: 'accessing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
return "Close tab";
-}, function($ctx1) {$ctx1.fill(self,"label",{}, smalltalk.HLCloseTabCommand.klass)})},
+return smalltalk.withContext(function($ctx1) { 
return "Instance side";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToggleInstanceSideCommand.klass)})},
 args: [],
-source: "label\x0a\x09^ 'Close tab'",
+source: "label\x0a\x09^ 'Instance side'",
 messageSends: [],
 referencedClasses: []
 }),
-smalltalk.HLCloseTabCommand.klass);
+smalltalk.HLToggleInstanceSideCommand.klass);
 
 
 smalltalk.addClass('HLOpenCommand', smalltalk.HLCommand, [], 'Helios-Commands');
 
 smalltalk.addMethod(
-"_bindingGroup",
+"_key",
 smalltalk.method({
-selector: "bindingGroup",
+selector: "key",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return (79);
+}, function($ctx1) {$ctx1.fill(self,"key",{},smalltalk.HLOpenCommand.klass)})},
+args: [],
+source: "key\x0a\x09^ 79",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLOpenCommand.klass);
+
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
 category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
return "Open";
-}, function($ctx1) {$ctx1.fill(self,"bindingGroup",{}, smalltalk.HLOpenCommand.klass)})},
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLOpenCommand.klass)})},
 args: [],
-source: "bindingGroup\x0a\x09^ 'Open'",
+source: "label\x0a\x09^ 'Open'",
 messageSends: [],
 referencedClasses: []
 }),
@@ -855,4 +1263,20 @@ smalltalk.HLOpenWorkspaceCommand.klass);
 
 smalltalk.addClass('HLViewCommand', smalltalk.HLCommand, [], 'Helios-Commands');
 
+smalltalk.addMethod(
+"_label",
+smalltalk.method({
+selector: "label",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return "View";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLViewCommand.klass)})},
+args: [],
+source: "label\x0a\x09^ 'View'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLViewCommand.klass);
+
 

+ 29 - 10
js/Helios-KeyBindings.deploy.js

@@ -353,6 +353,27 @@ return $1;
 messageSends: ["detect:ifNone:", "=", "label", "bindings"]}),
 smalltalk.HLBindingGroup);
 
+smalltalk.addMethod(
+"_at_add_",
+smalltalk.method({
+selector: "at:add:",
+fn: function (aString,aBinding){
+var self=this;
+var binding;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+binding=_st(self)._at_(aString);
+$1=binding;
+if(($receiver = $1) == nil || $receiver == undefined){
+$2=self;
+return $2;
+} else {
+$1;
+};
+_st(binding)._add_(aBinding);
+return self}, function($ctx1) {$ctx1.fill(self,"at:add:",{aString:aString,aBinding:aBinding,binding:binding},smalltalk.HLBindingGroup)})},
+messageSends: ["at:", "ifNil:", "add:"]}),
+smalltalk.HLBindingGroup);
+
 smalltalk.addMethod(
 "_atKey_",
 smalltalk.method({
@@ -522,14 +543,14 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $2,$1;
 $2=self["@bindings"];
 if(($receiver = $2) == nil || $receiver == undefined){
-self["@bindings"]=_st(self)._defaulBindings();
+self["@bindings"]=_st(self)._defaultBindings();
 $1=self["@bindings"];
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"bindings",{}, smalltalk.HLKeyBinder)})},
-messageSends: ["ifNil:", "defaulBindings"]}),
+}, function($ctx1) {$ctx1.fill(self,"bindings",{},smalltalk.HLKeyBinder)})},
+messageSends: ["ifNil:", "defaultBindings"]}),
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(
@@ -546,9 +567,9 @@ messageSends: ["hide", "helper"]}),
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(
-"_defaulBindings",
+"_defaultBindings",
 smalltalk.method({
-selector: "defaulBindings",
+selector: "defaultBindings",
 fn: function (){
 var self=this;
 var group;
@@ -559,13 +580,11 @@ _st($1)._addGroupKey_labelled_((86),"View");
 _st($1)._add_(_st(_st((smalltalk.HLCloseTabCommand || HLCloseTabCommand))._new())._asBinding());
 $2=_st($1)._yourself();
 group=$2;
-_st(_st((smalltalk.HLOpenCommand || HLOpenCommand))._allSubclasses())._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(group)._at_(_st(each)._bindingGroup()))._add_(_st(_st(each)._new())._asBinding());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+_st((smalltalk.HLOpenCommand || HLOpenCommand))._registerConcreteClassesOn_(_st(group)._at_("Open"));
 $3=group;
 return $3;
-}, function($ctx1) {$ctx1.fill(self,"defaulBindings",{group:group}, smalltalk.HLKeyBinder)})},
-messageSends: ["addGroupKey:labelled:", "new", "add:", "asBinding", "yourself", "do:", "at:", "bindingGroup", "allSubclasses"]}),
+}, function($ctx1) {$ctx1.fill(self,"defaultBindings",{group:group},smalltalk.HLKeyBinder)})},
+messageSends: ["addGroupKey:labelled:", "new", "add:", "asBinding", "yourself", "registerConcreteClassesOn:", "at:"]}),
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(

+ 37 - 13
js/Helios-KeyBindings.js

@@ -483,6 +483,32 @@ referencedClasses: []
 }),
 smalltalk.HLBindingGroup);
 
+smalltalk.addMethod(
+"_at_add_",
+smalltalk.method({
+selector: "at:add:",
+category: 'accessing',
+fn: function (aString,aBinding){
+var self=this;
+var binding;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+binding=_st(self)._at_(aString);
+$1=binding;
+if(($receiver = $1) == nil || $receiver == undefined){
+$2=self;
+return $2;
+} else {
+$1;
+};
+_st(binding)._add_(aBinding);
+return self}, function($ctx1) {$ctx1.fill(self,"at:add:",{aString:aString,aBinding:aBinding,binding:binding},smalltalk.HLBindingGroup)})},
+args: ["aString", "aBinding"],
+source: "at: aString add: aBinding\x0a\x09| binding |\x0a\x09\x0a\x09binding := self at: aString.\x0a\x09binding ifNil: [ ^ self ].\x0a\x09\x09\x0a\x09binding add: aBinding",
+messageSends: ["at:", "ifNil:", "add:"],
+referencedClasses: []
+}),
+smalltalk.HLBindingGroup);
+
 smalltalk.addMethod(
 "_atKey_",
 smalltalk.method({
@@ -713,16 +739,16 @@ var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $2,$1;
 $2=self["@bindings"];
 if(($receiver = $2) == nil || $receiver == undefined){
-self["@bindings"]=_st(self)._defaulBindings();
+self["@bindings"]=_st(self)._defaultBindings();
 $1=self["@bindings"];
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"bindings",{}, smalltalk.HLKeyBinder)})},
+}, function($ctx1) {$ctx1.fill(self,"bindings",{},smalltalk.HLKeyBinder)})},
 args: [],
-source: "bindings\x0a\x09^ bindings ifNil: [ bindings := self defaulBindings ]",
-messageSends: ["ifNil:", "defaulBindings"],
+source: "bindings\x0a\x09^ bindings ifNil: [ bindings := self defaultBindings ]",
+messageSends: ["ifNil:", "defaultBindings"],
 referencedClasses: []
 }),
 smalltalk.HLKeyBinder);
@@ -746,10 +772,10 @@ referencedClasses: []
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(
-"_defaulBindings",
+"_defaultBindings",
 smalltalk.method({
-selector: "defaulBindings",
-category: 'accessing',
+selector: "defaultBindings",
+category: 'defaults',
 fn: function (){
 var self=this;
 var group;
@@ -760,15 +786,13 @@ _st($1)._addGroupKey_labelled_((86),"View");
 _st($1)._add_(_st(_st((smalltalk.HLCloseTabCommand || HLCloseTabCommand))._new())._asBinding());
 $2=_st($1)._yourself();
 group=$2;
-_st(_st((smalltalk.HLOpenCommand || HLOpenCommand))._allSubclasses())._do_((function(each){
-return smalltalk.withContext(function($ctx2) {
return _st(_st(group)._at_(_st(each)._bindingGroup()))._add_(_st(_st(each)._new())._asBinding());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+_st((smalltalk.HLOpenCommand || HLOpenCommand))._registerConcreteClassesOn_(_st(group)._at_("Open"));
 $3=group;
 return $3;
-}, function($ctx1) {$ctx1.fill(self,"defaulBindings",{group:group}, smalltalk.HLKeyBinder)})},
+}, function($ctx1) {$ctx1.fill(self,"defaultBindings",{group:group},smalltalk.HLKeyBinder)})},
 args: [],
-source: "defaulBindings\x0a\x09| group |\x0a\x09\x0a\x09group := HLBindingGroup new\x0a\x09\x09addGroupKey: 79 labelled: 'Open';\x0a\x09\x09addGroupKey: 86 labelled: 'View';\x0a\x09\x09add: HLCloseTabCommand new asBinding;\x0a\x09\x09yourself.\x0a\x09\x09\x0a\x09HLOpenCommand allSubclasses do: [ :each | \x0a\x09\x09(group at: each bindingGroup) \x0a  \x09\x09\x09add: each new asBinding ].\x0a\x09\x09\x09\x09\x0a\x09^ group",
-messageSends: ["addGroupKey:labelled:", "new", "add:", "asBinding", "yourself", "do:", "at:", "bindingGroup", "allSubclasses"],
+source: "defaultBindings\x0a\x09| group |\x0a\x09\x0a\x09group := HLBindingGroup new\x0a\x09\x09addGroupKey: 79 labelled: 'Open';\x0a\x09\x09addGroupKey: 86 labelled: 'View';\x0a\x09\x09add: HLCloseTabCommand new asBinding;\x0a\x09\x09yourself.\x0a\x09\x09\x0a\x09HLOpenCommand registerConcreteClassesOn: (group at: 'Open').\x0a\x09\x09\x09\x09\x0a\x09^ group",
+messageSends: ["addGroupKey:labelled:", "new", "add:", "asBinding", "yourself", "registerConcreteClassesOn:", "at:"],
 referencedClasses: ["HLBindingGroup", "HLCloseTabCommand", "HLOpenCommand"]
 }),
 smalltalk.HLKeyBinder);

+ 20 - 6
st/Helios-Browser.st

@@ -31,15 +31,28 @@ initialize
 !HLBrowser methodsFor: 'keybindings'!
 
 registerBindingsOn: aBindingGroup
-	aBindingGroup 
+	HLBrowserCommand registerConcreteClassesOn: aBindingGroup for: self model
+	
+	"aBindingGroup 
     	addGroupKey: 66 labelled: 'Browse';
         addGroupKey: 71 labelled: 'Go to';
-        addGroupKey: 84 labelled: 'Toggle'.
+        addGroupKey: 84 labelled: 'Toggle';
+		addGroupKey: 77 labelled: 'Move'.
+			
+	(aBindingGroup at: 'Move')
+		addGroupKey: 77 labelled: 'Method';
+		addGroupKey: 67 labelled: 'Class';
+		addGroupKey: 80 labelled: 'Protocol'.
         
-   	HLBrowserCommand withAllSubclasses do: [ :each |
-   		each key ifNotNil: [
-  			(aBindingGroup at: each bindingGroup) 
-  				add: (each on: self model) asBinding ] ]
+	HLMoveMethodToCommand concreteClasses do: [ :each |
+  			(aBindingGroup at: 'Move') 
+				at: each bindingGroup 
+  				add: (each on: self model) asBinding ].
+			
+   	HLBrowserCommand concreteClasses do: [ :each |
+  			aBindingGroup 
+				at: each bindingGroup
+  				add: (each on: self model) asBinding ]"
 ! !
 
 !HLBrowser methodsFor: 'rendering'!
@@ -1029,6 +1042,7 @@ onClassSelected: aClass
 onMethodModified: aMethod
 
 	self model selectedClass = aMethod methodClass ifFalse: [ ^ self ].
+	self model selectedMethod ifNil: [ ^ self ].
     self model selectedMethod selector = aMethod selector ifFalse: [ ^ self ].
 
     self refresh

+ 180 - 33
st/Helios-Commands.st

@@ -19,9 +19,21 @@ label
 
 !HLCommand methodsFor: 'converting'!
 
-asBinding
+asActionBinding
 	^ (HLBindingAction on: self key labelled: self label)
     	callback: [ self execute ]
+!
+
+asBinding
+	^ self isBindingGroup
+		ifTrue: [ self asGroupBinding ]
+		ifFalse: [ self asActionBinding ]
+!
+
+asGroupBinding
+	^ HLBindingGroup 
+		on: self key 
+		labelled: self label
 ! !
 
 !HLCommand methodsFor: 'executing'!
@@ -29,10 +41,23 @@ asBinding
 execute
 ! !
 
+!HLCommand methodsFor: 'registration'!
+
+registerOn: aBinding
+	^ aBinding add: self asBinding
+! !
+
+!HLCommand methodsFor: 'testing'!
+
+isBindingGroup
+	^ (self class methodDictionary includesKey: 'execute') not
+! !
+
 !HLCommand class methodsFor: 'accessing'!
 
-bindingGroup
-	^ nil
+concreteSubclasses
+	^ self subclasses select: [ :each |
+		each isConcrete ]
 !
 
 documentation
@@ -47,23 +72,85 @@ label
 	^ ''
 ! !
 
-HLCommand subclass: #HLBrowserCommand
+!HLCommand class methodsFor: 'registration'!
+
+registerConcreteClassesOn: aBinding
+	self concreteSubclasses do: [ :each | | binding |
+		binding := each registerOn: aBinding.
+		binding isBindingGroup ifTrue: [
+			each registerConcreteClassesOn: binding ] ]
+!
+
+registerOn: aBinding
+	^ self new registerOn: aBinding
+! !
+
+!HLCommand class methodsFor: 'testing'!
+
+isConcrete
+	^ self key notNil
+! !
+
+HLCommand subclass: #HLCloseTabCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
+!HLCloseTabCommand methodsFor: 'executing'!
+
+execute
+	HLManager current removeActiveTab
+! !
+
+!HLCloseTabCommand class methodsFor: 'accessing'!
+
+key
+	^ 87
+!
+
+label
+	^ 'Close tab'
+! !
+
+HLCommand subclass: #HLModelCommand
  instanceVariableNames: 'model'
  package: 'Helios-Commands'!
 
-!HLBrowserCommand methodsFor: 'accessing'!
+!HLModelCommand methodsFor: 'accessing'!
 
 model
 	^ model
 !
 
-model: aBrowserModel
-	model := aBrowserModel
+model: aModel
+	model := aModel
+! !
+
+!HLModelCommand class methodsFor: 'instance creation'!
+
+for: aModel
+	^ self new
+! !
+
+!HLModelCommand class methodsFor: 'registration'!
+
+registerConcreteClassesOn: aBinding for: aModel
+	self concreteSubclasses do: [ :each | | binding |
+		binding := each registerOn: aBinding for: aModel.
+		binding isBindingGroup ifTrue: [
+			each registerConcreteClassesOn: binding for: aModel ] ]
+!
+
+registerOn: aBinding for: aModel
+	^ (self for: aModel) registerOn: aBinding
 ! !
 
+HLModelCommand subclass: #HLBrowserCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
 !HLBrowserCommand class methodsFor: 'instance creation'!
 
-on: aBrowserModel
+for: aBrowserModel
 	^ self new
     	model: aBrowserModel;
         yourself
@@ -75,7 +162,11 @@ HLBrowserCommand subclass: #HLGoToCommand
 
 !HLGoToCommand class methodsFor: 'accessing'!
 
-bindingGroup
+key
+	^ 71
+!
+
+label
 	^ 'Go to'
 ! !
 
@@ -189,13 +280,83 @@ label
 	^ 'Source code'
 ! !
 
+HLBrowserCommand subclass: #HLMoveToCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
+!HLMoveToCommand class methodsFor: 'accessing'!
+
+key
+	^ 77
+!
+
+label
+	^ 'Move'
+! !
+
+HLMoveToCommand subclass: #HLMoveMethodToCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
+!HLMoveMethodToCommand class methodsFor: 'accessing'!
+
+key
+	^ 77
+!
+
+label
+	^ 'Method'
+! !
+
+HLMoveMethodToCommand subclass: #HLMoveMethodToClassCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
+!HLMoveMethodToClassCommand methodsFor: 'executing'!
+
+execute
+! !
+
+!HLMoveMethodToClassCommand class methodsFor: 'accessing'!
+
+key
+	^ 67
+!
+
+label	
+	^ 'to class'
+! !
+
+HLMoveMethodToCommand subclass: #HLMoveMethodToProtocolCommand
+ instanceVariableNames: ''
+ package: 'Helios-Commands'!
+
+!HLMoveMethodToProtocolCommand methodsFor: 'executing'!
+
+execute
+! !
+
+!HLMoveMethodToProtocolCommand class methodsFor: 'accessing'!
+
+key
+	^ 84
+!
+
+label
+	^ 'to protocol'
+! !
+
 HLBrowserCommand subclass: #HLToggleCommand
  instanceVariableNames: ''
  package: 'Helios-Commands'!
 
 !HLToggleCommand class methodsFor: 'accessing'!
 
-bindingGroup
+key
+	^ 84
+!
+
+label
 	^ 'Toggle'
 ! !
 
@@ -243,37 +404,17 @@ label
 	^ 'Instance side'
 ! !
 
-HLCommand subclass: #HLCloseTabCommand
+HLCommand subclass: #HLOpenCommand
  instanceVariableNames: ''
  package: 'Helios-Commands'!
 
-!HLCloseTabCommand methodsFor: 'executing'!
-
-execute
-	HLManager current removeActiveTab
-! !
-
-!HLCloseTabCommand class methodsFor: 'accessing'!
-
-bindingGroup
-	^ 'Close'
-!
+!HLOpenCommand class methodsFor: 'accessing'!
 
 key
-	^ 87
+	^ 79
 !
 
 label
-	^ 'Close tab'
-! !
-
-HLCommand subclass: #HLOpenCommand
- instanceVariableNames: ''
- package: 'Helios-Commands'!
-
-!HLOpenCommand class methodsFor: 'accessing'!
-
-bindingGroup
 	^ 'Open'
 ! !
 
@@ -341,3 +482,9 @@ HLCommand subclass: #HLViewCommand
  instanceVariableNames: ''
  package: 'Helios-Commands'!
 
+!HLViewCommand class methodsFor: 'accessing'!
+
+label
+	^ 'View'
+! !
+

+ 26 - 17
st/Helios-KeyBindings.st

@@ -139,6 +139,15 @@ at: aString
       	ifNone: [ nil ]
 !
 
+at: aString add: aBinding
+	| binding |
+	
+	binding := self at: aString.
+	binding ifNil: [ ^ self ].
+		
+	binding add: aBinding
+!
+
 atKey: anInteger
 	^ self bindings 
     	detect: [ :each | each key = anInteger ]
@@ -194,23 +203,7 @@ activationKeyLabel
 !
 
 bindings
-	^ bindings ifNil: [ bindings := self defaulBindings ]
-!
-
-defaulBindings
-	| group |
-	
-	group := HLBindingGroup new
-		addGroupKey: 79 labelled: 'Open';
-		addGroupKey: 86 labelled: 'View';
-		add: HLCloseTabCommand new asBinding;
-		yourself.
-		
-	HLOpenCommand allSubclasses do: [ :each | 
-		(group at: each bindingGroup) 
-  			add: each new asBinding ].
-				
-	^ group
+	^ bindings ifNil: [ bindings := self defaultBindings ]
 !
 
 escapeKey
@@ -257,6 +250,22 @@ flushBindings
 	bindings := nil
 ! !
 
+!HLKeyBinder methodsFor: 'defaults'!
+
+defaultBindings
+	| group |
+	
+	group := HLBindingGroup new
+		addGroupKey: 79 labelled: 'Open';
+		addGroupKey: 86 labelled: 'View';
+		add: HLCloseTabCommand new asBinding;
+		yourself.
+		
+	HLOpenCommand registerConcreteClassesOn: (group at: 'Open').
+				
+	^ group
+! !
+
 !HLKeyBinder methodsFor: 'events'!
 
 handleActiveKeyDown: event