Browse Source

- helios: css improvements for the progress bars
- use the new progress collection enumaration in several places:
- package commit
- class recompilation

Nicolas Petton 11 năm trước cách đây
mục cha
commit
0d1c2be7d9

+ 11 - 0
css/helios.css

@@ -436,6 +436,9 @@ i {
     border-bottom: 1px solid #666;
     background-color: #e9eaf5;
     background-image: -webkit-linear-gradient(top, #e9eaf5, #bfc2d2);
+    background-image: -moz-linear-gradient(top, #e9eaf5, #bfc2d2);
+    background-image: -o-linear-gradient(top, #e9eaf5, #bfc2d2);
+    background-image: linear-gradient(top, #e9eaf5, #bfc2d2);
     color: #222;
     font-weight: bold;
     text-shadow: 0 0 0;
@@ -718,6 +721,14 @@ i {
     height: 200px;
 }
 
+.dialog .progress .bar {
+    background-color: #e9eaf5;
+    background-image: -webkit-linear-gradient(top, #B1BDD5, #8999b8);
+    background-image: -moz-linear-gradient(top, #B1BDD5, #8999b8);
+    background-image: -o-linear-gradient(top, #B1BDD5, #8999b8);
+    background-image: linear-gradient(top, #B1BDD5, #8999b8);
+ 
+}
 
 .confirmation span,
 .dialog span {

+ 3 - 4
js/Compiler-Core.deploy.js

@@ -416,17 +416,16 @@ fn: function (aClass){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-_st(_st(aClass)._methodDictionary())._do_((function(each){
+_st(_st(_st(aClass)._methodDictionary())._values())._do_displayingProgress_((function(each){
 return smalltalk.withContext(function($ctx2) {
-_st(console)._log_(_st(_st(_st(aClass)._name()).__comma(" >> ")).__comma(_st(each)._selector()));
 return _st(self)._install_forClass_category_(_st(each)._source(),aClass,_st(each)._category());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),_st("Recompiling ").__comma(_st(aClass)._name()));
 $1=_st(aClass)._isMetaclass();
 if(! smalltalk.assert($1)){
 _st(self)._recompile_(_st(aClass)._class());
 };
 return self}, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass},smalltalk.Compiler)})},
-messageSends: ["do:", "log:", ",", "selector", "name", "install:forClass:category:", "source", "category", "methodDictionary", "ifFalse:", "recompile:", "class", "isMetaclass"]}),
+messageSends: ["do:displayingProgress:", "install:forClass:category:", "source", "category", ",", "name", "values", "methodDictionary", "ifFalse:", "recompile:", "class", "isMetaclass"]}),
 smalltalk.Compiler);
 
 smalltalk.addMethod(

+ 4 - 5
js/Compiler-Core.js

@@ -555,19 +555,18 @@ fn: function (aClass){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-_st(_st(aClass)._methodDictionary())._do_((function(each){
+_st(_st(_st(aClass)._methodDictionary())._values())._do_displayingProgress_((function(each){
 return smalltalk.withContext(function($ctx2) {
-_st(console)._log_(_st(_st(_st(aClass)._name()).__comma(" >> ")).__comma(_st(each)._selector()));
 return _st(self)._install_forClass_category_(_st(each)._source(),aClass,_st(each)._category());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}),_st("Recompiling ").__comma(_st(aClass)._name()));
 $1=_st(aClass)._isMetaclass();
 if(! smalltalk.assert($1)){
 _st(self)._recompile_(_st(aClass)._class());
 };
 return self}, function($ctx1) {$ctx1.fill(self,"recompile:",{aClass:aClass},smalltalk.Compiler)})},
 args: ["aClass"],
-source: "recompile: aClass\x0a\x09aClass methodDictionary do: [:each |\x0a\x09\x09console log: aClass name, ' >> ', each selector.\x0a\x09\x09self install: each source forClass: aClass category: each category].\x0a\x09\x22self setupClass: aClass.\x22\x0a\x09aClass isMetaclass ifFalse: [self recompile: aClass class]",
-messageSends: ["do:", "log:", ",", "selector", "name", "install:forClass:category:", "source", "category", "methodDictionary", "ifFalse:", "recompile:", "class", "isMetaclass"],
+source: "recompile: aClass\x0a\x09aClass methodDictionary values\x0a\x09\x09do: [ :each | self install: each source forClass: aClass category: each category ]\x0a\x09\x09displayingProgress: 'Recompiling ', aClass name.\x0a\x09\x22self setupClass: aClass.\x22\x0a\x09aClass isMetaclass ifFalse: [ self recompile: aClass class ]",
+messageSends: ["do:displayingProgress:", "install:forClass:category:", "source", "category", ",", "name", "values", "methodDictionary", "ifFalse:", "recompile:", "class", "isMetaclass"],
 referencedClasses: []
 }),
 smalltalk.Compiler);

+ 1456 - 1221
js/Helios-Core.deploy.js

@@ -231,12 +231,9 @@ selector: "commitPackage",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._withHelperLabelled_do_(_st(_st("Committing package ").__comma(_st(_st(self)._selectedPackage())._name())).__comma("..."),(function(){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(self)._environment())._commitPackage_(_st(self)._selectedPackage());
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(_st(self)._environment())._commitPackage_(_st(self)._selectedPackage());
 return self}, function($ctx1) {$ctx1.fill(self,"commitPackage",{},smalltalk.HLToolModel)})},
-messageSends: ["withHelperLabelled:do:", ",", "name", "selectedPackage", "commitPackage:", "environment"]}),
+messageSends: ["commitPackage:", "selectedPackage", "environment"]}),
 smalltalk.HLToolModel);
 
 smalltalk.addMethod(
@@ -859,6 +856,27 @@ messageSends: ["environment:", "new", "yourself"]}),
 smalltalk.HLToolModel.klass);
 
 
+smalltalk.addClass('HLProgressHandler', smalltalk.ProgressHandler, [], 'Helios-Core');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "do:on:displaying:",
+fn: function (aBlock,aCollection,aString){
+var self=this;
+function $HLProgress(){return smalltalk.HLProgress||(typeof HLProgress=="undefined"?nil:HLProgress)}
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st($HLProgress())._new();
+_st($1)._label_(aString);
+_st($1)._workBlock_(aBlock);
+_st($1)._collection_(aCollection);
+_st($1)._appendToJQuery_(_st("body")._asJQuery());
+$2=_st($1)._start();
+return self}, function($ctx1) {$ctx1.fill(self,"do:on:displaying:",{aBlock:aBlock,aCollection:aCollection,aString:aString},smalltalk.HLProgressHandler)})},
+messageSends: ["label:", "new", "workBlock:", "collection:", "appendToJQuery:", "asJQuery", "start"]}),
+smalltalk.HLProgressHandler);
+
+
+
 smalltalk.addClass('HLTab', smalltalk.Widget, ['widget', 'label', 'root'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
@@ -1384,1838 +1402,2055 @@ messageSends: []}),
 smalltalk.HLWidget.klass);
 
 
-smalltalk.addClass('HLConfirmation', smalltalk.HLWidget, ['confirmationString', 'actionBlock', 'cancelBlock'], 'Helios-Core');
+smalltalk.addClass('HLFocusableWidget', smalltalk.HLWidget, [], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "actionBlock",
+selector: "blur",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@actionBlock"];
-if(($receiver = $2) == nil || $receiver == undefined){
-$1=(function(){
-return smalltalk.withContext(function($ctx2) {
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"actionBlock",{},smalltalk.HLConfirmation)})},
-messageSends: ["ifNil:"]}),
-smalltalk.HLConfirmation);
+_st(_st(_st(self)._wrapper())._asJQuery())._blur();
+return self}, function($ctx1) {$ctx1.fill(self,"blur",{},smalltalk.HLFocusableWidget)})},
+messageSends: ["blur", "asJQuery", "wrapper"]}),
+smalltalk.HLFocusableWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "actionBlock:",
-fn: function (aBlock){
+selector: "canHaveFocus",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@actionBlock"]=aBlock;
-return self}, function($ctx1) {$ctx1.fill(self,"actionBlock:",{aBlock:aBlock},smalltalk.HLConfirmation)})},
+return true;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLFocusableWidget)})},
 messageSends: []}),
-smalltalk.HLConfirmation);
+smalltalk.HLFocusableWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cancel",
+selector: "focus",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._cancelBlock())._value();
-_st(self)._remove();
-return self}, function($ctx1) {$ctx1.fill(self,"cancel",{},smalltalk.HLConfirmation)})},
-messageSends: ["value", "cancelBlock", "remove"]}),
-smalltalk.HLConfirmation);
+_st(_st(_st(self)._wrapper())._asJQuery())._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLFocusableWidget)})},
+messageSends: ["focus", "asJQuery", "wrapper"]}),
+smalltalk.HLFocusableWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cancelBlock",
+selector: "focusClass",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@cancelBlock"];
-if(($receiver = $2) == nil || $receiver == undefined){
-$1=(function(){
+return "focused";
+}, function($ctx1) {$ctx1.fill(self,"focusClass",{},smalltalk.HLFocusableWidget)})},
+messageSends: []}),
+smalltalk.HLFocusableWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "hasFocus",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(_st(self)._wrapper())._notNil())._and_((function(){
 return smalltalk.withContext(function($ctx2) {
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
-} else {
-$1=$2;
-};
+return _st(_st(_st(self)._wrapper())._asJQuery())._is_(":focus");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"cancelBlock",{},smalltalk.HLConfirmation)})},
-messageSends: ["ifNil:"]}),
-smalltalk.HLConfirmation);
+}, function($ctx1) {$ctx1.fill(self,"hasFocus",{},smalltalk.HLFocusableWidget)})},
+messageSends: ["and:", "is:", "asJQuery", "wrapper", "notNil"]}),
+smalltalk.HLFocusableWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cancelBlock:",
-fn: function (aBlock){
+selector: "renderContentOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@cancelBlock"]=aBlock;
-return self}, function($ctx1) {$ctx1.fill(self,"cancelBlock:",{aBlock:aBlock},smalltalk.HLConfirmation)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLFocusableWidget)})},
 messageSends: []}),
-smalltalk.HLConfirmation);
+smalltalk.HLFocusableWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirm",
-fn: function (){
+selector: "renderOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._actionBlock())._value();
-_st(self)._remove();
-return self}, function($ctx1) {$ctx1.fill(self,"confirm",{},smalltalk.HLConfirmation)})},
-messageSends: ["value", "actionBlock", "remove"]}),
-smalltalk.HLConfirmation);
+var $1,$2,$3,$4;
+$1=_st(html)._div();
+_st($1)._class_("hl_widget");
+$2=_st($1)._yourself();
+self["@wrapper"]=$2;
+_st(self["@wrapper"])._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._renderContentOn_(html);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+$3=self["@wrapper"];
+_st($3)._at_put_("tabindex","0");
+_st($3)._onBlur_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(_st(self)._wrapper())._asJQuery())._removeClass_(_st(self)._focusClass());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+$4=_st($3)._onFocus_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(_st(self)._wrapper())._asJQuery())._addClass_(_st(self)._focusClass());
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderOn:",{html:html},smalltalk.HLFocusableWidget)})},
+messageSends: ["class:", "div", "yourself", "with:", "renderContentOn:", "at:put:", "onBlur:", "removeClass:", "focusClass", "asJQuery", "wrapper", "onFocus:", "addClass:"]}),
+smalltalk.HLFocusableWidget);
+
+
 
+smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem', 'mapping'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirmationString",
+selector: "activateFirstListItem",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@confirmationString"];
-if(($receiver = $2) == nil || $receiver == undefined){
-$1="Confirm";
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"confirmationString",{},smalltalk.HLConfirmation)})},
-messageSends: ["ifNil:"]}),
-smalltalk.HLConfirmation);
+_st(self)._activateListItem_(_st(window)._jQuery_(_st(_st(_st(self["@wrapper"])._asJQuery())._find_("li.inactive"))._get_((0))));
+return self}, function($ctx1) {$ctx1.fill(self,"activateFirstListItem",{},smalltalk.HLListWidget)})},
+messageSends: ["activateListItem:", "jQuery:", "get:", "find:", "asJQuery"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirmationString:",
-fn: function (aString){
+selector: "activateItem:",
+fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@confirmationString"]=aString;
-return self}, function($ctx1) {$ctx1.fill(self,"confirmationString:",{aString:aString},smalltalk.HLConfirmation)})},
-messageSends: []}),
-smalltalk.HLConfirmation);
+var $1;
+var $early={};
+try {
+_st(self)._activateListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+return smalltalk.withContext(function($ctx2) {
+$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"activateItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: ["activateListItem:", "asJQuery", "at:ifAbsent:"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cssClass",
-fn: function (){
+selector: "activateListItem:",
+fn: function (aListItem){
 var self=this;
+var item;
 return smalltalk.withContext(function($ctx1) { 
-return "";
-}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLConfirmation)})},
-messageSends: []}),
-smalltalk.HLConfirmation);
+var $1,$2,$3;
+$1=_st(aListItem)._get_((0));
+if(($receiver = $1) == nil || $receiver == undefined){
+$2=self;
+return $2;
+} else {
+$1;
+};
+_st(_st(_st(aListItem)._parent())._children())._removeClass_("active");
+_st(aListItem)._addClass_("active");
+_st(self)._ensureVisible_(aListItem);
+item=_st(_st(self)._items())._at_(_st(_st(aListItem)._attr_("list-data"))._asNumber());
+$3=_st(_st(self)._selectedItem()).__eq_eq(item);
+if(! smalltalk.assert($3)){
+_st(self)._selectItem_(item);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"activateListItem:",{aListItem:aListItem,item:item},smalltalk.HLListWidget)})},
+messageSends: ["ifNil:", "get:", "removeClass:", "children", "parent", "addClass:", "ensureVisible:", "at:", "asNumber", "attr:", "items", "ifFalse:", "selectItem:", "==", "selectedItem"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "remove",
+selector: "activateNextListItem",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(window)._jQuery_(".dialog"))._removeClass_("active");
-_st((function(){
+_st(self)._activateListItem_(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_("li.active"))._next());
+_st(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_(" .active"))._get())._ifEmpty_((function(){
 return smalltalk.withContext(function($ctx2) {
-_st(_st(window)._jQuery_("#overlay"))._remove();
-return _st(_st(window)._jQuery_(".dialog"))._remove();
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
-return self}, function($ctx1) {$ctx1.fill(self,"remove",{},smalltalk.HLConfirmation)})},
-messageSends: ["removeClass:", "jQuery:", "valueWithTimeout:", "remove"]}),
-smalltalk.HLConfirmation);
+return _st(self)._activateFirstListItem();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"activateNextListItem",{},smalltalk.HLListWidget)})},
+messageSends: ["activateListItem:", "next", "find:", "asJQuery", "wrapper", "ifEmpty:", "activateFirstListItem", "get"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderButtonsOn:",
-fn: function (html){
+selector: "activatePreviousListItem",
+fn: function (){
 var self=this;
-var confirmButton;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$5,$6,$2;
-$1=_st(html)._div();
-_st($1)._class_("buttons");
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-$3=_st(html)._button();
-_st($3)._class_("button");
-_st($3)._with_("Cancel");
-$4=_st($3)._onClick_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(self)._cancel();
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-$4;
-$5=_st(html)._button();
-_st($5)._class_("button default");
-_st($5)._with_("Confirm");
-$6=_st($5)._onClick_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(self)._confirm();
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-confirmButton=$6;
-return confirmButton;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-_st(_st(confirmButton)._asJQuery())._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html,confirmButton:confirmButton},smalltalk.HLConfirmation)})},
-messageSends: ["class:", "div", "with:", "button", "onClick:", "cancel", "confirm", "focus", "asJQuery"]}),
-smalltalk.HLConfirmation);
+_st(self)._activateListItem_(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_("li.active"))._prev());
+return self}, function($ctx1) {$ctx1.fill(self,"activatePreviousListItem",{},smalltalk.HLListWidget)})},
+messageSends: ["activateListItem:", "prev", "find:", "asJQuery", "wrapper"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderContentOn:",
-fn: function (html){
+selector: "cssClassForItem:",
+fn: function (anObject){
 var self=this;
-var confirmButton;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$2;
-_st(_st(html)._div())._id_("overlay");
-$1=_st(html)._div();
-_st($1)._class_(_st("dialog ").__comma(_st(self)._cssClass()));
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-$3=self;
-_st($3)._renderMainOn_(html);
-$4=_st($3)._renderButtonsOn_(html);
-return $4;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-_st(_st(window)._jQuery_(".dialog"))._addClass_("active");
-_st(self)._setupKeyBindings();
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html,confirmButton:confirmButton},smalltalk.HLConfirmation)})},
-messageSends: ["id:", "div", "class:", ",", "cssClass", "with:", "renderMainOn:", "renderButtonsOn:", "addClass:", "jQuery:", "setupKeyBindings"]}),
-smalltalk.HLConfirmation);
+return "";
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: []}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderMainOn:",
-fn: function (html){
+selector: "defaultItems",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(html)._span())._with_(_st(self)._confirmationString());
-return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLConfirmation)})},
-messageSends: ["with:", "confirmationString", "span"]}),
-smalltalk.HLConfirmation);
+var $1;
+$1=[];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"defaultItems",{},smalltalk.HLListWidget)})},
+messageSends: []}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "setupKeyBindings",
-fn: function (){
+selector: "ensureVisible:",
+fn: function (aListItem){
 var self=this;
+var perent,position;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-_st(_st(window)._jQuery_(".dialog"))._keyup_((function(e){
-return smalltalk.withContext(function($ctx2) {
-$1=_st(_st(e)._keyCode()).__eq((27));
+var $1,$2;
+position=_st(self)._positionOf_(aListItem);
+parent=_st(aListItem)._parent();
+$1=_st(_st(_st(aListItem)._position())._top()).__lt((0));
 if(smalltalk.assert($1)){
-return _st(self)._cancel();
+_st(_st(parent)._get_((0)))._scrollTop_(_st(_st(_st(_st(parent)._get_((0)))._scrollTop()).__plus(_st(_st(aListItem)._position())._top())).__minus((10)));
 };
-}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{},smalltalk.HLConfirmation)})},
-messageSends: ["keyup:", "ifTrue:", "cancel", "=", "keyCode", "jQuery:"]}),
-smalltalk.HLConfirmation);
-
-
+$2=_st(_st(_st(_st(aListItem)._position())._top()).__plus(_st(aListItem)._height())).__gt(_st(parent)._height());
+if(smalltalk.assert($2)){
+_st(_st(parent)._get_((0)))._scrollTop_(_st(_st(_st(_st(_st(parent)._get_((0)))._scrollTop()).__plus(_st(aListItem)._height())).__minus(_st(_st(parent)._height()).__minus(_st(_st(aListItem)._position())._top()))).__plus((10)));
+};
+return self}, function($ctx1) {$ctx1.fill(self,"ensureVisible:",{aListItem:aListItem,perent:perent,position:position},smalltalk.HLListWidget)})},
+messageSends: ["positionOf:", "parent", "ifTrue:", "scrollTop:", "-", "+", "top", "position", "scrollTop", "get:", "<", "height", ">"]}),
+smalltalk.HLListWidget);
 
-smalltalk.addClass('HLRequest', smalltalk.HLConfirmation, ['input', 'value'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirm",
+selector: "focus",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._actionBlock())._value_(_st(_st(self["@input"])._asJQuery())._val());
-_st(self)._remove();
-return self}, function($ctx1) {$ctx1.fill(self,"confirm",{},smalltalk.HLRequest)})},
-messageSends: ["value:", "val", "asJQuery", "actionBlock", "remove"]}),
-smalltalk.HLRequest);
+var $1,$2;
+smalltalk.HLFocusableWidget.fn.prototype._focus.apply(_st(self), []);
+$1=_st(_st(self)._items())._isEmpty();
+if(! smalltalk.assert($1)){
+$2=_st(self)._selectedItem();
+if(($receiver = $2) == nil || $receiver == undefined){
+_st(self)._activateFirstListItem();
+} else {
+$2;
+};
+};
+return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLListWidget)})},
+messageSends: ["focus", "ifFalse:", "ifNil:", "activateFirstListItem", "selectedItem", "isEmpty", "items"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cssClass",
+selector: "initialize",
 fn: function (){
 var self=this;
+function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-return "large";
-}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLRequest)})},
-messageSends: []}),
-smalltalk.HLRequest);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "renderMainOn:",
-fn: function (html){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-smalltalk.HLConfirmation.fn.prototype._renderMainOn_.apply(_st(self), [html]);
-self["@input"]=_st(html)._textarea();
-_st(_st(self["@input"])._asJQuery())._val_(_st(self)._value());
-return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLRequest)})},
-messageSends: ["renderMainOn:", "textarea", "val:", "value", "asJQuery"]}),
-smalltalk.HLRequest);
+smalltalk.HLFocusableWidget.fn.prototype._initialize.apply(_st(self), []);
+self["@mapping"]=_st($Dictionary())._new();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLListWidget)})},
+messageSends: ["initialize", "new"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "value",
+selector: "items",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-$2=self["@value"];
+$2=self["@items"];
 if(($receiver = $2) == nil || $receiver == undefined){
-$1="";
+self["@items"]=_st(self)._defaultItems();
+$1=self["@items"];
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"value",{},smalltalk.HLRequest)})},
-messageSends: ["ifNil:"]}),
-smalltalk.HLRequest);
+}, function($ctx1) {$ctx1.fill(self,"items",{},smalltalk.HLListWidget)})},
+messageSends: ["ifNil:", "defaultItems"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "value:",
-fn: function (aString){
+selector: "items:",
+fn: function (aCollection){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@value"]=aString;
-return self}, function($ctx1) {$ctx1.fill(self,"value:",{aString:aString},smalltalk.HLRequest)})},
+self["@items"]=aCollection;
+return self}, function($ctx1) {$ctx1.fill(self,"items:",{aCollection:aCollection},smalltalk.HLListWidget)})},
 messageSends: []}),
-smalltalk.HLRequest);
-
-
+smalltalk.HLListWidget);
 
-smalltalk.addClass('HLFocusableWidget', smalltalk.HLWidget, [], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "blur",
-fn: function (){
+selector: "listCssClassForItem:",
+fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(_st(self)._wrapper())._asJQuery())._blur();
-return self}, function($ctx1) {$ctx1.fill(self,"blur",{},smalltalk.HLFocusableWidget)})},
-messageSends: ["blur", "asJQuery", "wrapper"]}),
-smalltalk.HLFocusableWidget);
+var $2,$1;
+$2=_st(_st(self)._selectedItem()).__eq(anObject);
+if(smalltalk.assert($2)){
+$1="active";
+} else {
+$1="inactive";
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "canHaveFocus",
-fn: function (){
+selector: "positionOf:",
+fn: function (aListItem){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return true;
-}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLFocusableWidget)})},
-messageSends: []}),
-smalltalk.HLFocusableWidget);
 
-smalltalk.addMethod(
-smalltalk.method({
-selector: "focus",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-_st(_st(_st(self)._wrapper())._asJQuery())._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLFocusableWidget)})},
-messageSends: ["focus", "asJQuery", "wrapper"]}),
-smalltalk.HLFocusableWidget);
+    	return aListItem.parent().children().get().indexOf(aListItem.get(0)) + 1
+	;
+return self}, function($ctx1) {$ctx1.fill(self,"positionOf:",{aListItem:aListItem},smalltalk.HLListWidget)})},
+messageSends: []}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "focusClass",
+selector: "refresh",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return "focused";
-}, function($ctx1) {$ctx1.fill(self,"focusClass",{},smalltalk.HLFocusableWidget)})},
-messageSends: []}),
-smalltalk.HLFocusableWidget);
+var $1;
+var $early={};
+try {
+smalltalk.HLFocusableWidget.fn.prototype._refresh.apply(_st(self), []);
+_st(self)._ensureVisible_(_st(_st(self["@mapping"])._at_ifAbsent_(_st(self)._selectedItem(),(function(){
+return smalltalk.withContext(function($ctx2) {
+$1=self;
+throw $early=[$1];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
+return self}
+catch(e) {if(e===$early)return e[0]; throw e}
+}, function($ctx1) {$ctx1.fill(self,"refresh",{},smalltalk.HLListWidget)})},
+messageSends: ["refresh", "ensureVisible:", "asJQuery", "at:ifAbsent:", "selectedItem"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "hasFocus",
-fn: function (){
+selector: "registerMappingFrom:to:",
+fn: function (anObject,aTag){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(_st(_st(self)._wrapper())._notNil())._and_((function(){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(self)._wrapper())._asJQuery())._is_(":focus");
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"hasFocus",{},smalltalk.HLFocusableWidget)})},
-messageSends: ["and:", "is:", "asJQuery", "wrapper", "notNil"]}),
-smalltalk.HLFocusableWidget);
+_st(self["@mapping"])._at_put_(anObject,aTag);
+return self}, function($ctx1) {$ctx1.fill(self,"registerMappingFrom:to:",{anObject:anObject,aTag:aTag},smalltalk.HLListWidget)})},
+messageSends: ["at:put:"]}),
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderContentOn:",
+selector: "renderButtonsOn:",
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLFocusableWidget)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},smalltalk.HLListWidget)})},
 messageSends: []}),
-smalltalk.HLFocusableWidget);
+smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderOn:",
+selector: "renderContentOn:",
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2,$3,$4;
-$1=_st(html)._div();
-_st($1)._class_("hl_widget");
-$2=_st($1)._yourself();
-self["@wrapper"]=$2;
-_st(self["@wrapper"])._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-return _st(self)._renderContentOn_(html);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-$3=self["@wrapper"];
-_st($3)._at_put_("tabindex","0");
-_st($3)._onBlur_((function(){
+$1=_st(html)._ul();
+_st($1)._class_("nav nav-pills nav-stacked");
+$2=_st($1)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(self)._wrapper())._asJQuery())._removeClass_(_st(self)._focusClass());
+return _st(self)._renderListOn_(html);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-$4=_st($3)._onFocus_((function(){
+$3=_st(html)._div();
+_st($3)._class_("pane_actions form-actions");
+$4=_st($3)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(self)._wrapper())._asJQuery())._addClass_(_st(self)._focusClass());
+return _st(self)._renderButtonsOn_(html);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderOn:",{html:html},smalltalk.HLFocusableWidget)})},
-messageSends: ["class:", "div", "yourself", "with:", "renderContentOn:", "at:put:", "onBlur:", "removeClass:", "focusClass", "asJQuery", "wrapper", "onFocus:", "addClass:"]}),
-smalltalk.HLFocusableWidget);
-
-
+_st(self)._setupKeyBindings();
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLListWidget)})},
+messageSends: ["class:", "ul", "with:", "renderListOn:", "div", "renderButtonsOn:", "setupKeyBindings"]}),
+smalltalk.HLListWidget);
 
-smalltalk.addClass('HLListWidget', smalltalk.HLFocusableWidget, ['items', 'selectedItem', 'mapping'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activateFirstListItem",
-fn: function (){
+selector: "renderItem:on:",
+fn: function (anObject,html){
 var self=this;
+var li;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._activateListItem_(_st(window)._jQuery_(_st(_st(_st(self["@wrapper"])._asJQuery())._find_("li.inactive"))._get_((0))));
-return self}, function($ctx1) {$ctx1.fill(self,"activateFirstListItem",{},smalltalk.HLListWidget)})},
-messageSends: ["activateListItem:", "jQuery:", "get:", "find:", "asJQuery"]}),
-smalltalk.HLListWidget);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "activateItem:",
-fn: function (anObject){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $1;
-var $early={};
-try {
-_st(self)._activateListItem_(_st(_st(self["@mapping"])._at_ifAbsent_(anObject,(function(){
+var $1,$3,$4,$2;
+li=_st(html)._li();
+_st(self)._registerMappingFrom_to_(anObject,li);
+$1=li;
+_st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
+_st($1)._class_(_st(self)._listCssClassForItem_(anObject));
+$2=_st($1)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
-$1=self;
-throw $early=[$1];
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
-return self}
-catch(e) {if(e===$early)return e[0]; throw e}
-}, function($ctx1) {$ctx1.fill(self,"activateItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: ["activateListItem:", "asJQuery", "at:ifAbsent:"]}),
+$3=_st(html)._a();
+_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
+_st(_st(html)._tag_("i"))._class_(_st(self)._cssClassForItem_(anObject));
+return _st(self)._renderItemLabel_on_(anObject,html);
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+$4=_st($3)._onClick_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self)._activateListItem_(_st(li)._asJQuery());
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+return $4;
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},smalltalk.HLListWidget)})},
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "asString", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activateListItem:",
-fn: function (aListItem){
+selector: "renderItemLabel:on:",
+fn: function (anObject,html){
 var self=this;
-var item;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3;
-$1=_st(aListItem)._get_((0));
-if(($receiver = $1) == nil || $receiver == undefined){
-$2=self;
-return $2;
-} else {
-$1;
-};
-_st(_st(_st(aListItem)._parent())._children())._removeClass_("active");
-_st(aListItem)._addClass_("active");
-_st(self)._ensureVisible_(aListItem);
-item=_st(_st(self)._items())._at_(_st(_st(aListItem)._attr_("list-data"))._asNumber());
-$3=_st(_st(self)._selectedItem()).__eq_eq(item);
-if(! smalltalk.assert($3)){
-_st(self)._selectItem_(item);
-};
-return self}, function($ctx1) {$ctx1.fill(self,"activateListItem:",{aListItem:aListItem,item:item},smalltalk.HLListWidget)})},
-messageSends: ["ifNil:", "get:", "removeClass:", "children", "parent", "addClass:", "ensureVisible:", "at:", "asNumber", "attr:", "items", "ifFalse:", "selectItem:", "==", "selectedItem"]}),
+_st(html)._with_(_st(anObject)._asString());
+return self}, function($ctx1) {$ctx1.fill(self,"renderItemLabel:on:",{anObject:anObject,html:html},smalltalk.HLListWidget)})},
+messageSends: ["with:", "asString"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activateNextListItem",
-fn: function (){
+selector: "renderListOn:",
+fn: function (html){
 var self=this;
+function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._activateListItem_(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_("li.active"))._next());
-_st(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_(" .active"))._get())._ifEmpty_((function(){
+self["@mapping"]=_st($Dictionary())._new();
+_st(_st(self)._items())._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
-return _st(self)._activateFirstListItem();
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"activateNextListItem",{},smalltalk.HLListWidget)})},
-messageSends: ["activateListItem:", "next", "find:", "asJQuery", "wrapper", "ifEmpty:", "activateFirstListItem", "get"]}),
-smalltalk.HLListWidget);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "activatePreviousListItem",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-_st(self)._activateListItem_(_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_("li.active"))._prev());
-return self}, function($ctx1) {$ctx1.fill(self,"activatePreviousListItem",{},smalltalk.HLListWidget)})},
-messageSends: ["activateListItem:", "prev", "find:", "asJQuery", "wrapper"]}),
+return _st(self)._renderItem_on_(each,html);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html},smalltalk.HLListWidget)})},
+messageSends: ["new", "do:", "renderItem:on:", "items"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "cssClassForItem:",
+selector: "selectItem:",
 fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return "";
-}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: []}),
+_st(self)._selectedItem_(anObject);
+return self}, function($ctx1) {$ctx1.fill(self,"selectItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: ["selectedItem:"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "defaultItems",
+selector: "selectedItem",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=[];
+$1=self["@selectedItem"];
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"defaultItems",{},smalltalk.HLListWidget)})},
+}, function($ctx1) {$ctx1.fill(self,"selectedItem",{},smalltalk.HLListWidget)})},
 messageSends: []}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "ensureVisible:",
-fn: function (aListItem){
+selector: "selectedItem:",
+fn: function (anObject){
 var self=this;
-var perent,position;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-position=_st(self)._positionOf_(aListItem);
-parent=_st(aListItem)._parent();
-$1=_st(_st(_st(aListItem)._position())._top()).__lt((0));
-if(smalltalk.assert($1)){
-_st(_st(parent)._get_((0)))._scrollTop_(_st(_st(_st(_st(parent)._get_((0)))._scrollTop()).__plus(_st(_st(aListItem)._position())._top())).__minus((10)));
-};
-$2=_st(_st(_st(_st(aListItem)._position())._top()).__plus(_st(aListItem)._height())).__gt(_st(parent)._height());
-if(smalltalk.assert($2)){
-_st(_st(parent)._get_((0)))._scrollTop_(_st(_st(_st(_st(_st(parent)._get_((0)))._scrollTop()).__plus(_st(aListItem)._height())).__minus(_st(_st(parent)._height()).__minus(_st(_st(aListItem)._position())._top()))).__plus((10)));
-};
-return self}, function($ctx1) {$ctx1.fill(self,"ensureVisible:",{aListItem:aListItem,perent:perent,position:position},smalltalk.HLListWidget)})},
-messageSends: ["positionOf:", "parent", "ifTrue:", "scrollTop:", "-", "+", "top", "position", "scrollTop", "get:", "<", "height", ">"]}),
+self["@selectedItem"]=anObject;
+return self}, function($ctx1) {$ctx1.fill(self,"selectedItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+messageSends: []}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "focus",
+selector: "setupKeyBindings",
 fn: function (){
 var self=this;
+var active,interval,delay,repeatInterval;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-smalltalk.HLFocusableWidget.fn.prototype._focus.apply(_st(self), []);
-$1=_st(_st(self)._items())._isEmpty();
-if(! smalltalk.assert($1)){
-$2=_st(self)._selectedItem();
-if(($receiver = $2) == nil || $receiver == undefined){
-_st(self)._activateFirstListItem();
+var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11;
+active=false;
+repeatInterval=(70);
+_st(_st(_st(self)._wrapper())._asJQuery())._unbind_("keydown");
+_st(_st(_st(self)._wrapper())._asJQuery())._keydown_((function(e){
+return smalltalk.withContext(function($ctx2) {
+$1=_st(_st(_st(e)._which()).__eq((38)))._and_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(active).__eq(false);
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+if(smalltalk.assert($1)){
+active=true;
+active;
+_st(self)._activatePreviousListItem();
+delay=_st((function(){
+return smalltalk.withContext(function($ctx3) {
+interval=_st((function(){
+return smalltalk.withContext(function($ctx4) {
+$2=_st(_st(_st(self)._wrapper())._asJQuery())._hasClass_(_st(self)._focusClass());
+if(smalltalk.assert($2)){
+return _st(self)._activatePreviousListItem();
 } else {
-$2;
+active=false;
+active;
+$3=interval;
+if(($receiver = $3) == nil || $receiver == undefined){
+$3;
+} else {
+_st(interval)._clearInterval();
+};
+$4=delay;
+if(($receiver = $4) == nil || $receiver == undefined){
+return $4;
+} else {
+return _st(delay)._clearTimeout();
 };
 };
-return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLListWidget)})},
-messageSends: ["focus", "ifFalse:", "ifNil:", "activateFirstListItem", "selectedItem", "isEmpty", "items"]}),
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}))._valueWithInterval_(repeatInterval);
+return interval;
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
+delay;
+};
+$5=_st(_st(_st(e)._which()).__eq((40)))._and_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(active).__eq(false);
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+if(smalltalk.assert($5)){
+active=true;
+active;
+_st(self)._activateNextListItem();
+delay=_st((function(){
+return smalltalk.withContext(function($ctx3) {
+interval=_st((function(){
+return smalltalk.withContext(function($ctx4) {
+$6=_st(_st(_st(self)._wrapper())._asJQuery())._hasClass_(_st(self)._focusClass());
+if(smalltalk.assert($6)){
+return _st(self)._activateNextListItem();
+} else {
+active=false;
+active;
+$7=interval;
+if(($receiver = $7) == nil || $receiver == undefined){
+$7;
+} else {
+_st(interval)._clearInterval();
+};
+$8=delay;
+if(($receiver = $8) == nil || $receiver == undefined){
+return $8;
+} else {
+return _st(delay)._clearTimeout();
+};
+};
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}))._valueWithInterval_(repeatInterval);
+return interval;
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
+return delay;
+};
+}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
+_st(_st(_st(self)._wrapper())._asJQuery())._keyup_((function(e){
+return smalltalk.withContext(function($ctx2) {
+$9=active;
+if(smalltalk.assert($9)){
+active=false;
+active;
+$10=interval;
+if(($receiver = $10) == nil || $receiver == undefined){
+$10;
+} else {
+_st(interval)._clearInterval();
+};
+$11=delay;
+if(($receiver = $11) == nil || $receiver == undefined){
+return $11;
+} else {
+return _st(delay)._clearTimeout();
+};
+};
+}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{active:active,interval:interval,delay:delay,repeatInterval:repeatInterval},smalltalk.HLListWidget)})},
+messageSends: ["unbind:", "asJQuery", "wrapper", "keydown:", "ifTrue:", "activatePreviousListItem", "valueWithTimeout:", "valueWithInterval:", "ifTrue:ifFalse:", "ifNotNil:", "clearInterval", "clearTimeout", "hasClass:", "focusClass", "and:", "=", "which", "activateNextListItem", "keyup:"]}),
 smalltalk.HLListWidget);
 
+
+
+smalltalk.addClass('HLNavigationListWidget', smalltalk.HLListWidget, ['previous', 'next'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "initialize",
+selector: "next",
 fn: function (){
 var self=this;
-function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-smalltalk.HLFocusableWidget.fn.prototype._initialize.apply(_st(self), []);
-self["@mapping"]=_st($Dictionary())._new();
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLListWidget)})},
-messageSends: ["initialize", "new"]}),
-smalltalk.HLListWidget);
+var $1;
+$1=self["@next"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"next",{},smalltalk.HLNavigationListWidget)})},
+messageSends: []}),
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "items",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@items"];
-if(($receiver = $2) == nil || $receiver == undefined){
-self["@items"]=_st(self)._defaultItems();
-$1=self["@items"];
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"items",{},smalltalk.HLListWidget)})},
-messageSends: ["ifNil:", "defaultItems"]}),
-smalltalk.HLListWidget);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "items:",
-fn: function (aCollection){
+selector: "next:",
+fn: function (aWidget){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@items"]=aCollection;
-return self}, function($ctx1) {$ctx1.fill(self,"items:",{aCollection:aCollection},smalltalk.HLListWidget)})},
-messageSends: []}),
-smalltalk.HLListWidget);
+var $1;
+self["@next"]=aWidget;
+$1=_st(_st(aWidget)._previous()).__eq(self);
+if(! smalltalk.assert($1)){
+_st(aWidget)._previous_(self);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"next:",{aWidget:aWidget},smalltalk.HLNavigationListWidget)})},
+messageSends: ["ifFalse:", "previous:", "=", "previous"]}),
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "listCssClassForItem:",
-fn: function (anObject){
+selector: "nextFocus",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=_st(_st(self)._selectedItem()).__eq(anObject);
-if(smalltalk.assert($2)){
-$1="active";
+var $1;
+$1=_st(self)._next();
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
 } else {
-$1="inactive";
+_st(_st(self)._next())._focus();
 };
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"listCssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"]}),
-smalltalk.HLListWidget);
+return self}, function($ctx1) {$ctx1.fill(self,"nextFocus",{},smalltalk.HLNavigationListWidget)})},
+messageSends: ["ifNotNil:", "focus", "next"]}),
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "positionOf:",
-fn: function (aListItem){
+selector: "previous",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-
-    	return aListItem.parent().children().get().indexOf(aListItem.get(0)) + 1
-	;
-return self}, function($ctx1) {$ctx1.fill(self,"positionOf:",{aListItem:aListItem},smalltalk.HLListWidget)})},
+var $1;
+$1=self["@previous"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"previous",{},smalltalk.HLNavigationListWidget)})},
 messageSends: []}),
-smalltalk.HLListWidget);
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "refresh",
-fn: function (){
+selector: "previous:",
+fn: function (aWidget){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-var $early={};
-try {
-smalltalk.HLFocusableWidget.fn.prototype._refresh.apply(_st(self), []);
-_st(self)._ensureVisible_(_st(_st(self["@mapping"])._at_ifAbsent_(_st(self)._selectedItem(),(function(){
-return smalltalk.withContext(function($ctx2) {
-$1=self;
-throw $early=[$1];
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})})))._asJQuery());
-return self}
-catch(e) {if(e===$early)return e[0]; throw e}
-}, function($ctx1) {$ctx1.fill(self,"refresh",{},smalltalk.HLListWidget)})},
-messageSends: ["refresh", "ensureVisible:", "asJQuery", "at:ifAbsent:", "selectedItem"]}),
-smalltalk.HLListWidget);
+self["@previous"]=aWidget;
+$1=_st(_st(aWidget)._next()).__eq(self);
+if(! smalltalk.assert($1)){
+_st(aWidget)._next_(self);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"previous:",{aWidget:aWidget},smalltalk.HLNavigationListWidget)})},
+messageSends: ["ifFalse:", "next:", "=", "next"]}),
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "registerMappingFrom:to:",
-fn: function (anObject,aTag){
+selector: "previousFocus",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self["@mapping"])._at_put_(anObject,aTag);
-return self}, function($ctx1) {$ctx1.fill(self,"registerMappingFrom:to:",{anObject:anObject,aTag:aTag},smalltalk.HLListWidget)})},
-messageSends: ["at:put:"]}),
-smalltalk.HLListWidget);
+var $1;
+$1=_st(self)._previous();
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+_st(_st(self)._previous())._focus();
+};
+return self}, function($ctx1) {$ctx1.fill(self,"previousFocus",{},smalltalk.HLNavigationListWidget)})},
+messageSends: ["ifNotNil:", "focus", "previous"]}),
+smalltalk.HLNavigationListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderButtonsOn:",
-fn: function (html){
+selector: "setupKeyBindings",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},smalltalk.HLListWidget)})},
-messageSends: []}),
-smalltalk.HLListWidget);
+var $1,$2;
+smalltalk.HLListWidget.fn.prototype._setupKeyBindings.apply(_st(self), []);
+_st(_st(_st(self)._wrapper())._asJQuery())._keydown_((function(e){
+return smalltalk.withContext(function($ctx2) {
+$1=_st(_st(e)._which()).__eq((39));
+if(smalltalk.assert($1)){
+_st(self)._nextFocus();
+};
+$2=_st(_st(e)._which()).__eq((37));
+if(smalltalk.assert($2)){
+return _st(self)._previousFocus();
+};
+}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{},smalltalk.HLNavigationListWidget)})},
+messageSends: ["setupKeyBindings", "keydown:", "ifTrue:", "nextFocus", "=", "which", "previousFocus", "asJQuery", "wrapper"]}),
+smalltalk.HLNavigationListWidget);
+
+
 
+smalltalk.addClass('HLToolListWidget', smalltalk.HLNavigationListWidget, ['model'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderContentOn:",
-fn: function (html){
+selector: "activateListItem:",
+fn: function (anItem){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4;
-$1=_st(html)._ul();
-_st($1)._class_("nav nav-pills nav-stacked");
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-return _st(self)._renderListOn_(html);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-$3=_st(html)._div();
-_st($3)._class_("pane_actions form-actions");
-$4=_st($3)._with_((function(){
+_st(_st(self)._model())._withChangesDo_((function(){
 return smalltalk.withContext(function($ctx2) {
-return _st(self)._renderButtonsOn_(html);
+return smalltalk.HLNavigationListWidget.fn.prototype._activateListItem_.apply(_st(self), [anItem]);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-_st(self)._setupKeyBindings();
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLListWidget)})},
-messageSends: ["class:", "ul", "with:", "renderListOn:", "div", "renderButtonsOn:", "setupKeyBindings"]}),
-smalltalk.HLListWidget);
+return self}, function($ctx1) {$ctx1.fill(self,"activateListItem:",{anItem:anItem},smalltalk.HLToolListWidget)})},
+messageSends: ["withChangesDo:", "activateListItem:", "model"]}),
+smalltalk.HLToolListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderItem:on:",
-fn: function (anObject,html){
+selector: "activateNextListItem",
+fn: function (){
 var self=this;
-var li;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$2;
-li=_st(html)._li();
-_st(self)._registerMappingFrom_to_(anObject,li);
-$1=li;
-_st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
-_st($1)._class_(_st(self)._listCssClassForItem_(anObject));
-$2=_st($1)._with_((function(){
+_st(_st(self)._model())._withChangesDo_((function(){
 return smalltalk.withContext(function($ctx2) {
-$3=_st(html)._a();
-_st($3)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-_st(_st(html)._tag_("i"))._class_(_st(self)._cssClassForItem_(anObject));
-return _st(self)._renderItemLabel_on_(anObject,html);
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-$4=_st($3)._onClick_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(self)._activateListItem_(_st(li)._asJQuery());
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return $4;
+return smalltalk.HLNavigationListWidget.fn.prototype._activateNextListItem.apply(_st(self), []);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},smalltalk.HLListWidget)})},
-messageSends: ["li", "registerMappingFrom:to:", "at:put:", "asString", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
-smalltalk.HLListWidget);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "renderItemLabel:on:",
-fn: function (anObject,html){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-_st(html)._with_(_st(anObject)._asString());
-return self}, function($ctx1) {$ctx1.fill(self,"renderItemLabel:on:",{anObject:anObject,html:html},smalltalk.HLListWidget)})},
-messageSends: ["with:", "asString"]}),
-smalltalk.HLListWidget);
+return self}, function($ctx1) {$ctx1.fill(self,"activateNextListItem",{},smalltalk.HLToolListWidget)})},
+messageSends: ["withChangesDo:", "activateNextListItem", "model"]}),
+smalltalk.HLToolListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderListOn:",
-fn: function (html){
+selector: "activatePreviousListItem",
+fn: function (){
 var self=this;
-function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-self["@mapping"]=_st($Dictionary())._new();
-_st(_st(self)._items())._do_((function(each){
+_st(_st(self)._model())._withChangesDo_((function(){
 return smalltalk.withContext(function($ctx2) {
-return _st(self)._renderItem_on_(each,html);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderListOn:",{html:html},smalltalk.HLListWidget)})},
-messageSends: ["new", "do:", "renderItem:on:", "items"]}),
-smalltalk.HLListWidget);
-
-smalltalk.addMethod(
-smalltalk.method({
-selector: "selectItem:",
-fn: function (anObject){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-_st(self)._selectedItem_(anObject);
-return self}, function($ctx1) {$ctx1.fill(self,"selectItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: ["selectedItem:"]}),
-smalltalk.HLListWidget);
+return smalltalk.HLNavigationListWidget.fn.prototype._activatePreviousListItem.apply(_st(self), []);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"activatePreviousListItem",{},smalltalk.HLToolListWidget)})},
+messageSends: ["withChangesDo:", "activatePreviousListItem", "model"]}),
+smalltalk.HLToolListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "selectedItem",
+selector: "commandCategory",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=self["@selectedItem"];
+$1=_st(self)._label();
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"selectedItem",{},smalltalk.HLListWidget)})},
-messageSends: []}),
-smalltalk.HLListWidget);
+}, function($ctx1) {$ctx1.fill(self,"commandCategory",{},smalltalk.HLToolListWidget)})},
+messageSends: ["label"]}),
+smalltalk.HLToolListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "selectedItem:",
-fn: function (anObject){
+selector: "label",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@selectedItem"]=anObject;
-return self}, function($ctx1) {$ctx1.fill(self,"selectedItem:",{anObject:anObject},smalltalk.HLListWidget)})},
+return "List";
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToolListWidget)})},
 messageSends: []}),
-smalltalk.HLListWidget);
+smalltalk.HLToolListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "setupKeyBindings",
+selector: "menuCommands",
 fn: function (){
 var self=this;
-var active,interval,delay,repeatInterval;
+function $HLToolCommand(){return smalltalk.HLToolCommand||(typeof HLToolCommand=="undefined"?nil:HLToolCommand)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11;
-active=false;
-repeatInterval=(70);
-_st(_st(_st(self)._wrapper())._asJQuery())._unbind_("keydown");
-_st(_st(_st(self)._wrapper())._asJQuery())._keydown_((function(e){
+var $1;
+$1=_st(_st(_st(_st($HLToolCommand())._concreteClasses())._select_((function(each){
 return smalltalk.withContext(function($ctx2) {
-$1=_st(_st(_st(e)._which()).__eq((38)))._and_((function(){
+return _st(each)._isValidFor_(_st(self)._model());
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._collect_((function(each){
+return smalltalk.withContext(function($ctx2) {
+return _st(each)._for_(_st(self)._model());
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._select_((function(each){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(_st(each)._category()).__eq(_st(self)._commandCategory()))._and_((function(){
 return smalltalk.withContext(function($ctx3) {
-return _st(active).__eq(false);
+return _st(_st(each)._isAction())._and_((function(){
+return smalltalk.withContext(function($ctx4) {
+return _st(each)._isActive();
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"menuCommands",{},smalltalk.HLToolListWidget)})},
+messageSends: ["select:", "and:", "isActive", "isAction", "=", "commandCategory", "category", "collect:", "for:", "model", "isValidFor:", "concreteClasses"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "model",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@model"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"model",{},smalltalk.HLToolListWidget)})},
+messageSends: []}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "model:",
+fn: function (aBrowserModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+self["@model"]=aBrowserModel;
+$1=self;
+_st($1)._observeSystem();
+$2=_st($1)._observeModel();
+return self}, function($ctx1) {$ctx1.fill(self,"model:",{aBrowserModel:aBrowserModel},smalltalk.HLToolListWidget)})},
+messageSends: ["observeSystem", "observeModel"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "observeModel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return self}, function($ctx1) {$ctx1.fill(self,"observeModel",{},smalltalk.HLToolListWidget)})},
+messageSends: []}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "observeSystem",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return self}, function($ctx1) {$ctx1.fill(self,"observeSystem",{},smalltalk.HLToolListWidget)})},
+messageSends: []}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "renderContentOn:",
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._renderHeadOn_(html);
+smalltalk.HLNavigationListWidget.fn.prototype._renderContentOn_.apply(_st(self), [html]);
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLToolListWidget)})},
+messageSends: ["renderHeadOn:", "renderContentOn:"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "renderHeadOn:",
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st(html)._div();
+_st($1)._class_("list-label");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+_st(html)._with_(_st(self)._label());
+return _st(self)._renderMenuOn_(html);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderHeadOn:",{html:html},smalltalk.HLToolListWidget)})},
+messageSends: ["class:", "div", "with:", "label", "renderMenuOn:"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "renderMenuOn:",
+fn: function (html){
+var self=this;
+var commands;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3,$5,$6,$7,$9,$10,$8,$4;
+commands=_st(self)._menuCommands();
+$1=_st(commands)._isEmpty();
 if(smalltalk.assert($1)){
-active=true;
-active;
-_st(self)._activatePreviousListItem();
-delay=_st((function(){
-return smalltalk.withContext(function($ctx3) {
-interval=_st((function(){
-return smalltalk.withContext(function($ctx4) {
-$2=_st(_st(_st(self)._wrapper())._asJQuery())._hasClass_(_st(self)._focusClass());
-if(smalltalk.assert($2)){
-return _st(self)._activatePreviousListItem();
-} else {
-active=false;
-active;
-$3=interval;
-if(($receiver = $3) == nil || $receiver == undefined){
-$3;
-} else {
-_st(interval)._clearInterval();
-};
-$4=delay;
-if(($receiver = $4) == nil || $receiver == undefined){
-return $4;
-} else {
-return _st(delay)._clearTimeout();
-};
-};
-}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}))._valueWithInterval_(repeatInterval);
-return interval;
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
-delay;
+$2=self;
+return $2;
 };
-$5=_st(_st(_st(e)._which()).__eq((40)))._and_((function(){
+$3=_st(html)._div();
+_st($3)._class_("btn-group cog");
+$4=_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+$5=_st(html)._a();
+_st($5)._class_("btn dropdown-toggle");
+_st($5)._at_put_("data-toggle","dropdown");
+$6=_st($5)._with_((function(){
 return smalltalk.withContext(function($ctx3) {
-return _st(active).__eq(false);
+return _st(_st(html)._tag_("i"))._class_("icon-cog");
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-if(smalltalk.assert($5)){
-active=true;
-active;
-_st(self)._activateNextListItem();
-delay=_st((function(){
+$6;
+$7=_st(html)._ul();
+_st($7)._class_("dropdown-menu pull-right");
+$8=_st($7)._with_((function(){
 return smalltalk.withContext(function($ctx3) {
-interval=_st((function(){
+return _st(_st(self)._menuCommands())._do_((function(each){
 return smalltalk.withContext(function($ctx4) {
-$6=_st(_st(_st(self)._wrapper())._asJQuery())._hasClass_(_st(self)._focusClass());
-if(smalltalk.assert($6)){
-return _st(self)._activateNextListItem();
-} else {
-active=false;
-active;
-$7=interval;
-if(($receiver = $7) == nil || $receiver == undefined){
-$7;
-} else {
-_st(interval)._clearInterval();
-};
-$8=delay;
-if(($receiver = $8) == nil || $receiver == undefined){
+return _st(_st(html)._li())._with_((function(){
+return smalltalk.withContext(function($ctx5) {
+$9=_st(html)._a();
+_st($9)._with_(_st(each)._menuLabel());
+$10=_st($9)._onClick_((function(){
+return smalltalk.withContext(function($ctx6) {
+return _st(self)._execute_(each);
+}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
+return $10;
+}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
+}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})}));
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 return $8;
-} else {
-return _st(delay)._clearTimeout();
-};
-};
-}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}))._valueWithInterval_(repeatInterval);
-return interval;
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
-return delay;
-};
-}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
-_st(_st(_st(self)._wrapper())._asJQuery())._keyup_((function(e){
-return smalltalk.withContext(function($ctx2) {
-$9=active;
-if(smalltalk.assert($9)){
-active=false;
-active;
-$10=interval;
-if(($receiver = $10) == nil || $receiver == undefined){
-$10;
-} else {
-_st(interval)._clearInterval();
-};
-$11=delay;
-if(($receiver = $11) == nil || $receiver == undefined){
-return $11;
-} else {
-return _st(delay)._clearTimeout();
-};
-};
-}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{active:active,interval:interval,delay:delay,repeatInterval:repeatInterval},smalltalk.HLListWidget)})},
-messageSends: ["unbind:", "asJQuery", "wrapper", "keydown:", "ifTrue:", "activatePreviousListItem", "valueWithTimeout:", "valueWithInterval:", "ifTrue:ifFalse:", "ifNotNil:", "clearInterval", "clearTimeout", "hasClass:", "focusClass", "and:", "=", "which", "activateNextListItem", "keyup:"]}),
-smalltalk.HLListWidget);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderMenuOn:",{html:html,commands:commands},smalltalk.HLToolListWidget)})},
+messageSends: ["menuCommands", "ifTrue:", "isEmpty", "class:", "div", "with:", "a", "at:put:", "tag:", "ul", "do:", "menuLabel", "onClick:", "execute:", "li"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "selectedItem:",
+fn: function (anItem){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLNavigationListWidget.fn.prototype._selectedItem_.apply(_st(self), [anItem]);
+_st(self)._updateMenu();
+return self}, function($ctx1) {$ctx1.fill(self,"selectedItem:",{anItem:anItem},smalltalk.HLToolListWidget)})},
+messageSends: ["selectedItem:", "updateMenu"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "unregister",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLNavigationListWidget.fn.prototype._unregister.apply(_st(self), []);
+_st(_st(_st(self)._model())._announcer())._unsubscribe_(self);
+_st(_st(_st(self)._model())._systemAnnouncer())._unsubscribe_(self);
+return self}, function($ctx1) {$ctx1.fill(self,"unregister",{},smalltalk.HLToolListWidget)})},
+messageSends: ["unregister", "unsubscribe:", "announcer", "model", "systemAnnouncer"]}),
+smalltalk.HLToolListWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "updateMenu",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_(".cog"))._remove();
+_st((function(html){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._renderMenuOn_(html);
+}, function($ctx2) {$ctx2.fillBlock({html:html},$ctx1)})}))._appendToJQuery_(_st(_st(_st(self)._wrapper())._asJQuery())._find_(".list-label"));
+return self}, function($ctx1) {$ctx1.fill(self,"updateMenu",{},smalltalk.HLToolListWidget)})},
+messageSends: ["remove", "find:", "asJQuery", "wrapper", "appendToJQuery:", "renderMenuOn:"]}),
+smalltalk.HLToolListWidget);
+
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "on:",
+fn: function (aModel){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$3,$1;
+$2=_st(self)._new();
+_st($2)._model_(aModel);
+$3=_st($2)._yourself();
+$1=$3;
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"on:",{aModel:aModel},smalltalk.HLToolListWidget.klass)})},
+messageSends: ["model:", "new", "yourself"]}),
+smalltalk.HLToolListWidget.klass);
 
 
-smalltalk.addClass('HLNavigationListWidget', smalltalk.HLListWidget, ['previous', 'next'], 'Helios-Core');
+smalltalk.addClass('HLManager', smalltalk.HLWidget, ['tabs', 'activeTab', 'keyBinder', 'environment', 'history'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "next",
+selector: "activate:",
+fn: function (aTab){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+_st(_st(self)._keyBinder())._flushBindings();
+_st(aTab)._registerBindings();
+self["@activeTab"]=aTab;
+$1=self;
+_st($1)._refresh();
+_st($1)._addToHistory_(aTab);
+$2=_st($1)._show_(aTab);
+return self}, function($ctx1) {$ctx1.fill(self,"activate:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["flushBindings", "keyBinder", "registerBindings", "refresh", "addToHistory:", "show:"]}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "activeTab",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1;
-$1=self["@next"];
+$1=self["@activeTab"];
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"next",{},smalltalk.HLNavigationListWidget)})},
+}, function($ctx1) {$ctx1.fill(self,"activeTab",{},smalltalk.HLManager)})},
 messageSends: []}),
-smalltalk.HLNavigationListWidget);
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "next:",
-fn: function (aWidget){
+selector: "addTab:",
+fn: function (aTab){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-self["@next"]=aWidget;
-$1=_st(_st(aWidget)._previous()).__eq(self);
-if(! smalltalk.assert($1)){
-_st(aWidget)._previous_(self);
-};
-return self}, function($ctx1) {$ctx1.fill(self,"next:",{aWidget:aWidget},smalltalk.HLNavigationListWidget)})},
-messageSends: ["ifFalse:", "previous:", "=", "previous"]}),
-smalltalk.HLNavigationListWidget);
+_st(_st(self)._tabs())._add_(aTab);
+_st(self)._activate_(aTab);
+return self}, function($ctx1) {$ctx1.fill(self,"addTab:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["add:", "tabs", "activate:"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "nextFocus",
+selector: "addToHistory:",
+fn: function (aTab){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._removeFromHistory_(aTab);
+_st(_st(self)._history())._add_(aTab);
+return self}, function($ctx1) {$ctx1.fill(self,"addToHistory:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["removeFromHistory:", "add:", "history"]}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "confirm:ifFalse:",
+fn: function (aString,aBlock){
+var self=this;
+function $HLConfirmation(){return smalltalk.HLConfirmation||(typeof HLConfirmation=="undefined"?nil:HLConfirmation)}
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st($HLConfirmation())._new();
+_st($1)._confirmationString_(aString);
+_st($1)._cancelBlock_(aBlock);
+$2=_st($1)._yourself();
+_st($2)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"confirm:ifFalse:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
+messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "cancelBlock:", "yourself"]}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "confirm:ifTrue:",
+fn: function (aString,aBlock){
+var self=this;
+function $HLConfirmation(){return smalltalk.HLConfirmation||(typeof HLConfirmation=="undefined"?nil:HLConfirmation)}
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st($HLConfirmation())._new();
+_st($1)._confirmationString_(aString);
+_st($1)._actionBlock_(aBlock);
+$2=_st($1)._yourself();
+_st($2)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"confirm:ifTrue:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
+messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "actionBlock:", "yourself"]}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "defaultEnvironment",
 fn: function (){
 var self=this;
+var parent;
+function $Environment(){return smalltalk.Environment||(typeof Environment=="undefined"?nil:Environment)}
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(self)._next();
+var $1,$2,$3,$4;
+$1=_st(window)._opener();
 if(($receiver = $1) == nil || $receiver == undefined){
-$1;
+parent=_st(window)._parent();
 } else {
-_st(_st(self)._next())._focus();
+parent=$1;
 };
-return self}, function($ctx1) {$ctx1.fill(self,"nextFocus",{},smalltalk.HLNavigationListWidget)})},
-messageSends: ["ifNotNil:", "focus", "next"]}),
-smalltalk.HLNavigationListWidget);
+$2=parent;
+if(($receiver = $2) == nil || $receiver == undefined){
+$3=_st($Environment())._new();
+return $3;
+} else {
+$2;
+};
+$4=_st(_st(_st(parent)._at_("smalltalk"))._at_("Environment"))._new();
+return $4;
+}, function($ctx1) {$ctx1.fill(self,"defaultEnvironment",{parent:parent},smalltalk.HLManager)})},
+messageSends: ["ifNil:", "parent", "opener", "new", "at:"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "previous",
+selector: "environment",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=self["@previous"];
+var $2,$1;
+$2=self["@environment"];
+if(($receiver = $2) == nil || $receiver == undefined){
+self["@environment"]=_st(self)._defaultEnvironment();
+$1=self["@environment"];
+} else {
+$1=$2;
+};
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"previous",{},smalltalk.HLNavigationListWidget)})},
-messageSends: []}),
-smalltalk.HLNavigationListWidget);
+}, function($ctx1) {$ctx1.fill(self,"environment",{},smalltalk.HLManager)})},
+messageSends: ["ifNil:", "defaultEnvironment"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "previous:",
-fn: function (aWidget){
+selector: "environment:",
+fn: function (anEnvironment){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-self["@previous"]=aWidget;
-$1=_st(_st(aWidget)._next()).__eq(self);
-if(! smalltalk.assert($1)){
-_st(aWidget)._next_(self);
-};
-return self}, function($ctx1) {$ctx1.fill(self,"previous:",{aWidget:aWidget},smalltalk.HLNavigationListWidget)})},
-messageSends: ["ifFalse:", "next:", "=", "next"]}),
-smalltalk.HLNavigationListWidget);
+self["@environment"]=anEnvironment;
+return self}, function($ctx1) {$ctx1.fill(self,"environment:",{anEnvironment:anEnvironment},smalltalk.HLManager)})},
+messageSends: []}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "previousFocus",
+selector: "history",
 fn: function (){
 var self=this;
+function $OrderedCollection(){return smalltalk.OrderedCollection||(typeof OrderedCollection=="undefined"?nil:OrderedCollection)}
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(self)._previous();
-if(($receiver = $1) == nil || $receiver == undefined){
-$1;
+var $2,$1;
+$2=self["@history"];
+if(($receiver = $2) == nil || $receiver == undefined){
+self["@history"]=_st($OrderedCollection())._new();
+$1=self["@history"];
 } else {
-_st(_st(self)._previous())._focus();
+$1=$2;
 };
-return self}, function($ctx1) {$ctx1.fill(self,"previousFocus",{},smalltalk.HLNavigationListWidget)})},
-messageSends: ["ifNotNil:", "focus", "previous"]}),
-smalltalk.HLNavigationListWidget);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"history",{},smalltalk.HLManager)})},
+messageSends: ["ifNil:", "new"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "setupKeyBindings",
-fn: function (){
+selector: "history:",
+fn: function (aCollection){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-smalltalk.HLListWidget.fn.prototype._setupKeyBindings.apply(_st(self), []);
-_st(_st(_st(self)._wrapper())._asJQuery())._keydown_((function(e){
-return smalltalk.withContext(function($ctx2) {
-$1=_st(_st(e)._which()).__eq((39));
-if(smalltalk.assert($1)){
-_st(self)._nextFocus();
-};
-$2=_st(_st(e)._which()).__eq((37));
-if(smalltalk.assert($2)){
-return _st(self)._previousFocus();
-};
-}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{},smalltalk.HLNavigationListWidget)})},
-messageSends: ["setupKeyBindings", "keydown:", "ifTrue:", "nextFocus", "=", "which", "previousFocus", "asJQuery", "wrapper"]}),
-smalltalk.HLNavigationListWidget);
-
+self["@history"]=aCollection;
+return self}, function($ctx1) {$ctx1.fill(self,"history:",{aCollection:aCollection},smalltalk.HLManager)})},
+messageSends: []}),
+smalltalk.HLManager);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "initialize",
+fn: function (){
+var self=this;
+function $HLInspector(){return smalltalk.HLInspector||(typeof HLInspector=="undefined"?nil:HLInspector)}
+function $ErrorHandler(){return smalltalk.ErrorHandler||(typeof ErrorHandler=="undefined"?nil:ErrorHandler)}
+function $ProgressHandler(){return smalltalk.ProgressHandler||(typeof ProgressHandler=="undefined"?nil:ProgressHandler)}
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLWidget.fn.prototype._initialize.apply(_st(self), []);
+_st(self)._registerInspector_($HLInspector());
+_st(self)._registerErrorHandler_(_st($ErrorHandler())._current());
+_st(self)._registerProgressHandler_(_st($ProgressHandler())._current());
+_st(_st(self)._keyBinder())._setupEvents();
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLManager)})},
+messageSends: ["initialize", "registerInspector:", "registerErrorHandler:", "current", "registerProgressHandler:", "setupEvents", "keyBinder"]}),
+smalltalk.HLManager);
 
-smalltalk.addClass('HLToolListWidget', smalltalk.HLNavigationListWidget, ['model'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activateListItem:",
-fn: function (anItem){
+selector: "keyBinder",
+fn: function (){
 var self=this;
+function $HLKeyBinder(){return smalltalk.HLKeyBinder||(typeof HLKeyBinder=="undefined"?nil:HLKeyBinder)}
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._model())._withChangesDo_((function(){
-return smalltalk.withContext(function($ctx2) {
-return smalltalk.HLNavigationListWidget.fn.prototype._activateListItem_.apply(_st(self), [anItem]);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"activateListItem:",{anItem:anItem},smalltalk.HLToolListWidget)})},
-messageSends: ["withChangesDo:", "activateListItem:", "model"]}),
-smalltalk.HLToolListWidget);
+var $2,$1;
+$2=self["@keyBinder"];
+if(($receiver = $2) == nil || $receiver == undefined){
+self["@keyBinder"]=_st($HLKeyBinder())._new();
+$1=self["@keyBinder"];
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"keyBinder",{},smalltalk.HLManager)})},
+messageSends: ["ifNil:", "new"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activateNextListItem",
+selector: "refresh",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._model())._withChangesDo_((function(){
-return smalltalk.withContext(function($ctx2) {
-return smalltalk.HLNavigationListWidget.fn.prototype._activateNextListItem.apply(_st(self), []);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"activateNextListItem",{},smalltalk.HLToolListWidget)})},
-messageSends: ["withChangesDo:", "activateNextListItem", "model"]}),
-smalltalk.HLToolListWidget);
+_st(_st(window)._jQuery_(".navbar"))._remove();
+_st(self)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"refresh",{},smalltalk.HLManager)})},
+messageSends: ["remove", "jQuery:", "appendToJQuery:", "asJQuery"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activatePreviousListItem",
-fn: function (){
+selector: "registerErrorHandler:",
+fn: function (anErrorHandler){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._model())._withChangesDo_((function(){
-return smalltalk.withContext(function($ctx2) {
-return smalltalk.HLNavigationListWidget.fn.prototype._activatePreviousListItem.apply(_st(self), []);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"activatePreviousListItem",{},smalltalk.HLToolListWidget)})},
-messageSends: ["withChangesDo:", "activatePreviousListItem", "model"]}),
-smalltalk.HLToolListWidget);
+_st(_st(self)._environment())._registerErrorHandler_(anErrorHandler);
+return self}, function($ctx1) {$ctx1.fill(self,"registerErrorHandler:",{anErrorHandler:anErrorHandler},smalltalk.HLManager)})},
+messageSends: ["registerErrorHandler:", "environment"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "commandCategory",
-fn: function (){
+selector: "registerInspector:",
+fn: function (anInspector){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(self)._label();
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"commandCategory",{},smalltalk.HLToolListWidget)})},
-messageSends: ["label"]}),
-smalltalk.HLToolListWidget);
+_st(_st(self)._environment())._registerInspector_(anInspector);
+return self}, function($ctx1) {$ctx1.fill(self,"registerInspector:",{anInspector:anInspector},smalltalk.HLManager)})},
+messageSends: ["registerInspector:", "environment"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "label",
-fn: function (){
+selector: "registerProgressHandler:",
+fn: function (aProgressHandler){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return "List";
-}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLToolListWidget)})},
-messageSends: []}),
-smalltalk.HLToolListWidget);
+_st(_st(self)._environment())._registerProgressHandler_(aProgressHandler);
+return self}, function($ctx1) {$ctx1.fill(self,"registerProgressHandler:",{aProgressHandler:aProgressHandler},smalltalk.HLManager)})},
+messageSends: ["registerProgressHandler:", "environment"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "menuCommands",
+selector: "removeActiveTab",
 fn: function (){
 var self=this;
-function $HLToolCommand(){return smalltalk.HLToolCommand||(typeof HLToolCommand=="undefined"?nil:HLToolCommand)}
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=_st(_st(_st(_st($HLToolCommand())._concreteClasses())._select_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(each)._isValidFor_(_st(self)._model());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._collect_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(each)._for_(_st(self)._model());
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})))._select_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(each)._category()).__eq(_st(self)._commandCategory()))._and_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(_st(each)._isAction())._and_((function(){
-return smalltalk.withContext(function($ctx4) {
-return _st(each)._isActive();
-}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"menuCommands",{},smalltalk.HLToolListWidget)})},
-messageSends: ["select:", "and:", "isActive", "isAction", "=", "commandCategory", "category", "collect:", "for:", "model", "isValidFor:", "concreteClasses"]}),
-smalltalk.HLToolListWidget);
+_st(self)._removeTab_(_st(self)._activeTab());
+return self}, function($ctx1) {$ctx1.fill(self,"removeActiveTab",{},smalltalk.HLManager)})},
+messageSends: ["removeTab:", "activeTab"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "model",
-fn: function (){
+selector: "removeFromHistory:",
+fn: function (aTab){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=self["@model"];
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"model",{},smalltalk.HLToolListWidget)})},
-messageSends: []}),
-smalltalk.HLToolListWidget);
+_st(self)._history_(_st(_st(self)._history())._reject_((function(each){
+return smalltalk.withContext(function($ctx2) {
+return _st(each).__eq_eq(aTab);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})));
+return self}, function($ctx1) {$ctx1.fill(self,"removeFromHistory:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["history:", "reject:", "==", "history"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "model:",
-fn: function (aBrowserModel){
+selector: "removeTab:",
+fn: function (aTab){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
-self["@model"]=aBrowserModel;
-$1=self;
-_st($1)._observeSystem();
-$2=_st($1)._observeModel();
-return self}, function($ctx1) {$ctx1.fill(self,"model:",{aBrowserModel:aBrowserModel},smalltalk.HLToolListWidget)})},
-messageSends: ["observeSystem", "observeModel"]}),
-smalltalk.HLToolListWidget);
+$1=_st(_st(self)._tabs())._includes_(aTab);
+if(! smalltalk.assert($1)){
+$2=self;
+return $2;
+};
+_st(self)._removeFromHistory_(aTab);
+_st(_st(self)._tabs())._remove_(aTab);
+_st(_st(self)._keyBinder())._flushBindings();
+_st(aTab)._remove();
+_st(self)._refresh();
+_st(_st(self)._history())._ifNotEmpty_((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st(_st(self)._history())._last())._activate();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"removeTab:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["ifFalse:", "includes:", "tabs", "removeFromHistory:", "remove:", "flushBindings", "keyBinder", "remove", "refresh", "ifNotEmpty:", "activate", "last", "history"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "observeModel",
-fn: function (){
+selector: "renderAddOn:",
+fn: function (html){
 var self=this;
+function $HLWidget(){return smalltalk.HLWidget||(typeof HLWidget=="undefined"?nil:HLWidget)}
 return smalltalk.withContext(function($ctx1) { 
-return self}, function($ctx1) {$ctx1.fill(self,"observeModel",{},smalltalk.HLToolListWidget)})},
-messageSends: []}),
-smalltalk.HLToolListWidget);
+var $1,$3,$4,$5,$7,$8,$6,$2;
+$1=_st(html)._li();
+_st($1)._class_("dropdown");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+$3=_st(html)._a();
+_st($3)._class_("dropdown-toggle");
+_st($3)._at_put_("data-toggle","dropdown");
+$4=_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
+_st(html)._with_("Open...");
+return _st(_st(html)._tag_("b"))._class_("caret");
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+$4;
+$5=_st(html)._ul();
+_st($5)._class_("dropdown-menu");
+$6=_st($5)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(_st(_st(_st($HLWidget())._withAllSubclasses())._select_((function(each){
+return smalltalk.withContext(function($ctx4) {
+return _st(each)._canBeOpenAsTab();
+}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})})))._sorted_((function(a,b){
+return smalltalk.withContext(function($ctx4) {
+return _st(_st(a)._tabPriority()).__lt(_st(b)._tabPriority());
+}, function($ctx4) {$ctx4.fillBlock({a:a,b:b},$ctx1)})})))._do_((function(each){
+return smalltalk.withContext(function($ctx4) {
+return _st(_st(html)._li())._with_((function(){
+return smalltalk.withContext(function($ctx5) {
+$7=_st(html)._a();
+_st($7)._with_(_st(each)._tabLabel());
+$8=_st($7)._onClick_((function(){
+return smalltalk.withContext(function($ctx6) {
+return _st(each)._openAsTab();
+}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
+return $8;
+}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
+}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})}));
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+return $6;
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderAddOn:",{html:html},smalltalk.HLManager)})},
+messageSends: ["class:", "li", "with:", "a", "at:put:", "tag:", "ul", "do:", "tabLabel", "onClick:", "openAsTab", "sorted:", "<", "tabPriority", "select:", "canBeOpenAsTab", "withAllSubclasses"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "observeSystem",
-fn: function (){
+selector: "renderContentOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return self}, function($ctx1) {$ctx1.fill(self,"observeSystem",{},smalltalk.HLToolListWidget)})},
-messageSends: []}),
-smalltalk.HLToolListWidget);
+var $1,$3,$4,$2;
+$1=_st(html)._div();
+_st($1)._class_("navbar navbar-fixed-top");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+$3=_st(html)._div();
+_st($3)._class_("navbar-inner");
+$4=_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self)._renderTabsOn_(html);
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+return $4;
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLManager)})},
+messageSends: ["class:", "div", "with:", "renderTabsOn:"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderContentOn:",
+selector: "renderTabsOn:",
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._renderHeadOn_(html);
-smalltalk.HLNavigationListWidget.fn.prototype._renderContentOn_.apply(_st(self), [html]);
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLToolListWidget)})},
-messageSends: ["renderHeadOn:", "renderContentOn:"]}),
-smalltalk.HLToolListWidget);
+var $1,$3,$4,$6,$5,$8,$9,$10,$11,$7,$2;
+$1=_st(html)._ul();
+_st($1)._class_("nav");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+_st(_st(self)._tabs())._do_((function(each){
+return smalltalk.withContext(function($ctx3) {
+$3=_st(html)._li();
+$4=$3;
+$6=_st(each)._isActive();
+if(smalltalk.assert($6)){
+$5="active";
+} else {
+$5="inactive";
+};
+_st($4)._class_($5);
+$7=_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx4) {
+$8=_st(html)._a();
+_st($8)._with_((function(){
+return smalltalk.withContext(function($ctx5) {
+_st(_st(_st(html)._tag_("i"))._class_("close"))._onClick_((function(){
+return smalltalk.withContext(function($ctx6) {
+return _st(self)._removeTab_(each);
+}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
+$9=_st(html)._span();
+_st($9)._class_(_st(each)._cssClass());
+$10=_st($9)._with_(_st(each)._displayLabel());
+return $10;
+}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
+$11=_st($8)._onClick_((function(){
+return smalltalk.withContext(function($ctx5) {
+return _st(each)._activate();
+}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
+return $11;
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
+return $7;
+}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}));
+return _st(self)._renderAddOn_(html);
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderTabsOn:",{html:html},smalltalk.HLManager)})},
+messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "cssClass", "span", "displayLabel", "a", "activate", "tabs", "renderAddOn:"]}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "request:do:",
+fn: function (aString,aBlock){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._request_value_do_(aString,"",aBlock);
+return self}, function($ctx1) {$ctx1.fill(self,"request:do:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
+messageSends: ["request:value:do:"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderHeadOn:",
-fn: function (html){
+selector: "request:value:do:",
+fn: function (aString,valueString,aBlock){
 var self=this;
+function $HLRequest(){return smalltalk.HLRequest||(typeof HLRequest=="undefined"?nil:HLRequest)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
-$1=_st(html)._div();
-_st($1)._class_("list-label");
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-_st(html)._with_(_st(self)._label());
-return _st(self)._renderMenuOn_(html);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderHeadOn:",{html:html},smalltalk.HLToolListWidget)})},
-messageSends: ["class:", "div", "with:", "label", "renderMenuOn:"]}),
-smalltalk.HLToolListWidget);
+$1=_st($HLRequest())._new();
+_st($1)._confirmationString_(aString);
+_st($1)._actionBlock_(aBlock);
+_st($1)._value_(valueString);
+$2=_st($1)._yourself();
+_st($2)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"request:value:do:",{aString:aString,valueString:valueString,aBlock:aBlock},smalltalk.HLManager)})},
+messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "actionBlock:", "value:", "yourself"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderMenuOn:",
-fn: function (html){
+selector: "show:",
+fn: function (aTab){
 var self=this;
-var commands;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$5,$6,$7,$9,$10,$8,$4;
-commands=_st(self)._menuCommands();
-$1=_st(commands)._isEmpty();
-if(smalltalk.assert($1)){
-$2=self;
-return $2;
-};
-$3=_st(html)._div();
-_st($3)._class_("btn-group cog");
-$4=_st($3)._with_((function(){
+var $1,$2;
+_st(_st(self)._tabs())._do_((function(each){
 return smalltalk.withContext(function($ctx2) {
-$5=_st(html)._a();
-_st($5)._class_("btn dropdown-toggle");
-_st($5)._at_put_("data-toggle","dropdown");
-$6=_st($5)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(_st(html)._tag_("i"))._class_("icon-cog");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-$6;
-$7=_st(html)._ul();
-_st($7)._class_("dropdown-menu pull-right");
-$8=_st($7)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(_st(self)._menuCommands())._do_((function(each){
-return smalltalk.withContext(function($ctx4) {
-return _st(_st(html)._li())._with_((function(){
-return smalltalk.withContext(function($ctx5) {
-$9=_st(html)._a();
-_st($9)._with_(_st(each)._menuLabel());
-$10=_st($9)._onClick_((function(){
-return smalltalk.withContext(function($ctx6) {
-return _st(self)._execute_(each);
-}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
-return $10;
-}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})}));
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return $8;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderMenuOn:",{html:html,commands:commands},smalltalk.HLToolListWidget)})},
-messageSends: ["menuCommands", "ifTrue:", "isEmpty", "class:", "div", "with:", "a", "at:put:", "tag:", "ul", "do:", "menuLabel", "onClick:", "execute:", "li"]}),
-smalltalk.HLToolListWidget);
+return _st(each)._hide();
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
+$1=aTab;
+_st($1)._show();
+$2=_st($1)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["do:", "hide", "tabs", "show", "focus"]}),
+smalltalk.HLManager);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "selectedItem:",
-fn: function (anItem){
+selector: "tabs",
+fn: function (){
 var self=this;
+function $OrderedCollection(){return smalltalk.OrderedCollection||(typeof OrderedCollection=="undefined"?nil:OrderedCollection)}
 return smalltalk.withContext(function($ctx1) { 
-smalltalk.HLNavigationListWidget.fn.prototype._selectedItem_.apply(_st(self), [anItem]);
-_st(self)._updateMenu();
-return self}, function($ctx1) {$ctx1.fill(self,"selectedItem:",{anItem:anItem},smalltalk.HLToolListWidget)})},
-messageSends: ["selectedItem:", "updateMenu"]}),
-smalltalk.HLToolListWidget);
+var $2,$1;
+$2=self["@tabs"];
+if(($receiver = $2) == nil || $receiver == undefined){
+self["@tabs"]=_st($OrderedCollection())._new();
+$1=self["@tabs"];
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"tabs",{},smalltalk.HLManager)})},
+messageSends: ["ifNil:", "new"]}),
+smalltalk.HLManager);
 
+
+smalltalk.HLManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
 smalltalk.method({
-selector: "unregister",
+selector: "current",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-smalltalk.HLNavigationListWidget.fn.prototype._unregister.apply(_st(self), []);
-_st(_st(_st(self)._model())._announcer())._unsubscribe_(self);
-_st(_st(_st(self)._model())._systemAnnouncer())._unsubscribe_(self);
-return self}, function($ctx1) {$ctx1.fill(self,"unregister",{},smalltalk.HLToolListWidget)})},
-messageSends: ["unregister", "unsubscribe:", "announcer", "model", "systemAnnouncer"]}),
-smalltalk.HLToolListWidget);
+var $2,$1;
+$2=self["@current"];
+if(($receiver = $2) == nil || $receiver == undefined){
+self["@current"]=_st(_st(self)._basicNew())._initialize();
+$1=self["@current"];
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"current",{},smalltalk.HLManager.klass)})},
+messageSends: ["ifNil:", "initialize", "basicNew"]}),
+smalltalk.HLManager.klass);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "updateMenu",
+selector: "initialize",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(_st(_st(self)._wrapper())._asJQuery())._find_(".cog"))._remove();
-_st((function(html){
-return smalltalk.withContext(function($ctx2) {
-return _st(self)._renderMenuOn_(html);
-}, function($ctx2) {$ctx2.fillBlock({html:html},$ctx1)})}))._appendToJQuery_(_st(_st(_st(self)._wrapper())._asJQuery())._find_(".list-label"));
-return self}, function($ctx1) {$ctx1.fill(self,"updateMenu",{},smalltalk.HLToolListWidget)})},
-messageSends: ["remove", "find:", "asJQuery", "wrapper", "appendToJQuery:", "renderMenuOn:"]}),
-smalltalk.HLToolListWidget);
-
+_st(_st(self)._current())._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLManager.klass)})},
+messageSends: ["appendToJQuery:", "asJQuery", "current"]}),
+smalltalk.HLManager.klass);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "on:",
-fn: function (aModel){
+selector: "new",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$3,$1;
-$2=_st(self)._new();
-_st($2)._model_(aModel);
-$3=_st($2)._yourself();
-$1=$3;
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"on:",{aModel:aModel},smalltalk.HLToolListWidget.klass)})},
-messageSends: ["model:", "new", "yourself"]}),
-smalltalk.HLToolListWidget.klass);
+_st(self)._shouldNotImplement();
+return self}, function($ctx1) {$ctx1.fill(self,"new",{},smalltalk.HLManager.klass)})},
+messageSends: ["shouldNotImplement"]}),
+smalltalk.HLManager.klass);
 
 
-smalltalk.addClass('HLManager', smalltalk.HLWidget, ['tabs', 'activeTab', 'keyBinder', 'environment', 'history'], 'Helios-Core');
+smalltalk.addClass('HLModal', smalltalk.HLWidget, [], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activate:",
-fn: function (aTab){
+selector: "cancel",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-_st(_st(self)._keyBinder())._flushBindings();
-_st(aTab)._registerBindings();
-self["@activeTab"]=aTab;
-$1=self;
-_st($1)._refresh();
-_st($1)._addToHistory_(aTab);
-$2=_st($1)._show_(aTab);
-return self}, function($ctx1) {$ctx1.fill(self,"activate:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["flushBindings", "keyBinder", "registerBindings", "refresh", "addToHistory:", "show:"]}),
-smalltalk.HLManager);
+_st(self)._remove();
+return self}, function($ctx1) {$ctx1.fill(self,"cancel",{},smalltalk.HLModal)})},
+messageSends: ["remove"]}),
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "activeTab",
+selector: "cssClass",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
-$1=self["@activeTab"];
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"activeTab",{},smalltalk.HLManager)})},
+return "";
+}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLModal)})},
 messageSends: []}),
-smalltalk.HLManager);
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "addTab:",
-fn: function (aTab){
+selector: "remove",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._tabs())._add_(aTab);
-_st(self)._activate_(aTab);
-return self}, function($ctx1) {$ctx1.fill(self,"addTab:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["add:", "tabs", "activate:"]}),
-smalltalk.HLManager);
+_st(_st(window)._jQuery_(".dialog"))._removeClass_("active");
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+_st(_st(window)._jQuery_("#overlay"))._remove();
+return _st(_st(window)._jQuery_(".dialog"))._remove();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
+return self}, function($ctx1) {$ctx1.fill(self,"remove",{},smalltalk.HLModal)})},
+messageSends: ["removeClass:", "jQuery:", "valueWithTimeout:", "remove"]}),
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "addToHistory:",
-fn: function (aTab){
+selector: "renderButtonsOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._removeFromHistory_(aTab);
-_st(_st(self)._history())._add_(aTab);
-return self}, function($ctx1) {$ctx1.fill(self,"addToHistory:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["removeFromHistory:", "add:", "history"]}),
-smalltalk.HLManager);
+return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},smalltalk.HLModal)})},
+messageSends: []}),
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirm:ifFalse:",
-fn: function (aString,aBlock){
+selector: "renderContentOn:",
+fn: function (html){
 var self=this;
-function $HLConfirmation(){return smalltalk.HLConfirmation||(typeof HLConfirmation=="undefined"?nil:HLConfirmation)}
+var confirmButton;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-$1=_st($HLConfirmation())._new();
-_st($1)._confirmationString_(aString);
-_st($1)._cancelBlock_(aBlock);
-$2=_st($1)._yourself();
-_st($2)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"confirm:ifFalse:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
-messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "cancelBlock:", "yourself"]}),
-smalltalk.HLManager);
+var $1,$3,$4,$2;
+_st(_st(html)._div())._id_("overlay");
+$1=_st(html)._div();
+_st($1)._class_(_st("dialog ").__comma(_st(self)._cssClass()));
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+$3=self;
+_st($3)._renderMainOn_(html);
+$4=_st($3)._renderButtonsOn_(html);
+return $4;
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(_st(window)._jQuery_(".dialog"))._addClass_("active");
+_st(self)._setupKeyBindings();
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html,confirmButton:confirmButton},smalltalk.HLModal)})},
+messageSends: ["id:", "div", "class:", ",", "cssClass", "with:", "renderMainOn:", "renderButtonsOn:", "addClass:", "jQuery:", "setupKeyBindings"]}),
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "confirm:ifTrue:",
-fn: function (aString,aBlock){
-var self=this;
-function $HLConfirmation(){return smalltalk.HLConfirmation||(typeof HLConfirmation=="undefined"?nil:HLConfirmation)}
-return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-$1=_st($HLConfirmation())._new();
-_st($1)._confirmationString_(aString);
-_st($1)._actionBlock_(aBlock);
-$2=_st($1)._yourself();
-_st($2)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"confirm:ifTrue:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
-messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "actionBlock:", "yourself"]}),
-smalltalk.HLManager);
+selector: "renderMainOn:",
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLModal)})},
+messageSends: []}),
+smalltalk.HLModal);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "defaultEnvironment",
+selector: "setupKeyBindings",
 fn: function (){
 var self=this;
-var parent;
-function $Environment(){return smalltalk.Environment||(typeof Environment=="undefined"?nil:Environment)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2,$3,$4;
-$1=_st(window)._opener();
-if(($receiver = $1) == nil || $receiver == undefined){
-parent=_st(window)._parent();
-} else {
-parent=$1;
-};
-$2=parent;
-if(($receiver = $2) == nil || $receiver == undefined){
-$3=_st($Environment())._new();
-return $3;
-} else {
-$2;
+var $1;
+_st(_st(window)._jQuery_(".dialog"))._keyup_((function(e){
+return smalltalk.withContext(function($ctx2) {
+$1=_st(_st(e)._keyCode()).__eq((27));
+if(smalltalk.assert($1)){
+return _st(self)._cancel();
 };
-$4=_st(_st(_st(parent)._at_("smalltalk"))._at_("Environment"))._new();
-return $4;
-}, function($ctx1) {$ctx1.fill(self,"defaultEnvironment",{parent:parent},smalltalk.HLManager)})},
-messageSends: ["ifNil:", "parent", "opener", "new", "at:"]}),
-smalltalk.HLManager);
+}, function($ctx2) {$ctx2.fillBlock({e:e},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"setupKeyBindings",{},smalltalk.HLModal)})},
+messageSends: ["keyup:", "ifTrue:", "cancel", "=", "keyCode", "jQuery:"]}),
+smalltalk.HLModal);
+
 
+
+smalltalk.addClass('HLConfirmation', smalltalk.HLModal, ['confirmationString', 'actionBlock', 'cancelBlock'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "environment",
+selector: "actionBlock",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-$2=self["@environment"];
+$2=self["@actionBlock"];
 if(($receiver = $2) == nil || $receiver == undefined){
-self["@environment"]=_st(self)._defaultEnvironment();
-$1=self["@environment"];
+$1=(function(){
+return smalltalk.withContext(function($ctx2) {
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"environment",{},smalltalk.HLManager)})},
-messageSends: ["ifNil:", "defaultEnvironment"]}),
-smalltalk.HLManager);
+}, function($ctx1) {$ctx1.fill(self,"actionBlock",{},smalltalk.HLConfirmation)})},
+messageSends: ["ifNil:"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "environment:",
-fn: function (anEnvironment){
+selector: "actionBlock:",
+fn: function (aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@environment"]=anEnvironment;
-return self}, function($ctx1) {$ctx1.fill(self,"environment:",{anEnvironment:anEnvironment},smalltalk.HLManager)})},
+self["@actionBlock"]=aBlock;
+return self}, function($ctx1) {$ctx1.fill(self,"actionBlock:",{aBlock:aBlock},smalltalk.HLConfirmation)})},
 messageSends: []}),
-smalltalk.HLManager);
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "history",
+selector: "cancel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(_st(self)._cancelBlock())._value();
+_st(self)._remove();
+return self}, function($ctx1) {$ctx1.fill(self,"cancel",{},smalltalk.HLConfirmation)})},
+messageSends: ["value", "cancelBlock", "remove"]}),
+smalltalk.HLConfirmation);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cancelBlock",
 fn: function (){
 var self=this;
-function $OrderedCollection(){return smalltalk.OrderedCollection||(typeof OrderedCollection=="undefined"?nil:OrderedCollection)}
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-$2=self["@history"];
+$2=self["@cancelBlock"];
 if(($receiver = $2) == nil || $receiver == undefined){
-self["@history"]=_st($OrderedCollection())._new();
-$1=self["@history"];
+$1=(function(){
+return smalltalk.withContext(function($ctx2) {
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})});
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"history",{},smalltalk.HLManager)})},
-messageSends: ["ifNil:", "new"]}),
-smalltalk.HLManager);
+}, function($ctx1) {$ctx1.fill(self,"cancelBlock",{},smalltalk.HLConfirmation)})},
+messageSends: ["ifNil:"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "history:",
-fn: function (aCollection){
+selector: "cancelBlock:",
+fn: function (aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self["@history"]=aCollection;
-return self}, function($ctx1) {$ctx1.fill(self,"history:",{aCollection:aCollection},smalltalk.HLManager)})},
+self["@cancelBlock"]=aBlock;
+return self}, function($ctx1) {$ctx1.fill(self,"cancelBlock:",{aBlock:aBlock},smalltalk.HLConfirmation)})},
 messageSends: []}),
-smalltalk.HLManager);
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "initialize",
+selector: "confirm",
 fn: function (){
 var self=this;
-function $HLInspector(){return smalltalk.HLInspector||(typeof HLInspector=="undefined"?nil:HLInspector)}
-function $HLErrorHandler(){return smalltalk.HLErrorHandler||(typeof HLErrorHandler=="undefined"?nil:HLErrorHandler)}
 return smalltalk.withContext(function($ctx1) { 
-smalltalk.HLWidget.fn.prototype._initialize.apply(_st(self), []);
-_st(self)._registerInspector_($HLInspector());
-_st(self)._registerErrorHandler_($HLErrorHandler());
-_st(_st(self)._keyBinder())._setupEvents();
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLManager)})},
-messageSends: ["initialize", "registerInspector:", "registerErrorHandler:", "setupEvents", "keyBinder"]}),
-smalltalk.HLManager);
+_st(_st(self)._actionBlock())._value();
+_st(self)._remove();
+return self}, function($ctx1) {$ctx1.fill(self,"confirm",{},smalltalk.HLConfirmation)})},
+messageSends: ["value", "actionBlock", "remove"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "keyBinder",
+selector: "confirmationString",
 fn: function (){
 var self=this;
-function $HLKeyBinder(){return smalltalk.HLKeyBinder||(typeof HLKeyBinder=="undefined"?nil:HLKeyBinder)}
 return smalltalk.withContext(function($ctx1) { 
 var $2,$1;
-$2=self["@keyBinder"];
+$2=self["@confirmationString"];
 if(($receiver = $2) == nil || $receiver == undefined){
-self["@keyBinder"]=_st($HLKeyBinder())._new();
-$1=self["@keyBinder"];
+$1="Confirm";
 } else {
 $1=$2;
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"keyBinder",{},smalltalk.HLManager)})},
-messageSends: ["ifNil:", "new"]}),
-smalltalk.HLManager);
+}, function($ctx1) {$ctx1.fill(self,"confirmationString",{},smalltalk.HLConfirmation)})},
+messageSends: ["ifNil:"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "refresh",
+selector: "confirmationString:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@confirmationString"]=aString;
+return self}, function($ctx1) {$ctx1.fill(self,"confirmationString:",{aString:aString},smalltalk.HLConfirmation)})},
+messageSends: []}),
+smalltalk.HLConfirmation);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "remove",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(window)._jQuery_(".navbar"))._remove();
-_st(self)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"refresh",{},smalltalk.HLManager)})},
-messageSends: ["remove", "jQuery:", "appendToJQuery:", "asJQuery"]}),
-smalltalk.HLManager);
+_st(_st(window)._jQuery_(".dialog"))._removeClass_("active");
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+_st(_st(window)._jQuery_("#overlay"))._remove();
+return _st(_st(window)._jQuery_(".dialog"))._remove();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((300));
+return self}, function($ctx1) {$ctx1.fill(self,"remove",{},smalltalk.HLConfirmation)})},
+messageSends: ["removeClass:", "jQuery:", "valueWithTimeout:", "remove"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "registerErrorHandler:",
-fn: function (anErrorHandler){
+selector: "renderButtonsOn:",
+fn: function (html){
 var self=this;
+var confirmButton;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._environment())._registerErrorHandler_(anErrorHandler);
-return self}, function($ctx1) {$ctx1.fill(self,"registerErrorHandler:",{anErrorHandler:anErrorHandler},smalltalk.HLManager)})},
-messageSends: ["registerErrorHandler:", "environment"]}),
-smalltalk.HLManager);
+var $1,$3,$4,$5,$6,$2;
+$1=_st(html)._div();
+_st($1)._class_("buttons");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
+$3=_st(html)._button();
+_st($3)._class_("button");
+_st($3)._with_("Cancel");
+$4=_st($3)._onClick_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self)._cancel();
+}, function($ctx3) {$ctx3.fillBlock({},$ctx2)})}));
+$4;
+$5=_st(html)._button();
+_st($5)._class_("button default");
+_st($5)._with_("Confirm");
+$6=_st($5)._onClick_((function(){
+return smalltalk.withContext(function($ctx3) {
+return _st(self)._confirm();
+}, function($ctx3) {$ctx3.fillBlock({},$ctx2)})}));
+confirmButton=$6;
+return confirmButton;
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+_st(_st(confirmButton)._asJQuery())._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html,confirmButton:confirmButton},smalltalk.HLConfirmation)})},
+messageSends: ["class:", "div", "with:", "button", "onClick:", "cancel", "confirm", "focus", "asJQuery"]}),
+smalltalk.HLConfirmation);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "registerInspector:",
-fn: function (anInspector){
+selector: "renderMainOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._environment())._registerInspector_(anInspector);
-return self}, function($ctx1) {$ctx1.fill(self,"registerInspector:",{anInspector:anInspector},smalltalk.HLManager)})},
-messageSends: ["registerInspector:", "environment"]}),
-smalltalk.HLManager);
+_st(_st(html)._span())._with_(_st(self)._confirmationString());
+return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLConfirmation)})},
+messageSends: ["with:", "confirmationString", "span"]}),
+smalltalk.HLConfirmation);
 
+
+
+smalltalk.addClass('HLRequest', smalltalk.HLConfirmation, ['input', 'value'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "removeActiveTab",
+selector: "confirm",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._removeTab_(_st(self)._activeTab());
-return self}, function($ctx1) {$ctx1.fill(self,"removeActiveTab",{},smalltalk.HLManager)})},
-messageSends: ["removeTab:", "activeTab"]}),
-smalltalk.HLManager);
+_st(_st(self)._actionBlock())._value_(_st(_st(self["@input"])._asJQuery())._val());
+_st(self)._remove();
+return self}, function($ctx1) {$ctx1.fill(self,"confirm",{},smalltalk.HLRequest)})},
+messageSends: ["value:", "val", "asJQuery", "actionBlock", "remove"]}),
+smalltalk.HLRequest);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "large";
+}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLRequest)})},
+messageSends: []}),
+smalltalk.HLRequest);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "renderMainOn:",
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLConfirmation.fn.prototype._renderMainOn_.apply(_st(self), [html]);
+self["@input"]=_st(html)._textarea();
+_st(_st(self["@input"])._asJQuery())._val_(_st(self)._value());
+return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLRequest)})},
+messageSends: ["renderMainOn:", "textarea", "val:", "value", "asJQuery"]}),
+smalltalk.HLRequest);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "value",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$1;
+$2=self["@value"];
+if(($receiver = $2) == nil || $receiver == undefined){
+$1="";
+} else {
+$1=$2;
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"value",{},smalltalk.HLRequest)})},
+messageSends: ["ifNil:"]}),
+smalltalk.HLRequest);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "removeFromHistory:",
-fn: function (aTab){
+selector: "value:",
+fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._history_(_st(_st(self)._history())._reject_((function(each){
-return smalltalk.withContext(function($ctx2) {
-return _st(each).__eq_eq(aTab);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})})));
-return self}, function($ctx1) {$ctx1.fill(self,"removeFromHistory:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["history:", "reject:", "==", "history"]}),
-smalltalk.HLManager);
+self["@value"]=aString;
+return self}, function($ctx1) {$ctx1.fill(self,"value:",{aString:aString},smalltalk.HLRequest)})},
+messageSends: []}),
+smalltalk.HLRequest);
+
 
+
+smalltalk.addClass('HLProgress', smalltalk.HLModal, ['label', 'workBlock', 'collection', 'progressBar'], 'Helios-Core');
 smalltalk.addMethod(
 smalltalk.method({
-selector: "removeTab:",
-fn: function (aTab){
+selector: "collection",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-$1=_st(_st(self)._tabs())._includes_(aTab);
-if(! smalltalk.assert($1)){
-$2=self;
-return $2;
-};
-_st(self)._removeFromHistory_(aTab);
-_st(_st(self)._tabs())._remove_(aTab);
-_st(_st(self)._keyBinder())._flushBindings();
-_st(aTab)._remove();
-_st(self)._refresh();
-_st(_st(self)._history())._ifNotEmpty_((function(){
-return smalltalk.withContext(function($ctx2) {
-return _st(_st(_st(self)._history())._last())._activate();
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"removeTab:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["ifFalse:", "includes:", "tabs", "removeFromHistory:", "remove:", "flushBindings", "keyBinder", "remove", "refresh", "ifNotEmpty:", "activate", "last", "history"]}),
-smalltalk.HLManager);
+var $1;
+$1=self["@collection"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"collection",{},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderAddOn:",
-fn: function (html){
+selector: "collection:",
+fn: function (aCollection){
 var self=this;
-function $HLWidget(){return smalltalk.HLWidget||(typeof HLWidget=="undefined"?nil:HLWidget)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$5,$7,$8,$6,$2;
-$1=_st(html)._li();
-_st($1)._class_("dropdown");
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-$3=_st(html)._a();
-_st($3)._class_("dropdown-toggle");
-_st($3)._at_put_("data-toggle","dropdown");
-$4=_st($3)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-_st(html)._with_("Open...");
-return _st(_st(html)._tag_("b"))._class_("caret");
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-$4;
-$5=_st(html)._ul();
-_st($5)._class_("dropdown-menu");
-$6=_st($5)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(_st(_st(_st($HLWidget())._withAllSubclasses())._select_((function(each){
-return smalltalk.withContext(function($ctx4) {
-return _st(each)._canBeOpenAsTab();
-}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})})))._sorted_((function(a,b){
-return smalltalk.withContext(function($ctx4) {
-return _st(_st(a)._tabPriority()).__lt(_st(b)._tabPriority());
-}, function($ctx4) {$ctx4.fillBlock({a:a,b:b},$ctx1)})})))._do_((function(each){
-return smalltalk.withContext(function($ctx4) {
-return _st(_st(html)._li())._with_((function(){
-return smalltalk.withContext(function($ctx5) {
-$7=_st(html)._a();
-_st($7)._with_(_st(each)._tabLabel());
-$8=_st($7)._onClick_((function(){
-return smalltalk.withContext(function($ctx6) {
-return _st(each)._openAsTab();
-}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
-return $8;
-}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-}, function($ctx4) {$ctx4.fillBlock({each:each},$ctx1)})}));
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return $6;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderAddOn:",{html:html},smalltalk.HLManager)})},
-messageSends: ["class:", "li", "with:", "a", "at:put:", "tag:", "ul", "do:", "tabLabel", "onClick:", "openAsTab", "sorted:", "<", "tabPriority", "select:", "canBeOpenAsTab", "withAllSubclasses"]}),
-smalltalk.HLManager);
+self["@collection"]=aCollection;
+return self}, function($ctx1) {$ctx1.fill(self,"collection:",{aCollection:aCollection},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderContentOn:",
-fn: function (html){
+selector: "evaluateAt:",
+fn: function (anInteger){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$2;
-$1=_st(html)._div();
-_st($1)._class_("navbar navbar-fixed-top");
-$2=_st($1)._with_((function(){
+var $1;
+_st(self)._updateProgress_(_st(_st(anInteger).__slash(_st(_st(self)._collection())._size())).__star((100)));
+$1=_st(_st(_st(self)._collection())._size()).__gt(anInteger);
+if(smalltalk.assert($1)){
+_st((function(){
 return smalltalk.withContext(function($ctx2) {
-$3=_st(html)._div();
-_st($3)._class_("navbar-inner");
-$4=_st($3)._with_((function(){
-return smalltalk.withContext(function($ctx3) {
-return _st(self)._renderTabsOn_(html);
-}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
-return $4;
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLManager)})},
-messageSends: ["class:", "div", "with:", "renderTabsOn:"]}),
-smalltalk.HLManager);
+_st(_st(self)._workBlock())._value_(_st(_st(self)._collection())._at_(anInteger));
+return _st(self)._evaluateAt_(_st(anInteger).__plus((1)));
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((10));
+} else {
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(self)._remove();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._valueWithTimeout_((500));
+};
+return self}, function($ctx1) {$ctx1.fill(self,"evaluateAt:",{anInteger:anInteger},smalltalk.HLProgress)})},
+messageSends: ["updateProgress:", "*", "/", "size", "collection", "ifTrue:ifFalse:", "valueWithTimeout:", "value:", "at:", "workBlock", "evaluateAt:", "+", "remove", ">"]}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "renderTabsOn:",
-fn: function (html){
+selector: "label",
+fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$6,$5,$8,$9,$10,$11,$7,$2;
-$1=_st(html)._ul();
-_st($1)._class_("nav");
-$2=_st($1)._with_((function(){
-return smalltalk.withContext(function($ctx2) {
-_st(_st(self)._tabs())._do_((function(each){
-return smalltalk.withContext(function($ctx3) {
-$3=_st(html)._li();
-$4=$3;
-$6=_st(each)._isActive();
-if(smalltalk.assert($6)){
-$5="active";
-} else {
-$5="inactive";
-};
-_st($4)._class_($5);
-$7=_st($3)._with_((function(){
-return smalltalk.withContext(function($ctx4) {
-$8=_st(html)._a();
-_st($8)._with_((function(){
-return smalltalk.withContext(function($ctx5) {
-_st(_st(_st(html)._tag_("i"))._class_("close"))._onClick_((function(){
-return smalltalk.withContext(function($ctx6) {
-return _st(self)._removeTab_(each);
-}, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
-$9=_st(html)._span();
-_st($9)._class_(_st(each)._cssClass());
-$10=_st($9)._with_(_st(each)._displayLabel());
-return $10;
-}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-$11=_st($8)._onClick_((function(){
-return smalltalk.withContext(function($ctx5) {
-return _st(each)._activate();
-}, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-return $11;
-}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
-return $7;
-}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}));
-return _st(self)._renderAddOn_(html);
-}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderTabsOn:",{html:html},smalltalk.HLManager)})},
-messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "cssClass", "span", "displayLabel", "a", "activate", "tabs", "renderAddOn:"]}),
-smalltalk.HLManager);
+var $1;
+$1=self["@label"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "request:do:",
-fn: function (aString,aBlock){
+selector: "label:",
+fn: function (aString){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._request_value_do_(aString,"",aBlock);
-return self}, function($ctx1) {$ctx1.fill(self,"request:do:",{aString:aString,aBlock:aBlock},smalltalk.HLManager)})},
-messageSends: ["request:value:do:"]}),
-smalltalk.HLManager);
+self["@label"]=aString;
+return self}, function($ctx1) {$ctx1.fill(self,"label:",{aString:aString},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "request:value:do:",
-fn: function (aString,valueString,aBlock){
+selector: "renderButtonsOn:",
+fn: function (html){
 var self=this;
-function $HLRequest(){return smalltalk.HLRequest||(typeof HLRequest=="undefined"?nil:HLRequest)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-$1=_st($HLRequest())._new();
-_st($1)._confirmationString_(aString);
-_st($1)._actionBlock_(aBlock);
-_st($1)._value_(valueString);
-$2=_st($1)._yourself();
-_st($2)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"request:value:do:",{aString:aString,valueString:valueString,aBlock:aBlock},smalltalk.HLManager)})},
-messageSends: ["appendToJQuery:", "asJQuery", "confirmationString:", "new", "actionBlock:", "value:", "yourself"]}),
-smalltalk.HLManager);
+return self}, function($ctx1) {$ctx1.fill(self,"renderButtonsOn:",{html:html},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "show:",
-fn: function (aTab){
+selector: "renderMainOn:",
+fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
-_st(_st(self)._tabs())._do_((function(each){
+var $1,$3,$4,$2;
+_st(_st(html)._span())._with_(_st(self)._label());
+$1=_st(html)._div();
+_st($1)._class_("progress");
+$2=_st($1)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
-return _st(each)._hide();
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
-$1=aTab;
-_st($1)._show();
-$2=_st($1)._focus();
-return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab},smalltalk.HLManager)})},
-messageSends: ["do:", "hide", "tabs", "show", "focus"]}),
-smalltalk.HLManager);
+$3=_st(html)._div();
+_st($3)._class_("bar");
+$4=_st($3)._style_("width: 0%");
+self["@progressBar"]=$4;
+return self["@progressBar"];
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderMainOn:",{html:html},smalltalk.HLProgress)})},
+messageSends: ["with:", "label", "span", "class:", "div", "style:"]}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "tabs",
+selector: "start",
 fn: function (){
 var self=this;
-function $OrderedCollection(){return smalltalk.OrderedCollection||(typeof OrderedCollection=="undefined"?nil:OrderedCollection)}
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@tabs"];
-if(($receiver = $2) == nil || $receiver == undefined){
-self["@tabs"]=_st($OrderedCollection())._new();
-$1=self["@tabs"];
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"tabs",{},smalltalk.HLManager)})},
-messageSends: ["ifNil:", "new"]}),
-smalltalk.HLManager);
-
+_st(self)._evaluateAt_((1));
+return self}, function($ctx1) {$ctx1.fill(self,"start",{},smalltalk.HLProgress)})},
+messageSends: ["evaluateAt:"]}),
+smalltalk.HLProgress);
 
-smalltalk.HLManager.klass.iVarNames = ['current'];
 smalltalk.addMethod(
 smalltalk.method({
-selector: "current",
-fn: function (){
+selector: "updateProgress:",
+fn: function (anInteger){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=self["@current"];
-if(($receiver = $2) == nil || $receiver == undefined){
-self["@current"]=_st(_st(self)._basicNew())._initialize();
-$1=self["@current"];
-} else {
-$1=$2;
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"current",{},smalltalk.HLManager.klass)})},
-messageSends: ["ifNil:", "initialize", "basicNew"]}),
-smalltalk.HLManager.klass);
+_st(_st(self["@progressBar"])._asJQuery())._css_put_("width",_st(_st(anInteger)._asString()).__comma("%"));
+return self}, function($ctx1) {$ctx1.fill(self,"updateProgress:",{anInteger:anInteger},smalltalk.HLProgress)})},
+messageSends: ["css:put:", ",", "asString", "asJQuery"]}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "initialize",
+selector: "workBlock",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(_st(self)._current())._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLManager.klass)})},
-messageSends: ["appendToJQuery:", "asJQuery", "current"]}),
-smalltalk.HLManager.klass);
+var $1;
+$1=self["@workBlock"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"workBlock",{},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "new",
-fn: function (){
+selector: "workBlock:",
+fn: function (aBlock){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-_st(self)._shouldNotImplement();
-return self}, function($ctx1) {$ctx1.fill(self,"new",{},smalltalk.HLManager.klass)})},
-messageSends: ["shouldNotImplement"]}),
-smalltalk.HLManager.klass);
+self["@workBlock"]=aBlock;
+return self}, function($ctx1) {$ctx1.fill(self,"workBlock:",{aBlock:aBlock},smalltalk.HLProgress)})},
+messageSends: []}),
+smalltalk.HLProgress);
+
 
 
 smalltalk.addClass('HLSUnit', smalltalk.HLWidget, [], 'Helios-Core');

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 402 - 397
js/Helios-Core.js


+ 3 - 3
js/Importer-Exporter.deploy.js

@@ -686,15 +686,15 @@ function $Exporter(){return smalltalk.Exporter||(typeof Exporter=="undefined"?ni
 function $StrippedExporter(){return smalltalk.StrippedExporter||(typeof StrippedExporter=="undefined"?nil:StrippedExporter)}
 function $ChunkExporter(){return smalltalk.ChunkExporter||(typeof ChunkExporter=="undefined"?nil:ChunkExporter)}
 return smalltalk.withContext(function($ctx1) { 
-_st([_st($Exporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".js")),_st($StrippedExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".deploy.js")),_st($ChunkExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathSt()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".st"))])._do_((function(commitStrategy){
+_st([_st($Exporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".js")),_st($StrippedExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".deploy.js")),_st($ChunkExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathSt()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".st"))])._do_displayingProgress_((function(commitStrategy){
 var fileContents;
 return smalltalk.withContext(function($ctx2) {
 fileContents=_st(_st(_st(commitStrategy)._key())._new())._exportPackage_(_st(aPackage)._name());
 fileContents;
 return _st(self)._ajaxPutAt_data_(_st(commitStrategy)._value(),fileContents);
-}, function($ctx2) {$ctx2.fillBlock({commitStrategy:commitStrategy,fileContents:fileContents},$ctx1)})}));
+}, function($ctx2) {$ctx2.fillBlock({commitStrategy:commitStrategy,fileContents:fileContents},$ctx1)})}),_st("Committing package ").__comma(_st(aPackage)._name()));
 return self}, function($ctx1) {$ctx1.fill(self,"commit:",{aPackage:aPackage},smalltalk.PackageHandler)})},
-messageSends: ["do:", "exportPackage:", "name", "new", "key", "ajaxPutAt:data:", "value", "->", ",", "commitPathJs", "commitPathSt"]}),
+messageSends: ["do:displayingProgress:", "exportPackage:", "name", "new", "key", "ajaxPutAt:data:", "value", ",", "->", "commitPathJs", "commitPathSt"]}),
 smalltalk.PackageHandler);
 
 smalltalk.addMethod(

+ 4 - 4
js/Importer-Exporter.js

@@ -823,17 +823,17 @@ function $Exporter(){return smalltalk.Exporter||(typeof Exporter=="undefined"?ni
 function $StrippedExporter(){return smalltalk.StrippedExporter||(typeof StrippedExporter=="undefined"?nil:StrippedExporter)}
 function $ChunkExporter(){return smalltalk.ChunkExporter||(typeof ChunkExporter=="undefined"?nil:ChunkExporter)}
 return smalltalk.withContext(function($ctx1) { 
-_st([_st($Exporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".js")),_st($StrippedExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".deploy.js")),_st($ChunkExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathSt()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".st"))])._do_((function(commitStrategy){
+_st([_st($Exporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".js")),_st($StrippedExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathJs()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".deploy.js")),_st($ChunkExporter()).__minus_gt(_st(_st(_st(_st(aPackage)._commitPathSt()).__comma("/")).__comma(_st(aPackage)._name())).__comma(".st"))])._do_displayingProgress_((function(commitStrategy){
 var fileContents;
 return smalltalk.withContext(function($ctx2) {
 fileContents=_st(_st(_st(commitStrategy)._key())._new())._exportPackage_(_st(aPackage)._name());
 fileContents;
 return _st(self)._ajaxPutAt_data_(_st(commitStrategy)._value(),fileContents);
-}, function($ctx2) {$ctx2.fillBlock({commitStrategy:commitStrategy,fileContents:fileContents},$ctx1)})}));
+}, function($ctx2) {$ctx2.fillBlock({commitStrategy:commitStrategy,fileContents:fileContents},$ctx1)})}),_st("Committing package ").__comma(_st(aPackage)._name()));
 return self}, function($ctx1) {$ctx1.fill(self,"commit:",{aPackage:aPackage},smalltalk.PackageHandler)})},
 args: ["aPackage"],
-source: "commit: aPackage\x0a\x09{ \x0a\x09\x09Exporter -> (aPackage commitPathJs, '/', aPackage name, '.js').\x0a\x09\x09StrippedExporter -> (aPackage commitPathJs, '/', aPackage name, '.deploy.js').\x0a\x09\x09ChunkExporter -> (aPackage commitPathSt, '/', aPackage name, '.st')\x0a\x09} \x0a\x09\x09do: [ :commitStrategy|| fileContents |\x0a\x09\x09\x09fileContents := (commitStrategy key new exportPackage: aPackage name).\x0a\x09\x09\x09self ajaxPutAt: commitStrategy value data: fileContents ]",
-messageSends: ["do:", "exportPackage:", "name", "new", "key", "ajaxPutAt:data:", "value", "->", ",", "commitPathJs", "commitPathSt"],
+source: "commit: aPackage\x0a\x09{ \x0a\x09\x09Exporter -> (aPackage commitPathJs, '/', aPackage name, '.js').\x0a\x09\x09StrippedExporter -> (aPackage commitPathJs, '/', aPackage name, '.deploy.js').\x0a\x09\x09ChunkExporter -> (aPackage commitPathSt, '/', aPackage name, '.st')\x0a\x09} \x0a\x09\x09do: [ :commitStrategy|| fileContents |\x0a\x09\x09\x09fileContents := (commitStrategy key new exportPackage: aPackage name).\x0a\x09\x09\x09self ajaxPutAt: commitStrategy value data: fileContents ]\x0a\x09\x09displayingProgress: 'Committing package ', aPackage name",
+messageSends: ["do:displayingProgress:", "exportPackage:", "name", "new", "key", "ajaxPutAt:data:", "value", ",", "->", "commitPathJs", "commitPathSt"],
 referencedClasses: ["Exporter", "StrippedExporter", "ChunkExporter"]
 }),
 smalltalk.PackageHandler);

+ 14 - 2
js/Kernel-Objects.deploy.js

@@ -1919,6 +1919,18 @@ return self}, function($ctx1) {$ctx1.fill(self,"registerInspector:",{anInspector
 messageSends: ["register:"]}),
 smalltalk.Environment);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerProgressHandler:",
+fn: function (aProgressHandler){
+var self=this;
+function $ProgressHandler(){return smalltalk.ProgressHandler||(typeof ProgressHandler=="undefined"?nil:ProgressHandler)}
+return smalltalk.withContext(function($ctx1) { 
+_st($ProgressHandler())._setCurrent_(aProgressHandler);
+return self}, function($ctx1) {$ctx1.fill(self,"registerProgressHandler:",{aProgressHandler:aProgressHandler},smalltalk.Environment)})},
+messageSends: ["setCurrent:"]}),
+smalltalk.Environment);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "removeClass:",
@@ -3648,9 +3660,9 @@ smalltalk.method({
 selector: "register",
 fn: function (){
 var self=this;
-function $ErrorHandler(){return smalltalk.ErrorHandler||(typeof ErrorHandler=="undefined"?nil:ErrorHandler)}
+function $ProgressHandler(){return smalltalk.ProgressHandler||(typeof ProgressHandler=="undefined"?nil:ProgressHandler)}
 return smalltalk.withContext(function($ctx1) { 
-_st($ErrorHandler())._setCurrent_(_st(self)._new());
+_st($ProgressHandler())._setCurrent_(_st(self)._new());
 return self}, function($ctx1) {$ctx1.fill(self,"register",{},smalltalk.ProgressHandler.klass)})},
 messageSends: ["setCurrent:", "new"]}),
 smalltalk.ProgressHandler.klass);

+ 21 - 4
js/Kernel-Objects.js

@@ -2648,6 +2648,23 @@ referencedClasses: ["InspectorHandler"]
 }),
 smalltalk.Environment);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerProgressHandler:",
+category: 'actions',
+fn: function (aProgressHandler){
+var self=this;
+function $ProgressHandler(){return smalltalk.ProgressHandler||(typeof ProgressHandler=="undefined"?nil:ProgressHandler)}
+return smalltalk.withContext(function($ctx1) { 
+_st($ProgressHandler())._setCurrent_(aProgressHandler);
+return self}, function($ctx1) {$ctx1.fill(self,"registerProgressHandler:",{aProgressHandler:aProgressHandler},smalltalk.Environment)})},
+args: ["aProgressHandler"],
+source: "registerProgressHandler: aProgressHandler\x0a\x09ProgressHandler setCurrent: aProgressHandler",
+messageSends: ["setCurrent:"],
+referencedClasses: ["ProgressHandler"]
+}),
+smalltalk.Environment);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "removeClass:",
@@ -4977,14 +4994,14 @@ selector: "register",
 category: 'initialization',
 fn: function (){
 var self=this;
-function $ErrorHandler(){return smalltalk.ErrorHandler||(typeof ErrorHandler=="undefined"?nil:ErrorHandler)}
+function $ProgressHandler(){return smalltalk.ProgressHandler||(typeof ProgressHandler=="undefined"?nil:ProgressHandler)}
 return smalltalk.withContext(function($ctx1) { 
-_st($ErrorHandler())._setCurrent_(_st(self)._new());
+_st($ProgressHandler())._setCurrent_(_st(self)._new());
 return self}, function($ctx1) {$ctx1.fill(self,"register",{},smalltalk.ProgressHandler.klass)})},
 args: [],
-source: "register\x0a\x09ErrorHandler setCurrent: self new",
+source: "register\x0a\x09ProgressHandler setCurrent: self new",
 messageSends: ["setCurrent:", "new"],
-referencedClasses: ["ErrorHandler"]
+referencedClasses: ["ProgressHandler"]
 }),
 smalltalk.ProgressHandler.klass);
 

+ 4 - 4
st/Compiler-Core.st

@@ -195,11 +195,11 @@ parseExpression: aString
 !
 
 recompile: aClass
-	aClass methodDictionary do: [:each |
-		console log: aClass name, ' >> ', each selector.
-		self install: each source forClass: aClass category: each category].
+	aClass methodDictionary values
+		do: [ :each | self install: each source forClass: aClass category: each category ]
+		displayingProgress: 'Recompiling ', aClass name.
 	"self setupClass: aClass."
-	aClass isMetaclass ifFalse: [self recompile: aClass class]
+	aClass isMetaclass ifFalse: [ self recompile: aClass class ]
 !
 
 recompileAll

+ 262 - 140
st/Helios-Core.st

@@ -404,6 +404,23 @@ on: anEnvironment
         yourself
 ! !
 
+ProgressHandler subclass: #HLProgressHandler
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+!HLProgressHandler commentStamp!
+I am a specific progress handler for Helios, displaying progresses in a modal window.!
+
+!HLProgressHandler methodsFor: 'progress handling'!
+
+do: aBlock on: aCollection displaying: aString
+	HLProgress new
+		label: aString;
+		workBlock: aBlock;
+		collection: aCollection;
+		appendToJQuery: 'body' asJQuery;
+		start
+! !
+
 Widget subclass: #HLTab
 	instanceVariableNames: 'widget label root'
 	package: 'Helios-Core'!
@@ -652,145 +669,6 @@ canBeOpenAsTab
 	^ false
 ! !
 
-HLWidget subclass: #HLConfirmation
-	instanceVariableNames: 'confirmationString actionBlock cancelBlock'
-	package: 'Helios-Core'!
-!HLConfirmation commentStamp!
-I display confirmation messages. 
-
-Instead of creating an instance directly, use `HLWidget >> #confirm:ifTrue:`.!
-
-!HLConfirmation methodsFor: 'accessing'!
-
-actionBlock
-	^ actionBlock ifNil: [ [] ]
-!
-
-actionBlock: aBlock
-	actionBlock := aBlock
-!
-
-cancelBlock
-	^ cancelBlock ifNil: [ [] ]
-!
-
-cancelBlock: aBlock
-	cancelBlock := aBlock
-!
-
-confirmationString
-	^ confirmationString ifNil: [ 'Confirm' ]
-!
-
-confirmationString: aString
-	confirmationString := aString
-!
-
-cssClass
-	^ ''
-! !
-
-!HLConfirmation methodsFor: 'actions'!
-
-cancel
-	self cancelBlock value.
-	self remove
-!
-
-confirm
-	self actionBlock value.
-	self remove
-!
-
-remove
-	(window jQuery: '.dialog') removeClass: 'active'.
-	[ 
-		(window jQuery: '#overlay') remove.
-		(window jQuery: '.dialog') remove
-	] valueWithTimeout: 300
-! !
-
-!HLConfirmation methodsFor: 'rendering'!
-
-renderButtonsOn: html
-	| confirmButton |
-	
-	html div 
-		class: 'buttons';
-		with: [
-			html button
-				class: 'button';
-				with: 'Cancel';
-				onClick: [ self cancel ].
-			confirmButton := html button
-				class: 'button default';
-				with: 'Confirm';
-				onClick: [ self confirm ] ].
-
-	confirmButton asJQuery focus
-!
-
-renderContentOn: html
-	| confirmButton |
-	
-	html div id: 'overlay'.
-	html div 
-		class: 'dialog ', self cssClass;
-		with: [
-			self
-				renderMainOn: html;
-				renderButtonsOn: html ].
-
-	(window jQuery: '.dialog') addClass: 'active'.
-	self setupKeyBindings
-!
-
-renderMainOn: html
-	html span with: self confirmationString
-!
-
-setupKeyBindings
-	(window jQuery: '.dialog') keyup: [ :e |
-		e keyCode = 27 ifTrue: [ self cancel ] ]
-! !
-
-HLConfirmation subclass: #HLRequest
-	instanceVariableNames: 'input value'
-	package: 'Helios-Core'!
-!HLRequest commentStamp!
-I display a modal window requesting user input.
-
-Instead of creating instances manually, use `HLWidget >> #request:do:` and `#request:value:do:`.!
-
-!HLRequest methodsFor: 'accessing'!
-
-cssClass
-	^ 'large'
-!
-
-value
-	^ value ifNil: [ '' ]
-!
-
-value: aString
-	value := aString
-! !
-
-!HLRequest methodsFor: 'actions'!
-
-confirm
-	self actionBlock value: input asJQuery val.
-	self remove
-! !
-
-!HLRequest methodsFor: 'rendering'!
-
-renderMainOn: html
-	super renderMainOn: html.
-	input := html textarea.
-	input asJQuery val: self value
-! !
-
 HLWidget subclass: #HLFocusableWidget
 	instanceVariableNames: ''
 	package: 'Helios-Core'!
@@ -1324,6 +1202,10 @@ registerInspector: anInspector
 	self environment registerInspector: anInspector
 !
 
+registerProgressHandler: aProgressHandler
+	self environment registerProgressHandler: aProgressHandler
+!
+
 removeActiveTab
 	self removeTab: self activeTab
 !
@@ -1379,7 +1261,8 @@ defaultEnvironment
 initialize
 	super initialize.
 	self registerInspector: HLInspector.
-	self registerErrorHandler: HLErrorHandler.
+	self registerErrorHandler: ErrorHandler current.
+	self registerProgressHandler: ProgressHandler current.
     self keyBinder setupEvents
 ! !
 
@@ -1467,6 +1350,245 @@ new
 	self shouldNotImplement
 ! !
 
+HLWidget subclass: #HLModal
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+!HLModal commentStamp!
+I implement an abstract modal widget.!
+
+!HLModal methodsFor: 'accessing'!
+
+cssClass
+	^ ''
+! !
+
+!HLModal methodsFor: 'actions'!
+
+cancel
+	self remove
+!
+
+remove
+	(window jQuery: '.dialog') removeClass: 'active'.
+	[ 
+		(window jQuery: '#overlay') remove.
+		(window jQuery: '.dialog') remove
+	] valueWithTimeout: 300
+! !
+
+!HLModal methodsFor: 'rendering'!
+
+renderButtonsOn: html
+!
+
+renderContentOn: html
+	| confirmButton |
+	
+	html div id: 'overlay'.
+	html div 
+		class: 'dialog ', self cssClass;
+		with: [
+			self
+				renderMainOn: html;
+				renderButtonsOn: html ].
+
+	(window jQuery: '.dialog') addClass: 'active'.
+	self setupKeyBindings
+!
+
+renderMainOn: html
+!
+
+setupKeyBindings
+	(window jQuery: '.dialog') keyup: [ :e |
+		e keyCode = 27 ifTrue: [ self cancel ] ]
+! !
+
+HLModal subclass: #HLConfirmation
+	instanceVariableNames: 'confirmationString actionBlock cancelBlock'
+	package: 'Helios-Core'!
+!HLConfirmation commentStamp!
+I display confirmation messages. 
+
+Instead of creating an instance directly, use `HLWidget >> #confirm:ifTrue:`.!
+
+!HLConfirmation methodsFor: 'accessing'!
+
+actionBlock
+	^ actionBlock ifNil: [ [] ]
+!
+
+actionBlock: aBlock
+	actionBlock := aBlock
+!
+
+cancelBlock
+	^ cancelBlock ifNil: [ [] ]
+!
+
+cancelBlock: aBlock
+	cancelBlock := aBlock
+!
+
+confirmationString
+	^ confirmationString ifNil: [ 'Confirm' ]
+!
+
+confirmationString: aString
+	confirmationString := aString
+! !
+
+!HLConfirmation methodsFor: 'actions'!
+
+cancel
+	self cancelBlock value.
+	self remove
+!
+
+confirm
+	self actionBlock value.
+	self remove
+!
+
+remove
+	(window jQuery: '.dialog') removeClass: 'active'.
+	[ 
+		(window jQuery: '#overlay') remove.
+		(window jQuery: '.dialog') remove
+	] valueWithTimeout: 300
+! !
+
+!HLConfirmation methodsFor: 'rendering'!
+
+renderButtonsOn: html
+	| confirmButton |
+	
+	html div 
+		class: 'buttons';
+		with: [
+			html button
+				class: 'button';
+				with: 'Cancel';
+				onClick: [ self cancel ].
+			confirmButton := html button
+				class: 'button default';
+				with: 'Confirm';
+				onClick: [ self confirm ] ].
+
+	confirmButton asJQuery focus
+!
+
+renderMainOn: html
+	html span with: self confirmationString
+! !
+
+HLConfirmation subclass: #HLRequest
+	instanceVariableNames: 'input value'
+	package: 'Helios-Core'!
+!HLRequest commentStamp!
+I display a modal window requesting user input.
+
+Instead of creating instances manually, use `HLWidget >> #request:do:` and `#request:value:do:`.!
+
+!HLRequest methodsFor: 'accessing'!
+
+cssClass
+	^ 'large'
+!
+
+value
+	^ value ifNil: [ '' ]
+!
+
+value: aString
+	value := aString
+! !
+
+!HLRequest methodsFor: 'actions'!
+
+confirm
+	self actionBlock value: input asJQuery val.
+	self remove
+! !
+
+!HLRequest methodsFor: 'rendering'!
+
+renderMainOn: html
+	super renderMainOn: html.
+	input := html textarea.
+	input asJQuery val: self value
+! !
+
+HLModal subclass: #HLProgress
+	instanceVariableNames: 'label workBlock collection progressBar'
+	package: 'Helios-Core'!
+!HLProgress commentStamp!
+I am a widget used to display progress modal dialogs.
+
+See `HLProgressHandler`!
+
+!HLProgress methodsFor: 'accessing'!
+
+collection
+	^ collection
+!
+
+collection: aCollection
+	collection := aCollection
+!
+
+label
+	^ label
+!
+
+label: aString
+	label := aString
+!
+
+workBlock
+	^ workBlock
+!
+
+workBlock: aBlock
+	workBlock := aBlock
+! !
+
+!HLProgress methodsFor: 'actions'!
+
+evaluateAt: anInteger
+	self updateProgress: (anInteger / self collection size) * 100.
+	self collection size > anInteger 
+		ifTrue: [ 
+			self workBlock value: (self collection at: anInteger).
+			[ self evaluateAt: anInteger + 1 ] valueWithTimeout: 1 ]
+		ifFalse: [ [ self remove ] valueWithTimeout: 500 ]
+!
+
+start
+	"Make sure the UI has some time to update itself between each iteration"
+	
+	self evaluateAt: 1
+!
+
+updateProgress: anInteger
+	progressBar asJQuery css: 'width' put: anInteger asString, '%'
+! !
+
+!HLProgress methodsFor: 'rendering'!
+
+renderButtonsOn: html
+!
+
+renderMainOn: html
+	html span with: self label.
+	html div 
+		class: 'progress progress-stripped progress-info active';
+		with: [
+			progressBar := html div 
+				class: 'bar';
+				style: 'width: 0%' ]
+! !
+
 HLWidget subclass: #HLSUnit
 	instanceVariableNames: ''
 	package: 'Helios-Core'!

+ 5 - 1
st/Kernel-Objects.st

@@ -818,6 +818,10 @@ registerInspector: anInspector
 	InspectorHandler register: anInspector
 !
 
+registerProgressHandler: aProgressHandler
+	ProgressHandler setCurrent: aProgressHandler
+!
+
 removeClass: aClass
 	Smalltalk current removeClass: aClass
 !
@@ -1718,7 +1722,7 @@ initialize
 !
 
 register
-	ErrorHandler setCurrent: self new
+	ProgressHandler setCurrent: self new
 ! !
 
 Object subclass: #Random

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác