/* * Smart GWT (GWT for SmartClient) * Copyright 2008 and beyond, Isomorphic Software, Inc. * * Smart GWT is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. Smart GWT is also * available under typical commercial license terms - see * http://smartclient.com/license * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package com.smartgwt.client.util; import com.smartgwt.client.event.*; import com.smartgwt.client.core.*; import com.smartgwt.client.types.*; import com.smartgwt.client.data.*; import com.smartgwt.client.data.events.*; import com.smartgwt.client.rpc.*; import com.smartgwt.client.widgets.*; import com.smartgwt.client.widgets.events.*; import com.smartgwt.client.widgets.form.*; import com.smartgwt.client.widgets.form.validator.*; import com.smartgwt.client.widgets.form.fields.*; import com.smartgwt.client.widgets.tile.*; import com.smartgwt.client.widgets.tile.events.*; import com.smartgwt.client.widgets.grid.*; import com.smartgwt.client.widgets.grid.events.*; import com.smartgwt.client.widgets.chart.*; import com.smartgwt.client.widgets.layout.*; import com.smartgwt.client.widgets.layout.events.*; import com.smartgwt.client.widgets.menu.*; import com.smartgwt.client.widgets.tab.*; import com.smartgwt.client.widgets.toolbar.*; import com.smartgwt.client.widgets.tree.*; import com.smartgwt.client.widgets.tree.events.*; import com.smartgwt.client.widgets.viewer.*; import com.smartgwt.client.widgets.calendar.*; import com.smartgwt.client.widgets.calendar.events.*; import com.smartgwt.client.widgets.cube.*; import java.util.Date; import java.util.List; import java.util.Map; import java.util.HashMap; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.Element; import com.smartgwt.client.util.*; import com.google.gwt.event.shared.*; import com.google.gwt.event.shared.HasHandlers; /** * Provides information about the page you're loaded in. We define "page" here to be roughly equivalent to the browser * window or frame the libraries have been loaded in. */ public class Page { // ********************* Properties / Attributes *********************** // ********************* Methods *********************** // ********************* Static Methods *********************** /** * Check whether the browser is supported by the Isomorphic Smart GWT system. Behavior depends upon the value of {@link * com.smartgwt.client.util.Page#unsupportedBrowserAction unsupportedBrowserAction}: <ul> <li><code>"continue"</code> Load * the page without notifying the user of potential issues</li> <li><code>"confirm"</code> Notify the user via a standard * confirm dialog that their browser is not supported. Provide options to continue anyway, or redirect to another page. * Text of the confirm dialog is retrieved by calling {@link * com.smartgwt.client.util.Page#getUnsupportedBrowserPromptString Page.getUnsupportedBrowserPromptString}.</li> * <li><code>"redirect"</code> Automatically redirect to the another URL</li> </ul> If redirecting to another page is * necessary, and no explicit URL is provided we will use {@link com.smartgwt.client.util.Page#defaultUnsupportedBrowserURL * defaultUnsupportedBrowserURL}. <p> This method is commonly called as part of the {@link * com.smartgwt.client.docs.Skinning skinning} logic after page load. */ public static native void checkBrowserAndRedirect() /*-{ $wnd.isc.Page.checkBrowserAndRedirect(); }-*/; /** * Check whether the browser is supported by the Isomorphic Smart GWT system. Behavior depends upon the value of {@link * com.smartgwt.client.util.Page#unsupportedBrowserAction unsupportedBrowserAction}: <ul> <li><code>"continue"</code> Load * the page without notifying the user of potential issues</li> <li><code>"confirm"</code> Notify the user via a standard * confirm dialog that their browser is not supported. Provide options to continue anyway, or redirect to another page. * Text of the confirm dialog is retrieved by calling {@link * com.smartgwt.client.util.Page#getUnsupportedBrowserPromptString Page.getUnsupportedBrowserPromptString}.</li> * <li><code>"redirect"</code> Automatically redirect to the another URL</li> </ul> If redirecting to another page is * necessary, and no explicit URL is provided we will use {@link com.smartgwt.client.util.Page#defaultUnsupportedBrowserURL * defaultUnsupportedBrowserURL}. <p> This method is commonly called as part of the {@link * com.smartgwt.client.docs.Skinning skinning} logic after page load. * @param URL URL of redirect page. May include Isomorphic special directories such as [SKIN]. * @see com.smartgwt.client.util.Page#unsupportedBrowserAction * @see com.smartgwt.client.util.Page#getUnsupportedBrowserPromptString * @see com.smartgwt.client.util.Page#defaultUnsupportedBrowserURL */ public static native void checkBrowserAndRedirect(String URL) /*-{ $wnd.isc.Page.checkBrowserAndRedirect(URL); }-*/; /** * Returns the base URL of the application, which is the page URL minus the last non-directory path component. For * example, if the page is loaded from <code>http://foo.com/bar/zoo.jsp</code>, appDir will be * <code>http://foo.com/bar/</code>. <P> If other page-wide URLs such as {@link * com.smartgwt.client.util.Page#setIsomorphicDir Page.setIsomorphicDir} are specified as relative paths, they are * considered relative to this URL. * * @return URL for page-specific files. */ public static native String getAppDir() /*-{ return $wnd.isc.Page.getAppDir(); }-*/; /** * Returns the directory for application-specific files (other than images). */ public static native void getAppFilesDir() /*-{ $wnd.isc.Page.getAppFilesDir(); }-*/; /** * Returns the directory for application-specific files (other than images). * @param URL New app files URL. */ public static native void getAppFilesDir(String URL) /*-{ $wnd.isc.Page.getAppFilesDir(URL); }-*/; /** * Return the directory for app-specific images. * * @return URL for page-specific images. */ public static native String getAppImgDir() /*-{ return $wnd.isc.Page.getAppImgDir(); }-*/; /** * Return the full URL for app-specific or skin image. <P> To use a skin image, start the URL with "[SKIN]". Any other * relative URL is assumed relative to the {@link com.smartgwt.client.util.Page#getAppImgDir appImgDir}. * @param src Local file name for the image. * * @return URL for the image. */ public static native String getImgURL(String src) /*-{ return $wnd.isc.Page.getImgURL(src); }-*/; /** * Return the full URL for app-specific or skin image. <P> To use a skin image, start the URL with "[SKIN]". Any other * relative URL is assumed relative to the {@link com.smartgwt.client.util.Page#getAppImgDir appImgDir}. * @param src Local file name for the image. * @param imgDir User-specified image directory, local to * * @return URL for the image. */ public static native String getImgURL(String src, String imgDir) /*-{ return $wnd.isc.Page.getImgURL(src, imgDir); }-*/; /** * Return the root directory for Isomorphic-specific files. * * @return IsomorphicDir URL. */ public static native String getIsomorphicDir() /*-{ return $wnd.isc.Page.getIsomorphicDir(); }-*/; /** * Is the current page wider than it is tall ("landscape" orientation) or the reverse ("portrait" orientation). Note that * the {@link com.smartgwt.client.types.PageEvent orientationChange page event} will be fired whenever the page orientation * changes. <P> This method is typically useful for apps developed for display on mobile devices, though it will also * return a valid value when running against a desktop browser. See also {@link com.smartgwt.client.docs.MobileDevelopment * this discussion} on building applications for mobile devices * * @return current page orientation */ public static native PageOrientation getOrientation() /*-{ var ret = $wnd.isc.Page.getOrientation(); if(ret == null || ret === undefined) return null; var enumValues = @com.smartgwt.client.types.PageOrientation::values()(); return @com.smartgwt.client.util.EnumUtil::getEnum([Lcom/smartgwt/client/types/ValueEnum;Ljava/lang/String;)(enumValues, ret); }-*/; /** * Get the height of the window contents as they have been drawn. If the page scrolls, this may be larger than the * page.getHeight(). * * @return height of the page as drawn */ public static native int getScrollHeight() /*-{ return $wnd.isc.Page.getScrollHeight(); }-*/; /** * Get the amount that the browser window has been scrolled horizontally. * * @return horizontal scroll amount */ public static native int getScrollLeft() /*-{ return $wnd.isc.Page.getScrollLeft(); }-*/; /** * Get the amount that the browser window has been scrolled vertically. * * @return vertical scroll amount */ public static native int getScrollTop() /*-{ return $wnd.isc.Page.getScrollTop(); }-*/; /** * Get the width of the window contents as they have been drawn. If the page scrolls, this may be larger than the * page.getWidth(). * * @return width of the page as drawn */ public static native int getScrollWidth() /*-{ return $wnd.isc.Page.getScrollWidth(); }-*/; /** * Return the directory for media that's part of the skin * * @return base URL for skin media */ public static native String getSkinDir() /*-{ return $wnd.isc.Page.getSkinDir(); }-*/; /** * Return the directory for a skin image. * * @return URL for page-specific images. */ public static native String getSkinImgDir() /*-{ return $wnd.isc.Page.getSkinImgDir(); }-*/; /** * Return the directory for a skin image. * @param imgDir Partial URL (relative to Page._skinDir) where the image lives. If not supplied, will use "images/" * * @return URL for page-specific images. */ public static native String getSkinImgDir(String imgDir) /*-{ return $wnd.isc.Page.getSkinImgDir(imgDir); }-*/; /** * Returns the text for the prompt shown to user from {@link com.smartgwt.client.util.Page#checkBrowserAndRedirect * Page.checkBrowserAndRedirect} if they are accessing this page in an unsupported browser and {@link * com.smartgwt.client.util.Page#unsupportedBrowserAction unsupportedBrowserAction} is set to <code>"confirm"</code>. May * be overridden to return a different message. * * @return Unsupported browser message. * @see com.smartgwt.client.util.Page#checkBrowserAndRedirect */ public static native String getUnsupportedBrowserPromptString() /*-{ return $wnd.isc.Page.getUnsupportedBrowserPromptString(); }-*/; /** * Return a full URL for a relative path that uses a special prefix such as "[APPFILES]" or "[SKIN]". <P> For images, use * {@link com.smartgwt.client.util.Page#getImgURL Page.getImgURL} instead. * @param fileName Local file name for the image. * * @return URL for the image. */ public static native String getURL(String fileName) /*-{ return $wnd.isc.Page.getURL(fileName); }-*/; /** * Has the page finished loading? * * @return true == page is done loading */ public static native Boolean isLoaded() /*-{ var retVal =$wnd.isc.Page.isLoaded(); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Return whether the page text direction is right to left. If you set "DIR=RTL" in the BODY tag of the page, then this * method will return true. If you set "DIR=LTR" then this method will return false. * * @return true if Page text direction is RTL, false otherwise */ public static native Boolean isRTL() /*-{ var retVal =$wnd.isc.Page.isRTL(); if(retVal == null || retVal === undefined) { return null; } else { return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(retVal); } }-*/; /** * Load a styleSheet for this application. The styleSheetURL parameter can use any special directories, eg:<br> *   <code>Page.loadStylesheet("[SKIN]/skin_styles.css")</code><br> or<br> *   <code>Page.loadStylesheet("[APP]/app_styles.css")</code>. <P> If you don't specify a special * directory, the app directory will be assumed. <P> Note: If the document's ONLOAD handler has already fired, this * will have no effect. * @param styleSheetURL URL to the stylesheet. */ public static native void loadStyleSheet(String styleSheetURL) /*-{ $wnd.isc.Page.loadStyleSheet(styleSheetURL); }-*/; /** * Move the window to a specified top and left in screen coordinates. * @param left new left coordinate for window * @param top new top coordinate for window */ public static native void moveTo(int left, int top) /*-{ $wnd.isc.Page.moveTo(left, top); }-*/; /** * Resize the outer portion of the window to a specific width and height. * @param width new width for the window * @param height new height for the window */ public static native void resizeTo(int width, int height) /*-{ $wnd.isc.Page.resizeTo(width, height); }-*/; /** * Scroll the window to a specified top and left coordinate. * @param left new left coordinate for window * @param top new top coordinate for window */ public static native void scrollTo(int left, int top) /*-{ $wnd.isc.Page.scrollTo(left, top); }-*/; /** * Specify the directory for miscellaneous app-specific files <b>other than</b> images, such as {@link * com.smartgwt.client.widgets.HTMLFlow#getContentsURL HTML fragments}, {@link com.smartgwt.client.widgets.ViewLoader * loadable views}, XML or JSON flat data files, videos, etc. <P> This URL also becomes available via the prefix * "[APPFILES]" for {@link com.smartgwt.client.rpc.RPCRequest#getActionURL actionURL}. <P> Defaults to the value of {@link * com.smartgwt.client.util.Page#getAppDir Page.getAppDir}, that is, the current directory. */ public static native void setAppFilesDir() /*-{ $wnd.isc.Page.setAppFilesDir(); }-*/; /** * Specify the directory for miscellaneous app-specific files <b>other than</b> images, such as {@link * com.smartgwt.client.widgets.HTMLFlow#getContentsURL HTML fragments}, {@link com.smartgwt.client.widgets.ViewLoader * loadable views}, XML or JSON flat data files, videos, etc. <P> This URL also becomes available via the prefix * "[APPFILES]" for {@link com.smartgwt.client.rpc.RPCRequest#getActionURL actionURL}. <P> Defaults to the value of {@link * com.smartgwt.client.util.Page#getAppDir Page.getAppDir}, that is, the current directory. * @param URL New app files URL. */ public static native void setAppFilesDir(String URL) /*-{ $wnd.isc.Page.setAppFilesDir(URL); }-*/; /** * Specify the directory for app-specific images. <P> This becomes the default location where any Smart GWT component will * load images from unless the special "[SKIN]" prefix is used to indicate that an image is part of a skin. <P> Default is * "[APP]images/" */ public static native void setAppImgDir() /*-{ $wnd.isc.Page.setAppImgDir(); }-*/; /** * Specify the directory for app-specific images. <P> This becomes the default location where any Smart GWT component will * load images from unless the special "[SKIN]" prefix is used to indicate that an image is part of a skin. <P> Default is * "[APP]images/" * @param URL New imgDir URL. */ public static native void setAppImgDir(String URL) /*-{ $wnd.isc.Page.setAppImgDir(URL); }-*/; /** * Specify the root directory for Isomorphic-supplied files. */ public static native void setIsomorphicDir() /*-{ $wnd.isc.Page.setIsomorphicDir(); }-*/; /** * Specify the root directory for Isomorphic-supplied files. * @param URL New IsomorphicDir URL. */ public static native void setIsomorphicDir(String URL) /*-{ $wnd.isc.Page.setIsomorphicDir(URL); }-*/; /** * Specify the URL for media that's part of the skin */ public static native void setSkinDir() /*-{ $wnd.isc.Page.setSkinDir(); }-*/; /** * Specify the URL for media that's part of the skin * @param URL New skinDir URL */ public static native void setSkinDir(String URL) /*-{ $wnd.isc.Page.setSkinDir(URL); }-*/; // *********************************************************** /** * Fire some action when the Page recieves a keyPress event from a certain key. * Note that if a widget has keyboard focus, this action will fire only after any widget-level * keyPress handlers have fired and bubbled the event up to the top of their ancestor chain. * Multiple actions can be registered to fire on a single keyPress using this method. * This differs from calling Page.setEvent() with the "keyPress" events registered via setEvent() will fire before widget * level handlers respond to the event, and will fire for every keyPress event, not just those triggerred by some specific * key or key-combination. * * @param keyName the key name * @param callback the callback function */ public static native void registerKey(String keyName, KeyCallback callback)/*-{ $wnd.isc.Page.registerKey(keyName, $entry(function(key) { callback.@com.smartgwt.client.util.KeyCallback::execute(Ljava/lang/String;)(key); })); }-*/; /** * Fire some action when the Page recieves a keyPress event from a certain key. * Note that if a widget has keyboard focus, this action will fire only after any widget-level * keyPress handlers have fired and bubbled the event up to the top of their ancestor chain. * Multiple actions can be registered to fire on a single keyPress using this method. * This differs from calling Page.setEvent() with the "keyPress" events registered via setEvent() will fire before widget * level handlers respond to the event, and will fire for every keyPress event, not just those triggerred by some specific * key or key-combination. * * @param keyIdentifier the key identifier * @param callback the callback function */ public static native void registerKey(KeyIdentifier keyIdentifier, KeyCallback callback)/*-{ var keyIdentifierJS = keyIdentifier.@com.smartgwt.client.core.DataClass::getJsObj()(); $wnd.isc.Page.registerKey(keyIdentifierJS, $entry(function(key) { callback.@com.smartgwt.client.util.KeyCallback::execute(Ljava/lang/String;)(key); })); }-*/; /** * Clears an action registered to fire on a specific a keyPress event via the {@link #registerKey(String, KeyCallback)} method. * * @param keyName name of key to clear registry enties for */ public static native void unregisterKey(String keyName)/*-{ $wnd.isc.Page.unregisterKey(keyName); }-*/; /** * Set the title of the page, which is typically shown as part of the browser window title * * @param title the page title */ public static native void setTitle(String title) /*-{ $wnd.isc.Page.setTitle(title); }-*/; /** * Get the width of the visible portion of the window, not including browser chrome or the scrollbar area. * * @return the width of the page */ public static native int getWidth() /*-{ return $wnd.isc.Page.getWidth(); }-*/; /** * Get the height of the visible portion of the window, not including browser chrome or the scrollbar area. * * @return the height of the page */ public static native int getHeight() /*-{ return $wnd.isc.Page.getHeight(); }-*/; /** * Get the width of the user's screen, in pixels. * * @return the screen width */ public static native int getScreenWidth() /*-{ return $wnd.isc.Page.getScreenWidth(); }-*/; /** * Get the height of the user's screen, in pixels. * * @return the screen height */ public static native int getScreenHeight() /*-{ return $wnd.isc.Page.getScreenHeight(); }-*/; /** * This method only applies to browsers who support the special viewport meta html tag such as Safari running on the * iPhone. <P> This method will dynamically change the viewport configuration, allowing you to set an initial size or scale * level and enable / disable user-scaling. Typically this method will be called with a value for scale, width or height * rather than passing in values for all three properties.<br> See the apple documentation about configuring the viewport * for more information: * @externalLink{http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html} * <P> <i>Note:</i> Modifying the width/height or initial scale of the viewport has 2 user-visible effects: <ul> <li>HTML * elements may reflow to fit the specified size (or the implied size calculated from the specified scale level and the * native device size).</li> <li>If the user has not scaled the application explicitly, and no other scaling or sizing * attributes were specified via a viewport meta tag for this page, the application will zoom to specified scale * level(or the scale level required to fit the specified viewport size to the device's screen).</li> </ul> * @param scale Desired scale level where 1 indicates no scaling (each css pixel will be displayed using 1px on the physical device). * Pass in null to avoid setting this property. * @param width Desired viewport width in pixels. This indicates how many pixels should fit within the device screen. Pass in null to * avoid setting this property. * @param height Desired viewport height in pixels. This indicates how many pixels should fit within the device screen. Pass in null to * avoid setting this property. * @param scalable Should the user be able to scale the application (using pinch gestures, double tapping, rotating the device, etc.)? */ public static native void updateViewport(Float scale, Integer width, Integer height, Boolean scalable) /*-{ // convert params to javascript numbers / boolean before passing to updateViewport if (scale != null) { scale = scale.@java.lang.Float::floatValue()(); } if (width != null) { width = width.@java.lang.Integer::intValue()(); } if (height != null) { height = height.@java.lang.Integer::intValue()(); } if (scalable != null) { scalable = scalable.@java.lang.Boolean::booleanValue()(); } $wnd.isc.Page.updateViewport(scale, width, height, scalable); }-*/; }