Browse Source

- Workspace improvements
- changes missing from previous commit

Nicolas Petton 11 years ago
parent
commit
17dd7da85a

+ 48 - 17
css/helios.css

@@ -27,22 +27,39 @@ a {
     cursor: pointer;
 }
 
+.CodeMirror pre {
+    line-height: 16px;
+}
+
 .btn, .btn-group > .btn, .btn-group > .dropdown-menu {
     font-size: 13px;
     padding: 2px 8px;
 }
 
+.navbar .navbar-fixed-top {
+    font-size: 12px;
+    line-height: 16px;
+}
+
 .navbar-inner {
-    min-height: 30px;
+    min-height: 26px;
+}
+
+
+.navbar .nav > li {
+    line-height: 16px;
 }
 
+
 .navbar .nav > li > a {
     padding: 5px 15px;
 }
 
 .navbar-fixed-top i {
     opacity: 0.2;
-    margin-right: 10px;
+    margin-right: 5px;
+    height: 12px;
+    margin-top: 0;
 }
 
 .navbar-fixed-top .active i {
@@ -61,24 +78,11 @@ a {
     margin-right: 2px;
 }
 
-/* .nav-pills.nav-stacked > li > a { */
-/*     width: 14px; */
-/*     height: 14px; */
-/*     display: inline-block; */
-/*     margin-right: 4px; */
-/* } */
-
 .nav-pills > .active > a {
     background: #ccc;
     color: #fff;
 }
 
-/* .focused .nav-pills{ */
-/*     box-shadow: inset 0 0 4px #000AFF; */
-/*     -webkit-box-shadow: inset 0 0 4px #000AFF; */
-/*     -moz-box-shadow: inset 0 0 4px #000AFF; */
-/* } */
-
 .focused .nav-pills > .active > a, .nav-pills > .active > a:hover {
     background: #08C;
 }
@@ -86,7 +90,7 @@ a {
 
 #container {
     position: fixed;
-    top: 30px;
+    top: 26px;
     bottom: 0;
     left: 0;
     right: 0;
@@ -233,7 +237,7 @@ a {
 }
 
 .key_helper .selected {
-    background: #0C8;
+    background: rgb(7, 195, 221);
     height: 30px;
     padding: 4px;
     color: white;
@@ -241,6 +245,16 @@ a {
     text-shadow: 0 -1px 0 #666;
 }
 
+.key_helper .close {
+    font-size: 14px;
+    line-height: 22px;
+}
+
+.key_helper .close:hover {
+    opacity: 0.8;
+}
+
+
 #keybinding-start-helper {
     position: fixed;
     top: 50%;
@@ -254,3 +268,20 @@ a {
     font-size: 16px;
     border-radius: 20px;
 }
+
+#cog-helper {
+    position: fixed;
+    bottom: 4px;
+    left: 4px;
+    z-index: 1000;
+    opacity: 0.6;
+    transition: all .5s;
+    -webkit-transition: all .5s;
+    -moz-transition: all .5s;
+    -o-transition: all .5s;
+    -ms-transition: all .5s;
+}
+
+#cog-helper:hover {
+    opacity: 1;
+}

+ 2 - 2
helios.html

@@ -5,7 +5,6 @@
     <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
     <meta name="author" content="Nicolas Petton" /> 
     <link rel="stylesheet" type="text/css" href='js/lib/bootstrap/css/bootstrap.css' /> 
-    <link rel="stylesheet" type="text/css" href='css/helios.css' /> 
     <link type="image/x-icon" rel="shortcut icon" href="/favicon.ico"/> 
     <script type='text/javascript' src='js/lib/jQuery/jquery-1.8.2.min.js'></script> 
     <script type='text/javascript' src='js/lib/jQuery/jquery-ui-1.8.24.custom.min.js'></script> 
@@ -14,7 +13,8 @@
   </head> 
   <body> 
     
-    <script type='text/javascript'> loadAmber({packages: ['Spaces', 'Helios-Core', 'Helios-Environments', 'Helios-Commands', 'Helios-Layout','Helios-KeyBindings', 'Helios-Browser', 'Helios-Workspace', 'Helios-Inspector', 'Helios-Announcements']}) </script> 
+    <script type='text/javascript'> loadAmber({packages: ['Spaces', 'Helios-Core', 'Helios-Environments', 'Helios-Commands-Core','Helios-Commands-Browser', 'Helios-Layout','Helios-KeyBindings', 'Helios-Browser', 'Helios-Workspace', 'Helios-Inspector', 'Helios-Announcements']}) </script> 
+    <link rel="stylesheet" type="text/css" href='css/helios.css' /> 
     
   </body> 
 </html> 

+ 4 - 22
js/Helios-Browser.deploy.js

@@ -1,5 +1,5 @@
 smalltalk.addPackage('Helios-Browser');
-smalltalk.addClass('HLBrowser', smalltalk.HLWidget, ['model', 'built', 'packagesListWidget', 'classesListWidget', 'protocolsListWidget', 'methodsListWidget', 'sourceWidget'], 'Helios-Browser');
+smalltalk.addClass('HLBrowser', smalltalk.HLWidget, ['model', 'packagesListWidget', 'classesListWidget', 'protocolsListWidget', 'methodsListWidget', 'sourceWidget'], 'Helios-Browser');
 smalltalk.addMethod(
 "_announcer",
 smalltalk.method({
@@ -46,18 +46,6 @@ return $1;
 messageSends: ["environment", "model"]}),
 smalltalk.HLBrowser);
 
-smalltalk.addMethod(
-"_initialize",
-smalltalk.method({
-selector: "initialize",
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.HLWidget.fn.prototype._initialize.apply(_st(self), []);
-self["@built"]=false;
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HLBrowser)})},
-messageSends: ["initialize"]}),
-smalltalk.HLBrowser);
-
 smalltalk.addMethod(
 "_methodsListWidget",
 smalltalk.method({
@@ -164,16 +152,10 @@ smalltalk.method({
 selector: "renderContentOn:",
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._packagesListWidget(),_st(self)._classesListWidget()),_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._protocolsListWidget(),_st(self)._methodsListWidget())),_st(self)._sourceWidget())));
-$1=self["@built"];
-if(! smalltalk.assert($1)){
+return smalltalk.withContext(function($ctx1) { 
_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._packagesListWidget(),_st(self)._classesListWidget()),_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._protocolsListWidget(),_st(self)._methodsListWidget())),_st(self)._sourceWidget())));
 _st(_st(self)._packagesListWidget())._focus();
-self["@built"]=true;
-self["@built"];
-};
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLBrowser)})},
-messageSends: ["with:", "with:with:", "packagesListWidget", "classesListWidget", "protocolsListWidget", "methodsListWidget", "sourceWidget", "ifFalse:", "focus"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLBrowser)})},
+messageSends: ["with:", "with:with:", "packagesListWidget", "classesListWidget", "protocolsListWidget", "methodsListWidget", "sourceWidget", "focus"]}),
 smalltalk.HLBrowser);
 
 smalltalk.addMethod(

+ 5 - 28
js/Helios-Browser.js

@@ -1,5 +1,5 @@
 smalltalk.addPackage('Helios-Browser');
-smalltalk.addClass('HLBrowser', smalltalk.HLWidget, ['model', 'built', 'packagesListWidget', 'classesListWidget', 'protocolsListWidget', 'methodsListWidget', 'sourceWidget'], 'Helios-Browser');
+smalltalk.addClass('HLBrowser', smalltalk.HLWidget, ['model', 'packagesListWidget', 'classesListWidget', 'protocolsListWidget', 'methodsListWidget', 'sourceWidget'], 'Helios-Browser');
 smalltalk.addMethod(
 "_announcer",
 smalltalk.method({
@@ -61,23 +61,6 @@ referencedClasses: []
 }),
 smalltalk.HLBrowser);
 
-smalltalk.addMethod(
-"_initialize",
-smalltalk.method({
-selector: "initialize",
-category: 'initialization',
-fn: function (){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.HLWidget.fn.prototype._initialize.apply(_st(self), []);
-self["@built"]=false;
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HLBrowser)})},
-args: [],
-source: "initialize\x0a\x09super initialize.\x0a\x09built := false",
-messageSends: ["initialize"],
-referencedClasses: []
-}),
-smalltalk.HLBrowser);
-
 smalltalk.addMethod(
 "_methodsListWidget",
 smalltalk.method({
@@ -215,18 +198,12 @@ selector: "renderContentOn:",
 category: 'rendering',
 fn: function (html){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $1;
-_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._packagesListWidget(),_st(self)._classesListWidget()),_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._protocolsListWidget(),_st(self)._methodsListWidget())),_st(self)._sourceWidget())));
-$1=self["@built"];
-if(! smalltalk.assert($1)){
+return smalltalk.withContext(function($ctx1) { 
_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._packagesListWidget(),_st(self)._classesListWidget()),_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._protocolsListWidget(),_st(self)._methodsListWidget())),_st(self)._sourceWidget())));
 _st(_st(self)._packagesListWidget())._focus();
-self["@built"]=true;
-self["@built"];
-};
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLBrowser)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLBrowser)})},
 args: ["html"],
-source: "renderContentOn: html\x0a\x09html with: (HLContainer with: (HLHorizontalSplitter \x0a    \x09with: (HLVerticalSplitter\x0a        \x09with: (HLVerticalSplitter\x0a            \x09with: self packagesListWidget\x0a                with: self classesListWidget)\x0a            with: (HLVerticalSplitter\x0a            \x09with: self protocolsListWidget\x0a                with: self methodsListWidget)) \x0a        with: self sourceWidget)).\x0a\x09\x0a\x09built ifFalse: [\x0a\x09\x09self packagesListWidget focus.\x0a\x09\x09built := true ]",
-messageSends: ["with:", "with:with:", "packagesListWidget", "classesListWidget", "protocolsListWidget", "methodsListWidget", "sourceWidget", "ifFalse:", "focus"],
+source: "renderContentOn: html\x0a\x09html with: (HLContainer with: (HLHorizontalSplitter \x0a    \x09with: (HLVerticalSplitter\x0a        \x09with: (HLVerticalSplitter\x0a            \x09with: self packagesListWidget\x0a                with: self classesListWidget)\x0a            with: (HLVerticalSplitter\x0a            \x09with: self protocolsListWidget\x0a                with: self methodsListWidget)) \x0a        with: self sourceWidget)).\x0a\x09\x0a\x09self packagesListWidget focus",
+messageSends: ["with:", "with:with:", "packagesListWidget", "classesListWidget", "protocolsListWidget", "methodsListWidget", "sourceWidget", "focus"],
 referencedClasses: ["HLVerticalSplitter", "HLHorizontalSplitter", "HLContainer"]
 }),
 smalltalk.HLBrowser);

+ 2 - 2
js/Helios-Commands.deploy.js

@@ -876,9 +876,9 @@ selector: "execute",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.HLWorkspace || HLWorkspace))._openAsTab();
+$1=_st((smalltalk.HLCodeWidget || HLCodeWidget))._openAsTab();
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLOpenWorkspaceCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLOpenWorkspaceCommand)})},
 messageSends: ["openAsTab"]}),
 smalltalk.HLOpenWorkspaceCommand);
 

+ 4 - 4
js/Helios-Commands.js

@@ -1217,13 +1217,13 @@ category: 'executing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
var $1;
-$1=_st((smalltalk.HLWorkspace || HLWorkspace))._openAsTab();
+$1=_st((smalltalk.HLCodeWidget || HLCodeWidget))._openAsTab();
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"execute",{}, smalltalk.HLOpenWorkspaceCommand)})},
+}, function($ctx1) {$ctx1.fill(self,"execute",{},smalltalk.HLOpenWorkspaceCommand)})},
 args: [],
-source: "execute\x0a\x09^ HLWorkspace openAsTab",
+source: "execute\x0a\x09^ HLCodeWidget openAsTab",
 messageSends: ["openAsTab"],
-referencedClasses: ["HLWorkspace"]
+referencedClasses: ["HLCodeWidget"]
 }),
 smalltalk.HLOpenWorkspaceCommand);
 

+ 65 - 8
js/Helios-Core.deploy.js

@@ -22,6 +22,39 @@ return self}, function($ctx1) {$ctx1.fill(self,"add",{}, smalltalk.HLTab)})},
 messageSends: ["addTab:", "manager"]}),
 smalltalk.HLTab);
 
+smalltalk.addMethod(
+"_displayLabel",
+smalltalk.method({
+selector: "displayLabel",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(_st(_st(self)._label())._size()).__gt((20));
+if(smalltalk.assert($2)){
+$1=_st(_st(_st(self)._label())._first_((20))).__comma("...");
+} else {
+$1=_st(self)._label();
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"displayLabel",{},smalltalk.HLTab)})},
+messageSends: ["ifTrue:ifFalse:", ",", "first:", "label", ">", "size"]}),
+smalltalk.HLTab);
+
+smalltalk.addMethod(
+"_focus",
+smalltalk.method({
+selector: "focus",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._widget())._canHaveFocus();
+if(smalltalk.assert($1)){
+_st(_st(self)._widget())._focus();
+};
+return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLTab)})},
+messageSends: ["ifTrue:", "focus", "widget", "canHaveFocus"]}),
+smalltalk.HLTab);
+
 smalltalk.addMethod(
 "_isActive",
 smalltalk.method({
@@ -132,6 +165,17 @@ return self}, function($ctx1) {$ctx1.fill(self,"alert:",{aString:aString}, small
 messageSends: ["alert:"]}),
 smalltalk.HLWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return false;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLWidget)})},
+messageSends: []}),
+smalltalk.HLWidget);
+
 smalltalk.addMethod(
 "_confirm_",
 smalltalk.method({
@@ -306,6 +350,17 @@ return self}, function($ctx1) {$ctx1.fill(self,"blur",{}, smalltalk.HLFocusableW
 messageSends: ["blur", "asJQuery"]}),
 smalltalk.HLFocusableWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLFocusableWidget)})},
+messageSends: []}),
+smalltalk.HLFocusableWidget);
+
 smalltalk.addMethod(
 "_focus",
 smalltalk.method({
@@ -1027,12 +1082,13 @@ return $2;
 };
 _st(self)._removeFromHistory_(aTab);
 _st(_st(self)._tabs())._remove_(aTab);
+_st(_st(self)._keyBinder())._flushBindings();
 _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:", "refresh", "ifNotEmpty:", "activate", "last", "history"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"removeTab:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["ifFalse:", "includes:", "tabs", "removeFromHistory:", "remove:", "flushBindings", "keyBinder", "refresh", "ifNotEmpty:", "activate", "last", "history"]}),
 smalltalk.HLManager);
 
 smalltalk.addMethod(
@@ -1122,10 +1178,10 @@ _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_("icon-remove-circle"))._onClick_((function(){
+return smalltalk.withContext(function($ctx5) {
_st(_st(_st(html)._tag_("i"))._class_("icon-remove"))._onClick_((function(){
 return smalltalk.withContext(function($ctx6) {
return _st(self)._removeTab_(each);
 }, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
-return _st(html)._with_(_st(each)._label());
+return _st(html)._with_(_st(each)._displayLabel());
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $9=_st($8)._onClick_((function(){
 return smalltalk.withContext(function($ctx5) {
return _st(each)._activate();
@@ -1136,8 +1192,8 @@ 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:", "label", "a", "activate", "tabs", "renderAddOn:"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderTabsOn:",{html:html},smalltalk.HLManager)})},
+messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "displayLabel", "a", "activate", "tabs", "renderAddOn:"]}),
 smalltalk.HLManager);
 
 smalltalk.addMethod(
@@ -1148,8 +1204,9 @@ fn: function (aTab){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(window)._jQuery_("#container"))._empty();
 _st(_st(aTab)._widget())._appendToJQuery_(_st("#container")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab}, smalltalk.HLManager)})},
-messageSends: ["empty", "jQuery:", "appendToJQuery:", "asJQuery", "widget"]}),
+_st(aTab)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab},smalltalk.HLManager)})},
+messageSends: ["empty", "jQuery:", "appendToJQuery:", "asJQuery", "widget", "focus"]}),
 smalltalk.HLManager);
 
 smalltalk.addMethod(

+ 88 - 11
js/Helios-Core.js

@@ -32,6 +32,49 @@ referencedClasses: []
 }),
 smalltalk.HLTab);
 
+smalltalk.addMethod(
+"_displayLabel",
+smalltalk.method({
+selector: "displayLabel",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $2,$1;
+$2=_st(_st(_st(self)._label())._size()).__gt((20));
+if(smalltalk.assert($2)){
+$1=_st(_st(_st(self)._label())._first_((20))).__comma("...");
+} else {
+$1=_st(self)._label();
+};
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"displayLabel",{},smalltalk.HLTab)})},
+args: [],
+source: "displayLabel\x0a\x09^ self label size > 20 \x0a\x09\x09ifTrue: [ (self label first: 20), '...' ]\x0a\x09\x09ifFalse: [ self label ]",
+messageSends: ["ifTrue:ifFalse:", ",", "first:", "label", ">", "size"],
+referencedClasses: []
+}),
+smalltalk.HLTab);
+
+smalltalk.addMethod(
+"_focus",
+smalltalk.method({
+selector: "focus",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(self)._widget())._canHaveFocus();
+if(smalltalk.assert($1)){
+_st(_st(self)._widget())._focus();
+};
+return self}, function($ctx1) {$ctx1.fill(self,"focus",{},smalltalk.HLTab)})},
+args: [],
+source: "focus\x0a\x09self widget canHaveFocus ifTrue: [\x0a\x09\x09self widget focus ]",
+messageSends: ["ifTrue:", "focus", "widget", "canHaveFocus"],
+referencedClasses: []
+}),
+smalltalk.HLTab);
+
 smalltalk.addMethod(
 "_isActive",
 smalltalk.method({
@@ -182,6 +225,22 @@ referencedClasses: []
 }),
 smalltalk.HLWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return false;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLWidget)})},
+args: [],
+source: "canHaveFocus\x0a\x09^ false",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLWidget);
+
 smalltalk.addMethod(
 "_confirm_",
 smalltalk.method({
@@ -421,6 +480,22 @@ referencedClasses: []
 }),
 smalltalk.HLFocusableWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLFocusableWidget)})},
+args: [],
+source: "canHaveFocus\x0a\x09^ true",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLFocusableWidget);
+
 smalltalk.addMethod(
 "_focus",
 smalltalk.method({
@@ -1368,14 +1443,15 @@ return $2;
 };
 _st(self)._removeFromHistory_(aTab);
 _st(_st(self)._tabs())._remove_(aTab);
+_st(_st(self)._keyBinder())._flushBindings();
 _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)})},
+return self}, function($ctx1) {$ctx1.fill(self,"removeTab:",{aTab:aTab},smalltalk.HLManager)})},
 args: ["aTab"],
-source: "removeTab: aTab\x0a\x09(self tabs includes: aTab) ifFalse: [ ^ self ].\x0a\x0a\x09self removeFromHistory: aTab.\x0a\x09self tabs remove: aTab.\x0a\x09self refresh.\x0a\x09self history ifNotEmpty: [\x0a\x09\x09self history last activate ]",
-messageSends: ["ifFalse:", "includes:", "tabs", "removeFromHistory:", "remove:", "refresh", "ifNotEmpty:", "activate", "last", "history"],
+source: "removeTab: aTab\x0a\x09(self tabs includes: aTab) ifFalse: [ ^ self ].\x0a\x0a\x09self removeFromHistory: aTab.\x0a\x09self tabs remove: aTab.\x0a\x09self keyBinder flushBindings.\x0a\x09self refresh.\x0a\x09self history ifNotEmpty: [\x0a\x09\x09self history last activate ]",
+messageSends: ["ifFalse:", "includes:", "tabs", "removeFromHistory:", "remove:", "flushBindings", "keyBinder", "refresh", "ifNotEmpty:", "activate", "last", "history"],
 referencedClasses: []
 }),
 smalltalk.HLManager);
@@ -1478,10 +1554,10 @@ _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_("icon-remove-circle"))._onClick_((function(){
+return smalltalk.withContext(function($ctx5) {
_st(_st(_st(html)._tag_("i"))._class_("icon-remove"))._onClick_((function(){
 return smalltalk.withContext(function($ctx6) {
return _st(self)._removeTab_(each);
 }, function($ctx6) {$ctx6.fillBlock({},$ctx1)})}));
-return _st(html)._with_(_st(each)._label());
+return _st(html)._with_(_st(each)._displayLabel());
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
 $9=_st($8)._onClick_((function(){
 return smalltalk.withContext(function($ctx5) {
return _st(each)._activate();
@@ -1492,10 +1568,10 @@ 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)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderTabsOn:",{html:html},smalltalk.HLManager)})},
 args: ["html"],
-source: "renderTabsOn: html\x0a\x09html ul \x0a\x09\x09class: 'nav';\x0a\x09\x09with: [ \x0a        \x09self tabs do: [ :each |\x0a\x09\x09\x09\x09html li \x0a\x09\x09\x09\x09\x09class: (each isActive ifTrue: [ 'active' ] ifFalse: [ 'inactive' ]);\x0a\x09\x09\x09\x09\x09with: [\x0a\x09\x09\x09\x09\x09\x09html a\x0a\x09\x09\x09\x09\x09\x09\x09with: [\x0a      \x09\x09\x09\x09\x09\x09\x09((html tag: 'i') class: 'icon-remove-circle')\x0a  \x09\x09\x09\x09\x09\x09\x09\x09\x09onClick: [ self removeTab: each ].\x0a                              \x09html with: each label ];\x0a\x09\x09\x09\x09\x09\x09\x09onClick: [ each activate ] ] ].\x0a\x09\x09\x09self renderAddOn: html ]",
-messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "label", "a", "activate", "tabs", "renderAddOn:"],
+source: "renderTabsOn: html\x0a\x09html ul \x0a\x09\x09class: 'nav';\x0a\x09\x09with: [ \x0a        \x09self tabs do: [ :each |\x0a\x09\x09\x09\x09html li \x0a\x09\x09\x09\x09\x09class: (each isActive ifTrue: [ 'active' ] ifFalse: [ 'inactive' ]);\x0a\x09\x09\x09\x09\x09with: [\x0a\x09\x09\x09\x09\x09\x09html a\x0a\x09\x09\x09\x09\x09\x09\x09with: [\x0a      \x09\x09\x09\x09\x09\x09\x09((html tag: 'i') class: 'icon-remove')\x0a  \x09\x09\x09\x09\x09\x09\x09\x09\x09onClick: [ self removeTab: each ].\x0a                              \x09html with: each displayLabel ];\x0a\x09\x09\x09\x09\x09\x09\x09onClick: [ each activate ] ] ].\x0a\x09\x09\x09self renderAddOn: html ]",
+messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "displayLabel", "a", "activate", "tabs", "renderAddOn:"],
 referencedClasses: []
 }),
 smalltalk.HLManager);
@@ -1509,10 +1585,11 @@ fn: function (aTab){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(window)._jQuery_("#container"))._empty();
 _st(_st(aTab)._widget())._appendToJQuery_(_st("#container")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab}, smalltalk.HLManager)})},
+_st(aTab)._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"show:",{aTab:aTab},smalltalk.HLManager)})},
 args: ["aTab"],
-source: "show: aTab\x0a\x09(window jQuery: '#container') empty.\x0a\x09aTab widget appendToJQuery: '#container' asJQuery",
-messageSends: ["empty", "jQuery:", "appendToJQuery:", "asJQuery", "widget"],
+source: "show: aTab\x0a\x09(window jQuery: '#container') empty.\x0a\x09aTab widget appendToJQuery: '#container' asJQuery.\x0a\x09aTab focus",
+messageSends: ["empty", "jQuery:", "appendToJQuery:", "asJQuery", "widget", "focus"],
 referencedClasses: []
 }),
 smalltalk.HLManager);

+ 3 - 2
js/Helios-Inspector.deploy.js

@@ -298,8 +298,9 @@ selector: "renderContentOn:",
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._variablesWidget(),_st(self)._displayWidget()),_st(self)._codeWidget())));
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLInspector)})},
-messageSends: ["with:", "with:with:", "variablesWidget", "displayWidget", "codeWidget"]}),
+_st(_st(self)._variablesWidget())._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLInspector)})},
+messageSends: ["with:", "with:with:", "variablesWidget", "displayWidget", "codeWidget", "focus"]}),
 smalltalk.HLInspector);
 
 smalltalk.addMethod(

+ 4 - 3
js/Helios-Inspector.js

@@ -404,10 +404,11 @@ category: 'rendering',
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(html)._with_(_st((smalltalk.HLContainer || HLContainer))._with_(_st((smalltalk.HLHorizontalSplitter || HLHorizontalSplitter))._with_with_(_st((smalltalk.HLVerticalSplitter || HLVerticalSplitter))._with_with_(_st(self)._variablesWidget(),_st(self)._displayWidget()),_st(self)._codeWidget())));
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLInspector)})},
+_st(_st(self)._variablesWidget())._focus();
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLInspector)})},
 args: ["html"],
-source: "renderContentOn: html\x0a   \x09html with: (HLContainer with: (HLHorizontalSplitter\x0a    \x09with: (HLVerticalSplitter \x0a            \x09\x09with: self variablesWidget\x0a            \x09    with: self displayWidget)\x0a        with: self codeWidget))\x0a ",
-messageSends: ["with:", "with:with:", "variablesWidget", "displayWidget", "codeWidget"],
+source: "renderContentOn: html\x0a   \x09html with: (HLContainer with: (HLHorizontalSplitter\x0a    \x09with: (HLVerticalSplitter \x0a            \x09\x09with: self variablesWidget\x0a            \x09    with: self displayWidget)\x0a        with: self codeWidget)).\x0a\x09\x0a\x09self variablesWidget focus\x0a ",
+messageSends: ["with:", "with:with:", "variablesWidget", "displayWidget", "codeWidget", "focus"],
 referencedClasses: ["HLVerticalSplitter", "HLHorizontalSplitter", "HLContainer"]
 }),
 smalltalk.HLInspector);

+ 94 - 28
js/Helios-KeyBindings.deploy.js

@@ -464,16 +464,15 @@ smalltalk.HLBindingGroup);
 
 
 
-smalltalk.addClass('HLKeyBinder', smalltalk.Object, ['modifierKey', 'active', 'helper', 'bindings', 'selectedBinding'], 'Helios-KeyBindings');
+smalltalk.addClass('HLKeyBinder', smalltalk.Object, ['modifierKey', 'helper', 'bindings', 'selectedBinding'], 'Helios-KeyBindings');
 smalltalk.addMethod(
 "_activate",
 smalltalk.method({
 selector: "activate",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@active"]=true;
-_st(_st(self)._helper())._show();
-return self}, function($ctx1) {$ctx1.fill(self,"activate",{}, smalltalk.HLKeyBinder)})},
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._helper())._show();
+return self}, function($ctx1) {$ctx1.fill(self,"activate",{},smalltalk.HLKeyBinder)})},
 messageSends: ["show", "helper"]}),
 smalltalk.HLKeyBinder);
 
@@ -559,10 +558,9 @@ smalltalk.method({
 selector: "deactivate",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@active"]=false;
-self["@selectedBinding"]=nil;
+return smalltalk.withContext(function($ctx1) { 
self["@selectedBinding"]=nil;
 _st(_st(self)._helper())._hide();
-return self}, function($ctx1) {$ctx1.fill(self,"deactivate",{}, smalltalk.HLKeyBinder)})},
+return self}, function($ctx1) {$ctx1.fill(self,"deactivate",{},smalltalk.HLKeyBinder)})},
 messageSends: ["hide", "helper"]}),
 smalltalk.HLKeyBinder);
 
@@ -710,12 +708,15 @@ smalltalk.method({
 selector: "initialize",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@helper"]=_st((smalltalk.HLKeyBinderHelper || HLKeyBinderHelper))._on_(self);
-_st(self["@helper"])._renderStart();
+$1=self["@helper"];
+_st($1)._renderStart();
+$2=_st($1)._renderCog();
 self["@active"]=false;
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HLKeyBinder)})},
-messageSends: ["initialize", "on:", "renderStart"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLKeyBinder)})},
+messageSends: ["initialize", "on:", "renderStart", "renderCog"]}),
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(
@@ -724,16 +725,11 @@ smalltalk.method({
 selector: "isActive",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$1;
-$2=self["@active"];
-if(($receiver = $2) == nil || $receiver == undefined){
-$1=false;
-} else {
-$1=$2;
-};
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(".").__comma(_st(_st(self)._helper())._cssClass()))._asJQuery())._is_(":visible");
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"isActive",{}, smalltalk.HLKeyBinder)})},
-messageSends: ["ifNil:"]}),
+}, function($ctx1) {$ctx1.fill(self,"isActive",{},smalltalk.HLKeyBinder)})},
+messageSends: ["is:", "asJQuery", ",", "cssClass", "helper"]}),
 smalltalk.HLKeyBinder);
 
 smalltalk.addMethod(
@@ -801,8 +797,20 @@ selector: "hide",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(_st(".").__comma(_st(self)._cssClass()))._asJQuery())._remove();
-return self}, function($ctx1) {$ctx1.fill(self,"hide",{}, smalltalk.HLKeyBinderHelper)})},
-messageSends: ["remove", "asJQuery", ",", "cssClass"]}),
+_st(self)._showCog();
+return self}, function($ctx1) {$ctx1.fill(self,"hide",{},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["remove", "asJQuery", ",", "cssClass", "showCog"]}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_hideCog",
+smalltalk.method({
+selector: "hideCog",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st("#cog-helper")._asJQuery())._hide();
+return self}, function($ctx1) {$ctx1.fill(self,"hideCog",{},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["hide", "asJQuery"]}),
 smalltalk.HLKeyBinderHelper);
 
 smalltalk.addMethod(
@@ -881,6 +889,51 @@ return self}, function($ctx1) {$ctx1.fill(self,"renderBindingOn:",{html:html}, s
 messageSends: ["renderOn:html:", "selectedBinding"]}),
 smalltalk.HLKeyBinderHelper);
 
+smalltalk.addMethod(
+"_renderCloseOn_",
+smalltalk.method({
+selector: "renderCloseOn:",
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=_st(html)._a();
+_st($1)._class_("close");
+_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(_st(html)._tag_("i"))._class_("icon-remove");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+$2=_st($1)._onClick_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._keyBinder())._deactivate();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderCloseOn:",{html:html},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["class:", "a", "with:", "tag:", "onClick:", "deactivate", "keyBinder"]}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_renderCog",
+smalltalk.method({
+selector: "renderCog",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
+_st((function(html){
+return smalltalk.withContext(function($ctx2) {
$1=_st(html)._div();
+_st($1)._id_("cog-helper");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
$3=_st(html)._a();
+_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx4) {
return _st(_st(html)._tag_("i"))._class_("icon-cog");
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
+$4=_st($3)._onClick_((function(){
+return smalltalk.withContext(function($ctx4) {
return _st(_st(self)._keyBinder())._activate();
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
+return $4;
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+return $2;
+}, function($ctx2) {$ctx2.fillBlock({html:html},$ctx1)})}))._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"renderCog",{},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["appendToJQuery:", "asJQuery", "id:", "div", "with:", "class:", "tag:", "a", "onClick:", "activate", "keyBinder"]}),
+smalltalk.HLKeyBinderHelper);
+
 smalltalk.addMethod(
 "_renderContentOn_",
 smalltalk.method({
@@ -893,11 +946,12 @@ _st($1)._class_(_st(self)._cssClass());
 $2=_st($1)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
$3=self;
 _st($3)._renderSelectionOn_(html);
-$4=_st($3)._renderBindingOn_(html);
+_st($3)._renderBindingOn_(html);
+$4=_st($3)._renderCloseOn_(html);
 return $4;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLKeyBinderHelper)})},
-messageSends: ["class:", "cssClass", "div", "with:", "renderSelectionOn:", "renderBindingOn:"]}),
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["class:", "cssClass", "div", "with:", "renderSelectionOn:", "renderBindingOn:", "renderCloseOn:"]}),
 smalltalk.HLKeyBinderHelper);
 
 smalltalk.addMethod(
@@ -960,9 +1014,21 @@ smalltalk.method({
 selector: "show",
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"show",{}, smalltalk.HLKeyBinderHelper)})},
-messageSends: ["appendToJQuery:", "asJQuery"]}),
+return smalltalk.withContext(function($ctx1) { 
_st(self)._hideCog();
+_st(self)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"show",{},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["hideCog", "appendToJQuery:", "asJQuery"]}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_showCog",
+smalltalk.method({
+selector: "showCog",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st("#cog-helper")._asJQuery())._show();
+return self}, function($ctx1) {$ctx1.fill(self,"showCog",{},smalltalk.HLKeyBinderHelper)})},
+messageSends: ["show", "asJQuery"]}),
 smalltalk.HLKeyBinderHelper);
 
 

+ 121 - 35
js/Helios-KeyBindings.js

@@ -629,7 +629,7 @@ smalltalk.HLBindingGroup);
 
 
 
-smalltalk.addClass('HLKeyBinder', smalltalk.Object, ['modifierKey', 'active', 'helper', 'bindings', 'selectedBinding'], 'Helios-KeyBindings');
+smalltalk.addClass('HLKeyBinder', smalltalk.Object, ['modifierKey', 'helper', 'bindings', 'selectedBinding'], 'Helios-KeyBindings');
 smalltalk.addMethod(
 "_activate",
 smalltalk.method({
@@ -637,11 +637,10 @@ selector: "activate",
 category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@active"]=true;
-_st(_st(self)._helper())._show();
-return self}, function($ctx1) {$ctx1.fill(self,"activate",{}, smalltalk.HLKeyBinder)})},
+return smalltalk.withContext(function($ctx1) { 
_st(_st(self)._helper())._show();
+return self}, function($ctx1) {$ctx1.fill(self,"activate",{},smalltalk.HLKeyBinder)})},
 args: [],
-source: "activate\x0a\x09active := true.\x0a\x09self helper show",
+source: "activate\x0a\x09self helper show",
 messageSends: ["show", "helper"],
 referencedClasses: []
 }),
@@ -760,12 +759,11 @@ selector: "deactivate",
 category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
self["@active"]=false;
-self["@selectedBinding"]=nil;
+return smalltalk.withContext(function($ctx1) { 
self["@selectedBinding"]=nil;
 _st(_st(self)._helper())._hide();
-return self}, function($ctx1) {$ctx1.fill(self,"deactivate",{}, smalltalk.HLKeyBinder)})},
+return self}, function($ctx1) {$ctx1.fill(self,"deactivate",{},smalltalk.HLKeyBinder)})},
 args: [],
-source: "deactivate\x0a\x09active := false.\x0a    selectedBinding := nil.\x0a\x09self helper hide",
+source: "deactivate\x0a    selectedBinding := nil.\x0a\x09self helper hide",
 messageSends: ["hide", "helper"],
 referencedClasses: []
 }),
@@ -956,14 +954,17 @@ selector: "initialize",
 category: 'initialization',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 self["@helper"]=_st((smalltalk.HLKeyBinderHelper || HLKeyBinderHelper))._on_(self);
-_st(self["@helper"])._renderStart();
+$1=self["@helper"];
+_st($1)._renderStart();
+$2=_st($1)._renderCog();
 self["@active"]=false;
-return self}, function($ctx1) {$ctx1.fill(self,"initialize",{}, smalltalk.HLKeyBinder)})},
+return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.HLKeyBinder)})},
 args: [],
-source: "initialize\x0a\x09super initialize.\x0a\x09helper := HLKeyBinderHelper on: self.\x0a\x09helper renderStart.\x0a    active := false",
-messageSends: ["initialize", "on:", "renderStart"],
+source: "initialize\x0a\x09super initialize.\x0a\x09helper := HLKeyBinderHelper on: self.\x0a\x09helper \x09\x0a\x09\x09renderStart;\x0a\x09\x09renderCog.\x0a    active := false",
+messageSends: ["initialize", "on:", "renderStart", "renderCog"],
 referencedClasses: ["HLKeyBinderHelper"]
 }),
 smalltalk.HLKeyBinder);
@@ -975,18 +976,13 @@ selector: "isActive",
 category: 'testing',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
var $2,$1;
-$2=self["@active"];
-if(($receiver = $2) == nil || $receiver == undefined){
-$1=false;
-} else {
-$1=$2;
-};
+return smalltalk.withContext(function($ctx1) { 
var $1;
+$1=_st(_st(_st(".").__comma(_st(_st(self)._helper())._cssClass()))._asJQuery())._is_(":visible");
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"isActive",{}, smalltalk.HLKeyBinder)})},
+}, function($ctx1) {$ctx1.fill(self,"isActive",{},smalltalk.HLKeyBinder)})},
 args: [],
-source: "isActive\x0a\x09^ active ifNil: [ false ]",
-messageSends: ["ifNil:"],
+source: "isActive\x0a\x09^ ('.', self helper cssClass) asJQuery is: ':visible'",
+messageSends: ["is:", "asJQuery", ",", "cssClass", "helper"],
 referencedClasses: []
 }),
 smalltalk.HLKeyBinder);
@@ -1077,10 +1073,27 @@ category: 'actions',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
_st(_st(_st(".").__comma(_st(self)._cssClass()))._asJQuery())._remove();
-return self}, function($ctx1) {$ctx1.fill(self,"hide",{}, smalltalk.HLKeyBinderHelper)})},
+_st(self)._showCog();
+return self}, function($ctx1) {$ctx1.fill(self,"hide",{},smalltalk.HLKeyBinderHelper)})},
 args: [],
-source: "hide\x0a\x09('.', self cssClass) asJQuery remove",
-messageSends: ["remove", "asJQuery", ",", "cssClass"],
+source: "hide\x0a\x09('.', self cssClass) asJQuery remove.\x0a\x09self showCog",
+messageSends: ["remove", "asJQuery", ",", "cssClass", "showCog"],
+referencedClasses: []
+}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_hideCog",
+smalltalk.method({
+selector: "hideCog",
+category: 'actions',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st("#cog-helper")._asJQuery())._hide();
+return self}, function($ctx1) {$ctx1.fill(self,"hideCog",{},smalltalk.HLKeyBinderHelper)})},
+args: [],
+source: "hideCog\x0a\x09'#cog-helper' asJQuery hide",
+messageSends: ["hide", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.HLKeyBinderHelper);
@@ -1186,6 +1199,61 @@ referencedClasses: []
 }),
 smalltalk.HLKeyBinderHelper);
 
+smalltalk.addMethod(
+"_renderCloseOn_",
+smalltalk.method({
+selector: "renderCloseOn:",
+category: 'rendering',
+fn: function (html){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$2;
+$1=_st(html)._a();
+_st($1)._class_("close");
+_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(_st(html)._tag_("i"))._class_("icon-remove");
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+$2=_st($1)._onClick_((function(){
+return smalltalk.withContext(function($ctx2) {
return _st(_st(self)._keyBinder())._deactivate();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"renderCloseOn:",{html:html},smalltalk.HLKeyBinderHelper)})},
+args: ["html"],
+source: "renderCloseOn: html\x0a\x09html a\x0a\x09\x09class: 'close';\x0a\x09\x09with: [ (html tag: 'i') class: 'icon-remove' ];\x0a\x09\x09onClick: [ self keyBinder deactivate ]",
+messageSends: ["class:", "a", "with:", "tag:", "onClick:", "deactivate", "keyBinder"],
+referencedClasses: []
+}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_renderCog",
+smalltalk.method({
+selector: "renderCog",
+category: 'rendering',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
var $1,$3,$4,$2;
+_st((function(html){
+return smalltalk.withContext(function($ctx2) {
$1=_st(html)._div();
+_st($1)._id_("cog-helper");
+$2=_st($1)._with_((function(){
+return smalltalk.withContext(function($ctx3) {
$3=_st(html)._a();
+_st($3)._with_((function(){
+return smalltalk.withContext(function($ctx4) {
return _st(_st(html)._tag_("i"))._class_("icon-cog");
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
+$4=_st($3)._onClick_((function(){
+return smalltalk.withContext(function($ctx4) {
return _st(_st(self)._keyBinder())._activate();
+}, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
+return $4;
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
+return $2;
+}, function($ctx2) {$ctx2.fillBlock({html:html},$ctx1)})}))._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"renderCog",{},smalltalk.HLKeyBinderHelper)})},
+args: [],
+source: "renderCog\x0a\x09[ :html |\x0a\x09\x09html \x0a\x09\x09\x09div id: 'cog-helper'; \x0a\x09\x09\x09with: [\x0a\x09\x09\x09\x09html a \x0a\x09\x09\x09\x09\x09with: [ (html tag: 'i') class: 'icon-cog' ];\x0a\x09\x09\x09\x09\x09onClick: [ self keyBinder activate ] ] ]\x0a\x09\x09appendToJQuery: 'body' asJQuery",
+messageSends: ["appendToJQuery:", "asJQuery", "id:", "div", "with:", "class:", "tag:", "a", "onClick:", "activate", "keyBinder"],
+referencedClasses: []
+}),
+smalltalk.HLKeyBinderHelper);
+
 smalltalk.addMethod(
 "_renderContentOn_",
 smalltalk.method({
@@ -1199,13 +1267,14 @@ _st($1)._class_(_st(self)._cssClass());
 $2=_st($1)._with_((function(){
 return smalltalk.withContext(function($ctx2) {
$3=self;
 _st($3)._renderSelectionOn_(html);
-$4=_st($3)._renderBindingOn_(html);
+_st($3)._renderBindingOn_(html);
+$4=_st($3)._renderCloseOn_(html);
 return $4;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html}, smalltalk.HLKeyBinderHelper)})},
+return self}, function($ctx1) {$ctx1.fill(self,"renderContentOn:",{html:html},smalltalk.HLKeyBinderHelper)})},
 args: ["html"],
-source: "renderContentOn: html\x0a\x09html div class: self cssClass; with: [\x0a      \x09self \x0a        \x09renderSelectionOn:html;\x0a          \x09renderBindingOn: html ]",
-messageSends: ["class:", "cssClass", "div", "with:", "renderSelectionOn:", "renderBindingOn:"],
+source: "renderContentOn: html\x0a\x09html div class: self cssClass; with: [\x0a      \x09self \x0a        \x09renderSelectionOn:html;\x0a          \x09renderBindingOn: html;\x0a\x09\x09\x09renderCloseOn: html ]",
+messageSends: ["class:", "cssClass", "div", "with:", "renderSelectionOn:", "renderBindingOn:", "renderCloseOn:"],
 referencedClasses: []
 }),
 smalltalk.HLKeyBinderHelper);
@@ -1286,11 +1355,28 @@ selector: "show",
 category: 'actions',
 fn: function (){
 var self=this;
-return smalltalk.withContext(function($ctx1) { 
_st(self)._appendToJQuery_(_st("body")._asJQuery());
-return self}, function($ctx1) {$ctx1.fill(self,"show",{}, smalltalk.HLKeyBinderHelper)})},
+return smalltalk.withContext(function($ctx1) { 
_st(self)._hideCog();
+_st(self)._appendToJQuery_(_st("body")._asJQuery());
+return self}, function($ctx1) {$ctx1.fill(self,"show",{},smalltalk.HLKeyBinderHelper)})},
+args: [],
+source: "show\x0a\x09self hideCog.\x0a\x09self appendToJQuery: 'body' asJQuery",
+messageSends: ["hideCog", "appendToJQuery:", "asJQuery"],
+referencedClasses: []
+}),
+smalltalk.HLKeyBinderHelper);
+
+smalltalk.addMethod(
+"_showCog",
+smalltalk.method({
+selector: "showCog",
+category: 'actions',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
_st(_st("#cog-helper")._asJQuery())._show();
+return self}, function($ctx1) {$ctx1.fill(self,"showCog",{},smalltalk.HLKeyBinderHelper)})},
 args: [],
-source: "show\x0a\x09self appendToJQuery: 'body' asJQuery",
-messageSends: ["appendToJQuery:", "asJQuery"],
+source: "showCog\x0a\x09'#cog-helper' asJQuery show",
+messageSends: ["show", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.HLKeyBinderHelper);

+ 11 - 0
js/Helios-Workspace.deploy.js

@@ -147,6 +147,17 @@ return $1;
 messageSends: ["announcer", "model"]}),
 smalltalk.HLCodeWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLCodeWidget)})},
+messageSends: []}),
+smalltalk.HLCodeWidget);
+
 smalltalk.addMethod(
 "_clear",
 smalltalk.method({

+ 16 - 0
js/Helios-Workspace.js

@@ -197,6 +197,22 @@ referencedClasses: []
 }),
 smalltalk.HLCodeWidget);
 
+smalltalk.addMethod(
+"_canHaveFocus",
+smalltalk.method({
+selector: "canHaveFocus",
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
return true;
+}, function($ctx1) {$ctx1.fill(self,"canHaveFocus",{},smalltalk.HLCodeWidget)})},
+args: [],
+source: "canHaveFocus\x0a\x09^ true",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLCodeWidget);
+
 smalltalk.addMethod(
 "_clear",
 smalltalk.method({

+ 2 - 11
st/Helios-Browser.st

@@ -1,6 +1,6 @@
 Smalltalk current createPackage: 'Helios-Browser'!
 HLWidget subclass: #HLBrowser
- instanceVariableNames: 'model built packagesListWidget classesListWidget protocolsListWidget methodsListWidget sourceWidget'
+ instanceVariableNames: 'model packagesListWidget classesListWidget protocolsListWidget methodsListWidget sourceWidget'
  package: 'Helios-Browser'!
 
 !HLBrowser methodsFor: 'accessing'!
@@ -21,13 +21,6 @@ model: aModel
 	model := aModel
 ! !
 
-!HLBrowser methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	built := false
-! !
-
 !HLBrowser methodsFor: 'keybindings'!
 
 registerBindingsOn: aBindingGroup
@@ -68,9 +61,7 @@ renderContentOn: html
                 with: self methodsListWidget)) 
         with: self sourceWidget)).
 	
-	built ifFalse: [
-		self packagesListWidget focus.
-		built := true ]
+	self packagesListWidget focus
 ! !
 
 !HLBrowser methodsFor: 'widgets'!

+ 1 - 1
st/Helios-Commands.st

@@ -465,7 +465,7 @@ HLOpenCommand subclass: #HLOpenWorkspaceCommand
 !HLOpenWorkspaceCommand methodsFor: 'executing'!
 
 execute
-	^ HLWorkspace openAsTab
+	^ HLCodeWidget openAsTab
 ! !
 
 !HLOpenWorkspaceCommand class methodsFor: 'accessing'!

+ 46 - 21
st/Helios-Core.st

@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Helios-Core'!
 Object subclass: #HLTab
-	instanceVariableNames: 'widget label'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'widget label'
+ package: 'Helios-Core'!
 
 !HLTab methodsFor: 'accessing'!
 
@@ -13,6 +13,17 @@ add
 	self manager addTab: self
 !
 
+displayLabel
+	^ self label size > 20 
+		ifTrue: [ (self label first: 20), '...' ]
+		ifFalse: [ self label ]
+!
+
+focus
+	self widget canHaveFocus ifTrue: [
+		self widget focus ]
+!
+
 label
 	^ label ifNil: [ '' ]
 !
@@ -49,8 +60,8 @@ on: aWidget labelled: aString
 ! !
 
 Widget subclass: #HLWidget
-	instanceVariableNames: 'wrapper'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'wrapper'
+ package: 'Helios-Core'!
 
 !HLWidget methodsFor: 'accessing'!
 
@@ -93,6 +104,12 @@ renderOn: html
     [ :renderer | self renderContentOn: renderer ] appendToJQuery: wrapper asJQuery
 ! !
 
+!HLWidget methodsFor: 'testing'!
+
+canHaveFocus
+	^ false
+! !
+
 !HLWidget methodsFor: 'updating'!
 
 refresh
@@ -124,12 +141,12 @@ canBeOpenAsTab
 ! !
 
 HLWidget subclass: #HLDebugger
-	instanceVariableNames: ''
-	package: 'Helios-Core'!
+ instanceVariableNames: ''
+ package: 'Helios-Core'!
 
 HLWidget subclass: #HLFocusableWidget
-	instanceVariableNames: 'hiddenInput'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'hiddenInput'
+ package: 'Helios-Core'!
 
 !HLFocusableWidget methodsFor: 'accessing'!
 
@@ -174,9 +191,15 @@ renderOn: html
 			self renderContentOn: html ]
 ! !
 
+!HLFocusableWidget methodsFor: 'testing'!
+
+canHaveFocus
+	^ true
+! !
+
 HLFocusableWidget subclass: #HLListWidget
-	instanceVariableNames: 'items selectedItem'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'items selectedItem'
+ package: 'Helios-Core'!
 
 !HLListWidget methodsFor: 'accessing'!
 
@@ -312,8 +335,8 @@ renderListOn: html
 ! !
 
 HLListWidget subclass: #HLNavigationListWidget
-	instanceVariableNames: 'previous next'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'previous next'
+ package: 'Helios-Core'!
 
 !HLNavigationListWidget methodsFor: 'accessing'!
 
@@ -358,8 +381,8 @@ setupKeyBindings
 ! !
 
 HLWidget subclass: #HLManager
-	instanceVariableNames: 'tabs activeTab keyBinder environment history'
-	package: 'Helios-Core'!
+ instanceVariableNames: 'tabs activeTab keyBinder environment history'
+ package: 'Helios-Core'!
 
 !HLManager methodsFor: 'accessing'!
 
@@ -428,6 +451,7 @@ removeTab: aTab
 
 	self removeFromHistory: aTab.
 	self tabs remove: aTab.
+	self keyBinder flushBindings.
 	self refresh.
 	self history ifNotEmpty: [
 		self history last activate ]
@@ -496,16 +520,17 @@ renderTabsOn: html
 					with: [
 						html a
 							with: [
-      							((html tag: 'i') class: 'icon-remove-circle')
+      							((html tag: 'i') class: 'icon-remove')
   									onClick: [ self removeTab: each ].
-                              	html with: each label ];
+                              	html with: each displayLabel ];
 							onClick: [ each activate ] ] ].
 			self renderAddOn: html ]
 !
 
 show: aTab
 	(window jQuery: '#container') empty.
-	aTab widget appendToJQuery: '#container' asJQuery
+	aTab widget appendToJQuery: '#container' asJQuery.
+	aTab focus
 ! !
 
 HLManager class instanceVariableNames: 'current'!
@@ -531,8 +556,8 @@ new
 ! !
 
 HLWidget subclass: #HLSUnit
-	instanceVariableNames: ''
-	package: 'Helios-Core'!
+ instanceVariableNames: ''
+ package: 'Helios-Core'!
 
 !HLSUnit class methodsFor: 'accessing'!
 
@@ -551,8 +576,8 @@ canBeOpenAsTab
 ! !
 
 HLWidget subclass: #HLTranscript
-	instanceVariableNames: ''
-	package: 'Helios-Core'!
+ instanceVariableNames: ''
+ package: 'Helios-Core'!
 
 !HLTranscript class methodsFor: 'accessing'!
 

+ 11 - 9
st/Helios-Inspector.st

@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Helios-Inspector'!
 HLWidget subclass: #HLInspector
-	instanceVariableNames: 'model variablesWidget displayWidget codeWidget label'
-	package: 'Helios-Inspector'!
+ instanceVariableNames: 'model variablesWidget displayWidget codeWidget label'
+ package: 'Helios-Inspector'!
 
 !HLInspector methodsFor: 'accessing'!
 
@@ -145,7 +145,9 @@ renderContentOn: html
     	with: (HLVerticalSplitter 
             		with: self variablesWidget
             	    with: self displayWidget)
-        with: self codeWidget))
+        with: self codeWidget)).
+	
+	self variablesWidget focus
 ! !
 
 !HLInspector class methodsFor: 'accessing'!
@@ -165,8 +167,8 @@ canBeOpenAsTab
 ! !
 
 HLNavigationListWidget subclass: #HLInspectorDisplayWidget
-	instanceVariableNames: 'model'
-	package: 'Helios-Inspector'!
+ instanceVariableNames: 'model'
+ package: 'Helios-Inspector'!
 
 !HLInspectorDisplayWidget methodsFor: 'accessing'!
 
@@ -196,8 +198,8 @@ selectionDisplayString
 ! !
 
 Object subclass: #HLInspectorModel
-	instanceVariableNames: 'announcer environment inspectee code variables selection'
-	package: 'Helios-Inspector'!
+ instanceVariableNames: 'announcer environment inspectee code variables selection'
+ package: 'Helios-Inspector'!
 
 !HLInspectorModel methodsFor: 'accessing'!
 
@@ -301,8 +303,8 @@ on: anEnvironment
 ! !
 
 HLNavigationListWidget subclass: #HLInspectorVariablesWidget
-	instanceVariableNames: 'announcer model list diveButton'
-	package: 'Helios-Inspector'!
+ instanceVariableNames: 'announcer model list diveButton'
+ package: 'Helios-Inspector'!
 
 !HLInspectorVariablesWidget methodsFor: 'accessing'!
 

+ 36 - 7
st/Helios-KeyBindings.st

@@ -188,7 +188,7 @@ isBindingGroup
 ! !
 
 Object subclass: #HLKeyBinder
- instanceVariableNames: 'modifierKey active helper bindings selectedBinding'
+ instanceVariableNames: 'modifierKey helper bindings selectedBinding'
  package: 'Helios-KeyBindings'!
 
 !HLKeyBinder methodsFor: 'accessing'!
@@ -222,7 +222,6 @@ selectedBinding
 !HLKeyBinder methodsFor: 'actions'!
 
 activate
-	active := true.
 	self helper show
 !
 
@@ -241,7 +240,6 @@ applyBindingGroup: aBinding
 !
 
 deactivate
-	active := false.
     selectedBinding := nil.
 	self helper hide
 !
@@ -315,14 +313,16 @@ setupEvents
 initialize
 	super initialize.
 	helper := HLKeyBinderHelper on: self.
-	helper renderStart.
+	helper 	
+		renderStart;
+		renderCog.
     active := false
 ! !
 
 !HLKeyBinder methodsFor: 'testing'!
 
 isActive
-	^ active ifNil: [ false ]
+	^ ('.', self helper cssClass) asJQuery is: ':visible'
 !
 
 systemIsMac
@@ -354,11 +354,21 @@ selectedBinding
 !HLKeyBinderHelper methodsFor: 'actions'!
 
 hide
-	('.', self cssClass) asJQuery remove
+	('.', self cssClass) asJQuery remove.
+	self showCog
+!
+
+hideCog
+	'#cog-helper' asJQuery hide
 !
 
 show
+	self hideCog.
 	self appendToJQuery: 'body' asJQuery
+!
+
+showCog
+	'#cog-helper' asJQuery show
 ! !
 
 !HLKeyBinderHelper methodsFor: 'keyBindings'!
@@ -385,11 +395,30 @@ renderBindingOn: html
 	self selectedBinding renderOn: self html: html
 !
 
+renderCloseOn: html
+	html a
+		class: 'close';
+		with: [ (html tag: 'i') class: 'icon-remove' ];
+		onClick: [ self keyBinder deactivate ]
+!
+
+renderCog
+	[ :html |
+		html 
+			div id: 'cog-helper'; 
+			with: [
+				html a 
+					with: [ (html tag: 'i') class: 'icon-cog' ];
+					onClick: [ self keyBinder activate ] ] ]
+		appendToJQuery: 'body' asJQuery
+!
+
 renderContentOn: html
 	html div class: self cssClass; with: [
       	self 
         	renderSelectionOn:html;
-          	renderBindingOn: html ]
+          	renderBindingOn: html;
+			renderCloseOn: html ]
 !
 
 renderSelectionOn: html

+ 10 - 6
st/Helios-Workspace.st

@@ -1,7 +1,7 @@
 Smalltalk current createPackage: 'Helios-Workspace'!
 Object subclass: #HLCodeModel
-	instanceVariableNames: 'announcer environment receiver'
-	package: 'Helios-Workspace'!
+ instanceVariableNames: 'announcer environment receiver'
+ package: 'Helios-Workspace'!
 
 !HLCodeModel methodsFor: 'accessing'!
 
@@ -52,8 +52,8 @@ on: anEnvironment
 ! !
 
 HLWidget subclass: #HLCodeWidget
-	instanceVariableNames: 'model wrapper code editor'
-	package: 'Helios-Workspace'!
+ instanceVariableNames: 'model wrapper code editor'
+ package: 'Helios-Workspace'!
 
 !HLCodeWidget methodsFor: 'accessing'!
 
@@ -239,6 +239,10 @@ renderContentOn: html
 
 !HLCodeWidget methodsFor: 'testing'!
 
+canHaveFocus
+	^ true
+!
+
 hasFocus
 	^ code asJQuery is: ':active'
 ! !
@@ -354,8 +358,8 @@ canBeOpenAsTab
 ! !
 
 HLCodeWidget subclass: #HLSourceCodeWidget
-	instanceVariableNames: 'browserModel'
-	package: 'Helios-Workspace'!
+ instanceVariableNames: 'browserModel'
+ package: 'Helios-Workspace'!
 
 !HLSourceCodeWidget methodsFor: 'accessing'!