|  | @@ -1,5 +1,5 @@
 | 
	
		
			
				|  |  |  smalltalk.addPackage('Helios-KeyBindings');
 | 
	
		
			
				|  |  | -smalltalk.addClass('HLBinding', smalltalk.Object, ['key', 'label'], 'Helios-KeyBindings');
 | 
	
		
			
				|  |  | +smalltalk.addClass('HLBinding', smalltalk.Object, ['key', 'label', 'each'], 'Helios-KeyBindings');
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_applyOn_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -152,6 +152,37 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.HLBinding);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_renderBindingOn_actionOn_",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "renderBindingOn:actionOn:",
 | 
	
		
			
				|  |  | +category: 'rendering',
 | 
	
		
			
				|  |  | +fn: function (html,aBinder){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$5,$6,$2;
 | 
	
		
			
				|  |  | +$1=_st(html)._span();
 | 
	
		
			
				|  |  | +_st($1)._class_("command");
 | 
	
		
			
				|  |  | +$2=_st($1)._with_((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
$3=_st(html)._span();
 | 
	
		
			
				|  |  | +_st($3)._class_("label");
 | 
	
		
			
				|  |  | +$4=_st($3)._with_(_st(_st(self)._shortcut())._asLowercase());
 | 
	
		
			
				|  |  | +$4;
 | 
	
		
			
				|  |  | +$5=_st(html)._a();
 | 
	
		
			
				|  |  | +_st($5)._class_("action");
 | 
	
		
			
				|  |  | +_st($5)._with_(_st(self)._displayLabel());
 | 
	
		
			
				|  |  | +$6=_st($5)._onClick_((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx3) {
return _st(aBinder)._applyBinding_(self);
 | 
	
		
			
				|  |  | +}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  | +return $6;
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"renderBindingOn:actionOn:",{html:html,aBinder:aBinder},smalltalk.HLBinding)})},
 | 
	
		
			
				|  |  | +args: ["html", "aBinder"],
 | 
	
		
			
				|  |  | +source: "renderBindingOn: html actionOn: aBinder\x0a\x0a\x09html span class: 'command'; with: [\x0a\x09\x09html span \x0a\x09\x09\x09class: 'label'; \x0a\x09\x09\x09with: self shortcut asLowercase.\x0a  \x09\x09html a \x0a        \x09class: 'action'; \x0a            with: self displayLabel;\x0a  \x09\x09\x09onClick: [ aBinder applyBinding: self ] ]",
 | 
	
		
			
				|  |  | +messageSends: ["class:", "span", "with:", "asLowercase", "shortcut", "a", "displayLabel", "onClick:", "applyBinding:"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.HLBinding);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_renderOn_html_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -367,6 +398,75 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  smalltalk.HLBindingAction.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addClass('HLBindingInput', smalltalk.HLBindingAction, ['input'], 'Helios-KeyBindings');
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_applyOn_",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "applyOn:",
 | 
	
		
			
				|  |  | +category: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aBinder){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
var $1,$2;
 | 
	
		
			
				|  |  | +$1=_st(self)._isActive();
 | 
	
		
			
				|  |  | +if(! smalltalk.assert($1)){
 | 
	
		
			
				|  |  | +$2=self;
 | 
	
		
			
				|  |  | +return $2;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +_st(aBinder)._applyBindingInput_with_(self,_st(self)._input());
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"applyOn:",{aBinder:aBinder},smalltalk.HLBindingInput)})},
 | 
	
		
			
				|  |  | +args: ["aBinder"],
 | 
	
		
			
				|  |  | +source: "applyOn: aBinder\x0a\x09self isActive ifFalse: [ ^ self ].\x0a\x09\x0a\x09aBinder applyBindingInput: self with: self input",
 | 
	
		
			
				|  |  | +messageSends: ["ifFalse:", "isActive", "applyBindingInput:with:", "input"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.HLBindingInput);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_input",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "input",
 | 
	
		
			
				|  |  | +category: 'actions',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
var $1;
 | 
	
		
			
				|  |  | +$1=_st(_st(self["@input"])._asJQuery())._val();
 | 
	
		
			
				|  |  | +return $1;
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"input",{},smalltalk.HLBindingInput)})},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: "input\x0a\x09^ input asJQuery val",
 | 
	
		
			
				|  |  | +messageSends: ["val", "asJQuery"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.HLBindingInput);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_renderBindingOn_actionOn_",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "renderBindingOn:actionOn:",
 | 
	
		
			
				|  |  | +category: 'rendering',
 | 
	
		
			
				|  |  | +fn: function (html,aBinder){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
 | 
	
		
			
				|  |  | +$1=_st(html)._span();
 | 
	
		
			
				|  |  | +_st($1)._class_("command");
 | 
	
		
			
				|  |  | +$2=_st($1)._with_((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
$3=_st(html)._input();
 | 
	
		
			
				|  |  | +_st($3)._class_("search-query");
 | 
	
		
			
				|  |  | +$4=_st($3)._placeholder_(_st(self)._displayLabel());
 | 
	
		
			
				|  |  | +self["@input"]=$4;
 | 
	
		
			
				|  |  | +return self["@input"];
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  | +_st(_st(self["@input"])._asJQuery())._focus();
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"renderBindingOn:actionOn:",{html:html,aBinder:aBinder},smalltalk.HLBindingInput)})},
 | 
	
		
			
				|  |  | +args: ["html", "aBinder"],
 | 
	
		
			
				|  |  | +source: "renderBindingOn: html actionOn: aBinder\x0a\x0a\x09html span \x0a\x09\x09class: 'command'; \x0a\x09\x09with: [\x0a\x09\x09\x09\x22html form\x0a\x09\x09\x09\x09class: 'form-search';\x0a\x09\x09\x09\x09with: [\x0a\x09\x09\x09\x09\x09html div\x0a\x09\x09\x09\x09\x09  class: 'input-append';\x0a\x09\x09\x09\x09\x09  with: [\x0a\x09\x09\x09\x09\x09\x09html input\x0a\x09\x09\x09\x09\x09\x09\x09type: 'text';\x0a\x09\x09\x09\x09\x09\x09\x09class: 'search-query';\x0a\x09\x09\x09\x09\x09\x09\x09placeholder: self displayLabel.\x0a\x09\x09\x09\x09\x09\x09html button\x0a\x09\x09\x09\x09\x09\x09\x09type: 'submit';\x0a\x09\x09\x09\x09\x09\x09\x09class: 'btn';\x0a\x09\x09\x09\x09\x09\x09\x09with: 'Ok' ] ] ]\x0a\x09\x09\x22\x0a\x09\x09input := html input\x0a\x09\x09\x09class: 'search-query';\x0a\x09\x09\x09placeholder: self displayLabel ].\x0a\x09\x09input asJQuery focus",
 | 
	
		
			
				|  |  | +messageSends: ["class:", "span", "with:", "input", "placeholder:", "displayLabel", "focus", "asJQuery"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.HLBindingInput);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addClass('HLBindingGroup', smalltalk.HLBinding, ['bindings'], 'Helios-KeyBindings');
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_activeBindings",
 | 
	
	
		
			
				|  | @@ -751,6 +851,23 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.HLKeyBinder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_applyBindingInput_with_",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "applyBindingInput:with:",
 | 
	
		
			
				|  |  | +category: 'actions',
 | 
	
		
			
				|  |  | +fn: function (aBinding,value){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
_st(_st(aBinding)._callback())._value_(value);
 | 
	
		
			
				|  |  | +_st(self)._deactivate();
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"applyBindingInput:with:",{aBinding:aBinding,value:value},smalltalk.HLKeyBinder)})},
 | 
	
		
			
				|  |  | +args: ["aBinding", "value"],
 | 
	
		
			
				|  |  | +source: "applyBindingInput: aBinding with: value\x0a    aBinding callback value: value.\x0a\x09self deactivate",
 | 
	
		
			
				|  |  | +messageSends: ["value:", "callback", "deactivate"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.HLKeyBinder);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_bindings",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -1176,31 +1293,15 @@ selector: "renderBindingGroup:on:",
 | 
	
		
			
				|  |  |  category: 'rendering',
 | 
	
		
			
				|  |  |  fn: function (aBindingGroup,html){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$5,$6,$2;
 | 
	
		
			
				|  |  | -_st(_st(_st(aBindingGroup)._activeBindings())._sorted_((function(a,b){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
_st(_st(_st(aBindingGroup)._activeBindings())._sorted_((function(a,b){
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx2) {
return _st(_st(a)._key()).__lt(_st(b)._key());
 | 
	
		
			
				|  |  |  }, function($ctx2) {$ctx2.fillBlock({a:a,b:b},$ctx1)})})))._do_((function(each){
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx2) {
$1=_st(html)._span();
 | 
	
		
			
				|  |  | -_st($1)._class_("command");
 | 
	
		
			
				|  |  | -$2=_st($1)._with_((function(){
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx3) {
$3=_st(html)._span();
 | 
	
		
			
				|  |  | -_st($3)._class_("label");
 | 
	
		
			
				|  |  | -$4=_st($3)._with_(_st(_st(each)._shortcut())._asLowercase());
 | 
	
		
			
				|  |  | -$4;
 | 
	
		
			
				|  |  | -$5=_st(html)._a();
 | 
	
		
			
				|  |  | -_st($5)._class_("action");
 | 
	
		
			
				|  |  | -_st($5)._with_(_st(each)._displayLabel());
 | 
	
		
			
				|  |  | -$6=_st($5)._onClick_((function(){
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx4) {
return _st(_st(self)._keyBinder())._applyBinding_(each);
 | 
	
		
			
				|  |  | -}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  | -return $6;
 | 
	
		
			
				|  |  | -}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  | -return $2;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
return _st(each)._renderBindingOn_actionOn_(html,_st(self)._keyBinder());
 | 
	
		
			
				|  |  |  }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 | 
	
		
			
				|  |  |  return self}, function($ctx1) {$ctx1.fill(self,"renderBindingGroup:on:",{aBindingGroup:aBindingGroup,html:html},smalltalk.HLKeyBinderHelper)})},
 | 
	
		
			
				|  |  |  args: ["aBindingGroup", "html"],
 | 
	
		
			
				|  |  | -source: "renderBindingGroup: aBindingGroup on: html\x0a\x09(aBindingGroup activeBindings \x0a    \x09sorted: [ :a :b | a key < b key ])\x0a        do: [ :each |\x0a\x09\x09\x09html span class: 'command'; with: [\x0a\x09\x09\x09\x09html span class: 'label'; with: each shortcut asLowercase.\x0a  \x09\x09\x09\x09html a \x0a                \x09class: 'action'; \x0a                    with: each displayLabel;\x0a  \x09\x09\x09\x09\x09onClick: [ self keyBinder applyBinding: each ] ] ]",
 | 
	
		
			
				|  |  | -messageSends: ["do:", "class:", "span", "with:", "asLowercase", "shortcut", "a", "displayLabel", "onClick:", "applyBinding:", "keyBinder", "sorted:", "<", "key", "activeBindings"],
 | 
	
		
			
				|  |  | +source: "renderBindingGroup: aBindingGroup on: html\x0a\x09(aBindingGroup activeBindings \x0a    \x09sorted: [ :a :b | a key < b key ])\x0a        do: [ :each | each renderBindingOn: html actionOn: self keyBinder ]",
 | 
	
		
			
				|  |  | +messageSends: ["do:", "renderBindingOn:actionOn:", "keyBinder", "sorted:", "<", "key", "activeBindings"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.HLKeyBinderHelper);
 |