2002/08/16 23:37:51
[org.ibex.core.git] / src / org / xwt / Static.java
1 // Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL]
2 package org.xwt;
3
4 import org.xwt.util.*;
5 import org.mozilla.javascript.*;
6
7 /** implements objects in the xwt.static.* namespace */
8 public class Static extends JSObject {
9
10     public static Static getStatic(String resourcename) {
11         Template t = Template.getTemplate(resourcename, null);
12         if (t != null) t.link();
13         return (Static)cache.get(resourcename);
14     }
15
16     public static Static createStatic(String resourcename, boolean isPackage) {
17         Static ret = (Static)cache.get(resourcename);
18         if (ret != null) return ret;
19         if (resourcename.indexOf('.') != -1)
20             createStatic(resourcename.substring(0, resourcename.lastIndexOf('.')), true);
21         ret = new Static(resourcename, isPackage);
22         return ret;
23     }
24
25     private static Hash cache = new Hash();
26
27     /** the resource name that this Static object corresponds to */
28     private String resourcename = null;
29
30     /** true iff this represents a directory (rather than an actual xwt) */
31     public boolean ispackage = false;
32
33     private Static(String resourcename, boolean ispackage) {
34         super(true);
35         cache.put(resourcename, this);
36         this.resourcename = resourcename;
37         this.ispackage = ispackage;
38         setSeal(ispackage);
39     }
40     
41     /** creates a new static representing a package */
42     public Static(String resourcename) { this(resourcename, true); }
43
44     public Object get(String name, Scriptable start) {
45         if (name == null) return null;
46
47         // hack since Rhino needs to be able to grab these functions to create new objects
48         if (name.equals("Object")) return JSObject.defaultObjects.get("Object", null);
49         if (name.equals("Array")) return JSObject.defaultObjects.get("Array", null);
50         if (name.equals("Function")) return JSObject.defaultObjects.get("Function", null);
51         if (name.equals("TypeError")) return JSObject.defaultObjects.get("TypeError", null);
52
53         if ("xwt".equals(name))
54             for(Scriptable cur = Context.enter().currentFunction; cur != null; cur = cur.getParentScope())
55                 if (cur == this) return XWT.singleton;
56
57         if (!ispackage) return super.get(name, start);
58         return getStatic(resourcename + (resourcename.length() == 0 ? "" : ".") + name);
59     }
60
61     static { createStatic("", true); }
62
63 }