Browse Source

Helios:
- Debugger improvements
- New icons

Nicolas Petton 11 years ago
parent
commit
7f4eb2380c

+ 72 - 27
js/Helios-Browser.deploy.js

@@ -250,6 +250,17 @@ return $2;
 messageSends: ["ifNil:", ",", "asString", "+"]}),
 smalltalk.HLBrowser.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "browser";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLBrowser.klass)})},
+messageSends: []}),
+smalltalk.HLBrowser.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -865,6 +876,23 @@ smalltalk.HLClassCache.klass);
 
 
 smalltalk.addClass('HLClassesListWidget', smalltalk.HLToolListWidget, [], 'Helios-Browser');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st(_st(_st(aClass)._theNonMetaClass())._comment())._isEmpty();
+if(smalltalk.assert($1)){
+return "uncommented";
+};
+$2=_st(_st(aClass)._theNonMetaClass())._heliosClass();
+return $2;
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
+messageSends: ["ifTrue:", "isEmpty", "comment", "theNonMetaClass", "heliosClass"]}),
+smalltalk.HLClassesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focusMethodsListWidget",
@@ -921,24 +949,6 @@ return $1;
 messageSends: ["select:", "not", "includes:", "superclass"]}),
 smalltalk.HLClassesListWidget);
 
-smalltalk.addMethod(
-smalltalk.method({
-selector: "iconForItem:",
-fn: function (aClass){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=_st(_st(_st(aClass)._theNonMetaClass())._comment())._isEmpty();
-if(smalltalk.assert($2)){
-$1="icon-question-sign";
-} else {
-$1="icon-none";
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
-messageSends: ["ifFalse:ifTrue:", "isEmpty", "comment", "theNonMetaClass"]}),
-smalltalk.HLClassesListWidget);
-
 smalltalk.addMethod(
 smalltalk.method({
 selector: "label",
@@ -1284,13 +1294,13 @@ li=_st(html)._li();
 _st(self)._registerMappingFrom_to_(aClass,li);
 $1=li;
 _st($1)._at_put_("list-data",_st(_st(self)._items())._indexOf_(aClass));
-_st($1)._class_(_st(self)._cssClassForItem_(aClass));
+_st($1)._class_(_st(self)._listCssClassForItem_(aClass));
 $2=_st($1)._with_((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)._iconForItem_(aClass));
+_st(_st(html)._tag_("i"))._class_(_st(self)._cssClassForItem_(aClass));
 return _st(self)._renderItemLabel_level_on_(aClass,anInteger,html);
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 $4=_st($3)._onClick_((function(){
@@ -1304,7 +1314,7 @@ return smalltalk.withContext(function($ctx2) {
 return _st(self)._renderItem_level_on_(each,_st(anInteger).__plus((1)),html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li},smalltalk.HLClassesListWidget)})},
-messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"]}),
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"]}),
 smalltalk.HLClassesListWidget);
 
 smalltalk.addMethod(
@@ -1831,7 +1841,7 @@ smalltalk.HLMethodsListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "iconForItem:",
+selector: "cssClassForItem:",
 fn: function (aSelector){
 var self=this;
 var override,overriden,method;
@@ -1844,20 +1854,20 @@ $2=override;
 if(smalltalk.assert($2)){
 $3=overriden;
 if(smalltalk.assert($3)){
-$1="icon-resize-vertical";
+$1="override-overridden";
 } else {
-$1="icon-arrow-up";
+$1="override";
 };
 } else {
 $4=overriden;
 if(smalltalk.assert($4)){
-$1="icon-arrow-down";
+$1="overridden";
 } else {
-$1="icon-none";
+$1="";
 };
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{aSelector:aSelector,override:override,overriden:overriden,method:method},smalltalk.HLMethodsListWidget)})},
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{aSelector:aSelector,override:override,overriden:overriden,method:method},smalltalk.HLMethodsListWidget)})},
 messageSends: ["methodForSelector:", "isOverride:", "isOverridden:", "ifTrue:ifFalse:"]}),
 smalltalk.HLMethodsListWidget);
 
@@ -2346,6 +2356,17 @@ return self}, function($ctx1) {$ctx1.fill(self,"commitPackage",{},smalltalk.HLPa
 messageSends: ["commitPackage", "model"]}),
 smalltalk.HLPackagesListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+fn: function (anItem){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "package";
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anItem:anItem},smalltalk.HLPackagesListWidget)})},
+messageSends: []}),
+smalltalk.HLPackagesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focusClassesListWidget",
@@ -2544,6 +2565,30 @@ return $1;
 messageSends: ["allProtocol", "model"]}),
 smalltalk.HLProtocolsListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+fn: function (anItem){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=_st(anItem).__eq(_st(self)._allProtocol());
+if(smalltalk.assert($1)){
+return "";
+};
+$2=_st(anItem).__eq("private");
+if(smalltalk.assert($2)){
+return "private";
+};
+$3=_st(anItem).__eq("initialization");
+if(smalltalk.assert($3)){
+return "default";
+};
+return "public";
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anItem:anItem},smalltalk.HLProtocolsListWidget)})},
+messageSends: ["ifTrue:", "=", "allProtocol"]}),
+smalltalk.HLProtocolsListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "label",

+ 94 - 34
js/Helios-Browser.js

@@ -325,6 +325,22 @@ referencedClasses: []
 }),
 smalltalk.HLBrowser.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "browser";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLBrowser.klass)})},
+args: [],
+source: "tabClass\x0a\x09^ 'browser'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLBrowser.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -1145,6 +1161,28 @@ smalltalk.HLClassCache.klass);
 
 
 smalltalk.addClass('HLClassesListWidget', smalltalk.HLToolListWidget, [], 'Helios-Browser');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+category: 'accessing',
+fn: function (aClass){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+$1=_st(_st(_st(aClass)._theNonMetaClass())._comment())._isEmpty();
+if(smalltalk.assert($1)){
+return "uncommented";
+};
+$2=_st(_st(aClass)._theNonMetaClass())._heliosClass();
+return $2;
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
+args: ["aClass"],
+source: "cssClassForItem: aClass\x0a\x09aClass theNonMetaClass comment isEmpty \x0a\x09\x09ifTrue: [ ^ 'uncommented' ].\x0a\x09^ aClass theNonMetaClass heliosClass",
+messageSends: ["ifTrue:", "isEmpty", "comment", "theNonMetaClass", "heliosClass"],
+referencedClasses: []
+}),
+smalltalk.HLClassesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focusMethodsListWidget",
@@ -1221,29 +1259,6 @@ referencedClasses: []
 }),
 smalltalk.HLClassesListWidget);
 
-smalltalk.addMethod(
-smalltalk.method({
-selector: "iconForItem:",
-category: 'accessing',
-fn: function (aClass){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=_st(_st(_st(aClass)._theNonMetaClass())._comment())._isEmpty();
-if(smalltalk.assert($2)){
-$1="icon-question-sign";
-} else {
-$1="icon-none";
-};
-return $1;
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{aClass:aClass},smalltalk.HLClassesListWidget)})},
-args: ["aClass"],
-source: "iconForItem: aClass\x0a\x09^ aClass theNonMetaClass comment isEmpty\x0a    \x09ifFalse: [ 'icon-none' ]\x0a      \x09ifTrue: [ 'icon-question-sign' ]",
-messageSends: ["ifFalse:ifTrue:", "isEmpty", "comment", "theNonMetaClass"],
-referencedClasses: []
-}),
-smalltalk.HLClassesListWidget);
-
 smalltalk.addMethod(
 smalltalk.method({
 selector: "label",
@@ -1665,13 +1680,13 @@ li=_st(html)._li();
 _st(self)._registerMappingFrom_to_(aClass,li);
 $1=li;
 _st($1)._at_put_("list-data",_st(_st(self)._items())._indexOf_(aClass));
-_st($1)._class_(_st(self)._cssClassForItem_(aClass));
+_st($1)._class_(_st(self)._listCssClassForItem_(aClass));
 $2=_st($1)._with_((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)._iconForItem_(aClass));
+_st(_st(html)._tag_("i"))._class_(_st(self)._cssClassForItem_(aClass));
 return _st(self)._renderItemLabel_level_on_(aClass,anInteger,html);
 }, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 $4=_st($3)._onClick_((function(){
@@ -1686,8 +1701,8 @@ return _st(self)._renderItem_level_on_(each,_st(anInteger).__plus((1)),html);
 }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderItem:level:on:",{aClass:aClass,anInteger:anInteger,html:html,li:li},smalltalk.HLClassesListWidget)})},
 args: ["aClass", "anInteger", "html"],
-source: "renderItem: aClass level: anInteger on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: aClass to: li.\x0a\x09\x0a    li\x0a    \x09at: 'list-data' put: (self items indexOf: aClass);\x0a    \x09class: (self cssClassForItem: aClass);\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: aClass).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: aClass level: anInteger on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ].\x0a                    \x0a    (self getChildrenOf: aClass) do: [ :each |\x0a    \x09self renderItem: each level: anInteger + 1 on: html ]",
-messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "cssClassForItem:", "with:", "iconForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"],
+source: "renderItem: aClass level: anInteger on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: aClass to: li.\x0a\x09\x0a    li\x0a    \x09at: 'list-data' put: (self items indexOf: aClass);\x0a\x09\x09class: (self listCssClassForItem: aClass);\x0a\x09\x09with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self cssClassForItem: aClass).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: aClass level: anInteger on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ].\x0a                    \x0a    (self getChildrenOf: aClass) do: [ :each |\x0a    \x09self renderItem: each level: anInteger + 1 on: html ]",
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:level:on:", "a", "onClick:", "activateListItem:", "asJQuery", "do:", "renderItem:level:on:", "+", "getChildrenOf:"],
 referencedClasses: []
 }),
 smalltalk.HLClassesListWidget);
@@ -2386,7 +2401,7 @@ smalltalk.HLMethodsListWidget);
 
 smalltalk.addMethod(
 smalltalk.method({
-selector: "iconForItem:",
+selector: "cssClassForItem:",
 category: 'accessing',
 fn: function (aSelector){
 var self=this;
@@ -2400,22 +2415,22 @@ $2=override;
 if(smalltalk.assert($2)){
 $3=overriden;
 if(smalltalk.assert($3)){
-$1="icon-resize-vertical";
+$1="override-overridden";
 } else {
-$1="icon-arrow-up";
+$1="override";
 };
 } else {
 $4=overriden;
 if(smalltalk.assert($4)){
-$1="icon-arrow-down";
+$1="overridden";
 } else {
-$1="icon-none";
+$1="";
 };
 };
 return $1;
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{aSelector:aSelector,override:override,overriden:overriden,method:method},smalltalk.HLMethodsListWidget)})},
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{aSelector:aSelector,override:override,overriden:overriden,method:method},smalltalk.HLMethodsListWidget)})},
 args: ["aSelector"],
-source: "iconForItem: aSelector\x0a\x09| override overriden method |\x0a    \x0a    method := self methodForSelector: aSelector.\x0a    override := self isOverride: method.\x0a    overriden := self isOverridden: method.\x0a    \x0a\x09^ override\x0a    \x09ifTrue: [ overriden\x0a\x09\x09\x09ifTrue: [ 'icon-resize-vertical' ]\x0a\x09\x09\x09ifFalse: [ 'icon-arrow-up' ] ]\x0a\x09\x09ifFalse: [\x0a\x09\x09\x09overriden\x0a\x09\x09\x09ifTrue: [ 'icon-arrow-down' ]\x0a\x09\x09\x09ifFalse: [ 'icon-none' ] ]",
+source: "cssClassForItem: aSelector\x0a\x09| override overriden method |\x0a    \x0a    method := self methodForSelector: aSelector.\x0a    override := self isOverride: method.\x0a    overriden := self isOverridden: method.\x0a    \x0a\x09^ override\x0a    \x09ifTrue: [ overriden\x0a\x09\x09\x09ifTrue: [ 'override-overridden' ]\x0a\x09\x09\x09ifFalse: [ 'override' ] ]\x0a\x09\x09ifFalse: [\x0a\x09\x09\x09overriden\x0a\x09\x09\x09ifTrue: [ 'overridden' ]\x0a\x09\x09\x09ifFalse: [ '' ] ]",
 messageSends: ["methodForSelector:", "isOverride:", "isOverridden:", "ifTrue:ifFalse:"],
 referencedClasses: []
 }),
@@ -3041,6 +3056,22 @@ referencedClasses: []
 }),
 smalltalk.HLPackagesListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+category: 'accessing',
+fn: function (anItem){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "package";
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anItem:anItem},smalltalk.HLPackagesListWidget)})},
+args: ["anItem"],
+source: "cssClassForItem: anItem\x09\x0a\x09^ 'package'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLPackagesListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focusClassesListWidget",
@@ -3304,6 +3335,35 @@ referencedClasses: []
 }),
 smalltalk.HLProtocolsListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClassForItem:",
+category: 'accessing',
+fn: function (anItem){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=_st(anItem).__eq(_st(self)._allProtocol());
+if(smalltalk.assert($1)){
+return "";
+};
+$2=_st(anItem).__eq("private");
+if(smalltalk.assert($2)){
+return "private";
+};
+$3=_st(anItem).__eq("initialization");
+if(smalltalk.assert($3)){
+return "default";
+};
+return "public";
+}, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anItem:anItem},smalltalk.HLProtocolsListWidget)})},
+args: ["anItem"],
+source: "cssClassForItem: anItem\x0a\x09anItem = self allProtocol ifTrue: [ ^ '' ].\x0a\x09anItem = 'private' ifTrue: [ ^ 'private' ].\x0a\x09anItem = 'initialization' ifTrue: [ ^ 'default' ].\x0a\x09^ 'public'",
+messageSends: ["ifTrue:", "=", "allProtocol"],
+referencedClasses: []
+}),
+smalltalk.HLProtocolsListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "label",

+ 96 - 30
js/Helios-Core.deploy.js

@@ -882,6 +882,19 @@ return self}, function($ctx1) {$ctx1.fill(self,"add",{},smalltalk.HLTab)})},
 messageSends: ["addTab:", "manager"]}),
 smalltalk.HLTab);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._widget())._tabClass();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLTab)})},
+messageSends: ["tabClass", "widget"]}),
+smalltalk.HLTab);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "displayLabel",
@@ -1268,6 +1281,19 @@ return self}, function($ctx1) {$ctx1.fill(self,"request:value:do:",{aString:aStr
 messageSends: ["request:value:do:", "manager"]}),
 smalltalk.HLWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._class())._tabClass();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWidget)})},
+messageSends: ["tabClass", "class"]}),
+smalltalk.HLWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "unregister",
@@ -1322,6 +1348,17 @@ return self}, function($ctx1) {$ctx1.fill(self,"openAsTab",{},smalltalk.HLWidget
 messageSends: ["ifFalse:", "canBeOpenAsTab", "addTab:", "on:labelled:", "new", "tabLabel", "current"]}),
 smalltalk.HLWidget.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWidget.klass)})},
+messageSends: []}),
+smalltalk.HLWidget.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -1842,16 +1879,9 @@ selector: "cssClassForItem:",
 fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=_st(_st(self)._selectedItem()).__eq(anObject);
-if(smalltalk.assert($2)){
-$1="active";
-} else {
-$1="inactive";
-};
-return $1;
+return "";
 }, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"]}),
+messageSends: []}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
@@ -1910,17 +1940,6 @@ 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: "iconForItem:",
-fn: function (anObject){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-return "";
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-messageSends: []}),
-smalltalk.HLListWidget);
-
 smalltalk.addMethod(
 smalltalk.method({
 selector: "initialize",
@@ -1964,6 +1983,24 @@ return self}, function($ctx1) {$ctx1.fill(self,"items:",{aCollection:aCollection
 messageSends: []}),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "listCssClassForItem:",
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+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: "positionOf:",
@@ -2054,14 +2091,14 @@ var $1,$3,$4,$2;
 li=_st(html)._li();
 _st(self)._registerMappingFrom_to_(anObject,li);
 $1=li;
-_st($1)._class_(_st(self)._cssClassForItem_(anObject));
 _st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
+_st($1)._class_(_st(self)._listCssClassForItem_(anObject));
 $2=_st($1)._with_((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)._iconForItem_(anObject));
+_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(){
@@ -2071,7 +2108,7 @@ return _st(self)._activateListItem_(_st(li)._asJQuery());
 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:", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "asString", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"]}),
 smalltalk.HLListWidget);
 
 smalltalk.addMethod(
@@ -2825,11 +2862,15 @@ smalltalk.method({
 selector: "initialize",
 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", "setupEvents", "keyBinder"]}),
+messageSends: ["initialize", "registerInspector:", "registerErrorHandler:", "setupEvents", "keyBinder"]}),
 smalltalk.HLManager);
 
 smalltalk.addMethod(
@@ -2864,6 +2905,28 @@ return self}, function($ctx1) {$ctx1.fill(self,"refresh",{},smalltalk.HLManager)
 messageSends: ["remove", "jQuery:", "appendToJQuery:", "asJQuery"]}),
 smalltalk.HLManager);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerErrorHandler:",
+fn: function (anErrorHandler){
+var self=this;
+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);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerInspector:",
+fn: function (anInspector){
+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);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "removeActiveTab",
@@ -2994,7 +3057,7 @@ selector: "renderTabsOn:",
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$6,$5,$8,$9,$7,$2;
+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(){
@@ -3015,24 +3078,27 @@ 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"))._onClick_((function(){
+_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)})}));
-return _st(html)._with_(_st(each)._displayLabel());
+$9=_st(html)._span();
+_st($9)._class_(_st(each)._cssClass());
+$10=_st($9)._with_(_st(each)._displayLabel());
+return $10;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-$9=_st($8)._onClick_((function(){
+$11=_st($8)._onClick_((function(){
 return smalltalk.withContext(function($ctx5) {
 return _st(each)._activate();
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-return $9;
+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:", "displayLabel", "a", "activate", "tabs", "renderAddOn:"]}),
+messageSends: ["class:", "ul", "with:", "do:", "ifTrue:ifFalse:", "isActive", "li", "onClick:", "removeTab:", "tag:", "cssClass", "span", "displayLabel", "a", "activate", "tabs", "renderAddOn:"]}),
 smalltalk.HLManager);
 
 smalltalk.addMethod(

+ 131 - 40
js/Helios-Core.js

@@ -1150,6 +1150,24 @@ referencedClasses: []
 }),
 smalltalk.HLTab);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "cssClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._widget())._tabClass();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"cssClass",{},smalltalk.HLTab)})},
+args: [],
+source: "cssClass\x0a\x09^ self widget tabClass",
+messageSends: ["tabClass", "widget"],
+referencedClasses: []
+}),
+smalltalk.HLTab);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "displayLabel",
@@ -1672,6 +1690,24 @@ referencedClasses: []
 }),
 smalltalk.HLWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._class())._tabClass();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWidget)})},
+args: [],
+source: "tabClass\x0a\x09^ self class tabClass",
+messageSends: ["tabClass", "class"],
+referencedClasses: []
+}),
+smalltalk.HLWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "unregister",
@@ -1746,6 +1782,22 @@ referencedClasses: ["HLTab", "HLManager"]
 }),
 smalltalk.HLWidget.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWidget.klass)})},
+args: [],
+source: "tabClass\x0a\x09^ ''",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLWidget.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -2432,18 +2484,11 @@ category: 'accessing',
 fn: function (anObject){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $2,$1;
-$2=_st(_st(self)._selectedItem()).__eq(anObject);
-if(smalltalk.assert($2)){
-$1="active";
-} else {
-$1="inactive";
-};
-return $1;
+return "";
 }, function($ctx1) {$ctx1.fill(self,"cssClassForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
 args: ["anObject"],
-source: "cssClassForItem: anObject\x0a\x09^ self selectedItem = anObject\x0a\x09\x09\x09ifTrue: [ 'active' ]\x0a\x09\x09\x09ifFalse: [ 'inactive' ]",
-messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"],
+source: "cssClassForItem: anObject\x0a\x09^ ''",
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.HLListWidget);
@@ -2519,22 +2564,6 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
-smalltalk.addMethod(
-smalltalk.method({
-selector: "iconForItem:",
-category: 'accessing',
-fn: function (anObject){
-var self=this;
-return smalltalk.withContext(function($ctx1) { 
-return "";
-}, function($ctx1) {$ctx1.fill(self,"iconForItem:",{anObject:anObject},smalltalk.HLListWidget)})},
-args: ["anObject"],
-source: "iconForItem: anObject\x0a\x09^ ''",
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.HLListWidget);
-
 smalltalk.addMethod(
 smalltalk.method({
 selector: "initialize",
@@ -2593,6 +2622,29 @@ referencedClasses: []
 }),
 smalltalk.HLListWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "listCssClassForItem:",
+category: 'accessing',
+fn: function (anObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+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)})},
+args: ["anObject"],
+source: "listCssClassForItem: anObject\x0a\x09^ self selectedItem = anObject\x0a\x09\x09ifTrue: [ 'active' ]\x0a\x09\x09ifFalse: [ 'inactive' ]",
+messageSends: ["ifTrue:ifFalse:", "=", "selectedItem"],
+referencedClasses: []
+}),
+smalltalk.HLListWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "positionOf:",
@@ -2709,14 +2761,14 @@ var $1,$3,$4,$2;
 li=_st(html)._li();
 _st(self)._registerMappingFrom_to_(anObject,li);
 $1=li;
-_st($1)._class_(_st(self)._cssClassForItem_(anObject));
 _st($1)._at_put_("list-data",_st(_st(_st(self)._items())._indexOf_(anObject))._asString());
+_st($1)._class_(_st(self)._listCssClassForItem_(anObject));
 $2=_st($1)._with_((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)._iconForItem_(anObject));
+_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(){
@@ -2727,8 +2779,8 @@ return $4;
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"renderItem:on:",{anObject:anObject,html:html,li:li},smalltalk.HLListWidget)})},
 args: ["anObject", "html"],
-source: "renderItem: anObject on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: anObject to: li.\x0a\x09\x0a    li\x0a    \x09class: (self cssClassForItem: anObject);\x0a        at: 'list-data' put: (self items indexOf: anObject) asString;\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self iconForItem: anObject).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: anObject on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ]",
-messageSends: ["li", "registerMappingFrom:to:", "class:", "cssClassForItem:", "at:put:", "asString", "indexOf:", "items", "with:", "iconForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"],
+source: "renderItem: anObject on: html\x0a\x09| li |\x0a    \x0a\x09li := html li.\x0a\x09self registerMappingFrom: anObject to: li.\x0a\x09\x0a    li\x0a        at: 'list-data' put: (self items indexOf: anObject) asString;\x0a\x09\x09class: (self listCssClassForItem: anObject);\x0a        with: [ \x0a        \x09html a\x0a            \x09with: [ \x0a            \x09\x09(html tag: 'i') class: (self cssClassForItem: anObject).\x0a  \x09\x09\x09\x09\x09self renderItemLabel: anObject on: html ];\x0a\x09\x09\x09\x09onClick: [\x0a                  \x09self activateListItem: li asJQuery ] ]",
+messageSends: ["li", "registerMappingFrom:to:", "at:put:", "asString", "indexOf:", "items", "class:", "listCssClassForItem:", "with:", "cssClassForItem:", "tag:", "renderItemLabel:on:", "a", "onClick:", "activateListItem:", "asJQuery"],
 referencedClasses: []
 }),
 smalltalk.HLListWidget);
@@ -3690,14 +3742,18 @@ selector: "initialize",
 category: 'initialization',
 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)})},
 args: [],
-source: "initialize\x0a\x09super initialize.\x0a    self keyBinder setupEvents",
-messageSends: ["initialize", "setupEvents", "keyBinder"],
-referencedClasses: []
+source: "initialize\x0a\x09super initialize.\x0a\x09self registerInspector: HLInspector.\x0a\x09self registerErrorHandler: HLErrorHandler.\x0a    self keyBinder setupEvents",
+messageSends: ["initialize", "registerInspector:", "registerErrorHandler:", "setupEvents", "keyBinder"],
+referencedClasses: ["HLInspector", "HLErrorHandler"]
 }),
 smalltalk.HLManager);
 
@@ -3743,6 +3799,38 @@ referencedClasses: []
 }),
 smalltalk.HLManager);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerErrorHandler:",
+category: 'actions',
+fn: function (anErrorHandler){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(_st(self)._environment())._registerErrorHandler_(anErrorHandler);
+return self}, function($ctx1) {$ctx1.fill(self,"registerErrorHandler:",{anErrorHandler:anErrorHandler},smalltalk.HLManager)})},
+args: ["anErrorHandler"],
+source: "registerErrorHandler: anErrorHandler\x0a\x09self environment registerErrorHandler: anErrorHandler",
+messageSends: ["registerErrorHandler:", "environment"],
+referencedClasses: []
+}),
+smalltalk.HLManager);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "registerInspector:",
+category: 'actions',
+fn: function (anInspector){
+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)})},
+args: ["anInspector"],
+source: "registerInspector: anInspector\x0a\x09self environment registerInspector: anInspector",
+messageSends: ["registerInspector:", "environment"],
+referencedClasses: []
+}),
+smalltalk.HLManager);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "removeActiveTab",
@@ -3899,7 +3987,7 @@ category: 'rendering',
 fn: function (html){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-var $1,$3,$4,$6,$5,$8,$9,$7,$2;
+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(){
@@ -3920,17 +4008,20 @@ 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"))._onClick_((function(){
+_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)})}));
-return _st(html)._with_(_st(each)._displayLabel());
+$9=_st(html)._span();
+_st($9)._class_(_st(each)._cssClass());
+$10=_st($9)._with_(_st(each)._displayLabel());
+return $10;
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-$9=_st($8)._onClick_((function(){
+$11=_st($8)._onClick_((function(){
 return smalltalk.withContext(function($ctx5) {
 return _st(each)._activate();
 }, function($ctx5) {$ctx5.fillBlock({},$ctx1)})}));
-return $9;
+return $11;
 }, function($ctx4) {$ctx4.fillBlock({},$ctx1)})}));
 return $7;
 }, function($ctx3) {$ctx3.fillBlock({each:each},$ctx1)})}));
@@ -3938,8 +4029,8 @@ return _st(self)._renderAddOn_(html);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 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')\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:"],
+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: 'close')\x0a  \x09\x09\x09\x09\x09\x09\x09\x09\x09onClick: [ self removeTab: each ].\x0a                              \x09html span \x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09class: each cssClass;\x0a\x09\x09\x09\x09\x09\x09\x09\x09\x09with: 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:", "cssClass", "span", "displayLabel", "a", "activate", "tabs", "renderAddOn:"],
 referencedClasses: []
 }),
 smalltalk.HLManager);

+ 243 - 12
js/Helios-Debugger.deploy.js

@@ -32,24 +32,32 @@ var self=this;
 var variables,inspectedContext;
 function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
+var $1,$2,$3;
 variables=_st($Dictionary())._new();
 inspectedContext=_st(self)._context();
 _st(variables)._addAll_(_st(inspectedContext)._locals());
 _st((function(){
 return smalltalk.withContext(function($ctx2) {
+return _st(_st(inspectedContext)._notNil())._and_((function(){
+return smalltalk.withContext(function($ctx3) {
 return _st(inspectedContext)._isBlockContext();
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._whileTrue_((function(){
 return smalltalk.withContext(function($ctx2) {
 inspectedContext=_st(inspectedContext)._outerContext();
 inspectedContext;
+$1=inspectedContext;
+if(($receiver = $1) == nil || $receiver == undefined){
+return $1;
+} else {
 return _st(variables)._addAll_(_st(inspectedContext)._locals());
+};
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-$1=anInspector;
-_st($1)._setLabel_("Context");
-$2=_st($1)._setVariables_(variables);
+$2=anInspector;
+_st($2)._setLabel_("Context");
+$3=_st($2)._setVariables_(variables);
 return self}, function($ctx1) {$ctx1.fill(self,"inspectOn:",{anInspector:anInspector,variables:variables,inspectedContext:inspectedContext},smalltalk.HLContextInspectorDecorator)})},
-messageSends: ["new", "context", "addAll:", "locals", "whileTrue:", "outerContext", "isBlockContext", "setLabel:", "setVariables:"]}),
+messageSends: ["new", "context", "addAll:", "locals", "whileTrue:", "outerContext", "ifNotNil:", "and:", "isBlockContext", "notNil", "setLabel:", "setVariables:"]}),
 smalltalk.HLContextInspectorDecorator);
 
 
@@ -76,12 +84,12 @@ smalltalk.method({
 selector: "codeWidget",
 fn: function (){
 var self=this;
-function $HLBrowserCodeWidget(){return smalltalk.HLBrowserCodeWidget||(typeof HLBrowserCodeWidget=="undefined"?nil:HLBrowserCodeWidget)}
+function $HLDebuggerCodeWidget(){return smalltalk.HLDebuggerCodeWidget||(typeof HLDebuggerCodeWidget=="undefined"?nil:HLDebuggerCodeWidget)}
 return smalltalk.withContext(function($ctx1) { 
 var $2,$3,$4,$1;
 $2=self["@codeWidget"];
 if(($receiver = $2) == nil || $receiver == undefined){
-$3=_st($HLBrowserCodeWidget())._new();
+$3=_st($HLDebuggerCodeWidget())._new();
 _st($3)._browserModel_(_st(self)._model());
 $4=_st($3)._yourself();
 self["@codeWidget"]=$4;
@@ -249,6 +257,17 @@ return $1;
 messageSends: ["initializeFromMethodContext:", "new", "yourself"]}),
 smalltalk.HLDebugger.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "debugger";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLDebugger.klass)})},
+messageSends: []}),
+smalltalk.HLDebugger.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -261,7 +280,167 @@ messageSends: []}),
 smalltalk.HLDebugger.klass);
 
 
-smalltalk.addClass('HLDebuggerModel', smalltalk.HLToolModel, ['rootContext', 'currentContext', 'contexts'], 'Helios-Debugger');
+smalltalk.addClass('HLDebuggerCodeWidget', smalltalk.HLBrowserCodeWidget, ['highlightedNode'], 'Helios-Debugger');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "addStopAt:",
+fn: function (anInteger){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@editor"])._setGutterMarker_gutter_value_(anInteger,"stops",_st(_st(_st("<div class=\x22stop\x22></stop>")._asJQuery())._toArray())._first());
+return self}, function($ctx1) {$ctx1.fill(self,"addStopAt:",{anInteger:anInteger},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["setGutterMarker:gutter:value:", "first", "toArray", "asJQuery"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "clearHighlight",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+_st(self["@editor"])._clearGutter_("stops");
+$1=_st(self)._highlightedNode();
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+var node;
+node=$receiver;
+_st(self["@editor"])._removeLineClass_where_class_(_st(_st(_st(node)._position())._x()).__minus((1)),"background","highlighted");
+};
+return self}, function($ctx1) {$ctx1.fill(self,"clearHighlight",{},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["clearGutter:", "ifNotNil:", "removeLineClass:where:class:", "-", "x", "position", "highlightedNode"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "contents:",
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._clearHighlight();
+smalltalk.HLBrowserCodeWidget.fn.prototype._contents_.apply(_st(self), [aString]);
+return self}, function($ctx1) {$ctx1.fill(self,"contents:",{aString:aString},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["clearHighlight", "contents:"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "editorOptions",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$3,$1;
+$2=smalltalk.HLBrowserCodeWidget.fn.prototype._editorOptions.apply(_st(self), []);
+_st($2)._at_put_("gutters",["CodeMirror-linenumbers", "stops"]);
+$3=_st($2)._yourself();
+$1=$3;
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"editorOptions",{},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["at:put:", "editorOptions", "yourself"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlight",
+fn: function (){
+var self=this;
+var anchor,head,selection;
+return smalltalk.withContext(function($ctx1) { 
+head=smalltalk.HashedCollection._fromPairs_([_st("line").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._position())._x()).__minus((1))),_st("ch").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._position())._y()).__minus((1)))]);
+anchor=smalltalk.HashedCollection._fromPairs_([_st("line").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._extent())._x()).__minus((1))),_st("ch").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._extent())._y()).__minus((1)))]);
+_st(self["@editor"])._setSelection_to_(head,anchor);
+return self}, function($ctx1) {$ctx1.fill(self,"highlight",{anchor:anchor,head:head,selection:selection},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["->", "-", "x", "position", "highlightedNode", "y", "extent", "setSelection:to:"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightLine:",
+fn: function (anInteger){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@editor"])._addLineClass_where_class_(anInteger,"background","highlighted");
+return self}, function($ctx1) {$ctx1.fill(self,"highlightLine:",{anInteger:anInteger},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["addLineClass:where:class:"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightNode:",
+fn: function (aNode){
+var self=this;
+var line;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=aNode;
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+line=_st(_st(_st(aNode)._position())._x()).__minus((1));
+line;
+$2=self;
+_st($2)._clearHighlight();
+_st($2)._addStopAt_(line);
+_st($2)._highlightLine_(line);
+$3=_st($2)._highlightedNode_(aNode);
+$3;
+};
+return self}, function($ctx1) {$ctx1.fill(self,"highlightNode:",{aNode:aNode,line:line},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["ifNotNil:", "-", "x", "position", "clearHighlight", "addStopAt:", "highlightLine:", "highlightedNode:"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightedNode",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@highlightedNode"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"highlightedNode",{},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: []}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightedNode:",
+fn: function (aNode){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@highlightedNode"]=aNode;
+return self}, function($ctx1) {$ctx1.fill(self,"highlightedNode:",{aNode:aNode},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: []}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "observeBrowserModel",
+fn: function (){
+var self=this;
+function $HLDebuggerContextSelected(){return smalltalk.HLDebuggerContextSelected||(typeof HLDebuggerContextSelected=="undefined"?nil:HLDebuggerContextSelected)}
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLBrowserCodeWidget.fn.prototype._observeBrowserModel.apply(_st(self), []);
+_st(_st(_st(self)._browserModel())._announcer())._on_send_to_($HLDebuggerContextSelected(),"onContextSelected",self);
+return self}, function($ctx1) {$ctx1.fill(self,"observeBrowserModel",{},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["observeBrowserModel", "on:send:to:", "announcer", "browserModel"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onContextSelected",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._highlightNode_(_st(_st(self)._browserModel())._nextNode());
+return self}, function($ctx1) {$ctx1.fill(self,"onContextSelected",{},smalltalk.HLDebuggerCodeWidget)})},
+messageSends: ["highlightNode:", "nextNode", "browserModel"]}),
+smalltalk.HLDebuggerCodeWidget);
+
+
+
+smalltalk.addClass('HLDebuggerModel', smalltalk.HLToolModel, ['rootContext', 'currentContext', 'contexts', 'interpreter'], 'Helios-Debugger');
 smalltalk.addMethod(
 smalltalk.method({
 selector: "contexts",
@@ -299,21 +478,24 @@ smalltalk.method({
 selector: "currentContext:",
 fn: function (aContext){
 var self=this;
+function $ASTDebugger(){return smalltalk.ASTDebugger||(typeof ASTDebugger=="undefined"?nil:ASTDebugger)}
 function $HLDebuggerContextSelected(){return smalltalk.HLDebuggerContextSelected||(typeof HLDebuggerContextSelected=="undefined"?nil:HLDebuggerContextSelected)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
 _st(self)._withChangesDo_((function(){
 return smalltalk.withContext(function($ctx2) {
+_st(self)._selectedMethod_(_st(aContext)._method());
 self["@currentContext"]=aContext;
 self["@currentContext"];
+self["@interpreter"]=_st($ASTDebugger())._context_(aContext);
+self["@interpreter"];
 $1=_st($HLDebuggerContextSelected())._new();
 _st($1)._context_(aContext);
 $2=_st($1)._yourself();
-_st(_st(self)._announcer())._announce_($2);
-return _st(self)._selectedMethod_(_st(aContext)._method());
+return _st(_st(self)._announcer())._announce_($2);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"currentContext:",{aContext:aContext},smalltalk.HLDebuggerModel)})},
-messageSends: ["withChangesDo:", "announce:", "context:", "new", "yourself", "announcer", "selectedMethod:", "method"]}),
+messageSends: ["withChangesDo:", "selectedMethod:", "method", "context:", "announce:", "new", "yourself", "announcer"]}),
 smalltalk.HLDebuggerModel);
 
 smalltalk.addMethod(
@@ -352,6 +534,32 @@ return self}, function($ctx1) {$ctx1.fill(self,"initializeFromContext:",{aMethod
 messageSends: ["fromMethodContext:", "initializeContexts"]}),
 smalltalk.HLDebuggerModel);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "interpreter",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@interpreter"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"interpreter",{},smalltalk.HLDebuggerModel)})},
+messageSends: []}),
+smalltalk.HLDebuggerModel);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "nextNode",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._interpreter())._nextNode();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"nextNode",{},smalltalk.HLDebuggerModel)})},
+messageSends: ["nextNode", "interpreter"]}),
+smalltalk.HLDebuggerModel);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "rootContext",
@@ -383,6 +591,29 @@ messageSends: ["initializeFromContext:", "new", "yourself"]}),
 smalltalk.HLDebuggerModel.klass);
 
 
+smalltalk.addClass('HLErrorHandler', smalltalk.ErrorHandler, [], 'Helios-Debugger');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "handleError:",
+fn: function (anError){
+var self=this;
+function $Error(){return smalltalk.Error||(typeof Error=="undefined"?nil:Error)}
+function $ErrorHandler(){return smalltalk.ErrorHandler||(typeof ErrorHandler=="undefined"?nil:ErrorHandler)}
+function $HLDebugger(){return smalltalk.HLDebugger||(typeof HLDebugger=="undefined"?nil:HLDebugger)}
+return smalltalk.withContext(function($ctx1) { 
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st($HLDebugger())._on_(_st(anError)._context()))._open();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_($Error(),(function(error){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st($ErrorHandler())._new())._handleError_(error);
+}, function($ctx2) {$ctx2.fillBlock({error:error},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"handleError:",{anError:anError},smalltalk.HLErrorHandler)})},
+messageSends: ["on:do:", "handleError:", "new", "open", "on:", "context"]}),
+smalltalk.HLErrorHandler);
+
+
+
 smalltalk.addClass('HLStackListWidget', smalltalk.HLToolListWidget, [], 'Helios-Debugger');
 smalltalk.addMethod(
 smalltalk.method({
@@ -409,7 +640,7 @@ selector: "label",
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return "Stack";
+return "Call stack";
 }, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLStackListWidget)})},
 messageSends: []}),
 smalltalk.HLStackListWidget);

+ 324 - 18
js/Helios-Debugger.js

@@ -43,26 +43,34 @@ var self=this;
 var variables,inspectedContext;
 function $Dictionary(){return smalltalk.Dictionary||(typeof Dictionary=="undefined"?nil:Dictionary)}
 return smalltalk.withContext(function($ctx1) { 
-var $1,$2;
+var $1,$2,$3;
 variables=_st($Dictionary())._new();
 inspectedContext=_st(self)._context();
 _st(variables)._addAll_(_st(inspectedContext)._locals());
 _st((function(){
 return smalltalk.withContext(function($ctx2) {
+return _st(_st(inspectedContext)._notNil())._and_((function(){
+return smalltalk.withContext(function($ctx3) {
 return _st(inspectedContext)._isBlockContext();
+}, function($ctx3) {$ctx3.fillBlock({},$ctx1)})}));
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._whileTrue_((function(){
 return smalltalk.withContext(function($ctx2) {
 inspectedContext=_st(inspectedContext)._outerContext();
 inspectedContext;
+$1=inspectedContext;
+if(($receiver = $1) == nil || $receiver == undefined){
+return $1;
+} else {
 return _st(variables)._addAll_(_st(inspectedContext)._locals());
+};
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
-$1=anInspector;
-_st($1)._setLabel_("Context");
-$2=_st($1)._setVariables_(variables);
+$2=anInspector;
+_st($2)._setLabel_("Context");
+$3=_st($2)._setVariables_(variables);
 return self}, function($ctx1) {$ctx1.fill(self,"inspectOn:",{anInspector:anInspector,variables:variables,inspectedContext:inspectedContext},smalltalk.HLContextInspectorDecorator)})},
 args: ["anInspector"],
-source: "inspectOn: anInspector\x0a\x09| variables inspectedContext |\x0a\x09\x0a\x09variables := Dictionary new.\x0a\x09inspectedContext := self context.\x0a\x09\x0a\x09variables addAll: inspectedContext locals.\x0a\x09\x0a\x09[ inspectedContext isBlockContext ] whileTrue: [\x0a\x09\x09inspectedContext := inspectedContext outerContext.\x0a\x09\x09variables addAll: inspectedContext locals ].\x0a\x09\x0a\x09anInspector\x0a\x09\x09setLabel: 'Context';\x0a\x09\x09setVariables: variables",
-messageSends: ["new", "context", "addAll:", "locals", "whileTrue:", "outerContext", "isBlockContext", "setLabel:", "setVariables:"],
+source: "inspectOn: anInspector\x0a\x09| variables inspectedContext |\x0a\x09\x0a\x09variables := Dictionary new.\x0a\x09inspectedContext := self context.\x0a\x09\x0a\x09variables addAll: inspectedContext locals.\x0a\x09\x0a\x09[ inspectedContext notNil and: [ inspectedContext isBlockContext ] ] whileTrue: [\x0a\x09\x09inspectedContext := inspectedContext outerContext.\x0a\x09\x09inspectedContext ifNotNil: [\x0a\x09\x09\x09variables addAll: inspectedContext locals ] ].\x0a\x09\x0a\x09anInspector\x0a\x09\x09setLabel: 'Context';\x0a\x09\x09setVariables: variables",
+messageSends: ["new", "context", "addAll:", "locals", "whileTrue:", "outerContext", "ifNotNil:", "and:", "isBlockContext", "notNil", "setLabel:", "setVariables:"],
 referencedClasses: ["Dictionary"]
 }),
 smalltalk.HLContextInspectorDecorator);
@@ -98,12 +106,12 @@ selector: "codeWidget",
 category: 'accessing',
 fn: function (){
 var self=this;
-function $HLBrowserCodeWidget(){return smalltalk.HLBrowserCodeWidget||(typeof HLBrowserCodeWidget=="undefined"?nil:HLBrowserCodeWidget)}
+function $HLDebuggerCodeWidget(){return smalltalk.HLDebuggerCodeWidget||(typeof HLDebuggerCodeWidget=="undefined"?nil:HLDebuggerCodeWidget)}
 return smalltalk.withContext(function($ctx1) { 
 var $2,$3,$4,$1;
 $2=self["@codeWidget"];
 if(($receiver = $2) == nil || $receiver == undefined){
-$3=_st($HLBrowserCodeWidget())._new();
+$3=_st($HLDebuggerCodeWidget())._new();
 _st($3)._browserModel_(_st(self)._model());
 $4=_st($3)._yourself();
 self["@codeWidget"]=$4;
@@ -114,9 +122,9 @@ $1=$2;
 return $1;
 }, function($ctx1) {$ctx1.fill(self,"codeWidget",{},smalltalk.HLDebugger)})},
 args: [],
-source: "codeWidget\x0a\x09^ codeWidget ifNil: [ codeWidget := HLBrowserCodeWidget new\x0a\x09\x09browserModel: self model;\x0a\x09\x09yourself ]",
+source: "codeWidget\x0a\x09^ codeWidget ifNil: [ codeWidget := HLDebuggerCodeWidget new\x0a\x09\x09browserModel: self model;\x0a\x09\x09yourself ]",
 messageSends: ["ifNil:", "browserModel:", "model", "new", "yourself"],
-referencedClasses: ["HLBrowserCodeWidget"]
+referencedClasses: ["HLDebuggerCodeWidget"]
 }),
 smalltalk.HLDebugger);
 
@@ -325,6 +333,22 @@ referencedClasses: []
 }),
 smalltalk.HLDebugger.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "debugger";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLDebugger.klass)})},
+args: [],
+source: "tabClass\x0a\x09^ 'debugger'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLDebugger.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",
@@ -342,7 +366,222 @@ referencedClasses: []
 smalltalk.HLDebugger.klass);
 
 
-smalltalk.addClass('HLDebuggerModel', smalltalk.HLToolModel, ['rootContext', 'currentContext', 'contexts'], 'Helios-Debugger');
+smalltalk.addClass('HLDebuggerCodeWidget', smalltalk.HLBrowserCodeWidget, ['highlightedNode'], 'Helios-Debugger');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "addStopAt:",
+category: 'actions',
+fn: function (anInteger){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@editor"])._setGutterMarker_gutter_value_(anInteger,"stops",_st(_st(_st("<div class=\x22stop\x22></stop>")._asJQuery())._toArray())._first());
+return self}, function($ctx1) {$ctx1.fill(self,"addStopAt:",{anInteger:anInteger},smalltalk.HLDebuggerCodeWidget)})},
+args: ["anInteger"],
+source: "addStopAt: anInteger\x0a\x09editor\x0a\x09\x09setGutterMarker: anInteger\x0a\x09\x09gutter: 'stops'\x0a\x09\x09value: '<div class=\x22stop\x22></stop>' asJQuery toArray first",
+messageSends: ["setGutterMarker:gutter:value:", "first", "toArray", "asJQuery"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "clearHighlight",
+category: 'actions',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+_st(self["@editor"])._clearGutter_("stops");
+$1=_st(self)._highlightedNode();
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+var node;
+node=$receiver;
+_st(self["@editor"])._removeLineClass_where_class_(_st(_st(_st(node)._position())._x()).__minus((1)),"background","highlighted");
+};
+return self}, function($ctx1) {$ctx1.fill(self,"clearHighlight",{},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "clearHighlight\x0a\x09editor clearGutter: 'stops'.\x0a\x09self highlightedNode ifNotNil: [ :node |\x0a\x09\x09editor \x0a\x09\x09\x09removeLineClass: node position x - 1\x0a\x09\x09\x09where: 'background'\x0a\x09\x09\x09class: 'highlighted' ]",
+messageSends: ["clearGutter:", "ifNotNil:", "removeLineClass:where:class:", "-", "x", "position", "highlightedNode"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "contents:",
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._clearHighlight();
+smalltalk.HLBrowserCodeWidget.fn.prototype._contents_.apply(_st(self), [aString]);
+return self}, function($ctx1) {$ctx1.fill(self,"contents:",{aString:aString},smalltalk.HLDebuggerCodeWidget)})},
+args: ["aString"],
+source: "contents: aString\x0a\x09self clearHighlight.\x0a\x09super contents: aString",
+messageSends: ["clearHighlight", "contents:"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "editorOptions",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $2,$3,$1;
+$2=smalltalk.HLBrowserCodeWidget.fn.prototype._editorOptions.apply(_st(self), []);
+_st($2)._at_put_("gutters",["CodeMirror-linenumbers", "stops"]);
+$3=_st($2)._yourself();
+$1=$3;
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"editorOptions",{},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "editorOptions\x0a\x09^ super editorOptions\x0a\x09\x09at: 'gutters' put: #('CodeMirror-linenumbers' 'stops');\x0a\x09\x09yourself",
+messageSends: ["at:put:", "editorOptions", "yourself"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlight",
+category: 'actions',
+fn: function (){
+var self=this;
+var anchor,head,selection;
+return smalltalk.withContext(function($ctx1) { 
+head=smalltalk.HashedCollection._fromPairs_([_st("line").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._position())._x()).__minus((1))),_st("ch").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._position())._y()).__minus((1)))]);
+anchor=smalltalk.HashedCollection._fromPairs_([_st("line").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._extent())._x()).__minus((1))),_st("ch").__minus_gt(_st(_st(_st(_st(self)._highlightedNode())._extent())._y()).__minus((1)))]);
+_st(self["@editor"])._setSelection_to_(head,anchor);
+return self}, function($ctx1) {$ctx1.fill(self,"highlight",{anchor:anchor,head:head,selection:selection},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "highlight\x0a\x09| anchor head selection |\x0a\x09\x0a\x09head := #{\x0a\x09\x09'line' -> (self highlightedNode position x - 1).\x0a\x09\x09'ch' -> (self highlightedNode position y - 1)\x0a\x09}.\x0a\x09\x0a\x09anchor := #{\x0a\x09\x09'line' -> (self highlightedNode extent x - 1).\x0a\x09\x09'ch' -> (self highlightedNode extent y - 1)\x0a\x09}.\x0a\x09\x0a\x09editor setSelection: head to: anchor",
+messageSends: ["->", "-", "x", "position", "highlightedNode", "y", "extent", "setSelection:to:"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightLine:",
+category: 'actions',
+fn: function (anInteger){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self["@editor"])._addLineClass_where_class_(anInteger,"background","highlighted");
+return self}, function($ctx1) {$ctx1.fill(self,"highlightLine:",{anInteger:anInteger},smalltalk.HLDebuggerCodeWidget)})},
+args: ["anInteger"],
+source: "highlightLine: anInteger\x0a\x09editor \x0a\x09\x09addLineClass: anInteger\x0a\x09\x09where: 'background'\x0a\x09\x09class: 'highlighted'",
+messageSends: ["addLineClass:where:class:"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightNode:",
+category: 'actions',
+fn: function (aNode){
+var self=this;
+var line;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2,$3;
+$1=aNode;
+if(($receiver = $1) == nil || $receiver == undefined){
+$1;
+} else {
+line=_st(_st(_st(aNode)._position())._x()).__minus((1));
+line;
+$2=self;
+_st($2)._clearHighlight();
+_st($2)._addStopAt_(line);
+_st($2)._highlightLine_(line);
+$3=_st($2)._highlightedNode_(aNode);
+$3;
+};
+return self}, function($ctx1) {$ctx1.fill(self,"highlightNode:",{aNode:aNode,line:line},smalltalk.HLDebuggerCodeWidget)})},
+args: ["aNode"],
+source: "highlightNode: aNode\x0a\x09| line |\x0a\x09aNode ifNotNil: [\x0a\x09\x09line := aNode position x - 1.\x0a\x09\x09self \x0a\x09\x09\x09clearHighlight; \x0a\x09\x09\x09addStopAt: line;\x0a\x09\x09\x09highlightLine: line;\x0a\x09\x09\x09highlightedNode: aNode\x0a\x09\x09]",
+messageSends: ["ifNotNil:", "-", "x", "position", "clearHighlight", "addStopAt:", "highlightLine:", "highlightedNode:"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightedNode",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@highlightedNode"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"highlightedNode",{},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "highlightedNode\x0a\x09^ highlightedNode",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "highlightedNode:",
+category: 'accessing',
+fn: function (aNode){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+self["@highlightedNode"]=aNode;
+return self}, function($ctx1) {$ctx1.fill(self,"highlightedNode:",{aNode:aNode},smalltalk.HLDebuggerCodeWidget)})},
+args: ["aNode"],
+source: "highlightedNode: aNode\x0a\x09highlightedNode := aNode",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "observeBrowserModel",
+category: 'actions',
+fn: function (){
+var self=this;
+function $HLDebuggerContextSelected(){return smalltalk.HLDebuggerContextSelected||(typeof HLDebuggerContextSelected=="undefined"?nil:HLDebuggerContextSelected)}
+return smalltalk.withContext(function($ctx1) { 
+smalltalk.HLBrowserCodeWidget.fn.prototype._observeBrowserModel.apply(_st(self), []);
+_st(_st(_st(self)._browserModel())._announcer())._on_send_to_($HLDebuggerContextSelected(),"onContextSelected",self);
+return self}, function($ctx1) {$ctx1.fill(self,"observeBrowserModel",{},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "observeBrowserModel\x0a\x09super observeBrowserModel.\x0a\x09\x0a\x09self browserModel announcer \x0a\x09\x09on: HLDebuggerContextSelected\x0a\x09\x09send: #onContextSelected\x0a\x09\x09to: self",
+messageSends: ["observeBrowserModel", "on:send:to:", "announcer", "browserModel"],
+referencedClasses: ["HLDebuggerContextSelected"]
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "onContextSelected",
+category: 'reactions',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+_st(self)._highlightNode_(_st(_st(self)._browserModel())._nextNode());
+return self}, function($ctx1) {$ctx1.fill(self,"onContextSelected",{},smalltalk.HLDebuggerCodeWidget)})},
+args: [],
+source: "onContextSelected\x0a\x09self highlightNode: self browserModel nextNode",
+messageSends: ["highlightNode:", "nextNode", "browserModel"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerCodeWidget);
+
+
+
+smalltalk.addClass('HLDebuggerModel', smalltalk.HLToolModel, ['rootContext', 'currentContext', 'contexts', 'interpreter'], 'Helios-Debugger');
 smalltalk.HLDebuggerModel.comment="I am a model for Helios debugging.\x0a\x0aMy instances hold a reference to an `AIContext` instance, built from a `MethodContext`. The context should be the root of the context stack."
 smalltalk.addMethod(
 smalltalk.method({
@@ -392,24 +631,27 @@ selector: "currentContext:",
 category: 'accessing',
 fn: function (aContext){
 var self=this;
+function $ASTDebugger(){return smalltalk.ASTDebugger||(typeof ASTDebugger=="undefined"?nil:ASTDebugger)}
 function $HLDebuggerContextSelected(){return smalltalk.HLDebuggerContextSelected||(typeof HLDebuggerContextSelected=="undefined"?nil:HLDebuggerContextSelected)}
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
 _st(self)._withChangesDo_((function(){
 return smalltalk.withContext(function($ctx2) {
+_st(self)._selectedMethod_(_st(aContext)._method());
 self["@currentContext"]=aContext;
 self["@currentContext"];
+self["@interpreter"]=_st($ASTDebugger())._context_(aContext);
+self["@interpreter"];
 $1=_st($HLDebuggerContextSelected())._new();
 _st($1)._context_(aContext);
 $2=_st($1)._yourself();
-_st(_st(self)._announcer())._announce_($2);
-return _st(self)._selectedMethod_(_st(aContext)._method());
+return _st(_st(self)._announcer())._announce_($2);
 }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 return self}, function($ctx1) {$ctx1.fill(self,"currentContext:",{aContext:aContext},smalltalk.HLDebuggerModel)})},
 args: ["aContext"],
-source: "currentContext: aContext\x0a\x09self withChangesDo: [ \x0a\x09\x09currentContext := aContext.\x0a\x09\x09self announcer announce: (HLDebuggerContextSelected new\x0a\x09\x09\x09context: aContext;\x0a\x09\x09\x09yourself).\x0a\x09\x09self selectedMethod: aContext method ]",
-messageSends: ["withChangesDo:", "announce:", "context:", "new", "yourself", "announcer", "selectedMethod:", "method"],
-referencedClasses: ["HLDebuggerContextSelected"]
+source: "currentContext: aContext\x0a\x09self withChangesDo: [ \x0a\x09\x09self selectedMethod: aContext method.\x0a\x09\x09currentContext := aContext.\x0a\x09\x09interpreter := ASTDebugger context: aContext.\x0a\x09\x09self announcer announce: (HLDebuggerContextSelected new\x0a\x09\x09\x09context: aContext;\x0a\x09\x09\x09yourself) ]",
+messageSends: ["withChangesDo:", "selectedMethod:", "method", "context:", "announce:", "new", "yourself", "announcer"],
+referencedClasses: ["ASTDebugger", "HLDebuggerContextSelected"]
 }),
 smalltalk.HLDebuggerModel);
 
@@ -459,6 +701,42 @@ referencedClasses: ["AIContext"]
 }),
 smalltalk.HLDebuggerModel);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "interpreter",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=self["@interpreter"];
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"interpreter",{},smalltalk.HLDebuggerModel)})},
+args: [],
+source: "interpreter\x0a\x09^ interpreter",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerModel);
+
+smalltalk.addMethod(
+smalltalk.method({
+selector: "nextNode",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(_st(self)._interpreter())._nextNode();
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"nextNode",{},smalltalk.HLDebuggerModel)})},
+args: [],
+source: "nextNode\x0a\x09^ self interpreter nextNode",
+messageSends: ["nextNode", "interpreter"],
+referencedClasses: []
+}),
+smalltalk.HLDebuggerModel);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "rootContext",
@@ -500,6 +778,34 @@ referencedClasses: []
 smalltalk.HLDebuggerModel.klass);
 
 
+smalltalk.addClass('HLErrorHandler', smalltalk.ErrorHandler, [], 'Helios-Debugger');
+smalltalk.addMethod(
+smalltalk.method({
+selector: "handleError:",
+category: 'error handling',
+fn: function (anError){
+var self=this;
+function $Error(){return smalltalk.Error||(typeof Error=="undefined"?nil:Error)}
+function $ErrorHandler(){return smalltalk.ErrorHandler||(typeof ErrorHandler=="undefined"?nil:ErrorHandler)}
+function $HLDebugger(){return smalltalk.HLDebugger||(typeof HLDebugger=="undefined"?nil:HLDebugger)}
+return smalltalk.withContext(function($ctx1) { 
+_st((function(){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st($HLDebugger())._on_(_st(anError)._context()))._open();
+}, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}))._on_do_($Error(),(function(error){
+return smalltalk.withContext(function($ctx2) {
+return _st(_st($ErrorHandler())._new())._handleError_(error);
+}, function($ctx2) {$ctx2.fillBlock({error:error},$ctx1)})}));
+return self}, function($ctx1) {$ctx1.fill(self,"handleError:",{anError:anError},smalltalk.HLErrorHandler)})},
+args: ["anError"],
+source: "handleError: anError\x0a\x09[ (HLDebugger on: anError context)\x0a\x09\x09open ] on: Error do: [ :error |\x0a\x09\x09\x09ErrorHandler new handleError: error ]",
+messageSends: ["on:do:", "handleError:", "new", "open", "on:", "context"],
+referencedClasses: ["Error", "ErrorHandler", "HLDebugger"]
+}),
+smalltalk.HLErrorHandler);
+
+
+
 smalltalk.addClass('HLStackListWidget', smalltalk.HLToolListWidget, [], 'Helios-Debugger');
 smalltalk.addMethod(
 smalltalk.method({
@@ -532,10 +838,10 @@ category: 'accessing',
 fn: function (){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-return "Stack";
+return "Call stack";
 }, function($ctx1) {$ctx1.fill(self,"label",{},smalltalk.HLStackListWidget)})},
 args: [],
-source: "label\x0a\x09^ 'Stack'",
+source: "label\x0a\x09^ 'Call stack'",
 messageSends: [],
 referencedClasses: []
 }),

File diff suppressed because it is too large
+ 344 - 414
js/Helios-Inspector.deploy.js


File diff suppressed because it is too large
+ 504 - 287
js/Helios-Inspector.js


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

@@ -311,6 +311,17 @@ return false;
 messageSends: []}),
 smalltalk.HLReferences.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "references";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLReferences.klass)})},
+messageSends: []}),
+smalltalk.HLReferences.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",

+ 16 - 0
js/Helios-References.js

@@ -411,6 +411,22 @@ referencedClasses: []
 }),
 smalltalk.HLReferences.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "references";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLReferences.klass)})},
+args: [],
+source: "tabClass\x0a\x09^ 'references'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLReferences.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",

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

@@ -270,6 +270,19 @@ return $1;
 messageSends: []}),
 smalltalk.HLCodeWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "editorOptions",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=smalltalk.HashedCollection._fromPairs_([_st("theme").__minus_gt("amber"),_st("lineNumbers").__minus_gt(true),_st("enterMode").__minus_gt("flat"),_st("indentWithTabs").__minus_gt(true),_st("indentUnit").__minus_gt((4)),_st("matchBrackets").__minus_gt(true),_st("electricChars").__minus_gt(false),_st("keyMap").__minus_gt("Amber"),_st("extraKeys").__minus_gt(smalltalk.HashedCollection._fromPairs_([_st("Shift-Space").__minus_gt("autocomplete")]))]);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"editorOptions",{},smalltalk.HLCodeWidget)})},
+messageSends: ["->"]}),
+smalltalk.HLCodeWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focus",
@@ -623,17 +636,7 @@ selector: "setEditorOn:",
 fn: function (aTextarea){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
-		theme: 'amber',
-                lineNumbers: true,
-                enterMode: 'flat',
-                indentWithTabs: true,
-				indentUnit: 4,
-                matchBrackets: true,
-                electricChars: true,
-				keyMap: 'Amber',
-				extraKeys: {"Shift-Space": "autocomplete"}
-	});
+self['@editor'] = CodeMirror.fromTextArea(aTextarea, self._editorOptions());
 return self}, function($ctx1) {$ctx1.fill(self,"setEditorOn:",{aTextarea:aTextarea},smalltalk.HLCodeWidget)})},
 messageSends: []}),
 smalltalk.HLCodeWidget);
@@ -1521,6 +1524,17 @@ return true;
 messageSends: []}),
 smalltalk.HLWorkspace.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "workspace";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWorkspace.klass)})},
+messageSends: []}),
+smalltalk.HLWorkspace.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",

+ 36 - 12
js/Helios-Workspace.js

@@ -360,6 +360,24 @@ referencedClasses: []
 }),
 smalltalk.HLCodeWidget);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "editorOptions",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=smalltalk.HashedCollection._fromPairs_([_st("theme").__minus_gt("amber"),_st("lineNumbers").__minus_gt(true),_st("enterMode").__minus_gt("flat"),_st("indentWithTabs").__minus_gt(true),_st("indentUnit").__minus_gt((4)),_st("matchBrackets").__minus_gt(true),_st("electricChars").__minus_gt(false),_st("keyMap").__minus_gt("Amber"),_st("extraKeys").__minus_gt(smalltalk.HashedCollection._fromPairs_([_st("Shift-Space").__minus_gt("autocomplete")]))]);
+return $1;
+}, function($ctx1) {$ctx1.fill(self,"editorOptions",{},smalltalk.HLCodeWidget)})},
+args: [],
+source: "editorOptions\x0a\x09^ #{\x0a\x09\x09'theme' -> 'amber'.\x0a        'lineNumbers' -> true.\x0a        'enterMode' -> 'flat'.\x0a        'indentWithTabs' -> true.\x0a\x09\x09'indentUnit' -> 4.\x0a        'matchBrackets' -> true.\x0a        'electricChars' -> false.\x0a\x09\x09'keyMap' -> 'Amber'.\x0a\x09\x09'extraKeys' -> #{'Shift-Space' -> 'autocomplete'}\x0a\x09}",
+messageSends: ["->"],
+referencedClasses: []
+}),
+smalltalk.HLCodeWidget);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "focus",
@@ -834,20 +852,10 @@ category: 'actions',
 fn: function (aTextarea){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
-self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
-		theme: 'amber',
-                lineNumbers: true,
-                enterMode: 'flat',
-                indentWithTabs: true,
-				indentUnit: 4,
-                matchBrackets: true,
-                electricChars: true,
-				keyMap: 'Amber',
-				extraKeys: {"Shift-Space": "autocomplete"}
-	});
+self['@editor'] = CodeMirror.fromTextArea(aTextarea, self._editorOptions());
 return self}, function($ctx1) {$ctx1.fill(self,"setEditorOn:",{aTextarea:aTextarea},smalltalk.HLCodeWidget)})},
 args: ["aTextarea"],
-source: "setEditorOn: aTextarea\x0a\x09<self['@editor'] = CodeMirror.fromTextArea(aTextarea, {\x0a\x09\x09theme: 'amber',\x0a                lineNumbers: true,\x0a                enterMode: 'flat',\x0a                indentWithTabs: true,\x0a\x09\x09\x09\x09indentUnit: 4,\x0a                matchBrackets: true,\x0a                electricChars: true,\x0a\x09\x09\x09\x09keyMap: 'Amber',\x0a\x09\x09\x09\x09extraKeys: {\x22Shift-Space\x22: \x22autocomplete\x22}\x0a\x09})>",
+source: "setEditorOn: aTextarea\x0a\x09<self['@editor'] = CodeMirror.fromTextArea(aTextarea, self._editorOptions())>",
 messageSends: [],
 referencedClasses: []
 }),
@@ -1996,6 +2004,22 @@ referencedClasses: []
 }),
 smalltalk.HLWorkspace.klass);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "tabClass",
+category: 'accessing',
+fn: function (){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+return "workspace";
+}, function($ctx1) {$ctx1.fill(self,"tabClass",{},smalltalk.HLWorkspace.klass)})},
+args: [],
+source: "tabClass\x0a\x09^ 'workspace'",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLWorkspace.klass);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "tabLabel",

+ 29 - 14
st/Helios-Browser.st

@@ -108,6 +108,10 @@ nextId
     ^ 'browser_', (nextId + 1) asString
 !
 
+tabClass
+	^ 'browser'
+!
+
 tabLabel
 	^ 'Browser'
 !
@@ -378,6 +382,12 @@ HLToolListWidget subclass: #HLClassesListWidget
 
 !HLClassesListWidget methodsFor: 'accessing'!
 
+cssClassForItem: aClass
+	aClass theNonMetaClass comment isEmpty 
+		ifTrue: [ ^ 'uncommented' ].
+	^ aClass theNonMetaClass heliosClass
+!
+
 getChildrenOf: aClass
 	^ self items select: [ :each | each superclass = aClass ]
 !
@@ -387,12 +397,6 @@ getRootClassesOf: aCollection
     		(aCollection includes: each superclass) not ]
 !
 
-iconForItem: aClass
-	^ aClass theNonMetaClass comment isEmpty
-    	ifFalse: [ 'icon-none' ]
-      	ifTrue: [ 'icon-question-sign' ]
-!
-
 label
 	^ 'Classes'
 ! !
@@ -636,11 +640,11 @@ renderItem: aClass level: anInteger on: html
 	
     li
     	at: 'list-data' put: (self items indexOf: aClass);
-    	class: (self cssClassForItem: aClass);
-        with: [ 
+		class: (self listCssClassForItem: aClass);
+		with: [ 
         	html a
             	with: [ 
-            		(html tag: 'i') class: (self iconForItem: aClass).
+            		(html tag: 'i') class: (self cssClassForItem: aClass).
   					self renderItemLabel: aClass level: anInteger on: html ];
 				onClick: [
                   	self activateListItem: li asJQuery ] ].
@@ -839,7 +843,7 @@ allProtocol
 	^ self model allProtocol
 !
 
-iconForItem: aSelector
+cssClassForItem: aSelector
 	| override overriden method |
     
     method := self methodForSelector: aSelector.
@@ -848,12 +852,12 @@ iconForItem: aSelector
     
 	^ override
     	ifTrue: [ overriden
-			ifTrue: [ 'icon-resize-vertical' ]
-			ifFalse: [ 'icon-arrow-up' ] ]
+			ifTrue: [ 'override-overridden' ]
+			ifFalse: [ 'override' ] ]
 		ifFalse: [
 			overriden
-			ifTrue: [ 'icon-arrow-down' ]
-			ifFalse: [ 'icon-none' ] ]
+			ifTrue: [ 'overridden' ]
+			ifFalse: [ '' ] ]
 !
 
 label
@@ -1080,6 +1084,10 @@ HLToolListWidget subclass: #HLPackagesListWidget
 
 !HLPackagesListWidget methodsFor: 'accessing'!
 
+cssClassForItem: anItem	
+	^ 'package'
+!
+
 items
 	^ items ifNil: [ self initializeItems ]
 !
@@ -1180,6 +1188,13 @@ allProtocol
 	^ self model allProtocol
 !
 
+cssClassForItem: anItem
+	anItem = self allProtocol ifTrue: [ ^ '' ].
+	anItem = 'private' ifTrue: [ ^ 'private' ].
+	anItem = 'initialization' ifTrue: [ ^ 'default' ].
+	^ 'public'
+!
+
 label
 	^ 'Protocols'
 !

+ 34 - 10
st/Helios-Core.st

@@ -426,6 +426,10 @@ add
 	self manager addTab: self
 !
 
+cssClass
+	^ self widget tabClass
+!
+
 displayLabel
 	^ self label size > 20 
 		ifTrue: [ (self label first: 20), '...' ]
@@ -523,6 +527,10 @@ manager
 	^ HLManager current
 !
 
+tabClass
+	^ self class tabClass
+!
+
 wrapper
 	^ wrapper
 ! !
@@ -600,6 +608,10 @@ openAsTab
 	HLManager current addTab: (HLTab on: self new labelled: self tabLabel)
 !
 
+tabClass
+	^ ''
+!
+
 tabLabel
 	^ 'Tab'
 !
@@ -802,12 +814,6 @@ HLFocusableWidget subclass: #HLListWidget
 !HLListWidget methodsFor: 'accessing'!
 
 cssClassForItem: anObject
-	^ self selectedItem = anObject
-			ifTrue: [ 'active' ]
-			ifFalse: [ 'inactive' ]
-!
-
-iconForItem: anObject
 	^ ''
 !
 
@@ -819,6 +825,12 @@ items: aCollection
 	items := aCollection
 !
 
+listCssClassForItem: anObject
+	^ self selectedItem = anObject
+		ifTrue: [ 'active' ]
+		ifFalse: [ 'inactive' ]
+!
+
 positionOf: aListItem
 	<
     	return aListItem.parent().children().get().indexOf(aListItem.get(0)) + 1
@@ -996,12 +1008,12 @@ renderItem: anObject on: html
 	self registerMappingFrom: anObject to: li.
 	
     li
-    	class: (self cssClassForItem: anObject);
         at: 'list-data' put: (self items indexOf: anObject) asString;
+		class: (self listCssClassForItem: anObject);
         with: [ 
         	html a
             	with: [ 
-            		(html tag: 'i') class: (self iconForItem: anObject).
+            		(html tag: 'i') class: (self cssClassForItem: anObject).
   					self renderItemLabel: anObject on: html ];
 				onClick: [
                   	self activateListItem: li asJQuery ] ]
@@ -1264,6 +1276,14 @@ confirm: aString ifTrue: aBlock
 			appendToJQuery: 'body' asJQuery
 !
 
+registerErrorHandler: anErrorHandler
+	self environment registerErrorHandler: anErrorHandler
+!
+
+registerInspector: anInspector
+	self environment registerInspector: anInspector
+!
+
 removeActiveTab
 	self removeTab: self activeTab
 !
@@ -1315,6 +1335,8 @@ defaultEnvironment
 
 initialize
 	super initialize.
+	self registerInspector: HLInspector.
+	self registerErrorHandler: HLErrorHandler.
     self keyBinder setupEvents
 ! !
 
@@ -1366,9 +1388,11 @@ renderTabsOn: html
 					with: [
 						html a
 							with: [
-      							((html tag: 'i') class: 'icon-remove')
+      							((html tag: 'i') class: 'close')
   									onClick: [ self removeTab: each ].
-                              	html with: each displayLabel ];
+                              	html span 
+									class: each cssClass;
+									with: each displayLabel ];
 							onClick: [ each activate ] ] ].
 			self renderAddOn: html ]
 !

+ 126 - 7
st/Helios-Debugger.st

@@ -25,9 +25,10 @@ inspectOn: anInspector
 	
 	variables addAll: inspectedContext locals.
 	
-	[ inspectedContext isBlockContext ] whileTrue: [
+	[ inspectedContext notNil and: [ inspectedContext isBlockContext ] ] whileTrue: [
 		inspectedContext := inspectedContext outerContext.
-		variables addAll: inspectedContext locals ].
+		inspectedContext ifNotNil: [
+			variables addAll: inspectedContext locals ] ].
 	
 	anInspector
 		setLabel: 'Context';
@@ -51,7 +52,7 @@ I am the main widget for the Helios debugger.!
 !HLDebugger methodsFor: 'accessing'!
 
 codeWidget
-	^ codeWidget ifNil: [ codeWidget := HLBrowserCodeWidget new
+	^ codeWidget ifNil: [ codeWidget := HLDebuggerCodeWidget new
 		browserModel: self model;
 		yourself ]
 !
@@ -112,6 +113,10 @@ renderContentOn: html
 
 !HLDebugger class methodsFor: 'accessing'!
 
+tabClass
+	^ 'debugger'
+!
+
 tabLabel
 	^ 'Debugger'
 ! !
@@ -124,8 +129,101 @@ on: aMethodContext
 		yourself
 ! !
 
+HLBrowserCodeWidget subclass: #HLDebuggerCodeWidget
+	instanceVariableNames: 'highlightedNode'
+	package: 'Helios-Debugger'!
+
+!HLDebuggerCodeWidget methodsFor: 'accessing'!
+
+contents: aString
+	self clearHighlight.
+	super contents: aString
+!
+
+editorOptions
+	^ super editorOptions
+		at: 'gutters' put: #('CodeMirror-linenumbers' 'stops');
+		yourself
+!
+
+highlightedNode
+	^ highlightedNode
+!
+
+highlightedNode: aNode
+	highlightedNode := aNode
+! !
+
+!HLDebuggerCodeWidget methodsFor: 'actions'!
+
+addStopAt: anInteger
+	editor
+		setGutterMarker: anInteger
+		gutter: 'stops'
+		value: '<div class="stop"></stop>' asJQuery toArray first
+!
+
+clearHighlight
+	editor clearGutter: 'stops'.
+	self highlightedNode ifNotNil: [ :node |
+		editor 
+			removeLineClass: node position x - 1
+			where: 'background'
+			class: 'highlighted' ]
+!
+
+highlight
+	| anchor head selection |
+	
+	head := #{
+		'line' -> (self highlightedNode position x - 1).
+		'ch' -> (self highlightedNode position y - 1)
+	}.
+	
+	anchor := #{
+		'line' -> (self highlightedNode extent x - 1).
+		'ch' -> (self highlightedNode extent y - 1)
+	}.
+	
+	editor setSelection: head to: anchor
+!
+
+highlightLine: anInteger
+	editor 
+		addLineClass: anInteger
+		where: 'background'
+		class: 'highlighted'
+!
+
+highlightNode: aNode
+	| line |
+	aNode ifNotNil: [
+		line := aNode position x - 1.
+		self 
+			clearHighlight; 
+			addStopAt: line;
+			highlightLine: line;
+			highlightedNode: aNode
+		]
+!
+
+observeBrowserModel
+	super observeBrowserModel.
+	
+	self browserModel announcer 
+		on: HLDebuggerContextSelected
+		send: #onContextSelected
+		to: self
+! !
+
+!HLDebuggerCodeWidget methodsFor: 'reactions'!
+
+onContextSelected
+	self highlightNode: self browserModel nextNode
+! !
+
 HLToolModel subclass: #HLDebuggerModel
-	instanceVariableNames: 'rootContext currentContext contexts'
+	instanceVariableNames: 'rootContext currentContext contexts interpreter'
 	package: 'Helios-Debugger'!
 !HLDebuggerModel commentStamp!
 I am a model for Helios debugging.
@@ -145,11 +243,20 @@ currentContext
 
 currentContext: aContext
 	self withChangesDo: [ 
+		self selectedMethod: aContext method.
 		currentContext := aContext.
+		interpreter := ASTDebugger context: aContext.
 		self announcer announce: (HLDebuggerContextSelected new
 			context: aContext;
-			yourself).
-		self selectedMethod: aContext method ]
+			yourself) ]
+!
+
+interpreter
+	^ interpreter
+!
+
+nextNode
+	^ self interpreter nextNode
 !
 
 rootContext
@@ -184,6 +291,18 @@ on: aMethodContext
 		yourself
 ! !
 
+ErrorHandler subclass: #HLErrorHandler
+	instanceVariableNames: ''
+	package: 'Helios-Debugger'!
+
+!HLErrorHandler methodsFor: 'error handling'!
+
+handleError: anError
+	[ (HLDebugger on: anError context)
+		open ] on: Error do: [ :error |
+			ErrorHandler new handleError: error ]
+! !
+
 HLToolListWidget subclass: #HLStackListWidget
 	instanceVariableNames: ''
 	package: 'Helios-Debugger'!
@@ -195,7 +314,7 @@ items
 !
 
 label
-	^ 'Stack'
+	^ 'Call stack'
 ! !
 
 !HLStackListWidget methodsFor: 'actions'!

+ 245 - 234
st/Helios-Inspector.st

@@ -1,236 +1,4 @@
 Smalltalk current createPackage: 'Helios-Inspector'!
-HLWidget subclass: #HLInspector
-	instanceVariableNames: 'model variablesWidget displayWidget codeWidget label'
-	package: 'Helios-Inspector'!
-
-!HLInspector methodsFor: 'accessing'!
-
-codeWidget
-	^ codeWidget ifNil: [
-		codeWidget := HLCodeWidget new
-    		model: model code;
-        	receiver: model inspectee;
-        	yourself ]
-!
-
-displayWidget
-	^ displayWidget ifNil: [
-		displayWidget := HLInspectorDisplayWidget new
-    		model: self model;
-        	yourself ]
-!
-
-initialize
-	super initialize.
-	self register
-!
-
-inspectee
-	^ self model inspectee
-!
-
-inspectee: anObject
-	self model inspectee: anObject
-!
-
-label
-    ^ label ifNil: [ model inspectee printString ]
-!
-
-model
-	^ model ifNil: [ 
-    	self model: HLInspectorModel new.
-		model ]
-!
-
-model: aModel
-	model := aModel. 
-    self codeWidget model: aModel code.
-    
-    self 
-        observeCodeWidget;
-    	observeVariablesWidget;
-        observeModel
-!
-
-tabLabel
-    ^ 'Inspector'
-!
-
-variablesWidget
-	^ variablesWidget ifNil: [
-		variablesWidget := HLInspectorVariablesWidget new
-    		model: self model;
-        	yourself ]
-! !
-
-!HLInspector methodsFor: 'actions'!
-
-inspect: anObject
-	self model inspect: anObject on: self.
-    
-	self 
-    	refreshVariablesWidget;
-		refreshDisplayWidget
-!
-
-observeCodeWidget
-	self codeWidget announcer 
-    	on: HLDoItExecuted 
-        do: [ self onDoneIt ]
-!
-
-observeModel
-	self model announcer
-        on: HLInstanceVariableSelected
-		send: #onInstanceVariableSelected
-		to: self
-!
-
-observeVariablesWidget
-	self variablesWidget announcer 
-        on: HLDiveRequested do:[ self onDive ]
-!
-
-open
-	HLManager current addTab: (HLTab on: self labelled: self tabLabel)
-!
-
-refresh
-	self inspect: self inspectee
-!
-
-refreshDisplayWidget
-	self displayWidget refresh
-!
-
-refreshVariablesWidget
-	self variablesWidget refresh
-!
-
-setLabel: aString
-	label := aString
-!
-
-setVariables: aDictionary
-	self model variables: aDictionary
-! !
-
-!HLInspector methodsFor: 'reactions'!
-
-onDive
-
-	self inspect: self model selectedInstVarObject
-!
-
-onDoneIt
-
-	self refresh
-!
-
-onInspectIt
-!
-
-onInstanceVariableSelected
-	self codeWidget receiver: self model selectedInstVarObject.
-	self refreshDisplayWidget
-!
-
-onPrintIt
-! !
-
-!HLInspector methodsFor: 'registration'!
-
-register
-	self class register: self
-!
-
-unregister
-	super unregister.
-	self class unregister: self
-! !
-
-!HLInspector methodsFor: 'rendering'!
-
-renderContentOn: html
-   	html with: (HLContainer with: (HLHorizontalSplitter
-    	with: (HLVerticalSplitter 
-            		with: self variablesWidget
-            	    with: self displayWidget)
-        with: self codeWidget)).
-	
-	self variablesWidget focus
-! !
-
-HLInspector class instanceVariableNames: 'inspectors'!
-
-!HLInspector class methodsFor: 'accessing'!
-
-inspectors
-	^ inspectors ifNil: [ inspectors := OrderedCollection new ]
-!
-
-tabLabel
-	^ 'Inspector'
-!
-
-tabPriority
-	^ 10
-! !
-
-!HLInspector class methodsFor: 'actions'!
-
-inspect: anObject
-	self new
-		inspect: anObject;
-		open
-! !
-
-!HLInspector class methodsFor: 'initialization'!
-
-initialize
-	super initialize.
-	InspectorHandler register: self.
-	self watchChanges
-!
-
-watchChanges
-	[ self inspectors do: [ :each | each refresh ] ]
-		valueWithInterval: 500
-! !
-
-!HLInspector class methodsFor: 'registration'!
-
-register: anInspector
-	self inspectors add: anInspector
-!
-
-unregister: anInspector
-	self inspectors remove: anInspector
-! !
-
-!HLInspector class methodsFor: 'testing'!
-
-canBeOpenAsTab
-	^ false
-! !
-
-HLInspector subclass: #HLInspectorWidget
-	instanceVariableNames: ''
-	package: 'Helios-Inspector'!
-
-!HLInspectorWidget methodsFor: 'rendering'!
-
-renderContentOn: html
-   	html with: (HLHorizontalSplitter
-    	with: (HLVerticalSplitter 
-            		with: self variablesWidget
-            	    with: self displayWidget)
-        with: self codeWidget).
-	
-	self variablesWidget focus
-! !
-
 HLNavigationListWidget subclass: #HLInspectorDisplayWidget
 	instanceVariableNames: 'model'
 	package: 'Helios-Inspector'!
@@ -263,7 +31,7 @@ selectionDisplayString
 ! !
 
 Object subclass: #HLInspectorModel
-	instanceVariableNames: 'announcer environment inspectee code variables selection'
+	instanceVariableNames: 'announcer environment inspectee code variables label selection'
 	package: 'Helios-Inspector'!
 
 !HLInspectorModel methodsFor: 'accessing'!
@@ -293,6 +61,14 @@ inspectee: anObject
 	inspectee := anObject
 !
 
+label
+    ^ label ifNil: [ self inspectee printString ]
+!
+
+label: aString
+    label := aString
+!
+
 selectedInstVarObject
 	^ self instVarObjectAt: self selection
 !
@@ -378,7 +154,7 @@ announcer
 !
 
 label
-	^ self model inspectee class name
+	^ self model label
 !
 
 model
@@ -441,3 +217,238 @@ renderHeadOn: html
 		with: self label
 ! !
 
+HLWidget subclass: #HLInspectorWidget
+	instanceVariableNames: 'model variablesWidget displayWidget codeWidget'
+	package: 'Helios-Inspector'!
+
+!HLInspectorWidget methodsFor: 'accessing'!
+
+codeWidget
+	^ codeWidget ifNil: [
+		codeWidget := HLCodeWidget new
+    		model: model code;
+        	receiver: model inspectee;
+        	yourself ]
+!
+
+displayWidget
+	^ displayWidget ifNil: [
+		displayWidget := HLInspectorDisplayWidget new
+    		model: self model;
+        	yourself ]
+!
+
+initialize
+	super initialize.
+	self register
+!
+
+inspectee
+	^ self model inspectee
+!
+
+inspectee: anObject
+	self model inspectee: anObject
+!
+
+label
+    ^ self model label
+!
+
+model
+	^ model ifNil: [ 
+    	self model: HLInspectorModel new.
+		model ]
+!
+
+model: aModel
+	model := aModel. 
+    self codeWidget model: aModel code.
+    
+    self 
+        observeCodeWidget;
+    	observeVariablesWidget;
+        observeModel
+!
+
+tabLabel
+    ^ 'Inspector'
+!
+
+variablesWidget
+	^ variablesWidget ifNil: [
+		variablesWidget := HLInspectorVariablesWidget new
+    		model: self model;
+        	yourself ]
+! !
+
+!HLInspectorWidget methodsFor: 'actions'!
+
+inspect: anObject
+	self model inspect: anObject on: self.
+    
+	self 
+    	refreshVariablesWidget;
+		refreshDisplayWidget
+!
+
+observeCodeWidget
+	self codeWidget announcer 
+    	on: HLDoItExecuted 
+        do: [ self onDoneIt ]
+!
+
+observeModel
+	self model announcer
+        on: HLInstanceVariableSelected
+		send: #onInstanceVariableSelected
+		to: self
+!
+
+observeVariablesWidget
+	self variablesWidget announcer 
+        on: HLDiveRequested do:[ self onDive ]
+!
+
+open
+	HLManager current addTab: (HLTab on: self labelled: self tabLabel)
+!
+
+refresh
+	self inspect: self inspectee
+!
+
+refreshDisplayWidget
+	self displayWidget refresh
+!
+
+refreshVariablesWidget
+	self variablesWidget refresh
+!
+
+setLabel: aString
+	self model label: aString
+!
+
+setVariables: aDictionary
+	self model variables: aDictionary
+! !
+
+!HLInspectorWidget methodsFor: 'reactions'!
+
+onDive
+
+	HLInspector new 
+		inspect: self model selectedInstVarObject;
+		open
+!
+
+onDoneIt
+
+	self refresh
+!
+
+onInspectIt
+!
+
+onInstanceVariableSelected
+	self codeWidget receiver: self model selectedInstVarObject.
+	self refreshDisplayWidget
+!
+
+onPrintIt
+! !
+
+!HLInspectorWidget methodsFor: 'registration'!
+
+register
+	HLInspector register: self
+!
+
+unregister
+	super unregister.
+	HLInspector unregister: self
+! !
+
+!HLInspectorWidget methodsFor: 'rendering'!
+
+renderContentOn: html
+   	html with: (HLHorizontalSplitter
+    	with: (HLVerticalSplitter 
+            with: self variablesWidget
+            with: self displayWidget)
+        with: self codeWidget)
+! !
+
+HLInspectorWidget subclass: #HLInspector
+	instanceVariableNames: ''
+	package: 'Helios-Inspector'!
+
+!HLInspector methodsFor: 'rendering'!
+
+renderContentOn: html
+   	html with: (HLContainer with: (HLHorizontalSplitter
+    	with: (HLVerticalSplitter 
+            with: self variablesWidget
+            with: self displayWidget)
+        with: self codeWidget)).
+	
+	self variablesWidget focus
+! !
+
+HLInspector class instanceVariableNames: 'inspectors'!
+
+!HLInspector class methodsFor: 'accessing'!
+
+inspectors
+	^ inspectors ifNil: [ inspectors := OrderedCollection new ]
+!
+
+tabClass
+	^ 'inspector'
+!
+
+tabLabel
+	^ 'Inspector'
+!
+
+tabPriority
+	^ 10
+! !
+
+!HLInspector class methodsFor: 'actions'!
+
+inspect: anObject
+	self new
+		inspect: anObject;
+		open
+! !
+
+!HLInspector class methodsFor: 'initialization'!
+
+initialize
+	super initialize.
+	self watchChanges
+!
+
+watchChanges
+	[ self inspectors do: [ :each | each refresh ] ]
+		valueWithInterval: 500
+! !
+
+!HLInspector class methodsFor: 'registration'!
+
+register: anInspector
+	self inspectors add: anInspector
+!
+
+unregister: anInspector
+	self inspectors remove: anInspector
+! !
+
+!HLInspector class methodsFor: 'testing'!
+
+canBeOpenAsTab
+	^ false
+! !
+

+ 4 - 0
st/Helios-References.st

@@ -127,6 +127,10 @@ renderContentOn: html
 
 !HLReferences class methodsFor: 'accessing'!
 
+tabClass
+	^ 'references'
+!
+
 tabLabel
 	^ 'References'
 !

+ 19 - 11
st/Helios-Workspace.st

@@ -76,6 +76,20 @@ currentLineOrSelection
 		ifTrue: [ self selection ]
 !
 
+editorOptions
+	^ #{
+		'theme' -> 'amber'.
+        'lineNumbers' -> true.
+        'enterMode' -> 'flat'.
+        'indentWithTabs' -> true.
+		'indentUnit' -> 4.
+        'matchBrackets' -> true.
+        'electricChars' -> false.
+		'keyMap' -> 'Amber'.
+		'extraKeys' -> #{'Shift-Space' -> 'autocomplete'}
+	}
+!
+
 model
 	^ model ifNil: [ model := HLCodeModel new ]
 !
@@ -183,17 +197,7 @@ saveIt
 !
 
 setEditorOn: aTextarea
-	<self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
-		theme: 'amber',
-                lineNumbers: true,
-                enterMode: 'flat',
-                indentWithTabs: true,
-				indentUnit: 4,
-                matchBrackets: true,
-                electricChars: true,
-				keyMap: 'Amber',
-				extraKeys: {"Shift-Space": "autocomplete"}
-	})>
+	<self['@editor'] = CodeMirror.fromTextArea(aTextarea, self._editorOptions())>
 ! !
 
 !HLCodeWidget methodsFor: 'hints'!
@@ -765,6 +769,10 @@ canHaveFocus
 
 !HLWorkspace class methodsFor: 'accessing'!
 
+tabClass
+	^ 'workspace'
+!
+
 tabLabel
 	^ 'Workspace'
 !

Some files were not shown because too many files changed in this diff