Browse Source

Forgot to add all the modified files of the needed refactoring to make Workspace work

Sebastian Sastre 11 years ago
parent
commit
51e461acc1

+ 1 - 1
helios.html

@@ -14,7 +14,7 @@
   </head> 
   <body> 
     
-    <script type='text/javascript'> loadAmber({packages: ['Spaces', 'Helios-Core', 'Helios-Commands', 'Helios-Layout','Helios-KeyBindings', 'Helios-Browser', 'Helios-Announcements']}) </script> 
+    <script type='text/javascript'> loadAmber({packages: ['Spaces', 'Helios-Core', 'Helios-Commands', 'Helios-Layout','Helios-KeyBindings', 'Helios-Browser', 'Helios-Workspace', 'Helios-Announcements']}) </script> 
     
   </body> 
 </html> 

+ 50 - 0
js/Helios-Announcements.deploy.js

@@ -2,6 +2,56 @@ smalltalk.addPackage('Helios-Announcements', {});
 smalltalk.addClass('HLAnnouncement', smalltalk.Object, [], 'Helios-Announcements');
 
 
+smalltalk.addClass('HLCodeHandled', smalltalk.HLAnnouncement, ['code'], 'Helios-Announcements');
+smalltalk.addMethod(
+"_code",
+smalltalk.method({
+selector: "code",
+fn: function (){
+var self=this;
+return self["@code"];
+}
+}),
+smalltalk.HLCodeHandled);
+
+smalltalk.addMethod(
+"_code_",
+smalltalk.method({
+selector: "code:",
+fn: function (aModel){
+var self=this;
+self["@code"]=aModel;
+return self}
+}),
+smalltalk.HLCodeHandled);
+
+
+smalltalk.addMethod(
+"_on_",
+smalltalk.method({
+selector: "on:",
+fn: function (aCodeModel){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send(self,"_new",[]);
+smalltalk.send($2,"_code_",[aCodeModel]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+}
+}),
+smalltalk.HLCodeHandled.klass);
+
+
+smalltalk.addClass('HLDoItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
+smalltalk.addClass('HLInspectItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
+smalltalk.addClass('HLPrintItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
 smalltalk.addClass('HLItemSelected', smalltalk.HLAnnouncement, ['item'], 'Helios-Announcements');
 smalltalk.addMethod(
 "_item",

+ 65 - 0
js/Helios-Announcements.js

@@ -2,6 +2,71 @@ smalltalk.addPackage('Helios-Announcements', {});
 smalltalk.addClass('HLAnnouncement', smalltalk.Object, [], 'Helios-Announcements');
 
 
+smalltalk.addClass('HLCodeHandled', smalltalk.HLAnnouncement, ['code'], 'Helios-Announcements');
+smalltalk.addMethod(
+"_code",
+smalltalk.method({
+selector: "code",
+category: 'accessing',
+fn: function (){
+var self=this;
+return self["@code"];
+},
+args: [],
+source: "code\x0a\x0a\x09^ code",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLCodeHandled);
+
+smalltalk.addMethod(
+"_code_",
+smalltalk.method({
+selector: "code:",
+category: 'accessing',
+fn: function (aModel){
+var self=this;
+self["@code"]=aModel;
+return self},
+args: ["aModel"],
+source: "code: aModel\x0a\x0a\x09code := aModel",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLCodeHandled);
+
+
+smalltalk.addMethod(
+"_on_",
+smalltalk.method({
+selector: "on:",
+category: 'actions',
+fn: function (aCodeModel){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send(self,"_new",[]);
+smalltalk.send($2,"_code_",[aCodeModel]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+},
+args: ["aCodeModel"],
+source: "on: aCodeModel\x0a\x0a\x09^ self new \x0a    \x09code: aCodeModel;\x0a        yourself",
+messageSends: ["code:", "new", "yourself"],
+referencedClasses: []
+}),
+smalltalk.HLCodeHandled.klass);
+
+
+smalltalk.addClass('HLDoItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
+smalltalk.addClass('HLInspectItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
+smalltalk.addClass('HLPrintItRequested', smalltalk.HLCodeHandled, [], 'Helios-Announcements');
+
+
 smalltalk.addClass('HLItemSelected', smalltalk.HLAnnouncement, ['item'], 'Helios-Announcements');
 smalltalk.addMethod(
 "_item",

+ 60 - 10
js/Helios-Browser.deploy.js

@@ -965,20 +965,40 @@ fn: function () {
 }),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_beLocal",
+smalltalk.method({
+selector: "beLocal",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_initializeEnvironment",[]);
+return self}
+}),
+smalltalk.HLBrowserModel);
+
+smalltalk.addMethod(
+"_beRemoteOn_port_",
+smalltalk.method({
+selector: "beRemoteOn:port:",
+fn: function (anIPAddress,aPort){
+var self=this;
+return self}
+}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_environment",
 smalltalk.method({
 selector: "environment",
-fn: function () {
-    var self = this;
-    var $1;
-    if (($receiver = self['@environment']) == nil || $receiver == undefined) {
-        self['@environment'] = smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []);
-        $1 = self['@environment'];
-    } else {
-        $1 = self['@environment'];
-    }
-    return $1;
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@environment"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeEnvironment",[]);
+} else {
+$1=self["@environment"];
+};
+return $1;
 }
 }),
 smalltalk.HLBrowserModel);
@@ -995,6 +1015,20 @@ fn: function (anEnvironment) {
 }),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_initializeEnvironment",
+smalltalk.method({
+selector: "initializeEnvironment",
+fn: function (){
+var self=this;
+var $1;
+self["@environment"]=smalltalk.send((smalltalk.HLLocalEnvironment || HLLocalEnvironment),"_new",[]);
+$1=self["@environment"];
+return $1;
+}
+}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_packages",
 smalltalk.method({
@@ -1221,6 +1255,22 @@ fn: function (aWidget) {
 smalltalk.HLBrowserModel);
 
 
+smalltalk.addMethod(
+"_on_",
+smalltalk.method({
+selector: "on:",
+fn: function (anEnvironment){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send(self,"_new",[]);
+smalltalk.send($2,"_environment_",[anEnvironment]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+}
+}),
+smalltalk.HLBrowserModel.klass);
+
 
 smalltalk.addClass('HLBrowserSourceWidget', smalltalk.HLWidget, ['model', 'sourceArea'], 'Helios-Browser');
 smalltalk.addMethod(

+ 83 - 13
js/Helios-Browser.js

@@ -1280,26 +1280,56 @@ referencedClasses: ["Announcer"]
 }),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_beLocal",
+smalltalk.method({
+selector: "beLocal",
+category: 'actions',
+fn: function (){
+var self=this;
+smalltalk.send(self,"_initializeEnvironment",[]);
+return self},
+args: [],
+source: "beLocal\x0a\x0a\x09self initializeEnvironment\x0a",
+messageSends: ["initializeEnvironment"],
+referencedClasses: []
+}),
+smalltalk.HLBrowserModel);
+
+smalltalk.addMethod(
+"_beRemoteOn_port_",
+smalltalk.method({
+selector: "beRemoteOn:port:",
+category: 'actions',
+fn: function (anIPAddress,aPort){
+var self=this;
+return self},
+args: ["anIPAddress", "aPort"],
+source: "beRemoteOn: anIPAddress port: aPort\x0a\x0a\x09\x22to-do\x22\x0a    \x0a    \x22environment := HLRemoteEnvironment on: anIPAddress port: aPort\x0a    \x0a    ...kind of stuff\x22\x0a    \x0a",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_environment",
 smalltalk.method({
 selector: "environment",
 category: 'accessing',
-fn: function () {
-    var self = this;
-    var $1;
-    if (($receiver = self['@environment']) == nil || $receiver == undefined) {
-        self['@environment'] = smalltalk.send(smalltalk.Smalltalk || Smalltalk, "_current", []);
-        $1 = self['@environment'];
-    } else {
-        $1 = self['@environment'];
-    }
-    return $1;
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@environment"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeEnvironment",[]);
+} else {
+$1=self["@environment"];
+};
+return $1;
 },
 args: [],
-source: "environment\x0a\x09^ environment ifNil: [ environment := Smalltalk current ]",
-messageSends: ["ifNil:", "current"],
-referencedClasses: ["Smalltalk"]
+source: "environment\x0a\x09^ environment ifNil: [ self initializeEnvironment ]",
+messageSends: ["ifNil:", "initializeEnvironment"],
+referencedClasses: []
 }),
 smalltalk.HLBrowserModel);
 
@@ -1320,6 +1350,25 @@ referencedClasses: []
 }),
 smalltalk.HLBrowserModel);
 
+smalltalk.addMethod(
+"_initializeEnvironment",
+smalltalk.method({
+selector: "initializeEnvironment",
+category: 'initialization',
+fn: function (){
+var self=this;
+var $1;
+self["@environment"]=smalltalk.send((smalltalk.HLLocalEnvironment || HLLocalEnvironment),"_new",[]);
+$1=self["@environment"];
+return $1;
+},
+args: [],
+source: "initializeEnvironment\x0a\x09^ environment := HLLocalEnvironment new",
+messageSends: ["new"],
+referencedClasses: ["HLLocalEnvironment"]
+}),
+smalltalk.HLBrowserModel);
+
 smalltalk.addMethod(
 "_packages",
 smalltalk.method({
@@ -1616,6 +1665,27 @@ referencedClasses: []
 smalltalk.HLBrowserModel);
 
 
+smalltalk.addMethod(
+"_on_",
+smalltalk.method({
+selector: "on:",
+category: 'actions',
+fn: function (anEnvironment){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send(self,"_new",[]);
+smalltalk.send($2,"_environment_",[anEnvironment]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+},
+args: ["anEnvironment"],
+source: "on: anEnvironment\x0a\x0a\x09^ self new\x0a    \x09environment: anEnvironment;\x0a        yourself",
+messageSends: ["environment:", "new", "yourself"],
+referencedClasses: []
+}),
+smalltalk.HLBrowserModel.klass);
+
 
 smalltalk.addClass('HLBrowserSourceWidget', smalltalk.HLWidget, ['model', 'sourceArea'], 'Helios-Browser');
 smalltalk.addMethod(

+ 83 - 39
js/Helios-Core.deploy.js

@@ -1,4 +1,87 @@
 smalltalk.addPackage('Helios-Core', {});
+smalltalk.addClass('HLEnvironment', smalltalk.Object, [], 'Helios-Core');
+smalltalk.addMethod(
+"_eval_on_",
+smalltalk.method({
+selector: "eval:on:",
+fn: function (someCode,aReceiver){
+var self=this;
+var $1;
+$1=smalltalk.send(self,"_subclassResponsibility",[]);
+return $1;
+}
+}),
+smalltalk.HLEnvironment);
+
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(self,"_subclassResponsibility",[]);
+return $1;
+}
+}),
+smalltalk.HLEnvironment);
+
+
+
+smalltalk.addClass('HLLocalEnvironment', smalltalk.HLEnvironment, [], 'Helios-Core');
+smalltalk.addMethod(
+"_eval_on_",
+smalltalk.method({
+selector: "eval:on:",
+fn: function (someCode,aReceiver){
+var self=this;
+var $1,$2;
+var $early={};
+try {
+var compiler;
+compiler=smalltalk.send((smalltalk.Compiler || Compiler),"_new",[]);
+smalltalk.send((function(){
+return smalltalk.send(compiler,"_parseExpression_",[someCode]);
+}),"_on_do_",[(smalltalk.Error || Error),(function(ex){
+$1=smalltalk.send(window,"_alert_",[smalltalk.send(ex,"_messageText",[])]);
+throw $early=[$1];
+})]);
+$2=smalltalk.send(smalltalk.send(smalltalk.send(compiler,"_eval_",[smalltalk.send(compiler,"_compile_forClass_",[smalltalk.send(smalltalk.send("doIt ^[","__comma",[someCode]),"__comma",["] value"]),(smalltalk.DoIt || DoIt)])]),"_fn",[]),"_applyTo_arguments_",[aReceiver,[]]);
+return $2;
+}
+catch(e) {if(e===$early)return e[0]; throw e}
+}
+}),
+smalltalk.HLLocalEnvironment);
+
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk),"_current",[]),"_packages",[]);
+return $1;
+}
+}),
+smalltalk.HLLocalEnvironment);
+
+
+
+smalltalk.addClass('HLRemoveEnvironment', smalltalk.HLEnvironment, [], 'Helios-Core');
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLRemoveEnvironment);
+
+
+
 smalltalk.addClass('HLSourceArea', smalltalk.Widget, ['editor', 'textarea', 'div', 'receiver', 'onDoIt'], 'Helios-Core');
 smalltalk.addMethod(
 "_clear",
@@ -1114,9 +1197,6 @@ smalltalk.HLNavigationListWidget);
 
 
 
-smalltalk.addClass('HLInspector', smalltalk.HLWidget, [], 'Helios-Core');
-
-
 smalltalk.addClass('HLManager', smalltalk.HLWidget, ['tabs', 'activeTab', 'keyBinder'], 'Helios-Core');
 smalltalk.addMethod(
 "_activate_",
@@ -1465,39 +1545,3 @@ return (600);
 smalltalk.HLTranscript.klass);
 
 
-smalltalk.addClass('HLWorkspace', smalltalk.HLWidget, [], 'Helios-Core');
-
-smalltalk.addMethod(
-"_canBeOpenAsTab",
-smalltalk.method({
-selector: "canBeOpenAsTab",
-fn: function (){
-var self=this;
-return true;
-}
-}),
-smalltalk.HLWorkspace.klass);
-
-smalltalk.addMethod(
-"_tabLabel",
-smalltalk.method({
-selector: "tabLabel",
-fn: function (){
-var self=this;
-return "Workspace";
-}
-}),
-smalltalk.HLWorkspace.klass);
-
-smalltalk.addMethod(
-"_tabPriority",
-smalltalk.method({
-selector: "tabPriority",
-fn: function (){
-var self=this;
-return (10);
-}
-}),
-smalltalk.HLWorkspace.klass);
-
-

+ 109 - 54
js/Helios-Core.js

@@ -1,4 +1,113 @@
 smalltalk.addPackage('Helios-Core', {});
+smalltalk.addClass('HLEnvironment', smalltalk.Object, [], 'Helios-Core');
+smalltalk.HLEnvironment.comment="Abstract class defining common behavior for local and remote environments"
+smalltalk.addMethod(
+"_eval_on_",
+smalltalk.method({
+selector: "eval:on:",
+category: 'actions',
+fn: function (someCode,aReceiver){
+var self=this;
+var $1;
+$1=smalltalk.send(self,"_subclassResponsibility",[]);
+return $1;
+},
+args: ["someCode", "aReceiver"],
+source: "eval: someCode on: aReceiver\x0a\x0a\x09^ self subclassResponsibility",
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
+}),
+smalltalk.HLEnvironment);
+
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+category: 'accessing',
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(self,"_subclassResponsibility",[]);
+return $1;
+},
+args: [],
+source: "packages\x0a\x0a\x09^ self subclassResponsibility",
+messageSends: ["subclassResponsibility"],
+referencedClasses: []
+}),
+smalltalk.HLEnvironment);
+
+
+
+smalltalk.addClass('HLLocalEnvironment', smalltalk.HLEnvironment, [], 'Helios-Core');
+smalltalk.addMethod(
+"_eval_on_",
+smalltalk.method({
+selector: "eval:on:",
+category: 'actions',
+fn: function (someCode,aReceiver){
+var self=this;
+var $1,$2;
+var $early={};
+try {
+var compiler;
+compiler=smalltalk.send((smalltalk.Compiler || Compiler),"_new",[]);
+smalltalk.send((function(){
+return smalltalk.send(compiler,"_parseExpression_",[someCode]);
+}),"_on_do_",[(smalltalk.Error || Error),(function(ex){
+$1=smalltalk.send(window,"_alert_",[smalltalk.send(ex,"_messageText",[])]);
+throw $early=[$1];
+})]);
+$2=smalltalk.send(smalltalk.send(smalltalk.send(compiler,"_eval_",[smalltalk.send(compiler,"_compile_forClass_",[smalltalk.send(smalltalk.send("doIt ^[","__comma",[someCode]),"__comma",["] value"]),(smalltalk.DoIt || DoIt)])]),"_fn",[]),"_applyTo_arguments_",[aReceiver,[]]);
+return $2;
+}
+catch(e) {if(e===$early)return e[0]; throw e}
+},
+args: ["someCode", "aReceiver"],
+source: "eval: someCode on: aReceiver\x0a\x09| compiler  |\x0a\x09compiler := Compiler new.\x0a\x09[compiler parseExpression: someCode] on: Error do: [:ex |\x0a\x09\x09^window alert: ex messageText].\x0a\x09^(compiler eval: (compiler compile: 'doIt ^[', someCode, '] value' forClass: DoIt)) fn applyTo: aReceiver arguments: #()",
+messageSends: ["new", "on:do:", "alert:", "messageText", "parseExpression:", "applyTo:arguments:", "fn", "eval:", "compile:forClass:", ","],
+referencedClasses: ["Compiler", "Error", "DoIt"]
+}),
+smalltalk.HLLocalEnvironment);
+
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+category: 'accessing',
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk),"_current",[]),"_packages",[]);
+return $1;
+},
+args: [],
+source: "packages\x0a\x0a\x09^ Smalltalk current packages",
+messageSends: ["packages", "current"],
+referencedClasses: ["Smalltalk"]
+}),
+smalltalk.HLLocalEnvironment);
+
+
+
+smalltalk.addClass('HLRemoveEnvironment', smalltalk.HLEnvironment, [], 'Helios-Core');
+smalltalk.addMethod(
+"_packages",
+smalltalk.method({
+selector: "packages",
+category: 'accessing',
+fn: function (){
+var self=this;
+return self},
+args: [],
+source: "packages\x0a\x09\x22Answer the remote environment's packages\x22\x0a  \x0a\x09\x22to-do\x22\x0a    \x0a    \x22Note for future self and friends:\x0a    the problem with remote stuff is that the answers shouldn't be expected to be\x0a    received in a syncrhonous fashion. Everything network is asyc, so you *are going to deal with callbacks* here\x22",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.HLRemoveEnvironment);
+
+
+
 smalltalk.addClass('HLSourceArea', smalltalk.Widget, ['editor', 'textarea', 'div', 'receiver', 'onDoIt'], 'Helios-Core');
 smalltalk.addMethod(
 "_clear",
@@ -1494,9 +1603,6 @@ smalltalk.HLNavigationListWidget);
 
 
 
-smalltalk.addClass('HLInspector', smalltalk.HLWidget, [], 'Helios-Core');
-
-
 smalltalk.addClass('HLManager', smalltalk.HLWidget, ['tabs', 'activeTab', 'keyBinder'], 'Helios-Core');
 smalltalk.addMethod(
 "_activate_",
@@ -1950,54 +2056,3 @@ referencedClasses: []
 smalltalk.HLTranscript.klass);
 
 
-smalltalk.addClass('HLWorkspace', smalltalk.HLWidget, [], 'Helios-Core');
-
-smalltalk.addMethod(
-"_canBeOpenAsTab",
-smalltalk.method({
-selector: "canBeOpenAsTab",
-category: 'testing',
-fn: function (){
-var self=this;
-return true;
-},
-args: [],
-source: "canBeOpenAsTab\x0a\x09^ true",
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.HLWorkspace.klass);
-
-smalltalk.addMethod(
-"_tabLabel",
-smalltalk.method({
-selector: "tabLabel",
-category: 'accessing',
-fn: function (){
-var self=this;
-return "Workspace";
-},
-args: [],
-source: "tabLabel\x0a\x09^ 'Workspace'",
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.HLWorkspace.klass);
-
-smalltalk.addMethod(
-"_tabPriority",
-smalltalk.method({
-selector: "tabPriority",
-category: 'accessing',
-fn: function (){
-var self=this;
-return (10);
-},
-args: [],
-source: "tabPriority\x0a\x09^ 10",
-messageSends: [],
-referencedClasses: []
-}),
-smalltalk.HLWorkspace.klass);
-
-

+ 801 - 2
js/Helios-Workspace.deploy.js

@@ -1,5 +1,5 @@
 smalltalk.addPackage('Helios-Workspace', {});
-smalltalk.addClass('HLWorkspaceModel', smalltalk.Object, ['announcer', 'environment'], 'Helios-Workspace');
+smalltalk.addClass('HLCodeModel', smalltalk.Object, ['announcer', 'environment', 'receiver'], 'Helios-Workspace');
 smalltalk.addMethod(
 "_announcer",
 smalltalk.method({
@@ -15,6 +15,791 @@ $1=self["@announcer"];
 return $1;
 }
 }),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_doIt_do_",
+smalltalk.method({
+selector: "doIt:do:",
+fn: function (someCode,aReaction){
+var self=this;
+var result;
+result=smalltalk.send(smalltalk.send(self,"_environment",[]),"_eval_on_",[someCode,smalltalk.send(self,"_receiver",[])]);
+smalltalk.send(aReaction,"_value_",[result]);
+return result;
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_environment",
+smalltalk.method({
+selector: "environment",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@environment"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeEnvironment",[]);
+} else {
+$1=self["@environment"];
+};
+return $1;
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_environment_",
+smalltalk.method({
+selector: "environment:",
+fn: function (anEnvironment){
+var self=this;
+self["@environment"]=anEnvironment;
+return self}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_initializeAnnouncer",
+smalltalk.method({
+selector: "initializeAnnouncer",
+fn: function (){
+var self=this;
+var $1;
+self["@announcer"]=smalltalk.send((smalltalk.Announcer || Announcer),"_new",[]);
+$1=self["@announcer"];
+return $1;
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_initializeEnvironment",
+smalltalk.method({
+selector: "initializeEnvironment",
+fn: function (){
+var self=this;
+var $1;
+self["@environment"]=smalltalk.send((smalltalk.Smalltalk || Smalltalk),"_current",[]);
+$1=self["@environment"];
+return $1;
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_initializeReceiver",
+smalltalk.method({
+selector: "initializeReceiver",
+fn: function (){
+var self=this;
+var $1;
+self["@receiver"]=smalltalk.send((smalltalk.DoIt || DoIt),"_new",[]);
+$1=self["@receiver"];
+return $1;
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_receiver",
+smalltalk.method({
+selector: "receiver",
+fn: function (){
+var self=this;
+return self["@receiver"];
+}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_receiver_",
+smalltalk.method({
+selector: "receiver:",
+fn: function (anObject){
+var self=this;
+self["@receiver"]=anObject;
+return self}
+}),
+smalltalk.HLCodeModel);
+
+smalltalk.addMethod(
+"_subscribe_",
+smalltalk.method({
+selector: "subscribe:",
+fn: function (aWidget){
+var self=this;
+smalltalk.send(aWidget,"_subscribeTo_",[smalltalk.send(self,"_announcer",[])]);
+return self}
+}),
+smalltalk.HLCodeModel);
+
+
+smalltalk.addMethod(
+"_on_",
+smalltalk.method({
+selector: "on:",
+fn: function (anEnvironment){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send(self,"_new",[]);
+smalltalk.send($2,"_environment_",[anEnvironment]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+}
+}),
+smalltalk.HLCodeModel.klass);
+
+
+smalltalk.addClass('HLCodeWidget', smalltalk.HLWidget, ['model', 'wrapper', 'code', 'editor', 'doItReaction'], 'Helios-Workspace');
+smalltalk.addMethod(
+"_announcer",
+smalltalk.method({
+selector: "announcer",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send(self,"_model",[]),"_announcer",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_clear",
+smalltalk.method({
+selector: "clear",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_val_",[""]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_currentLine",
+smalltalk.method({
+selector: "currentLine",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(self["@editor"],"_getLine_",[smalltalk.send(smalltalk.send(self["@editor"],"_getCursor",[]),"_line",[])]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_currentLineOrSelection",
+smalltalk.method({
+selector: "currentLineOrSelection",
+fn: function (){
+var self=this;
+var $2,$1;
+$2=smalltalk.send(self["@editor"],"_somethingSelected",[]);
+if(smalltalk.assert($2)){
+$1=smalltalk.send(self,"_selection",[]);
+} else {
+$1=smalltalk.send(self,"_currentLine",[]);
+};
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_doItReaction",
+smalltalk.method({
+selector: "doItReaction",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@doItReaction"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeDoItReaction",[]);
+} else {
+$1=self["@doItReaction"];
+};
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_doItReaction_",
+smalltalk.method({
+selector: "doItReaction:",
+fn: function (aBlock){
+var self=this;
+self["@doItReaction"]=aBlock;
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_editor",
+smalltalk.method({
+selector: "editor",
+fn: function (){
+var self=this;
+return self["@editor"];
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_focus",
+smalltalk.method({
+selector: "focus",
+fn: function (){
+var self=this;
+smalltalk.send(smalltalk.send(self,"_editor",[]),"_focus",[]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_initializeDoItReaction",
+smalltalk.method({
+selector: "initializeDoItReaction",
+fn: function (){
+var self=this;
+var $1;
+self["@doItReaction"]=(function(){
+});
+$1=self["@doItReaction"];
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_model",
+smalltalk.method({
+selector: "model",
+fn: function (){
+var self=this;
+return self["@model"];
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_model_",
+smalltalk.method({
+selector: "model:",
+fn: function (aModel){
+var self=this;
+self["@model"]=aModel;
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_observeWrapper",
+smalltalk.method({
+selector: "observeWrapper",
+fn: function (){
+var self=this;
+smalltalk.send(self["@wrapper"],"_onKeyDown_",[(function(e){
+return smalltalk.send(self,"_onKeyDown_",[e]);
+})]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_onDoIt",
+smalltalk.method({
+selector: "onDoIt",
+fn: function (){
+var self=this;
+var result;
+result=smalltalk.send(self["@model"],"_doIt_do_",[smalltalk.send(self,"_currentLineOrSelection",[]),smalltalk.send(self,"_doItReaction",[])]);
+smalltalk.send(smalltalk.send(self,"_announcer",[]),"_announce_",[smalltalk.send((smalltalk.HLDoItRequested || HLDoItRequested),"_on_",[self["@model"]])]);
+return result;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_onInspectIt",
+smalltalk.method({
+selector: "onInspectIt",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_onKeyDown_",
+smalltalk.method({
+selector: "onKeyDown:",
+fn: function (anEvent){
+var self=this;
+if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 80) { //ctrl+p
+			self._onPrintIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 68) { //ctrl+d
+			self._onDoIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 73) { //ctrl+i
+			self._onInspectIt();
+			anEvent.preventDefault();
+			return false;
+		}
+	};
+;
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_onPrintIt",
+smalltalk.method({
+selector: "onPrintIt",
+fn: function (){
+var self=this;
+var result;
+result=smalltalk.send(self["@model"],"_doIt_do_",[smalltalk.send(self,"_currentLineOrSelection",[]),smalltalk.send(self,"_doItReaction",[])]);
+smalltalk.send(smalltalk.send(self,"_announcer",[]),"_announce_",[smalltalk.send((smalltalk.HLPrintItRequested || HLPrintItRequested),"_on_",[self["@model"]])]);
+smalltalk.send(self,"_print_",[smalltalk.send(result,"_printString",[])]);
+smalltalk.send(self,"_focus",[]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_print_",
+smalltalk.method({
+selector: "print:",
+fn: function (aString){
+var self=this;
+var start;
+var stop;
+start=smalltalk.send((smalltalk.HashedCollection || HashedCollection),"_new",[]);
+stop=smalltalk.send((smalltalk.HashedCollection || HashedCollection),"_new",[]);
+smalltalk.send(start,"_at_put_",["line",smalltalk.send(smalltalk.send(self["@editor"],"_getCursor_",[false]),"_line",[])]);
+smalltalk.send(start,"_at_put_",["ch",smalltalk.send(smalltalk.send(self["@editor"],"_getCursor_",[false]),"_ch",[])]);
+smalltalk.send(stop,"_at_put_",["line",smalltalk.send(start,"_at_",["line"])]);
+smalltalk.send(stop,"_at_put_",["ch",smalltalk.send(smalltalk.send(smalltalk.send(start,"_at_",["ch"]),"__plus",[smalltalk.send(aString,"_size",[])]),"__plus",[(2)])]);
+smalltalk.send(self["@editor"],"_replaceSelection_",[smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(self["@editor"],"_getSelection",[]),"__comma",[" "]),"__comma",[aString]),"__comma",[" "])]);
+smalltalk.send(self["@editor"],"_setCursor_",[smalltalk.send(self["@editor"],"_getCursor_",[true])]);
+smalltalk.send(self["@editor"],"_setSelection_end_",[stop,start]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_receiver",
+smalltalk.method({
+selector: "receiver",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send(self,"_model",[]),"_receiver",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_receiver_",
+smalltalk.method({
+selector: "receiver:",
+fn: function (anObject){
+var self=this;
+smalltalk.send(smalltalk.send(self,"_model",[]),"_receiver_",[anObject]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_renderOn_",
+smalltalk.method({
+selector: "renderOn:",
+fn: function (html){
+var self=this;
+self["@wrapper"]=smalltalk.send(smalltalk.send(html,"_div",[]),"_class_",["code"]);
+smalltalk.send(smalltalk.send(smalltalk.send(self,"_observeWrapper",[]),"_wrapper",[]),"_with_",[(function(){
+self["@code"]=smalltalk.send(html,"_textarea",[]);
+return self["@code"];
+})]);
+smalltalk.send(self,"_setEditorOn_",[smalltalk.send(self["@code"],"_element",[])]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_selection",
+smalltalk.method({
+selector: "selection",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(self["@editor"],"_getSelection",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_selectionEnd",
+smalltalk.method({
+selector: "selectionEnd",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send(self["@code"],"_element",[]),"_selectionEnd",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_selectionEnd_",
+smalltalk.method({
+selector: "selectionEnd:",
+fn: function (anInteger){
+var self=this;
+smalltalk.send(smalltalk.send(self["@code"],"_element",[]),"_selectionEnd_",[anInteger]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_selectionStart",
+smalltalk.method({
+selector: "selectionStart",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(smalltalk.send(self["@code"],"_element",[]),"_selectionStart",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_selectionStart_",
+smalltalk.method({
+selector: "selectionStart:",
+fn: function (anInteger){
+var self=this;
+smalltalk.send(smalltalk.send(self["@code"],"_element",[]),"_selectionStart_",[anInteger]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_setEditorOn_",
+smalltalk.method({
+selector: "setEditorOn:",
+fn: function (aTextarea){
+var self=this;
+self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
+		theme: 'amber',
+                lineNumbers: true,
+                enterMode: 'flat',
+                matchBrackets: true,
+                electricChars: false
+	});
+;
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_val",
+smalltalk.method({
+selector: "val",
+fn: function (){
+var self=this;
+var $1;
+$1=smalltalk.send(self["@code"],"_getValue",[]);
+return $1;
+}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_val_",
+smalltalk.method({
+selector: "val:",
+fn: function (aString){
+var self=this;
+smalltalk.send(self["@code"],"_setValue_",[aString]);
+return self}
+}),
+smalltalk.HLCodeWidget);
+
+smalltalk.addMethod(
+"_wrapper",
+smalltalk.method({
+selector: "wrapper",
+fn: function (){
+var self=this;
+return self["@wrapper"];
+}
+}),
+smalltalk.HLCodeWidget);
+
+
+
+smalltalk.addClass('HLWorkspace', smalltalk.HLWidget, ['model', 'code'], 'Helios-Workspace');
+smalltalk.addMethod(
+"_code",
+smalltalk.method({
+selector: "code",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@code"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeCode",[]);
+} else {
+$1=self["@code"];
+};
+return $1;
+}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_ensureModel",
+smalltalk.method({
+selector: "ensureModel",
+fn: function (){
+var self=this;
+if(($receiver = self["@model"]) == nil || $receiver == undefined){
+smalltalk.send(self,"_model_",[smalltalk.send(self,"_model",[])]);
+} else {
+self["@model"];
+};
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_initializeCode",
+smalltalk.method({
+selector: "initializeCode",
+fn: function (){
+var self=this;
+var $1;
+self["@code"]=smalltalk.send(self,"_makeCode",[]);
+$1=self["@code"];
+return $1;
+}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_initializeModel",
+smalltalk.method({
+selector: "initializeModel",
+fn: function (){
+var self=this;
+var $1;
+self["@model"]=smalltalk.send((smalltalk.HLWorkspaceModel || HLWorkspaceModel),"_new",[]);
+$1=self["@model"];
+return $1;
+}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_makeCode",
+smalltalk.method({
+selector: "makeCode",
+fn: function (){
+var self=this;
+var $2,$3,$1;
+$2=smalltalk.send((smalltalk.HLCodeWidget || HLCodeWidget),"_new",[]);
+smalltalk.send($2,"_model_",[smalltalk.send(self["@model"],"_code",[])]);
+$3=smalltalk.send($2,"_yourself",[]);
+$1=$3;
+return $1;
+}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_model",
+smalltalk.method({
+selector: "model",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@model"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeModel",[]);
+} else {
+$1=self["@model"];
+};
+return $1;
+}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_model_",
+smalltalk.method({
+selector: "model:",
+fn: function (aModel){
+var self=this;
+self["@model"]=aModel;
+smalltalk.send(smalltalk.send(self,"_code",[]),"_model_",[smalltalk.send(aModel,"_code",[])]);
+smalltalk.send(self,"_observeCode",[]);
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_observeCode",
+smalltalk.method({
+selector: "observeCode",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_onDoIt",
+smalltalk.method({
+selector: "onDoIt",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_onInspectIt",
+smalltalk.method({
+selector: "onInspectIt",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_onPrintIt",
+smalltalk.method({
+selector: "onPrintIt",
+fn: function (){
+var self=this;
+return self}
+}),
+smalltalk.HLWorkspace);
+
+smalltalk.addMethod(
+"_renderContentOn_",
+smalltalk.method({
+selector: "renderContentOn:",
+fn: function (html){
+var self=this;
+smalltalk.send(self,"_ensureModel",[]);
+smalltalk.send(html,"_with_",[smalltalk.send(self,"_code",[])]);
+return self}
+}),
+smalltalk.HLWorkspace);
+
+
+smalltalk.addMethod(
+"_canBeOpenAsTab",
+smalltalk.method({
+selector: "canBeOpenAsTab",
+fn: function (){
+var self=this;
+return true;
+}
+}),
+smalltalk.HLWorkspace.klass);
+
+smalltalk.addMethod(
+"_tabLabel",
+smalltalk.method({
+selector: "tabLabel",
+fn: function (){
+var self=this;
+return "Workspace";
+}
+}),
+smalltalk.HLWorkspace.klass);
+
+smalltalk.addMethod(
+"_tabPriority",
+smalltalk.method({
+selector: "tabPriority",
+fn: function (){
+var self=this;
+return (10);
+}
+}),
+smalltalk.HLWorkspace.klass);
+
+
+smalltalk.addClass('HLWorkspaceModel', smalltalk.Object, ['announcer', 'environment', 'code'], 'Helios-Workspace');
+smalltalk.addMethod(
+"_announcer",
+smalltalk.method({
+selector: "announcer",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@announcer"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeAnnouncer",[]);
+} else {
+$1=self["@announcer"];
+};
+return $1;
+}
+}),
+smalltalk.HLWorkspaceModel);
+
+smalltalk.addMethod(
+"_beLocal",
+smalltalk.method({
+selector: "beLocal",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_initializeEnvironment",[]);
+return self}
+}),
+smalltalk.HLWorkspaceModel);
+
+smalltalk.addMethod(
+"_beRemoteOn_port_",
+smalltalk.method({
+selector: "beRemoteOn:port:",
+fn: function (anIPAddress,aPort){
+var self=this;
+return self}
+}),
+smalltalk.HLWorkspaceModel);
+
+smalltalk.addMethod(
+"_code",
+smalltalk.method({
+selector: "code",
+fn: function (){
+var self=this;
+var $1;
+if(($receiver = self["@code"]) == nil || $receiver == undefined){
+$1=smalltalk.send(self,"_initializeCode",[]);
+} else {
+$1=self["@code"];
+};
+return $1;
+}
+}),
 smalltalk.HLWorkspaceModel);
 
 smalltalk.addMethod(
@@ -59,6 +844,20 @@ return $1;
 }),
 smalltalk.HLWorkspaceModel);
 
+smalltalk.addMethod(
+"_initializeCode",
+smalltalk.method({
+selector: "initializeCode",
+fn: function (){
+var self=this;
+var $1;
+self["@code"]=smalltalk.send((smalltalk.HLCodeModel || HLCodeModel),"_on_",[smalltalk.send(self,"_environment",[])]);
+$1=self["@code"];
+return $1;
+}
+}),
+smalltalk.HLWorkspaceModel);
+
 smalltalk.addMethod(
 "_initializeEnvironment",
 smalltalk.method({
@@ -66,7 +865,7 @@ selector: "initializeEnvironment",
 fn: function (){
 var self=this;
 var $1;
-self["@environment"]=smalltalk.send((smalltalk.Smalltalk || Smalltalk),"_current",[]);
+self["@environment"]=smalltalk.send((smalltalk.HLLocalEnvironment || HLLocalEnvironment),"_new",[]);
 $1=self["@environment"];
 return $1;
 }

File diff suppressed because it is too large
+ 1076 - 1
js/Helios-Workspace.js


+ 37 - 0
st/Helios-Announcements.st

@@ -3,6 +3,43 @@ Object subclass: #HLAnnouncement
 	instanceVariableNames: ''
 	package: 'Helios-Announcements'!
 
+HLAnnouncement subclass: #HLCodeHandled
+	instanceVariableNames: 'code'
+	package: 'Helios-Announcements'!
+
+!HLCodeHandled methodsFor: 'accessing'!
+
+code
+
+	^ code
+!
+
+code: aModel
+
+	code := aModel
+! !
+
+!HLCodeHandled class methodsFor: 'actions'!
+
+on: aCodeModel
+
+	^ self new 
+    	code: aCodeModel;
+        yourself
+! !
+
+HLCodeHandled subclass: #HLDoItRequested
+	instanceVariableNames: ''
+	package: 'Helios-Announcements'!
+
+HLCodeHandled subclass: #HLInspectItRequested
+	instanceVariableNames: ''
+	package: 'Helios-Announcements'!
+
+HLCodeHandled subclass: #HLPrintItRequested
+	instanceVariableNames: ''
+	package: 'Helios-Announcements'!
+
 HLAnnouncement subclass: #HLItemSelected
 	instanceVariableNames: 'item'
 	package: 'Helios-Announcements'!

+ 32 - 1
st/Helios-Browser.st

@@ -507,7 +507,7 @@ allProtocol
 !
 
 environment
-	^ environment ifNil: [ environment := Smalltalk current ]
+	^ environment ifNil: [ self initializeEnvironment ]
 !
 
 environment: anEnvironment
@@ -598,6 +598,22 @@ showInstance: aBoolean
     self announcer announce: HLShowInstanceToggled new
 ! !
 
+!HLBrowserModel methodsFor: 'actions'!
+
+beLocal
+
+	self initializeEnvironment
+!
+
+beRemoteOn: anIPAddress port: aPort
+
+	"to-do"
+    
+    "environment := HLRemoteEnvironment on: anIPAddress port: aPort
+    
+    ...kind of stuff"
+! !
+
 !HLBrowserModel methodsFor: 'announcements'!
 
 announcer
@@ -608,6 +624,21 @@ subscribe: aWidget
 	aWidget subscribeTo: self announcer
 ! !
 
+!HLBrowserModel methodsFor: 'initialization'!
+
+initializeEnvironment
+	^ environment := HLLocalEnvironment new
+! !
+
+!HLBrowserModel class methodsFor: 'actions'!
+
+on: anEnvironment
+
+	^ self new
+    	environment: anEnvironment;
+        yourself
+! !
+
 HLWidget subclass: #HLBrowserSourceWidget
 	instanceVariableNames: 'model sourceArea'
 	package: 'Helios-Browser'!

+ 57 - 24
st/Helios-Core.st

@@ -1,4 +1,61 @@
 Smalltalk current createPackage: 'Helios-Core' properties: #{}!
+Object subclass: #HLEnvironment
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+!HLEnvironment commentStamp!
+Abstract class defining common behavior for local and remote environments!
+
+!HLEnvironment methodsFor: 'accessing'!
+
+packages
+
+	^ self subclassResponsibility
+! !
+
+!HLEnvironment methodsFor: 'actions'!
+
+eval: someCode on: aReceiver
+
+	^ self subclassResponsibility
+! !
+
+HLEnvironment subclass: #HLLocalEnvironment
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+
+!HLLocalEnvironment methodsFor: 'accessing'!
+
+packages
+
+	^ Smalltalk current packages
+! !
+
+!HLLocalEnvironment methodsFor: 'actions'!
+
+eval: someCode on: aReceiver
+	| compiler  |
+	compiler := Compiler new.
+	[compiler parseExpression: someCode] on: Error do: [:ex |
+		^window alert: ex messageText].
+	^(compiler eval: (compiler compile: 'doIt ^[', someCode, '] value' forClass: DoIt)) fn applyTo: aReceiver arguments: #()
+! !
+
+HLEnvironment subclass: #HLRemoveEnvironment
+	instanceVariableNames: ''
+	package: 'Helios-Core'!
+
+!HLRemoveEnvironment methodsFor: 'accessing'!
+
+packages
+	"Answer the remote environment's packages"
+  
+	"to-do"
+    
+    "Note for future self and friends:
+    the problem with remote stuff is that the answers shouldn't be expected to be
+    received in a syncrhonous fashion. Everything network is asyc, so you *are going to deal with callbacks* here"
+! !
+
 Widget subclass: #HLSourceArea
 	instanceVariableNames: 'editor textarea div receiver onDoIt'
 	package: 'Helios-Core'!
@@ -492,10 +549,6 @@ setupKeyBindings
         	self previousFocus ] ]
 ! !
 
-HLWidget subclass: #HLInspector
-	instanceVariableNames: ''
-	package: 'Helios-Core'!
-
 HLWidget subclass: #HLManager
 	instanceVariableNames: 'tabs activeTab keyBinder'
 	package: 'Helios-Core'!
@@ -670,23 +723,3 @@ canBeOpenAsTab
 	^ true
 ! !
 
-HLWidget subclass: #HLWorkspace
-	instanceVariableNames: ''
-	package: 'Helios-Core'!
-
-!HLWorkspace class methodsFor: 'accessing'!
-
-tabLabel
-	^ 'Workspace'
-!
-
-tabPriority
-	^ 10
-! !
-
-!HLWorkspace class methodsFor: 'testing'!
-
-canBeOpenAsTab
-	^ true
-! !
-

+ 370 - 2
st/Helios-Workspace.st

@@ -1,6 +1,350 @@
 Smalltalk current createPackage: 'Helios-Workspace' properties: #{}!
+Object subclass: #HLCodeModel
+	instanceVariableNames: 'announcer environment receiver'
+	package: 'Helios-Workspace'!
+
+!HLCodeModel methodsFor: 'accessing'!
+
+announcer
+	^ announcer ifNil: [ self initializeAnnouncer ]
+!
+
+environment
+	^ environment ifNil: [ self initializeEnvironment]
+!
+
+environment: anEnvironment
+	environment := anEnvironment
+!
+
+receiver
+	^ receiver
+!
+
+receiver: anObject
+	receiver := anObject
+! !
+
+!HLCodeModel methodsFor: 'actions'!
+
+doIt: someCode do: aReaction
+
+	| result |
+    result := self environment eval: someCode on: self receiver.
+	aReaction value: result.
+    ^result
+!
+
+subscribe: aWidget
+	aWidget subscribeTo: self announcer
+! !
+
+!HLCodeModel methodsFor: 'initialization'!
+
+initializeAnnouncer
+	^ announcer := Announcer new
+!
+
+initializeEnvironment
+	^ environment := Smalltalk current
+!
+
+initializeReceiver
+	^receiver := DoIt new
+! !
+
+!HLCodeModel class methodsFor: 'actions'!
+
+on: anEnvironment
+
+	^ self new
+    	environment: anEnvironment;
+        yourself
+! !
+
+HLWidget subclass: #HLCodeWidget
+	instanceVariableNames: 'model wrapper code editor doItReaction'
+	package: 'Helios-Workspace'!
+
+!HLCodeWidget methodsFor: 'accessing'!
+
+announcer
+	^ self model announcer
+!
+
+currentLine
+    ^editor getLine: (editor getCursor line)
+!
+
+currentLineOrSelection
+    ^editor somethingSelected
+		ifFalse: [self currentLine]
+		ifTrue: [self selection]
+!
+
+doItReaction
+
+	^ doItReaction ifNil:[self initializeDoItReaction]
+!
+
+doItReaction: aBlock
+
+	doItReaction := aBlock
+!
+
+model
+
+	^ model
+!
+
+model: aModel
+
+	model := aModel
+!
+
+receiver
+	^ self model receiver
+!
+
+receiver: anObject
+	self model receiver: anObject
+!
+
+selection
+	^editor getSelection
+!
+
+selectionEnd
+   ^code element selectionEnd
+!
+
+selectionEnd: anInteger
+   code element selectionEnd: anInteger
+!
+
+selectionStart
+   ^code element selectionStart
+!
+
+selectionStart: anInteger
+   code element selectionStart: anInteger
+!
+
+val
+	^ code getValue
+!
+
+val: aString
+    code setValue: aString
+!
+
+wrapper
+
+	^ wrapper
+! !
+
+!HLCodeWidget methodsFor: 'actions'!
+
+clear
+      self val: ''
+!
+
+editor
+	^editor
+!
+
+focus
+      self editor focus
+!
+
+observeWrapper
+
+    wrapper onKeyDown: [:e | self onKeyDown: e]
+!
+
+print: aString
+	| start stop |
+	start := HashedCollection new.
+	stop := HashedCollection new.
+	start at: 'line' put: (editor getCursor: false) line.
+	start at: 'ch' put: (editor getCursor: false) ch.
+	stop at: 'line' put: (start at: 'line').
+	stop at: 'ch' put: ((start at: 'ch') + aString size + 2).
+	editor replaceSelection: (editor getSelection, ' ', aString, ' ').
+	editor setCursor: (editor getCursor: true).
+	editor setSelection: stop end: start
+!
+
+setEditorOn: aTextarea
+	<self['@editor'] = CodeMirror.fromTextArea(aTextarea, {
+		theme: 'amber',
+                lineNumbers: true,
+                enterMode: 'flat',
+                matchBrackets: true,
+                electricChars: false
+	})>
+! !
+
+!HLCodeWidget methodsFor: 'initialization'!
+
+initializeDoItReaction
+
+	^ doItReaction := ["no-op"]
+! !
+
+!HLCodeWidget methodsFor: 'reactions'!
+
+onDoIt
+	| result |
+
+	result:=  model 
+    				doIt: self currentLineOrSelection 
+        			do: self doItReaction.
+        
+	self announcer announce: (HLDoItRequested on: model).
+	^ result
+!
+
+onInspectIt
+!
+
+onKeyDown: anEvent
+
+    <if(anEvent.ctrlKey) {
+		if(anEvent.keyCode === 80) { //ctrl+p
+			self._onPrintIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 68) { //ctrl+d
+			self._onDoIt();
+			anEvent.preventDefault();
+			return false;
+		}
+		if(anEvent.keyCode === 73) { //ctrl+i
+			self._onInspectIt();
+			anEvent.preventDefault();
+			return false;
+		}
+	}>
+!
+
+onPrintIt
+
+	| result |
+
+	result:=  model 
+    				doIt: self currentLineOrSelection 
+        			do: self doItReaction.
+        
+	self announcer announce: (HLPrintItRequested on: model).
+
+    self print: result printString.
+	self focus.
+! !
+
+!HLCodeWidget methodsFor: 'rendering'!
+
+renderOn: html
+    wrapper := html div class: 'code'.
+    self observeWrapper
+    wrapper with: [code := html textarea].
+    self setEditorOn: code element.
+! !
+
+HLWidget subclass: #HLWorkspace
+	instanceVariableNames: 'model code'
+	package: 'Helios-Workspace'!
+
+!HLWorkspace methodsFor: 'accessing'!
+
+code
+
+	^ code ifNil:[self initializeCode]
+!
+
+model
+
+	^ model ifNil:[self initializeModel]
+!
+
+model: aModel
+
+	model := aModel.
+     
+    self code model: aModel code.
+    self observeCode.
+! !
+
+!HLWorkspace methodsFor: 'actions'!
+
+ensureModel
+	"Sends the #model: initialization message if needed."
+
+	model ifNil:[
+		self model: self model]
+!
+
+makeCode
+
+	^ HLCodeWidget new
+    	model: model code;
+        yourself
+!
+
+observeCode
+! !
+
+!HLWorkspace methodsFor: 'initialization'!
+
+initializeCode
+
+	^ code := self makeCode.
+!
+
+initializeModel
+
+	^ model := HLWorkspaceModel new
+! !
+
+!HLWorkspace methodsFor: 'reactions'!
+
+onDoIt
+!
+
+onInspectIt
+!
+
+onPrintIt
+! !
+
+!HLWorkspace methodsFor: 'rendering'!
+
+renderContentOn: html
+
+	self ensureModel.
+    
+	html with: self code
+! !
+
+!HLWorkspace class methodsFor: 'accessing'!
+
+tabLabel
+	^ 'Workspace'
+!
+
+tabPriority
+	^ 10
+! !
+
+!HLWorkspace class methodsFor: 'testing'!
+
+canBeOpenAsTab
+	^ true
+! !
+
 Object subclass: #HLWorkspaceModel
-	instanceVariableNames: 'announcer environment'
+	instanceVariableNames: 'announcer environment code'
 	package: 'Helios-Workspace'!
 
 !HLWorkspaceModel methodsFor: 'accessing'!
@@ -9,6 +353,11 @@ announcer
 	^ announcer ifNil: [ self initializeAnnouncer ]
 !
 
+code
+	"Answers the code model working for this workspace model"
+	^ code ifNil:[self initializeCode]
+!
+
 environment
 	^ environment ifNil: [ self initializeEnvironment]
 !
@@ -19,6 +368,20 @@ environment: anEnvironment
 
 !HLWorkspaceModel methodsFor: 'actions'!
 
+beLocal
+
+	self initializeEnvironment
+!
+
+beRemoteOn: anIPAddress port: aPort
+
+	"to-do"
+    
+    "environment := HLRemoteEnvironment on: anIPAddress port: aPort
+    
+    ...kind of stuff"
+!
+
 subscribe: aWidget
 	aWidget subscribeTo: self announcer
 ! !
@@ -29,8 +392,13 @@ initializeAnnouncer
 	^ announcer := Announcer new
 !
 
+initializeCode
+
+	^ code := HLCodeModel on: self environment
+!
+
 initializeEnvironment
-	^ environment := Smalltalk current
+	^ environment := HLLocalEnvironment new
 ! !
 
 !HLWorkspaceModel methodsFor: 'reactions'!

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