2003/06/26 01:53:37
[org.ibex.core.git] / src / org / xwt / Template.java
index 4022c42..6ee6f0b 100644 (file)
@@ -73,10 +73,10 @@ public class Template {
     private boolean changed = false;
 
     /** the script on the static node of this template, null if it has already been executed */
-    private JS.Function staticscript = null;
+    private JS.CompiledFunction staticscript = null;
 
     /** the script on this node */
-    private JS.Function script = null;
+    private JS.CompiledFunction script = null;
 
     /** during XML parsing, this holds the list of currently-parsed children; null otherwise */
     private Vec childvect = new Vec();
@@ -165,7 +165,7 @@ public class Template {
      *  @param pboxes a vector of all box parents on which to put $-references
      *  @param ptemplates a vector of the nodeNames to recieve private references on the pboxes
      */
-    void apply(Box b, Vec pboxes, Vec ptemplates, JS.Function callback, int numerator, int denominator) {
+    void apply(Box b, Vec pboxes, Vec ptemplates, JS.Callable callback, int numerator, int denominator) {
 
         int original_numerator = numerator;
 
@@ -206,13 +206,13 @@ public class Template {
         if (redirect != null && !"self".equals(redirect)) redir = (Box)b.get("$" + redirect);
 
         if (script != null) try {
-            script.cloneWithNewParentScope(b).call(new JS.Array());
+            script.call(new JS.Array(), b);
         } catch (JS.Exn e) {
             if (Log.on) Log.log(this, "WARNING: uncaught ecmascript exception: " + e.getMessage());
         }
 
         for(int i=0; keys != null && i<keys.length; i++) {
-           // FIXME: make sure that if exceptions are thrown in here, the line number of the offending XML is logged
+            // FIXME: make sure that if exceptions are thrown in here, the line number of the offending XML is logged
             if (keys[i] == null) { }
             else if (keys[i].equals("border") || keys[i].equals("image") &&
                      !vals[i].toString().startsWith("http://") && !vals[i].toString().startsWith("https://")) {
@@ -238,18 +238,18 @@ public class Template {
 
         if (callback != null)
             try {
-               JS.Array args = new JS.Array();
-               args.addElement(new Double(numerator));
-               args.addElement(new Double(denominator));
+                JS.Array args = new JS.Array();
+                args.addElement(new Double(numerator));
+                args.addElement(new Double(denominator));
                 callback.call(args);
             } catch (JS.Exn e) {
                 if (Log.on) Log.log(this, "WARNING: uncaught ecmascript exception: " + e);
             }
 
         if (Thread.currentThread() instanceof ThreadMessage) try {
-           XWT.sleep(0);
+            XWT.sleep(0);
         } catch (JS.Exn e) {
-           if (Log.on) Log.log(this, "WARNING: uncaught ecmascript exception: " + e);
+            if (Log.on) Log.log(this, "WARNING: uncaught ecmascript exception: " + e);
         }
     }
 
@@ -264,7 +264,7 @@ public class Template {
     }
 
     /** adds a theme mapping, retemplatizing as needed */
-    public static void retheme(JS.Function callback) {
+    public static void retheme(JS.Callable callback) {
         XWF.flushXWFs();
 
         // clear changed marker and relink
@@ -284,9 +284,9 @@ public class Template {
 
         if (callback != null)
             try {
-               JS.Array args = new JS.Array();
-               args.addElement(new Double(1.0));
-               args.addElement(new Double(1.0));
+                JS.Array args = new JS.Array();
+                args.addElement(new Double(1.0));
+                args.addElement(new Double(1.0));
                 callback.call(args);
             } catch (JS.Exn ex) {
                 if (Log.on) Log.log(Template.class, "WARNING: uncaught ecmascript exception: " + ex.getMessage());
@@ -296,8 +296,8 @@ public class Template {
     /** template reapplication procedure */
     private static void reapply(Box b) {
 
-       Log.log(Template.class, "Template.reapply() not implemented");
-       /*
+        Log.log(Template.class, "Template.reapply() not implemented");
+        /*
         // Ref 7.5.1: check if we need to retemplatize
         boolean retemplatize = false;
         if (b.templatename != null) {
@@ -351,7 +351,7 @@ public class Template {
 
         // Recurse
         for(Box j = b.getChild(0); j != null; j = j.nextSibling()) reapply(j);
-       */
+        */
     }
 
     /** runs statics, resolves string references to other templates into actual Template instance references, and sets <tt>change</tt> as needed */
@@ -363,18 +363,18 @@ public class Template {
         if (staticscript != null) try { 
             JS.Scope s = Static.createStatic(nodeName, false);
             if (staticscript != null) {
-                JS.Function temp = staticscript;
+                JS.CompiledFunction temp = staticscript;
                 staticscript = null;
 
-               // we layer a transparent scope over the Static so that we can catch requests for the xwt object
-               // yet not screw up paths that include a package called xwt (ie xwt.static.org.xwt.foo)
-               JS.Scope varScope = new JS.Scope(s) {
-                       public boolean isTransparent() { return true; }
-                       public Object get(Object key) {
-                           if ("xwt".equals(key)) return XWT.singleton; else return super.get(key);
-                       } };
+                // we layer a transparent scope over the Static so that we can catch requests for the xwt object
+                // yet not screw up paths that include a package called xwt (ie xwt.static.org.xwt.foo)
+                JS.Scope varScope = new JS.Scope(s) {
+                        public boolean isTransparent() { return true; }
+                        public Object get(Object key) {
+                            if ("xwt".equals(key)) return XWT.singleton; else return super.get(key);
+                        } };
 
-               temp.cloneWithNewParentScope(varScope).call(null);
+                temp.call(new JS.Array(), varScope);
             }
         } catch (JS.Exn e) {
             if (Log.on) Log.log(this, "WARNING: uncaught ecmascript exception: " + e.getMessage());
@@ -488,6 +488,7 @@ public class Template {
                     if (t.redirect != null)
                         throw new XML.SchemaException("the <redirect> header element may not appear more than once");
                     t.redirect = c.vals[0].toString();
+                    if(t.redirect.equals("null")) t.redirect = null;
                     return;
 
                 } else if (c.localName.equals("preapply")) {
@@ -650,10 +651,10 @@ public class Template {
             }
         }
 
-        private JS.Function genscript(boolean isstatic) {
-            JS.Function thisscript = null;
+        private JS.CompiledFunction genscript(boolean isstatic) {
+            JS.CompiledFunction thisscript = null;
             try {
-                thisscript = JS.parse(new StringReader(t.content.toString()), t.nodeName + (isstatic ? "._" : ""), t.content_start);
+                thisscript = JS.parse(t.nodeName + (isstatic ? "._" : ""), t.content_start, new StringReader(t.content.toString()));
             } catch (JS.Exn ee) {
                 if (Log.on) Log.log(this, "  ERROR: " + ee.getMessage());
                 thisscript = null;