2004/01/19 00:16:54
[org.ibex.core.git] / src / org / xwt / Platform.java
index abbf3ec..8c4df6e 100644 (file)
@@ -1,10 +1,11 @@
-// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL]
+// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL]
 package org.xwt;
 
 import java.lang.reflect.*;
 import java.net.*;
 import java.io.*;
 import java.util.*;
+import org.xwt.js.*;
 import org.xwt.util.*;
 
 /** 
@@ -46,46 +47,45 @@ public abstract class Platform {
             String os_version = System.getProperty("os.version", "");
             String platform_class = null;
             
-            if (os_name.startsWith("Darwin")) platform_class = "Darwin";
-            else if (vendor.startsWith("Free Software Foundation")) {
+            if (vendor.startsWith("Free Software Foundation")) {
                 if (os_name.startsWith("Window")) platform_class = "Win32";
+                else if (os_name.startsWith("Linux")) platform_class = "Linux";
+                else if (os_name.startsWith("SunOS")) platform_class = "Solaris";
+                else if (os_name.startsWith("Solaris")) platform_class = "Solaris";
                 else platform_class = "X11";
-            } else if (version.startsWith("1.1") && vendor.startsWith("Netscape")) platform_class = "Netscape";
-            else if (version.startsWith("1.1") && vendor.startsWith("Microsoft")) platform_class = "Microsoft";
+            }
             else if (!version.startsWith("1.0") && !version.startsWith("1.1")) platform_class = "Java2";
 
-            // Disable 2d hardware acceleration on Jaguar (do we need this?)
-            // if (os_name.equals("Mac OS X") && os_version.startsWith("10.2")) System.setProperty("com.apple.hwaccel", "false");
-            //System.setProperty("com.apple.hwaccel", "false");
+            if (platform_class == null) {
+                Log.error(Platform.class, "Unable to detect JVM");
+                criticalAbort("Unable to detect JVM");
+            }
 
-            if (platform_class != null)
-                Class.forName("org.xwt.plat." + platform_class).newInstance();
+            if (platform_class != null) Class.forName("org.xwt.plat." + platform_class).newInstance();
 
+            String term = Platform.getEnv("TERM");
+            Log.color = term != null && term.length() != 0 && !term.equals("cygwin");
+            
             try {
                 build = (String)Class.forName("org.xwt.Build").getField("build").get(null);
+                Log.diag(Platform.class, "XWT build: " + build);
             } catch (ClassNotFoundException cnfe) {
+                Log.warn(Platform.class, "XWT build: unknown");
             } catch (Exception e) {
-                if (Log.on) Log.info(Platform.class, "exception while detecting build:");
-                if (Log.on) Log.info(Platform.class, e);
-            }
-            if (Log.on) Log.info(Platform.class, "XWT build: " + build);
-
-            if (Log.on) Log.info(Platform.class, "XWT VM detection:   vendor = " + vendor);
-            if (Log.on) Log.info(Platform.class, "                   version = " + version);
-            if (Log.on) Log.info(Platform.class, "                        os = " + os_name + " [version " + os_version + "]");
-
-            if (platform_class == null) {
-                if (Log.on) Log.info(Platform.class, "Unable to detect JVM");
-                criticalAbort("Unable to detect JVM");
+                Log.info(Platform.class, "exception while detecting build:");
+                Log.info(Platform.class, e);
             }
 
-            if (Log.on) Log.info(Platform.class, "                  platform = " + platform.getDescriptiveName());
-            if (Log.on) Log.info(Platform.class, "                     class = " + platform.getClass().getName());
+            Log.diag(Platform.class, "XWT VM detection:   vendor = " + vendor);
+            Log.diag(Platform.class, "                   version = " + version);
+            Log.diag(Platform.class, "                        os = " + os_name + " [version " + os_version + "]");
+            Log.diag(Platform.class, "                  platform = " + platform.getDescriptiveName());
+            Log.diag(Platform.class, "                     class = " + platform.getClass().getName());
             platform.postInit();
 
         } catch (Exception e) {
-            if (Log.on) Log.info(Platform.class, "Exception while trying to detect JVM");
-            if (Log.on) Log.info(Platform.class, e);
+            Log.error(Platform.class, "Exception while trying to detect JVM");
+            Log.error(Platform.class, e);
             criticalAbort("Unable to detect JVM");
         }
 
@@ -94,32 +94,36 @@ public abstract class Platform {
 
     // Methods to be Overridden ///////////////////////////////////////////////////////////////////
 
-    /** a string describing the VM */
-    protected String getDescriptiveName() { return "Generic Java 1.1 VM"; }
-
-    /** invoked after initialization messages have been printed; useful for additional platform detection log messages */
-    protected void postInit() { }
-
     protected Surface _createSurface(Box b, boolean framed) { return null; }
-    protected Picture _createPicture(Res r) { return null; }
+    protected Picture _createPicture(JS r) { return null; }
     protected PixelBuffer _createPixelBuffer(int w, int h, Surface owner) { return null; }
     protected Font.Glyph _createGlyph(org.xwt.Font f, char c) { return new DefaultGlyph(f, c); }
 
     public static PixelBuffer createPixelBuffer(int w, int h, Surface s) { return platform._createPixelBuffer(w, h, s); }
-    public static Picture createPicture(Res r) { return platform._createPicture(r); }
+    public static Picture createPicture(JS r) { return platform._createPicture(r); }
     public static Font.Glyph createGlyph(org.xwt.Font f, char c) { return platform._createGlyph(f, c); }
     public static Surface createSurface(Box b, boolean framed, boolean refreshable) {
         Surface ret = platform._createSurface(b, framed);
         ret.setInvisible(false);
-        ret.setLimits(b.minwidth, b.minheight, b.maxwidth, b.maxheight);
         if (refreshable) {
             Surface.allSurfaces.addElement(ret);
             ret.dirty(0, 0, b.width, b.height);
             ret.Refresh();
         }
+        try {
+            if (b.get("titlebar") != null) ret.setTitleBarText((String)b.get("titlebar"));
+        } catch (JSExn e) {
+            Log.warn(Platform.class, e);
+        }
         return ret;
     }
 
+    /** a string describing the VM */
+    protected String getDescriptiveName() { return "Generic Java 1.1 VM"; }
+
+    /** invoked after initialization messages have been printed; useful for additional platform detection log messages */
+    protected void postInit() { }
+
     /** the human-readable name of the key mapped to XWT's 'alt' key */
     public static String altKeyName() { return platform._altKeyName(); }
     protected String _altKeyName() { return "alt"; }
@@ -142,6 +146,11 @@ public abstract class Platform {
 
     /** used to notify the user of very serious failures; usually used when logging is not working or unavailable */
     protected void _criticalAbort(String message) { System.exit(-1); }
+    public static void criticalAbort(String message) {
+        Log.info(Platform.class, "Critical Abort:");
+        Log.info(Platform.class, message);
+        platform._criticalAbort(message);
+    }
 
     /** if true, org.xwt.Surface will generate a Click automatically after a press and a release */
     public static boolean needsAutoClick() { return platform._needsAutoClick(); }
@@ -157,9 +166,7 @@ public abstract class Platform {
 
     /** returns an InputStream to the builtin xwar */
     public static InputStream getBuiltinInputStream() { return platform._getBuiltinInputStream(); }
-    protected InputStream _getBuiltinInputStream() {
-        return this.getClass().getClassLoader().getResourceAsStream("org/xwt/builtin.jar");
-    }
+    protected InputStream _getBuiltinInputStream() {return getClass().getClassLoader().getResourceAsStream("org/xwt/builtin.jar");}
 
     /** returns the value of the environment variable key, or null if no such key exists */
     public static String getEnv(String key) { return platform._getEnv(key); }
@@ -184,8 +191,8 @@ public abstract class Platform {
                 if (s.startsWith(key + "="))
                     return s.substring(key.length() + 1);
         } catch (Exception e) {
-            if (Log.on) Log.info(this, "Exception while reading from environment:");
-            if (Log.on) Log.info(this, e);
+            Log.info(this, "Exception while reading from environment:");
+            Log.info(this, e);
         }
         return null;
     }
@@ -207,38 +214,30 @@ public abstract class Platform {
             Method m = c.getMethod("openURL", new Class[] { String.class });
             m.invoke(null, new String[] { url });
         } catch (Exception e) {
-            Log.info(this, e);
+            Log.warn(this, "exception trying to open a browser window");
+            Log.warn(this, e);
         }
     }
 
     /** opens a new browser window */
     public static void newBrowserWindow(String url) {
         if (!(url.startsWith("https://") || url.startsWith("http://") || url.startsWith("ftp://") || url.startsWith("mailto:"))) {
-            if (Log.on) Log.info(Platform.class, "xwt.newBrowserWindow() only supports http and https urls");
+            Log.info(Platform.class, "xwt.newBrowserWindow() only supports http and https urls");
             return;
         }
-
         // check the URL for well-formedness, as a defense against buffer overflow attacks
         try {
             String u = url;
             if (u.startsWith("https")) u = "http" + u.substring(5);
             new URL(u);
         } catch (MalformedURLException e) {
-            if (Log.on) Log.info(Platform.class, "URL " + url + " is not well-formed");
-            if (Log.on) Log.info(Platform.class, e);
+            Log.info(Platform.class, "URL " + url + " is not well-formed");
+            Log.info(Platform.class, e);
         }
-
-        if (Log.on) Log.info(Platform.class, "newBrowserWindow, url = " + url);
+        Log.info(Platform.class, "newBrowserWindow, url = " + url);
         platform._newBrowserWindow(url);
     }
 
-    /** used to notify the user of very serious failures; usually used when logging is not working or unavailable */
-    public static void criticalAbort(String message) {
-        if (Log.on) Log.info(Platform.class, "Critical Abort:");
-        if (Log.on) Log.info(Platform.class, message);
-        platform._criticalAbort(message);
-    }
-
     /** detects proxy settings */
     protected synchronized org.xwt.HTTP.Proxy _detectProxy() { return null; }
     public static synchronized org.xwt.HTTP.Proxy detectProxy() {
@@ -247,11 +246,11 @@ public abstract class Platform {
         if (alreadyDetectedProxy) return null;
         alreadyDetectedProxy = true;
 
-        if (Log.on) Log.info(Platform.class, "attempting environment-variable DNS proxy detection");
+        Log.info(Platform.class, "attempting environment-variable DNS proxy detection");
         cachedProxyInfo = org.xwt.HTTP.Proxy.detectProxyViaManual();
         if (cachedProxyInfo != null) return cachedProxyInfo;
 
-        if (Log.on) Log.info(Platform.class, "attempting " + platform.getClass().getName() + " proxy detection");
+        Log.info(Platform.class, "attempting " + platform.getClass().getName() + " proxy detection");
         cachedProxyInfo = platform._detectProxy();
         if (cachedProxyInfo != null) return cachedProxyInfo;
 
@@ -268,18 +267,18 @@ public abstract class Platform {
         public DefaultGlyph(org.xwt.Font f, char c) { super(f, c); }
         public Picture getPicture() {
             if (p == null && isLoaded) {
-                p = createPicture(null);
+                Picture p = createPicture(null);
                 p.data = new int[data.length];
                 for(int i=0; i<data.length; i++) p.data[i] = (data[i] & 0xff) << 24;
-                data = null;
+                this.data = null;
                 p.width = this.width;
                 p.height = this.height;
+                p.isLoaded = true;
+                this.p = p;
             }
             return p;
         }
     }
-
-
 }