Browse Source

Merge remote-tracking branch 'upstream/master'

Laurent Laffont 12 years ago
parent
commit
96dde890c6
11 changed files with 275 additions and 115 deletions
  1. 52 0
      Makefile
  2. 23 0
      examples/Makefile
  3. 1 1
      examples/webos/eris/Makefile
  4. 2 2
      examples/webos/helloamber/Makefile
  5. BIN
      favicon.ico
  6. 2 1
      js/IDE.deploy.js
  7. 4 3
      js/IDE.js
  8. 183 95
      js/amber.js
  9. 1 8
      js/init.js
  10. 2 2
      server/Makefile
  11. 5 3
      st/IDE.st

+ 52 - 0
Makefile

@@ -0,0 +1,52 @@
+# Makefile for sub directories
+AMBER = st
+SERVER = server
+EXAMPLES = examples
+
+# REST is all except AMBER
+REST = $(SERVER) $(EXAMPLES)
+
+# And these are all
+DIRS = $(AMBER) $(REST)
+
+# The sets of directories to do various things in
+BUILDDIRS = $(DIRS:%=build-%)
+EXAMPLESDIRS = $(EXAMPLES:%=build-%)
+INSTALLDIRS = $(AMBER:%=install-%)
+CLEANDIRS = $(REST:%=clean-%)
+CLEANALLDIRS = $(DIRS:%=clean-%)
+
+all: $(BUILDDIRS)
+$(DIRS): $(BUILDDIRS)
+$(BUILDDIRS):
+	$(MAKE) -C $(@:build-%=%)
+
+amber: build-st
+
+# Examples and server need Amber first
+build-server: build-st
+build-examples: build-st
+
+examples: $(EXAMPLESDIRS)
+$(EXAMPLESDIRS):
+	$(MAKE) -C $(@:build-%=%)
+
+install: $(INSTALLDIRS)
+$(INSTALLDIRS):
+	$(MAKE) -C $(@:install-%=%) install
+
+clean: $(CLEANDIRS)
+$(CLEANDIRS): 
+	$(MAKE) -C $(@:clean-%=%) clean
+
+cleanall: $(CLEANALLDIRS) 
+$(CLEANALLDIRS): 
+	$(MAKE) -C $(@:clean-%=%) clean
+
+
+.PHONY: subdirs $(DIRS)
+.PHONY: subdirs $(BUILDDIRS)
+.PHONY: subdirs $(INSTALLDIRS)
+.PHONY: subdirs $(CLEANDIRS)
+.PHONY: subdirs $(CLEANALLDIRS)
+.PHONY: all install clean

+ 23 - 0
examples/Makefile

@@ -0,0 +1,23 @@
+# Makefile for sub directories
+#
+# mindepth makes sure we do not include this Makeile
+MAKEFILES = $(shell find . -mindepth 2 -name 'Makefile')
+DIRS = $(patsubst %/Makefile, %, $(MAKEFILES))
+
+# The sets of directories to do various things in
+BUILDDIRS = $(DIRS:%=build-%)
+CLEANDIRS = $(DIRS:%=clean-%)
+
+all: $(BUILDDIRS)
+$(DIRS): $(BUILDDIRS)
+$(BUILDDIRS):
+	$(MAKE) -C $(@:build-%=%)
+
+clean: $(CLEANDIRS)
+$(CLEANDIRS):
+	$(MAKE) -C $(@:clean-%=%) clean
+
+.PHONY: subdirs $(DIRS)
+.PHONY: subdirs $(BUILDDIRS)
+.PHONY: subdirs $(CLEANDIRS)
+.PHONY: all clean

+ 1 - 1
examples/webos/eris/Makefile

@@ -22,7 +22,7 @@ $(IPK): $(FILEJS)
 
 clean:
 	rm -f $(FILEJS) $(OBJECTS) $(IPK)
-	palm-install -r $(PACKAGE)
+#	palm-install -r $(PACKAGE)
 
 install: $(IPK)
 	palm-install $(IPK)

+ 2 - 2
examples/webos/helloamber/Makefile

@@ -8,7 +8,7 @@ PACKAGE  := amber.helloamber
 VERSION  := 1.0.0
 
 # -O for Closure optimization of js code.
-FLAGS    := -O
+FLAGS    := 
 IPK      := $(PACKAGE)_$(VERSION)_all.ipk
 FILE     := Program
 SOURCES  := $(wildcard *.st)
@@ -23,7 +23,7 @@ $(IPK): $(FILEJS)
 
 clean:
 	rm -f $(FILEJS) $(OBJECTS) $(IPK)
-	palm-install -r $(PACKAGE)
+#	palm-install -r $(PACKAGE)
 
 install: $(IPK)
 	palm-install $(IPK)

BIN
favicon.ico


+ 2 - 1
js/IDE.deploy.js

@@ -1,3 +1,4 @@
+(smalltalk.addPackage('IDE'))
 smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
 smalltalk.addMethod(
 '_tabs',
@@ -1183,7 +1184,7 @@ fn: function (){
 var self=this;
 var newName=nil;
 newName=smalltalk.send(self, "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]);
-((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
+(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
 return self;}
 }),
 smalltalk.Browser);

+ 4 - 3
js/IDE.js

@@ -1,3 +1,4 @@
+(smalltalk.addPackage('IDE'))
 smalltalk.addClass('TabManager', smalltalk.Widget, ['selectedTab', 'tabs', 'opened', 'ul', 'input'], 'IDE');
 smalltalk.addMethod(
 unescape('_tabs'),
@@ -1669,11 +1670,11 @@ fn: function (){
 var self=this;
 var newName=nil;
 newName=smalltalk.send(self, "_prompt_", [smalltalk.send("Rename package ", "__comma", [self['@selectedPackage']])]);
-((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));
+(($receiver = newName) != nil && $receiver != undefined) ? (function(){return ((($receiver = smalltalk.send(newName, "_notEmpty", [])).klass === smalltalk.Boolean) ? ($receiver ? (function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){smalltalk.send(smalltalk.send((smalltalk.Smalltalk || Smalltalk), "_current", []), "_renamePackage_to_", [self['@selectedPackage'], newName]);return smalltalk.send(self, "_updateCategoriesList", []);})]));})() : nil;
 return self;},
 args: [],
-source: unescape('renamePackage%0A%0A%20%20%7C%20newName%20%7C%0A%20%20newName%20%3A%3D%20self%20prompt%3A%20%27Rename%20package%20%27%2C%20selectedPackage.%0A%20%20newName%20notEmpty%20ifTrue%3A%20%5B%0A%09Smalltalk%20current%20renamePackage%3A%20selectedPackage%20to%3A%20newName.%0A%09self%20updateCategoriesList%5D'),
-messageSends: ["prompt:", unescape("%2C"), "ifTrue:", "notEmpty", "renamePackage:to:", "current", "updateCategoriesList"],
+source: unescape('renamePackage%0A%0A%20%20%7C%20newName%20%7C%0A%20%20newName%20%3A%3D%20self%20prompt%3A%20%27Rename%20package%20%27%2C%20selectedPackage.%0A%20%20newName%20ifNotNil%3A%20%5B%0A%20%20%20%20newName%20notEmpty%20ifTrue%3A%20%5B%0A%09Smalltalk%20current%20renamePackage%3A%20selectedPackage%20to%3A%20newName.%0A%09self%20updateCategoriesList%5D%5D'),
+messageSends: ["prompt:", unescape("%2C"), "ifNotNil:", "ifTrue:", "notEmpty", "renamePackage:to:", "current", "updateCategoriesList"],
 referencedClasses: [smalltalk.Smalltalk]
 }),
 smalltalk.Browser);

+ 183 - 95
js/amber.js

@@ -1,103 +1,191 @@
 /* Adapted from Clamato by Avi Bryant. http://www.clamato.net */
 
 (function() {
-    var scripts = document.getElementsByTagName("script");
-    var src = scripts[ scripts.length - 1 ].src;
-    var home = src.split("/").slice(0, -2).join("/") + "/";
-    var nocache = '?' + (new Date()).getTime();
-    var deploy = false;
-
-    function loadJS(name, prefix) {
-	var prefix = prefix || 'js';
-	var name = name;
-	if(!deploy) {
-	    name = name + nocache;
-	}
-	document.write('<script src="' + home + prefix + '/' + name + '" type="text/javascript"></script>');
-    }
-    
-    function loadCSS(name, prefix) {
-	var prefix = prefix || 'css';
-	var name = name;
-	if(!deploy) {
-	    name = name + nocache;
-	}
-	var link = document.createElement("link")
-  	link.setAttribute("rel", "stylesheet")
-  	link.setAttribute("type", "text/css")
-  	link.setAttribute("href", home + prefix + '/' + name)
-	document.getElementsByTagName("head")[0].appendChild(link);
-    }
+  var
+    scripts = document.getElementsByTagName("script"),
+    src = scripts[ scripts.length - 1 ].src,
+    home = src.split("/").slice(0, -2).join("/") + "/";
 
-    function loadDependencies() {
-	loadJS('lib/jQuery/jquery-1.6.4.min.js');
-	loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
-    }
+  window.Amber = {
+    debug: false,
+    deploy: false,
+    nocache: '?' + (new Date()).getTime(),
+    home: home,
 
-    function loadIDEDependencies() {
-	loadJS('lib/jQuery/jquery.textarea.js');
-	loadJS('lib/CodeMirror/lib/codemirror.js');
-	loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
-	loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
-	loadCSS('lib/CodeMirror/theme/amber.css', 'js');
-    }
+    /*
+     example:
+     Amber.load({
+       files: ['MyCategory1.js', 'MyCategory2.js'],
+       ready: function() {smalltalk.Browser._open()}
+     })
+    */
+    load: function(spec) {
+      var self = this;
+      self.localStorageSource = [];
+      self.spec = ((typeof spec == 'undefined') ? {} : spec);
+
+      // In deployment mode, only the compressed version of Kernel
+      // and Canvas are loaded
+      self.deploy = self.spec.deploy || self.deploy;
+      self.debug = self.spec.debug || self.debug;
+
+      // Specify a version string to avoid wrong browser caching
+      if (self.spec.version)
+        self.nocache = '?' + self.spec.version;
+
+      self.loadDependencies();
+      self.loadJS('boot.js');
+
+      self.populateLocalPackages();
+
+      if (self.deploy) {
+        self.loadPackages([
+          'Kernel.deploy',
+          'Canvas.deploy'
+        ]);
+      } else {
+        self.loadIDEDependencies();
+        self.loadCSS('amber.css');
+
+        self.loadPackages([
+          'Kernel',
+          'Canvas',
+          'Compiler',
+          'parser',
+          'IDE',
+          'SUnit',
+          'Examples',
+          'Benchfib',
+          'Kernel-Tests',
+        ]);
+      }
+
+      var additionalFiles = self.spec.packages || self.spec.files;
+      if (additionalFiles)
+        self.loadPackages(additionalFiles, self.spec.prefix);
+
+      // Always load all local packages
+      for (name in self.localPackages) {
+        self.log('Local package:  ' + name);
+        self.localStorageSource.push(self.localPackages[name]);
+      }
+
+      // Be sure to setup & initialize smalltalk classes
+      self.loadJS('init.js');
+    },
+
+    loadPackages: function(names, prefix){
+      var self = this;
+      var name, url;
+      var prefix = prefix || 'js';
+
+      for (var i=0; i < names.length; i++) {
+        name = names[i].split(/\.js$/)[0];
+
+        // Only load package from the server if it isn't stored in
+        // localStorage
+        if (!(name in self.localPackages)) {
+          self.log('Server package: ' + name);
+          self.loadJS(name + '.js', prefix);
+        }
+      }
+    },
+
+    loadJS: function(name, prefix) {
+      var self = this;
+      var prefix = prefix || 'js';
+      var name = name;
+
+      if (!self.deploy)
+        name = name + self.nocache;
+
+      var url = self.home + prefix + '/' + name;
+      var scriptString = '<script src="' + url + '" type="text/javascript"></script>';
+      document.write(scriptString);
+    },
+
+    loadCSS: function (name, prefix) {
+      var self = this;
+      var prefix = prefix || 'css';
+      var name = name;
+      if (!self.deploy)
+        name = name + self.nocache;
+
+      var url = self.home + prefix + '/' + name;
+
+      var link = document.createElement("link");
+      link.setAttribute("rel", "stylesheet");
+      link.setAttribute("type", "text/css");
+      link.setAttribute("href", url);
+      document.getElementsByTagName("head")[0].appendChild(link);
+    },
+
+    loadDependencies: function() {
+      var self = this;
+      self.loadJS('lib/jQuery/jquery-1.6.4.min.js');
+      self.loadJS('lib/jQuery/jquery-ui-1.8.9.custom.min.js');
+    },
+
+    loadIDEDependencies: function() {
+      var self = this;
+      self.loadJS('lib/jQuery/jquery.textarea.js');
+      self.loadJS('lib/CodeMirror/lib/codemirror.js');
+      self.loadCSS('lib/CodeMirror/lib/codemirror.css', 'js');
+      self.loadJS('lib/CodeMirror/mode/smalltalk/smalltalk.js');
+      self.loadCSS('lib/CodeMirror/theme/amber.css', 'js');
+    },
+
+    // This will be called after JS files have been loaded
+    initializeSmalltalk: function(){
+      var self = this;
+
+      for (var i=0; i < self.localStorageSource.length; i++)
+        eval(self.localStorageSource[i]);
+
+      smalltalk.init(smalltalk.Object);
+      smalltalk.classes()._do_(function(each) {each._initialize()});
+
+      if (self.spec.ready)
+        self.spec.ready();
+
+      if (self.deploy)
+        smalltalk.setDeploymentMode();
+    },
+
+    populateLocalPackages: function(){
+      var self = this;
+      var localStorageRE = /^smalltalk\.packages\.(.*)$/;
+      self.localPackages = {};
+
+      var match, key;
+
+      for(var i=0; i < localStorage.length; i++) {
+        key = localStorage.key(i);
+
+        if (match = key.match(localStorageRE)) {
+          self.localPackages[match[1]] = localStorage[key];
+        }
+      }
+
+      return self.localPackages;
+    },
+
+    clearLocalPackages: function(){
+      var self = this;
+      for (var name in self.localPackages) {
+        self.log('Removing ' + name + ' from local storage');
+        localStorage.removeItem('smalltalk.packages.' + name);
+      }
+    },
 
-    window.loadAmber = function(spec) {
-	/* 
-	 example: 
-	 loadAmber({
-	   files: ['MyCategory1.js', 'MyCategory2.js'], 
-	   ready: function() {smalltalk.Browser._open()}
-	 })
-	*/
-
-	var spec = spec || {};
-
-	// In deployment mode, only the compressed version of Kernel 
-	// and Canvas are loaded
-	deploy = spec.deploy || false;
-
-	// Specify a version string to avoid wrong browser caching
-	if(spec.version) {
-	    nocache = '?' + spec.version;
-	}
-
-	loadDependencies();
-	if(deploy) {
-	    loadJS("boot.js");
-	    loadJS("Kernel.deploy.js");
-	    loadJS("Canvas.deploy.js");
-	} else {
-	    loadIDEDependencies();
-	    loadCSS('amber.css');
-	    loadJS("boot.js");
-	    loadJS("Kernel.js");
-	    loadJS("Canvas.js");
-	    loadJS("Compiler.js");
-	    loadJS("parser.js");
-	    loadJS("IDE.js");
-	    loadJS("SUnit.js");
-	    loadJS("Examples.js");
-	    loadJS("Benchfib.js");
-	    loadJS("Kernel-Tests.js");
-	}
-
-	// Load other files, possibly with another directory prefix than 'js'
-	if(spec.files) {
-	    for(var i=0; i < spec.files.length; i++) {
-		loadJS(spec.files[i], spec.prefix);
-	    }
-	}
-
-	smalltalkReady = function() {
-	    if(spec.ready) {
-		spec.ready();
-	    }
-	    if(deploy) {smalltalk.setDeploymentMode()}
-	}
-
-	// Be sure to setup & initialize smalltalk classes
-	loadJS("init.js");
+    log: function(string) {
+      var self = this;
+      if (self.debug)
+        console.log(string);
     }
+  };
 
-})();
+  window.loadAmber = function(spec) {
+    Amber.load(spec);
+  }
+})();

+ 1 - 8
js/init.js

@@ -1,8 +1 @@
-smalltalk.init(smalltalk.Object);
-smalltalk.classes()._do_(function(each) {each._initialize()});
-
-/* Similar to jQuery(document).ready() */
-
-if(this.smalltalkReady) {
-    this.smalltalkReady();
-}
+Amber.initializeSmalltalk();

+ 2 - 2
server/Makefile

@@ -1,7 +1,7 @@
-Program.js: FileServer.st
+server.js: FileServer.st
 	../bin/amberc -m FileServer FileServer.st server
 
-run: Program.js
+run: server.js
 	./server
 
 clean:

+ 5 - 3
st/IDE.st

@@ -599,9 +599,11 @@ compileMethodDefinitionFor: aClass
     method := compiler eval: (compiler compileNode: node).
     method category: selectedProtocol.
     compiler unknownVariables do: [:each |
-	(self confirm: 'Declare ''', each, ''' as instance variable?') ifTrue: [
-		self addInstanceVariableNamed: each toClass: aClass.
-		^self compileMethodDefinitionFor: aClass]].
+        "Do not try to redeclare javascript's objects"
+        (window at: each) ifNil: [
+		(self confirm: 'Declare ''', each, ''' as instance variable?') ifTrue: [
+			self addInstanceVariableNamed: each toClass: aClass.
+			^self compileMethodDefinitionFor: aClass]]].
     aClass addCompiledMethod: method.
     compiler setupClass: aClass.
     self updateMethodsList.