X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FPlatform.java;h=02e75dd4fb8eddf7d26661811edf4feb0d47d566;hb=8fd78bcfe4e844cae509d132ca37bd32a115a6f1;hp=af9a169a2e3d478977b8bcc2552a769b82618643;hpb=7e44b314529106dfc24f09c6c3ac6b9adba92cb2;p=org.ibex.core.git diff --git a/src/org/xwt/Platform.java b/src/org/xwt/Platform.java index af9a169..02e75dd 100644 --- a/src/org/xwt/Platform.java +++ b/src/org/xwt/Platform.java @@ -113,7 +113,7 @@ public class Platform { protected Picture _createPicture(int[] b, int w, int h) { return null; } /** should return true if it is safe to supress full-surface dirties immediately after a window resize */ - protected boolean _supressDirtyOnResize() { return true; } + protected boolean _supressDirtyOnResize() { return false; } /** the human-readable name of the key mapped to XWT's 'alt' key */ protected String _altKeyName() { return "alt"; } @@ -167,6 +167,9 @@ public class Platform { /** if true, org.xwt.Surface will generate a Click automatically after a press and a release */ protected boolean _needsAutoClick() { return false; } + /** if true, org.xwt.Surface will generate a DoubleClick automatically after recieving two clicks in a short period of time */ + protected boolean _needsAutoDoubleClick() { return false; } + protected void _newBrowserWindow(String url) { if (Log.on) Log.log(this, "Platform " + platform.getClass().getName() + " cannot open browser windows"); return; @@ -175,11 +178,21 @@ public class Platform { /** Returns null if XWT should always use direct connection; otherwise returns a ProxyInfo object with proxy settings */ protected synchronized HTTP.ProxyInfo _detectProxy() { return null; } + /** displays a platform-specific "open file" dialog and returns the chosen filename, or null if the user hit cancel */ + protected String _fileDialog(String suggestedFileName, boolean write) { return null; } + + /** returns true iff the platform has a case-sensitive filesystem */ + protected boolean _isCaseSensitive() { return true; } + + // Static methods -- thunk to the instance ///////////////////////////////////////////////////////////////////////// /** if true, org.xwt.Surface should generate Click messages automatically when a Release happens after a Press and the mouse has not moved much */ public static boolean needsAutoClick() { return platform._needsAutoClick(); } + /** if true, org.xwt.Surface should generate DoubleClick messages automatically when needed */ + public static boolean needsAutoDoubleClick() { return platform._needsAutoDoubleClick(); } + /** should return true if it is safe to supress full-surface dirties immediately after a window resize */ public static String getDefaultFont() { return platform._getDefaultFont(); } @@ -233,12 +246,36 @@ public class Platform { /** creates and returns a picture */ public static Picture createPicture(ImageDecoder i) { return platform._createPicture(i.getData(), i.getWidth(), i.getHeight()); } + /** returns true iff the platform has a case-sensitive filesystem */ + public static boolean isCaseSensitive() { return platform._isCaseSensitive(); } + + /** displays a platform-specific "open file" dialog and returns the chosen filename, or null if the user hit cancel */ + public static String fileDialog(String suggestedFileName, boolean write) { + if (!ThreadMessage.suspendThread()) return null; + try { + return platform._fileDialog(suggestedFileName, write); + } finally { + ThreadMessage.resumeThread(); + } + } + /** 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.log(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.log(Platform.class, "URL " + url + " is not well-formed"); + if (Log.on) Log.log(Platform.class, e); + } + if (Log.on) Log.log(Platform.class, "newBrowserWindow, url = " + url); platform._newBrowserWindow(url); } @@ -333,7 +370,7 @@ public class Platform { public void parse(String font) { int i = 0; - while(i < font.length() && !Character.isDigit(font.charAt(i))) i++; + while(i < font.length() && !Character.isDigit(font.charAt(i)) && font.charAt(i) != '*') i++; name = font.substring(0, i).toLowerCase().replace('_', ' '); size = 10; italic = false; @@ -341,10 +378,15 @@ public class Platform { underline = false; dotted_underline = false; if (i != font.length()) { - int j = i; - while (j < font.length() && Character.isDigit(font.charAt(j))) j++; - if (i != j) size = stoi(font.substring(i, j)); - i = j; + if (font.charAt(i) == '*') { + size = 0; + i++; + } else { + int j = i; + while (j < font.length() && Character.isDigit(font.charAt(j))) j++; + if (i != j) size = stoi(font.substring(i, j)); + i = j; + } while(i < font.length()) { switch (font.charAt(i)) { case 'b': bold = true; break;