/*
* Ext GWT 2.2.4 - Ext for GWT
* Copyright(c) 2007-2010, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client;
import java.util.Map;
import com.extjs.gxt.ui.client.aria.FocusManager;
import com.extjs.gxt.ui.client.core.El;
import com.extjs.gxt.ui.client.core.XDOM;
import com.extjs.gxt.ui.client.image.XImages;
import com.extjs.gxt.ui.client.messages.XMessages;
import com.extjs.gxt.ui.client.state.CookieProvider;
import com.extjs.gxt.ui.client.state.StateManager;
import com.extjs.gxt.ui.client.util.CSS;
import com.extjs.gxt.ui.client.util.Theme;
import com.extjs.gxt.ui.client.util.ThemeManager;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Document;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Accessibility;
/**
* GXT core utilities and functions.
*/
public class GXT {
/**
* GXT images.
*/
public static XImages IMAGES = (XImages) GWT.create(XImages.class);
/**
* GXT messages.
*/
public static XMessages MESSAGES = (XMessages) GWT.create(XMessages.class);
/**
* <code>true</code> if the browser uses the webkit engine.
*/
public static boolean isWebKit;
/**
* <code>true</code> if the browser is safari.
*/
public static boolean isSafari;
/**
* <code>true</code> if the browser is safari2.
*/
public static boolean isSafari2;
/**
* <code>true</code> if the browser is safari3.
*/
public static boolean isSafari3;
/**
* <code>true</code> if the browser is safari4.
*/
public static boolean isSafari4;
/**
* <code>true</code> if the browser is chrome.
*/
public static boolean isChrome;
/**
* <code>true</code> if the browser is opera.
*/
public static boolean isOpera;
/**
* <code>true</code> if the browser is ie.
*/
public static boolean isIE;
/**
* <code>true</code> if the browser is ie6.
*/
public static boolean isIE6;
/**
* <code>true</code> if the browser is ie7.
*/
public static boolean isIE7;
/**
* <code>true</code> if the browser is ie8.
*/
public static boolean isIE8;
/**
* <code>true</code> if the browser is ie8.
*/
public static boolean isIE9;
/**
* <code>true</code> if the browser is gecko.
*/
public static boolean isGecko;
/**
* <code>true</code> if the browser is gecko2.
*/
public static boolean isGecko2;
/**
* <code>true</code> if the browser is gecko3.
*/
public static boolean isGecko3;
/**
* <code>true</code> if the browser is gecko3.5.
*/
public static boolean isGecko35;
/**
* <code>true</code> if the browser is in strict mode.
*/
public static boolean isStrict;
/**
* <code>true</code> if using https.
*/
public static boolean isSecure;
/**
* <code>true</code> if mac os.
*/
public static boolean isMac;
/**
* <code>true</code> if linux os.
*/
public static boolean isLinux;
/**
* <code>true</code> if windows os.
*/
public static boolean isWindows;
/**
* <code>true</code> if is air.
*/
public static boolean isAir;
/**
* <code>true</code> if is borderbox.
*/
public static boolean isBorderBox;
/**
* <code>true</code> if the browser uses shims.
*/
public static boolean useShims;
/**
* URL to a blank file used by GXT when in secure mode for iframe src to
* prevent the IE insecure content. Default value is 'blank.html'.
*/
public static String SSL_SECURE_URL = GWT.getModuleBaseURL() + "blank.html";
/**
* URL to a 1x1 transparent gif image used by GXT to create inline icons with
* CSS background images. Default value is '/images/default/shared/clear.gif';
*/
public static String BLANK_IMAGE_URL;
/**
* Path to GXT resources (defaults to 'gxt').
*/
public static String RESOURCES_URL = "gxt";
private static boolean initialized;
private static Theme defaultTheme;
private static boolean forceTheme;
private static Version version;
private static boolean ariaEnabled, focusManagerEnabled;
/**
* True if the OS high contrast mode is enabled.
*/
public static boolean isHighContrastMode = false;
/**
* Returns the auto id prefix.
*
* @return the auto id prefix
*/
public static String getAutoIdPrefix() {
return XDOM.getAutoIdPrefix();
}
/**
* Returns the current theme id.
*
* @return the theme id
*/
public static String getThemeId() {
Map<String, Object> map = StateManager.get().getMap(GWT.getModuleBaseURL() + "theme");
if (map != null) {
return map.get("id").toString();
}
return null;
}
/**
* Returns the browser's user agent.
*
* @return the user agent
*/
public native static String getUserAgent() /*-{
return $wnd.navigator.userAgent.toLowerCase();
}-*/;
/**
* Returns the version information.
*
* @return the version information
*/
public static Version getVersion() {
if (version == null) {
version = new Version();
}
return version;
}
/**
* Hides the loading panel.
*
* @param id the loading panel id
*/
public static void hideLoadingPanel(String id) {
final Element loading = XDOM.getElementById(id);
if (loading != null) {
Timer t = new Timer() {
@Override
public void run() {
El.fly(loading).hide();
}
};
t.schedule(500);
}
}
/**
* Initializes GXT.
*/
public static void init() {
if (initialized) {
return;
}
initialized = true;
Element div = DOM.createDiv();
div.setClassName("x-contrast-test");
XDOM.getBody().appendChild(div);
if ("none".equals(XDOM.getComputedStyle(div, "backgroundImage"))) {
isHighContrastMode = true;
XDOM.getBodyEl().addStyleName("x-contrast");
}
XDOM.getBody().removeChild(div);
String ua = getUserAgent();
System.out.println(ua);
isOpera = ua.indexOf("opera") != -1;
isIE = !isOpera && ua.indexOf("msie") != -1;
isIE6 = !isOpera && ua.indexOf("msie 6") != -1;
isIE7 = !isOpera && ua.indexOf("msie 7") != -1;
isIE8 = !isOpera && ua.indexOf("msie 8") != -1;
isIE9 = !isOpera && ua.indexOf("msie 9") != -1;
isChrome = !isIE && ua.indexOf("chrome") != -1;
isWebKit = ua.indexOf("webkit") != -1;
isSafari = !isChrome && ua.indexOf("safari") != -1;
isSafari3 = isSafari && ua.indexOf("version/3") != -1;
isSafari4 = isSafari && ua.indexOf("version/4") != -1;
isSafari2 = isSafari && !isSafari3 && !isSafari4;
isGecko = !isWebKit && ua.indexOf("gecko") != -1;
isGecko35 = isGecko && ua.indexOf("rv:1.9.1") != -1;
isGecko3 = isGecko && ua.indexOf("rv:1.9.") != -1;
isGecko2 = isGecko && ua.indexOf("rv:1.8.") != -1;
isWindows = (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1);
isMac = (ua.indexOf("macintosh") != -1 || ua.indexOf("mac os x") != -1);
isAir = (ua.indexOf("adobeair") != -1);
isLinux = (ua.indexOf("linux") != -1);
// don't override if set to true
if (!useShims) {
useShims = isIE6 || (isMac && isGecko2);
}
isStrict = Document.get().isCSS1Compat();
isBorderBox = El.isBorderBox(DOM.createDiv());
isSecure = Window.Location.getProtocol().toLowerCase().startsWith("https");
if (BLANK_IMAGE_URL == null) {
if (isIE8 || (isGecko && !isSecure)) {
BLANK_IMAGE_URL = "data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
} else {
BLANK_IMAGE_URL = GWT.getModuleBaseURL() + "clear.gif";
}
}
El bodyEl = XDOM.getBodyEl();
if (isBorderBox) {
bodyEl.addStyleName("ext-border-box");
}
if (isIE) {
bodyEl.addStyleName("ext-ie");
String cls = (isIE6 ? "ext-ie6" : (isIE7 ? "ext-ie7" : (isIE8 ? "ext-ie8" : (isIE9 ? "ext-ie8 ext-ie9" : null))));
bodyEl.addStyleName(cls);
if (isIE7 && isIE8compatibility()) {
bodyEl.addStyleName("ext-ie8-compatibility");
}
} else if (isGecko) {
bodyEl.addStyleName("ext-gecko");
String cls = (isGecko2 ? "ext-gecko2" : (isGecko3 ? "ext-gecko3" : null));
bodyEl.addStyleName(cls);
} else if (isOpera) {
bodyEl.addStyleName("ext-opera");
} else if (isWebKit) {
bodyEl.addStyleName("ext-webkit");
if (isSafari) {
bodyEl.addStyleName("ext-safari");
} else if (isChrome) {
bodyEl.addStyleName("ext-chrome");
}
}
if (isWindows) {
bodyEl.addStyleName("ext-windows");
} else if (isMac) {
bodyEl.addStyleName("ext-mac");
} else if (isLinux) {
bodyEl.addStyleName("ext-linux");
}
if (StateManager.get().getProvider() == null) {
StateManager.get().setProvider(new CookieProvider("/", null, null, isSecure));
}
Map<String, Object> theme = StateManager.get().getMap(GWT.getModuleBaseURL() + "theme");
if ((defaultTheme != null && forceTheme) || (theme == null && defaultTheme != null)) {
theme = defaultTheme.asMap();
}
if (theme != null) {
final String themeId = theme.get("id").toString();
String fileName = theme.get("file").toString();
if (!fileName.contains("gxt-all.css")) {
CSS.addStyleSheet(themeId, fileName);
}
bodyEl.addStyleName("x-theme-" + themeId);
Theme t = ThemeManager.findTheme(themeId);
t.init();
StateManager.get().set(GWT.getModuleBaseURL() + "theme", theme);
}
if (isStrict) { // add to the parent to allow for selectors like
// ".ext-strict .ext-ie"
Element p = (Element) XDOM.getBody().getParentElement();
if (p != null) {
El.fly(p).addStyleName("ext-strict");
}
}
if (isIE6) {
removeBackgroundFlicker();
}
}
/**
* Returns the ARIA enabled state.
*
* @return true if enabled, false otherwise
*/
public static boolean isAriaEnabled() {
return ariaEnabled;
}
/**
* Returns the focus managed enabled state.
*
* @return true if enabled, false otherwise
*/
public static boolean isFocusManagerEnabled() {
return focusManagerEnabled;
}
/**
* True to enable ARIA functionality. Enabling ARIA will also cause the focus
* manager to enabled.
*
* @param enable true to enable
*/
public static void setAriaEnabled(boolean enable) {
ariaEnabled = enable;
Accessibility.setRole(XDOM.getBody(), enable ? "application" : "");
setFocusManagerEnabled(enable);
}
/**
* True to enable the focus manager.
*
* @param enable true to enable
*/
public static void setFocusManagerEnabled(boolean enable) {
focusManagerEnabled = enable;
if (enable) {
FocusManager.get().enable();
} else {
FocusManager.get().disable();
}
}
/**
* Sets the auto id prefix which is prepended to the auto id counter when
* generating auto ids (defaults to 'x-auto').
*
* @param autoIdPrefix the auto id prefix
*/
public static void setAutoIdPrefix(String autoIdPrefix) {
XDOM.setAutoIdPrefix(autoIdPrefix);
}
/**
* Sets the default theme which will be used if the user does not have a theme
* selected with the state provider.
*
* @param theme the default theme
* @param force true to force the theme, ignoring the the theme saved with the
* state manager
*/
public static void setDefaultTheme(Theme theme, boolean force) {
defaultTheme = theme;
forceTheme = force;
}
/**
* Changes the theme. A theme's stylehseets should be given a class = to the
* theme id. Any stylesheets that have a class that do not match the id be
* removed (stylesheets with no class specified are ignored). The method will
* reload the application after changing themes.
*
* @param theme the new theme name.
*/
public static void switchTheme(Theme theme) {
StateManager.get().set(GWT.getModuleBaseURL() + "theme", theme.asMap());
XDOM.reload();
}
private native static boolean isIE8compatibility() /*-{
if (@com.extjs.gxt.ui.client.GXT::isIE7) {
if ($doc.documentMode) {
return true;
}
}
return false;
}-*/;
private native static void removeBackgroundFlicker() /*-{
try {
$doc.execCommand("BackgroundImageCache", false, true);
} catch (e) {
}
}-*/;
}