summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathieu Velten2013-12-12 10:18:47 (EST)
committerErdal Karaca2013-12-12 10:28:50 (EST)
commita5890967317edfe5ab5a9c91e00a15329e7e41cc (patch)
tree5860fa05729efc9093610ade748c91bd52e17266
parent2504c18146e24adb3dd7f1a0e8ba7db16f13b6f2 (diff)
downloadorg.eclipse.xwt-a5890967317edfe5ab5a9c91e00a15329e7e41cc.zip
org.eclipse.xwt-a5890967317edfe5ab5a9c91e00a15329e7e41cc.tar.gz
org.eclipse.xwt-a5890967317edfe5ab5a9c91e00a15329e7e41cc.tar.bz2
[Bug 347742] XWT locks on initialization with GTK
Signed-off-by: Mathieu Velten <mathieu.velten@atos.net>
-rw-r--r--org.eclipse.xwt/src/org/eclipse/xwt/XWT.java2255
1 files changed, 1128 insertions, 1127 deletions
diff --git a/org.eclipse.xwt/src/org/eclipse/xwt/XWT.java b/org.eclipse.xwt/src/org/eclipse/xwt/XWT.java
index bb855a5..441c77c 100644
--- a/org.eclipse.xwt/src/org/eclipse/xwt/XWT.java
+++ b/org.eclipse.xwt/src/org/eclipse/xwt/XWT.java
@@ -1,1127 +1,1128 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Soyatec - initial API and implementation
- * Anyware-tech - add multiple loaders
- *******************************************************************************/
-package org.eclipse.xwt;
-
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.core.databinding.observable.IChangeListener;
-import org.eclipse.core.databinding.observable.IObservable;
-import org.eclipse.core.databinding.observable.Realm;
-import org.eclipse.core.databinding.observable.list.IObservableList;
-import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
-import org.eclipse.core.databinding.observable.set.IObservableSet;
-import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.xwt.callback.IBeforeParsingCallback;
-import org.eclipse.xwt.core.IBinding;
-import org.eclipse.xwt.core.TriggerBase;
-import org.eclipse.xwt.databinding.BindingContext;
-import org.eclipse.xwt.databinding.IBindingContext;
-import org.eclipse.xwt.input.ICommand;
-import org.eclipse.xwt.internal.core.UpdateSourceTrigger;
-import org.eclipse.xwt.internal.utils.UserData;
-import org.eclipse.xwt.metadata.IEvent;
-import org.eclipse.xwt.metadata.IMetaclass;
-import org.eclipse.xwt.metadata.IProperty;
-
-/**
- * XWT is the main class of the XWT framework. It provides most of the services
- * in API.
- *
- * @author yyang
- */
-public class XWT {
-
- private static List<IXWTInitializer> initializers = new ArrayList<IXWTInitializer>();
- private static Thread displayThread;
- private static final Object displayLock = new Object();
-
- /**
- * Get the system logger.
- *
- * @returnF
- */
- public static ILogger getLogger() {
- return XWTLoaderManager.getActive().getLogger();
- }
-
- /**
- * Create a UI Profile with the provide data and apply it immediately.
- *
- * @param profileData
- * @return
- */
- public static Object createUIProfile() {
- return XWTLoaderManager.getActive().createUIProfile();
- }
-
- /**
- * Put the Profile in place
- *
- * @param profile
- * @return
- */
- public static boolean applyProfile(Object profile) {
- return XWTLoaderManager.getActive().applyProfile(profile);
- }
-
- /**
- * Restore the previous profile
- *
- * @return
- */
- public static Object restoreProfile() {
- return XWTLoaderManager.getActive().restoreProfile();
- }
-
- /**
- *
- * @param nsmapace
- * @param handler
- */
- public static void registerNamespaceHandler(String nsmapace,
- INamespaceHandler handler) {
- XWTLoaderManager.getActive()
- .registerNamespaceHandler(nsmapace, handler);
- }
-
- /**
- *
- * @param nsmapace
- */
- public static void unregisterNamespaceHandler(String nsmapace) {
- XWTLoaderManager.getActive().unregisterNamespaceHandler(nsmapace);
- }
-
- /**
- *
- * @param nsmapace
- * @return
- */
- public static INamespaceHandler getNamespaceHandler(String nsmapace) {
- return XWTLoaderManager.getActive().getNamespaceHandler(nsmapace);
- }
-
- /**
- * Register an Observable IChangeListener for a given UI element. The second
- * registration of the same listener on the same UI Element has no effect.
- *
- * @param context
- * @param listener
- * @return
- */
- public static boolean addObservableChangeListener(Object context,
- IChangeListener listener) {
- return XWTLoaderManager.getActive().addObservableChangeListener(
- context, listener);
- }
-
- /**
- * Undo the registration of the Observable IChangeListener for a given UI
- * element.
- *
- * @param context
- * @param listener
- */
- public static void removeObservableChangeListener(Object context,
- IChangeListener listener) {
- XWTLoaderManager.getActive().removeObservableChangeListener(context,
- listener);
- }
-
- /**
- * Find an existing IObservableValue
- *
- * @param nsmapace
- * @return null if it doesn't exist.
- */
- public static IObservableValue findObservableValue(Object context,
- Object data, String propertyName) {
- return XWTLoaderManager.getActive().findObservableValue(context, data,
- propertyName);
- }
-
- /**
- * Find an existing IObservableValue
- *
- * @param nsmapace
- * @return null if it doesn't exist.
- */
- public static IObservableList findObservableList(Object context,
- Object data, String propertyName) {
- return XWTLoaderManager.getActive().findObservableList(context, data,
- propertyName);
- }
-
- /**
- * Find an existing IObservableValue
- *
- * @param nsmapace
- * @return null if it doesn't exist.
- */
- public static IObservableSet findObservableSet(Object context, Object data,
- String propertyName) {
- return XWTLoaderManager.getActive().findObservableSet(context, data,
- propertyName);
- }
-
- /**
- * get or create a IObservableValue
- *
- * @param nsmapace
- * @return return null or raises an exception XWTException if fails
- */
- public static IObservableValue observableValue(Object context, Object data,
- String propertyName, UpdateSourceTrigger updateSourceTrigger) {
- return XWTLoaderManager.getActive().observableValue(context, data,
- propertyName, updateSourceTrigger);
- }
-
- /**
- * get or create a IObservable
- *
- * @param nsmapace
- * @return return null or raises an exception XWTException if fails
- */
- public static IObservable observe(Object context, Object data,
- String propertyName, UpdateSourceTrigger updateSourceTrigger) {
- return XWTLoaderManager.getActive().observe(context, data,
- propertyName, updateSourceTrigger);
- }
-
- /**
- * get or create a IObservable
- *
- * @param nsmapace
- * @return return null or raises an exception XWTException if fails
- */
- public static IObservableFactory observableFactory(Object context,
- String propertyName, UpdateSourceTrigger updateSourceTrigger) {
- return XWTLoaderManager.getActive().observableFactory(context,
- propertyName, updateSourceTrigger);
- }
-
- /**
- * get or create a IObservableValue
- *
- * @param nsmapace
- * @return return null or raises an exception XWTException if fails
- */
- public static IObservableValue observableValue(Object context, Object data,
- String propertyName) {
- return XWTLoaderManager.getActive().observableValue(context, data,
- propertyName, UpdateSourceTrigger.Default);
- }
-
- /**
- * Change the system logger
- *
- * @param logger
- */
- public static void setLogger(ILogger log) {
- XWTLoaderManager.getActive().setLogger(log);
- }
-
- /**
- * Get the name of the element, which is defined by <code>Name</code> or
- * <code>x:Name</code>. Return <code>null</code>
- *
- * @param object
- * @return
- */
- public static String getElementName(Object object) {
- return XWTLoaderManager.getActive().getElementName(object);
- }
-
- /**
- * Find a named UI element.
- *
- * @param context
- * the start point of research.
- * @param name
- * @return
- */
- public static Object findElementByName(Object context, String name) {
- return XWTLoaderManager.getActive().findElementByName(context, name);
- }
-
- /**
- * Get the DataContext of given element
- *
- * @param context
- * @return
- */
- public static Object getDataContext(Object element, Class<?> targetType) {
- Object value = XWTLoaderManager.getActive().getDataContext(element);
- if (targetType == null || !targetType.isInstance(value)) {
- if (value instanceof IBinding) {
- return ((IBinding) value).getValue(targetType);
- }
- if (value instanceof IObservableValue) {
- return ((IObservableValue) value).getValue();
- }
- }
- return value;
- }
-
- /**
- * Returns the {@link BindingContext} within the upper scope of the control.
- * <p>
- * Each UI Element may have a local DataBindingContext property. While
- * locating DataBindingContext, if the current UI Element has not the
- * property, the parent's will be used.
- * <p>
- * If none is found, a default one will be created as default for the
- * current scope
- * <p>
- * If still not found {@link XWTException} thrown...
- *
- * @param element
- * @return
- */
- public static IBindingContext getBindingContext(Object element) {
- return (IBindingContext) XWTLoaderManager.getActive()
- .getBindingContext(element);
- }
-
- /**
- * Get the DataContext of given element
- *
- * @param context
- * @return
- */
- public static Object getDataContext(Object element) {
- return getDataContext(element, null);
- }
-
- /**
- * Set the DataContext of given element
- *
- * @param context
- * @return
- */
- public static void setDataContext(Object element, Object dataContext) {
- XWTLoaderManager.getActive().setDataContext(UserData.getWidget(element), dataContext);
- }
-
- /**
- * Get the Triggers of given element
- *
- * @param context
- * @return
- */
- public static TriggerBase[] getTriggers(Widget element) {
- return XWTLoaderManager.getActive().getTriggers(element);
- }
-
- /**
- * Get the Triggers of given element
- *
- * @param context
- * @return
- */
- public static void setTriggers(Widget element, TriggerBase[] triggers) {
- XWTLoaderManager.getActive().setTriggers(element, triggers);
- }
-
- /**
- * Get the CLR (Common Language Runtime) object. If no CLR object is found
- * in this element, the research will be propagated in it parent.
- *
- * @param widget
- * @return
- */
- public static Object getCLR(Object widget) {
- return UserData.getCLR(widget);
- }
-
- /**
- * Find the root shell
- *
- * @param context
- * @return
- */
- public static Shell findShell(Object context) {
- return UserData.findShell(context);
- }
-
- public static IProperty findProperty(Object object, String name) {
- IMetaclass metaclass = XWTLoaderManager.getActive()
- .getMetaclass(object);
- return metaclass.findProperty(name);
- }
-
- public static Object findResource(Object object, String name) {
- return XWTLoaderManager.getActive().findResource(object, name);
- }
-
- public static Map<String, Object> getResources(Object object) {
- return XWTLoaderManager.getActive().getResources(object);
- }
-
- public static IEvent findEvent(Object object, String name) {
- IMetaclass metaclass = XWTLoaderManager.getActive()
- .getMetaclass(object);
- return metaclass.findEvent(name);
- }
-
- public static IMetaclass getMetaclass(Object object) {
- return XWTLoaderManager.getActive().getMetaclass(object);
- }
-
- /**
- * Load the file content. All widget will be created but they are showed.
- * This method return the root element.
- *
- */
- static public Object load(URL file) throws Exception {
- XWT.checkInitialization();
- return XWTLoaderManager.getActive().load(file);
- }
-
- /**
- * Load the content from IUIResource. All widget will be created but they
- * are showed. This method return the root element.
- *
- */
- static public Object load(IUIResource resource) throws Exception {
- XWT.checkInitialization();
- return XWTLoaderManager.getActive().load(resource);
- }
-
- /**
- * Load the file content. All widget will be created but they are showed.
- * This method return the root element.
- *
- */
- static public Object load(URL file, Object dataContext) throws Exception {
- XWT.checkInitialization();
- return XWTLoaderManager.getActive().load(file, dataContext);
- }
-
- /**
- * Load the content from IUIResource. All widget will be created but they
- * are showed. This method return the root element.
- *
- */
- static public Object load(IUIResource resource, Object dataContext)
- throws Exception {
- XWT.checkInitialization();
- return XWTLoaderManager.getActive().load(resource, dataContext);
- }
-
- /**
- * Load the file content under a UI Object. All widget will be created. This
- * method returns the root element. The DataContext will be associated to
- * the root element.
- */
- static public Object load(Object parent, URL file) throws Exception {
- return XWTLoaderManager.getActive().load(parent, file);
- }
-
- /**
- * Load the file content under a UI Object. All widget will be created. This
- * method returns the root element. The DataContext will be associated to
- * the root element.
- *
- */
- static public Object load(Object parent, IUIResource resource)
- throws Exception {
- return XWTLoaderManager.getActive().load(parent, resource);
- }
-
- /**
- * Load the file content under a UI Object with a DataContext. All widget
- * will be created. This method returns the root element. The DataContext
- * will be associated to the root element.
- */
- static public Object load(Object parent, URL file, Object dataContext)
- throws Exception {
- return XWTLoaderManager.getActive().load(parent, file, dataContext);
- }
-
- /**
- * Load the content from IUIResource.
- *
- * @param stream
- * @param input
- * @param parsingCallback
- * null if the callback is not necessary
- * @return
- * @throws Exception
- */
- static public IUIResource loadAsResource(InputStream stream, URL input,
- IBeforeParsingCallback parsingCallback) throws Exception {
- return XWTLoaderManager.getActive().loadAsResource(stream, input,
- parsingCallback);
- }
-
- /**
- * Load the content from IUIResource.
- *
- * @param stream
- * @param input
- * @param parsingCallback
- * null if the callback is not necessary
- * @return
- * @throws Exception
- */
- static public IUIResource loadAsResource(InputStream stream, URL input)
- throws Exception {
- return XWTLoaderManager.getActive().loadAsResource(stream, input);
- }
-
- /**
- * Load the content from IUIResource.
- *
- * @param input
- * @param parsingCallback
- * null if the callback is not necessary
- * @return
- * @throws Exception
- */
- static public IUIResource loadAsResource(URL input,
- IBeforeParsingCallback parsingCallback) throws Exception {
- return XWTLoaderManager.getActive().loadAsResource(null, input,
- parsingCallback);
- }
-
- /**
- * Load the content from IUIResource.
- *
- * @param input
- * @return
- * @throws Exception
- */
- static public IUIResource loadAsResource(URL input) throws Exception {
- return XWTLoaderManager.getActive().loadAsResource(null, input);
- }
-
- /**
- * Load the file content under a UI Object with a DataContext. All widget
- * will be created. This method returns the root element. The DataContext
- * will be associated to the root element.
- */
- static public Object load(Object parent, IUIResource resource,
- Object dataContext) throws Exception {
- return XWTLoaderManager.getActive().load(parent, resource, dataContext);
- }
-
- static public Object load(Object parent, IUIResource resource,
- Map<String, Object> options) throws Exception {
- return XWTLoaderManager.getActive().load(parent, resource, options);
- }
-
- /**
- * Open and show the file content in a new Shell.
- */
- static public void open(final URL url) throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(url);
- }
-
- /**
- * Open and show the file content in a new Shell.
- */
- static public void open(final Class<?> type) throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(type);
- }
-
- /**
- * Open and show the file content in a new Shell.
- */
- static public void open(final IUIResource resource) throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(resource);
- }
-
- /**
- * load the content from a stream with a style, a DataContext and a
- * ResourceDictionary. The root elements will be hold by UI Object parent
- */
- static public Object load(Object parent, InputStream stream, URL file,
- Object dataContext) throws Exception {
- return XWTLoaderManager.getActive().load(parent, stream, file,
- dataContext);
- }
-
- /**
- * load the file content. The corresponding UI element is not yet created
- */
- static public void open(URL url, Object dataContext) throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(url, dataContext);
- }
-
- /**
- * load the content from IUIResource. The corresponding UI element is not
- * yet created
- */
- static public void open(IUIResource resource, Object dataContext)
- throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(resource, dataContext);
- }
-
- /**
- * load the file content. The corresponding UI element is not yet created
- */
- static public void open(Class<?> type, Object dataContext) throws Exception {
- open(type.getResource(type.getSimpleName()
- + IConstants.XWT_EXTENSION_SUFFIX), dataContext);
- }
-
- /**
- * load the file content. The corresponding UI element is not yet created
- */
- static public void open(URL url, Map<String, Object> options)
- throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(url, options);
- }
-
- /**
- * load the content from IUIResource. The corresponding UI element is not
- * yet created
- */
- static public void open(IUIResource resource, Map<String, Object> options)
- throws Exception {
- XWT.checkInitialization();
- XWTLoaderManager.getActive().open(resource, options);
- }
-
- static public Object convertFrom(Class<?> targetType, String string) {
- return XWTLoaderManager.getActive().convertFrom(targetType, string);
- }
-
- static public Object loadWithOptions(URL url, Map<String, Object> options)
- throws Exception {
- return XWTLoaderManager.getActive().loadWithOptions(url, options);
- }
-
- static public Object loadWithOptions(IUIResource resource,
- Map<String, Object> options) throws Exception {
- return XWTLoaderManager.getActive().loadWithOptions(resource, options);
- }
-
- /**
- *
- * @param stream
- * @param url
- * @param options
- * @return
- * @throws Exception
- */
- static public Object load(InputStream stream, URL url) throws Exception {
- XWT.checkInitialization();
- return loadWithOptions(stream, url, Collections.EMPTY_MAP);
- }
-
- /**
- *
- * @param stream
- * @param url
- * @param options
- * @return
- * @throws Exception
- */
- static public Object loadWithOptions(InputStream stream, URL url,
- Map<String, Object> options) throws Exception {
- XWT.checkInitialization();
- return XWTLoaderManager.getActive().loadWithOptions(stream, url,
- options);
- }
-
- /**
- * Metaclass services to return all registered Metaclasses.
- *
- * @param stream
- * @param url
- * @param loadData
- * @return
- * @throws Exception
- */
- static public IMetaclass[] getAllMetaclasses() {
- return XWTLoaderManager.getActive().getAllMetaclasses();
- }
-
- /**
- * Get the corresponding Metaclass
- *
- * @param tagName
- * @param ns
- * The namespace
- * @return
- */
- static public IMetaclass getMetaclass(String tagName, String ns) {
- return XWTLoaderManager.getActive().getMetaclass(tagName, ns);
- }
-
- /**
- * Register a Data converter
- *
- * @param converter
- * @param type
- */
- public static void registerEventGroup(Class<?> type, IEventGroup eventGroup) {
- XWTLoaderManager.getActive().registerEventGroup(type, eventGroup);
- }
-
- /**
- * Register a Data converter
- *
- * @param converter
- * @param type
- */
- public static void registerConvertor(IConverter converter) {
- XWTLoaderManager.getActive().registerConvertor(converter);
- }
-
- /**
- * Register a command to a name
- *
- * @param name
- * @param command
- */
- public static void registerCommand(String name, ICommand command) {
- XWTLoaderManager.getActive().registerCommand(name, command);
- }
-
- /**
- * Add a default style
- *
- * @param style
- * @return
- */
- public static void addDefaultStyle(IStyle style) {
- XWTLoaderManager.getActive().addDefaultStyle(style);
- }
-
- public static void addDataProviderFactory(String name,
- IDataProviderFactory dataProviderFactory) {
- XWTLoaderManager.getActive().addDataProviderFactory(name,
- dataProviderFactory);
- }
-
- public static void removeDataProviderFactory(String name) {
- XWTLoaderManager.getActive().removeDataProviderFactory(name);
- }
-
- public static void removeDataProviderFactory(
- IDataProviderFactory dataProviderFactory) {
- XWTLoaderManager.getActive().removeDataProviderFactory(
- dataProviderFactory);
- }
-
- public static Collection<IDataProviderFactory> getDataProviderFactories() {
- return XWTLoaderManager.getActive().getDataProviderFactories();
- }
-
- /**
- * Register UI type
- *
- * @param javaclass
- */
- static public IMetaclass registerMetaclass(Class<?> type) {
- return XWTLoaderManager.getActive().registerMetaclass(type);
- }
-
- /**
- * Register UI type
- *
- * @param javaclass
- */
- static public void registerMetaclass(IMetaclass type) {
- XWTLoaderManager.getActive().registerMetaclass(type);
- }
-
- /**
- * Get the dynamic property value
- *
- * @param javaclass
- */
- static public Object getPropertyValue(Object uiElement, IProperty property) {
- return XWTLoaderManager.getActive().getPropertyValue(uiElement,
- property);
- }
-
- /**
- * Get the dynamic property value
- *
- * @param javaclass
- */
- static public Object getPropertyValue(Object uiElement, String propertyName) {
- IMetaclass metaclass = XWT.getMetaclass(uiElement);
- IProperty property = metaclass.findProperty(propertyName);
- if (property == null) {
- return null;
- }
- return XWTLoaderManager.getActive().getPropertyValue(uiElement,
- property);
- }
-
- /**
- * Set the dynamic property value
- *
- * @param javaclass
- */
- static public void setPropertyValue(Object uiElement, IProperty property,
- Object value) {
- XWTLoaderManager.getActive().setPropertyValue(uiElement, property,
- value);
- }
-
- /**
- * Set the dynamic property value
- *
- * @param javaclass
- */
- static public void setPropertyValue(Object uiElement, String propertyName,
- Object value) {
- IMetaclass metaclass = XWT.getMetaclass(uiElement);
- IProperty property = metaclass.findProperty(propertyName);
- if (property == null) {
- throw new XWTException("Property " + propertyName + " not found.");
- }
- XWTLoaderManager.getActive().setPropertyValue(uiElement, property,
- value);
- }
-
- /**
- * Remove the dynamic property value
- *
- * @param javaclass
- */
- static public void removePropertyValue(Object uiElement, IProperty property) {
- XWTLoaderManager.getActive().removePropertyValue(uiElement, property);
- }
-
- /**
- * Remove the dynamic property value
- *
- * @param javaclass
- */
- static public boolean hasPropertyValue(Object uiElement, IProperty property) {
- return XWTLoaderManager.getActive().hasPropertyValue(uiElement,
- property);
- }
-
- /**
- * Find a Data converter
- *
- * @param converter
- * @param type
- */
- static public IConverter findConvertor(Class<?> source, Class<?> target) {
- return XWTLoaderManager.getActive().findConvertor(source, target);
- }
-
- /**
- * Switch current loading context
- *
- */
- public static void setLoadingContext(ILoadingContext loadingContext) {
- XWTLoaderManager.getActive().setLoadingContext(loadingContext);
- }
-
- /**
- * Return current loading context
- *
- * @return ILoadingContext
- */
- public static ILoadingContext getLoadingContext() {
- return XWTLoaderManager.getActive().getLoadingContext();
- }
-
- /**
- * Add a tracking option
- *
- * @param tracking
- */
- static public void addTracking(Tracking tracking) {
- XWTLoaderManager.getActive().addTracking(tracking);
- }
-
- /**
- * Test if the tracking on argument is enabled.
- *
- * @param tracking
- * @return
- */
- static public boolean isTracking(Tracking tracking) {
- return XWTLoaderManager.getActive().isTracking(tracking);
- }
-
- /**
- * Get all tracking options
- *
- * @return
- */
- static public Set<Tracking> getTrackings() {
- return XWTLoaderManager.getActive().getTrackings();
- }
-
- /**
- * Set up the default ICLRFactory
- *
- * @param factory
- */
- static public void setCLRFactory(ICLRFactory factory) {
- XWTLoaderManager.getActive().setCLRFactory(factory);
- }
-
- static public boolean checkInitialization() {
- if (isAllInitializersInitialized()) {
- return false;
- }
- return checkInitialization(-1);
- }
-
- static public boolean checkInitialization(long timeoutMillis) {
- long started = System.currentTimeMillis();
- while (true) {
- if (timeoutMillis != -1
- && System.currentTimeMillis() - started > timeoutMillis) {
- return false;
- }
-
- if (isAllInitializersInitialized()) {
- return false;
- }
-
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- return false;
- }
- }
- }
-
- private static boolean isAllInitializersInitialized() {
- synchronized (initializers) {
- for (IXWTInitializer initializer : initializers) {
- if (!initializer.isInitialized()) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * The default CLRFactory.
- *
- * @return
- */
- static public ICLRFactory getCLRFactory() {
- return XWTLoaderManager.getActive().getCLRFactory();
- }
-
- /**
- * Find a command by name
- *
- * @param name
- * @return
- */
- static public ICommand getCommand(String name) {
- return XWTLoaderManager.getActive().getCommand(name);
- }
-
- public static IDataProvider findDataProvider(Object dataContext) {
- return XWTLoaderManager.getActive().findDataProvider(dataContext);
- }
-
- static public Realm getRealm() {
- return XWTLoaderManager.getActive().getRealm();
- }
-
- static public boolean isXWTNamespace(String namespace) {
- return IConstants.XWT_X_NAMESPACE.equals(namespace)
- || IConstants.XWT_NAMESPACE.equals(namespace)
- || namespace.startsWith(IConstants.XAML_CLR_NAMESPACE_PROTO);
- }
-
- /**
- * Check if the value of a property is to resolve.
- *
- * @param type
- * type of property
- * @return
- */
- public static boolean isFileResolveType(Class<?> type) {
- return XWTLoaderManager.getActive().isFileResolveType(type);
- }
-
- /**
- * Register the value of a property is to resolve.
- *
- * @param type
- * type of property
- * @return
- */
- public static void registerFileResolveType(Class<?> type) {
- XWTLoaderManager.getActive().registerFileResolveType(type);
- }
-
- /**
- * Register the value of a property is to resolve.
- *
- * @param type
- * type of property
- * @return
- */
- public static void unregisterFileResolveType(Class<?> type) {
- XWTLoaderManager.getActive().unregisterFileResolveType(type);
- }
-
- static class DisplayThread extends Thread implements Listener {
- protected long startTime = -1;
- protected boolean toStop = false;
- protected Runnable runnable;
-
- public DisplayThread(Runnable runnable) {
- this.runnable = runnable;
- }
-
- public void handleEvent(Event event) {
- }
- }
-
- /**
- * Run in UI context.
- *
- * @param runnable
- */
- public static void runOnUIThread(final Runnable runnable) {
- String platform = SWT.getPlatform();
- if (platform.startsWith("win") || platform.endsWith("cocoa") || platform.startsWith("rap")) {
- XWTLoaderManager.getDefault();
- runnable.run();
- } else if (platform.endsWith("gtk")) {
- synchronized (displayLock) {
- if (displayThread == null || !displayThread.isAlive()) {
- try {
- Field field = Display.class.getDeclaredField("Default");
- if (field != null) {
- field.setAccessible(true);
- Display defaultDisplay = (Display) field.get(null);
- if (defaultDisplay != null) {
- displayThread = defaultDisplay.getThread();
- }
- }
- } catch (Exception e) {
- }
- }
-
- if (displayThread == null || !displayThread.isAlive()) {
- displayThread = new Thread() {
- private long startTime = -1;
- private Display display;
- private boolean toStop = false;
- private boolean ignoreNotification = false;
- protected Runnable runnable = new Runnable() {
- public void run() {
- if (ignoreNotification) {
- startTime = -1;
- return;
- }
- if (startTime == -1) {
- startTime = System.currentTimeMillis();
- } else {
- if ((System.currentTimeMillis() - startTime) > 10000
- && display.getActiveShell() == null
- && display.getShells().length == 0) {
- toStop = true;
- display.wake();
- } else {
- startTime = System.currentTimeMillis();
- }
- }
- }
- };
-
- @Override
- public void run() {
- // Set default XWT ICLRFactory
- XWTLoaderManager.getDefault();
- display = Display.getDefault();
- runnable.run();
- while (true) {
- if (!display.readAndDispatch()) {
- display.timerExec(10000, runnable);
- display.sleep();
- ignoreNotification = true;
- }
- if (toStop) {
- break;
- }
- startTime = -1;
- }
- }
- };
- displayThread.start();
- } else {
- XWT.checkInitialization();
- Display display = Display.findDisplay(displayThread);
- if (display != null) {
- display.syncExec(runnable);
- }
- }
- }
- } else {
- throw new UnsupportedOperationException();
- }
- }
-
- public static void addInitializer(IXWTInitializer initializer) {
- synchronized (initializers) {
- if (!XWTLoaderManager.isStarted()) {
- initializers.add(initializer);
- }
- }
- }
-
- static List<IXWTInitializer> getInitializers() {
- return initializers;
- }
-
- public static Object findParent(Object element, Class<?> type) {
- Widget widget = UserData.getWidget(element);
- if (widget == null) {
- return null;
- }
- return UserData.findParent(widget, type);
- }
-
- static void runInitializers(IXWTLoader loader) {
- synchronized (initializers) {
- for (IXWTInitializer initializer : XWT.getInitializers()) {
- initializer.initialize(loader);
- }
- }
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Soyatec - initial API and implementation
+ * Anyware-tech - add multiple loaders
+ *******************************************************************************/
+package org.eclipse.xwt;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.databinding.conversion.IConverter;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
+import org.eclipse.core.databinding.observable.set.IObservableSet;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.xwt.callback.IBeforeParsingCallback;
+import org.eclipse.xwt.core.IBinding;
+import org.eclipse.xwt.core.TriggerBase;
+import org.eclipse.xwt.databinding.BindingContext;
+import org.eclipse.xwt.databinding.IBindingContext;
+import org.eclipse.xwt.input.ICommand;
+import org.eclipse.xwt.internal.core.UpdateSourceTrigger;
+import org.eclipse.xwt.internal.utils.UserData;
+import org.eclipse.xwt.metadata.IEvent;
+import org.eclipse.xwt.metadata.IMetaclass;
+import org.eclipse.xwt.metadata.IProperty;
+
+/**
+ * XWT is the main class of the XWT framework. It provides most of the services
+ * in API.
+ *
+ * @author yyang
+ */
+public class XWT {
+
+ private static List<IXWTInitializer> initializers = new ArrayList<IXWTInitializer>();
+ private static Thread displayThread;
+ private static final Object displayLock = new Object();
+
+ /**
+ * Get the system logger.
+ *
+ * @returnF
+ */
+ public static ILogger getLogger() {
+ return XWTLoaderManager.getActive().getLogger();
+ }
+
+ /**
+ * Create a UI Profile with the provide data and apply it immediately.
+ *
+ * @param profileData
+ * @return
+ */
+ public static Object createUIProfile() {
+ return XWTLoaderManager.getActive().createUIProfile();
+ }
+
+ /**
+ * Put the Profile in place
+ *
+ * @param profile
+ * @return
+ */
+ public static boolean applyProfile(Object profile) {
+ return XWTLoaderManager.getActive().applyProfile(profile);
+ }
+
+ /**
+ * Restore the previous profile
+ *
+ * @return
+ */
+ public static Object restoreProfile() {
+ return XWTLoaderManager.getActive().restoreProfile();
+ }
+
+ /**
+ *
+ * @param nsmapace
+ * @param handler
+ */
+ public static void registerNamespaceHandler(String nsmapace,
+ INamespaceHandler handler) {
+ XWTLoaderManager.getActive()
+ .registerNamespaceHandler(nsmapace, handler);
+ }
+
+ /**
+ *
+ * @param nsmapace
+ */
+ public static void unregisterNamespaceHandler(String nsmapace) {
+ XWTLoaderManager.getActive().unregisterNamespaceHandler(nsmapace);
+ }
+
+ /**
+ *
+ * @param nsmapace
+ * @return
+ */
+ public static INamespaceHandler getNamespaceHandler(String nsmapace) {
+ return XWTLoaderManager.getActive().getNamespaceHandler(nsmapace);
+ }
+
+ /**
+ * Register an Observable IChangeListener for a given UI element. The second
+ * registration of the same listener on the same UI Element has no effect.
+ *
+ * @param context
+ * @param listener
+ * @return
+ */
+ public static boolean addObservableChangeListener(Object context,
+ IChangeListener listener) {
+ return XWTLoaderManager.getActive().addObservableChangeListener(
+ context, listener);
+ }
+
+ /**
+ * Undo the registration of the Observable IChangeListener for a given UI
+ * element.
+ *
+ * @param context
+ * @param listener
+ */
+ public static void removeObservableChangeListener(Object context,
+ IChangeListener listener) {
+ XWTLoaderManager.getActive().removeObservableChangeListener(context,
+ listener);
+ }
+
+ /**
+ * Find an existing IObservableValue
+ *
+ * @param nsmapace
+ * @return null if it doesn't exist.
+ */
+ public static IObservableValue findObservableValue(Object context,
+ Object data, String propertyName) {
+ return XWTLoaderManager.getActive().findObservableValue(context, data,
+ propertyName);
+ }
+
+ /**
+ * Find an existing IObservableValue
+ *
+ * @param nsmapace
+ * @return null if it doesn't exist.
+ */
+ public static IObservableList findObservableList(Object context,
+ Object data, String propertyName) {
+ return XWTLoaderManager.getActive().findObservableList(context, data,
+ propertyName);
+ }
+
+ /**
+ * Find an existing IObservableValue
+ *
+ * @param nsmapace
+ * @return null if it doesn't exist.
+ */
+ public static IObservableSet findObservableSet(Object context, Object data,
+ String propertyName) {
+ return XWTLoaderManager.getActive().findObservableSet(context, data,
+ propertyName);
+ }
+
+ /**
+ * get or create a IObservableValue
+ *
+ * @param nsmapace
+ * @return return null or raises an exception XWTException if fails
+ */
+ public static IObservableValue observableValue(Object context, Object data,
+ String propertyName, UpdateSourceTrigger updateSourceTrigger) {
+ return XWTLoaderManager.getActive().observableValue(context, data,
+ propertyName, updateSourceTrigger);
+ }
+
+ /**
+ * get or create a IObservable
+ *
+ * @param nsmapace
+ * @return return null or raises an exception XWTException if fails
+ */
+ public static IObservable observe(Object context, Object data,
+ String propertyName, UpdateSourceTrigger updateSourceTrigger) {
+ return XWTLoaderManager.getActive().observe(context, data,
+ propertyName, updateSourceTrigger);
+ }
+
+ /**
+ * get or create a IObservable
+ *
+ * @param nsmapace
+ * @return return null or raises an exception XWTException if fails
+ */
+ public static IObservableFactory observableFactory(Object context,
+ String propertyName, UpdateSourceTrigger updateSourceTrigger) {
+ return XWTLoaderManager.getActive().observableFactory(context,
+ propertyName, updateSourceTrigger);
+ }
+
+ /**
+ * get or create a IObservableValue
+ *
+ * @param nsmapace
+ * @return return null or raises an exception XWTException if fails
+ */
+ public static IObservableValue observableValue(Object context, Object data,
+ String propertyName) {
+ return XWTLoaderManager.getActive().observableValue(context, data,
+ propertyName, UpdateSourceTrigger.Default);
+ }
+
+ /**
+ * Change the system logger
+ *
+ * @param logger
+ */
+ public static void setLogger(ILogger log) {
+ XWTLoaderManager.getActive().setLogger(log);
+ }
+
+ /**
+ * Get the name of the element, which is defined by <code>Name</code> or
+ * <code>x:Name</code>. Return <code>null</code>
+ *
+ * @param object
+ * @return
+ */
+ public static String getElementName(Object object) {
+ return XWTLoaderManager.getActive().getElementName(object);
+ }
+
+ /**
+ * Find a named UI element.
+ *
+ * @param context
+ * the start point of research.
+ * @param name
+ * @return
+ */
+ public static Object findElementByName(Object context, String name) {
+ return XWTLoaderManager.getActive().findElementByName(context, name);
+ }
+
+ /**
+ * Get the DataContext of given element
+ *
+ * @param context
+ * @return
+ */
+ public static Object getDataContext(Object element, Class<?> targetType) {
+ Object value = XWTLoaderManager.getActive().getDataContext(element);
+ if (targetType == null || !targetType.isInstance(value)) {
+ if (value instanceof IBinding) {
+ return ((IBinding) value).getValue(targetType);
+ }
+ if (value instanceof IObservableValue) {
+ return ((IObservableValue) value).getValue();
+ }
+ }
+ return value;
+ }
+
+ /**
+ * Returns the {@link BindingContext} within the upper scope of the control.
+ * <p>
+ * Each UI Element may have a local DataBindingContext property. While
+ * locating DataBindingContext, if the current UI Element has not the
+ * property, the parent's will be used.
+ * <p>
+ * If none is found, a default one will be created as default for the
+ * current scope
+ * <p>
+ * If still not found {@link XWTException} thrown...
+ *
+ * @param element
+ * @return
+ */
+ public static IBindingContext getBindingContext(Object element) {
+ return (IBindingContext) XWTLoaderManager.getActive()
+ .getBindingContext(element);
+ }
+
+ /**
+ * Get the DataContext of given element
+ *
+ * @param context
+ * @return
+ */
+ public static Object getDataContext(Object element) {
+ return getDataContext(element, null);
+ }
+
+ /**
+ * Set the DataContext of given element
+ *
+ * @param context
+ * @return
+ */
+ public static void setDataContext(Object element, Object dataContext) {
+ XWTLoaderManager.getActive().setDataContext(UserData.getWidget(element), dataContext);
+ }
+
+ /**
+ * Get the Triggers of given element
+ *
+ * @param context
+ * @return
+ */
+ public static TriggerBase[] getTriggers(Widget element) {
+ return XWTLoaderManager.getActive().getTriggers(element);
+ }
+
+ /**
+ * Get the Triggers of given element
+ *
+ * @param context
+ * @return
+ */
+ public static void setTriggers(Widget element, TriggerBase[] triggers) {
+ XWTLoaderManager.getActive().setTriggers(element, triggers);
+ }
+
+ /**
+ * Get the CLR (Common Language Runtime) object. If no CLR object is found
+ * in this element, the research will be propagated in it parent.
+ *
+ * @param widget
+ * @return
+ */
+ public static Object getCLR(Object widget) {
+ return UserData.getCLR(widget);
+ }
+
+ /**
+ * Find the root shell
+ *
+ * @param context
+ * @return
+ */
+ public static Shell findShell(Object context) {
+ return UserData.findShell(context);
+ }
+
+ public static IProperty findProperty(Object object, String name) {
+ IMetaclass metaclass = XWTLoaderManager.getActive()
+ .getMetaclass(object);
+ return metaclass.findProperty(name);
+ }
+
+ public static Object findResource(Object object, String name) {
+ return XWTLoaderManager.getActive().findResource(object, name);
+ }
+
+ public static Map<String, Object> getResources(Object object) {
+ return XWTLoaderManager.getActive().getResources(object);
+ }
+
+ public static IEvent findEvent(Object object, String name) {
+ IMetaclass metaclass = XWTLoaderManager.getActive()
+ .getMetaclass(object);
+ return metaclass.findEvent(name);
+ }
+
+ public static IMetaclass getMetaclass(Object object) {
+ return XWTLoaderManager.getActive().getMetaclass(object);
+ }
+
+ /**
+ * Load the file content. All widget will be created but they are showed.
+ * This method return the root element.
+ *
+ */
+ static public Object load(URL file) throws Exception {
+ XWT.checkInitialization();
+ return XWTLoaderManager.getActive().load(file);
+ }
+
+ /**
+ * Load the content from IUIResource. All widget will be created but they
+ * are showed. This method return the root element.
+ *
+ */
+ static public Object load(IUIResource resource) throws Exception {
+ XWT.checkInitialization();
+ return XWTLoaderManager.getActive().load(resource);
+ }
+
+ /**
+ * Load the file content. All widget will be created but they are showed.
+ * This method return the root element.
+ *
+ */
+ static public Object load(URL file, Object dataContext) throws Exception {
+ XWT.checkInitialization();
+ return XWTLoaderManager.getActive().load(file, dataContext);
+ }
+
+ /**
+ * Load the content from IUIResource. All widget will be created but they
+ * are showed. This method return the root element.
+ *
+ */
+ static public Object load(IUIResource resource, Object dataContext)
+ throws Exception {
+ XWT.checkInitialization();
+ return XWTLoaderManager.getActive().load(resource, dataContext);
+ }
+
+ /**
+ * Load the file content under a UI Object. All widget will be created. This
+ * method returns the root element. The DataContext will be associated to
+ * the root element.
+ */
+ static public Object load(Object parent, URL file) throws Exception {
+ return XWTLoaderManager.getActive().load(parent, file);
+ }
+
+ /**
+ * Load the file content under a UI Object. All widget will be created. This
+ * method returns the root element. The DataContext will be associated to
+ * the root element.
+ *
+ */
+ static public Object load(Object parent, IUIResource resource)
+ throws Exception {
+ return XWTLoaderManager.getActive().load(parent, resource);
+ }
+
+ /**
+ * Load the file content under a UI Object with a DataContext. All widget
+ * will be created. This method returns the root element. The DataContext
+ * will be associated to the root element.
+ */
+ static public Object load(Object parent, URL file, Object dataContext)
+ throws Exception {
+ return XWTLoaderManager.getActive().load(parent, file, dataContext);
+ }
+
+ /**
+ * Load the content from IUIResource.
+ *
+ * @param stream
+ * @param input
+ * @param parsingCallback
+ * null if the callback is not necessary
+ * @return
+ * @throws Exception
+ */
+ static public IUIResource loadAsResource(InputStream stream, URL input,
+ IBeforeParsingCallback parsingCallback) throws Exception {
+ return XWTLoaderManager.getActive().loadAsResource(stream, input,
+ parsingCallback);
+ }
+
+ /**
+ * Load the content from IUIResource.
+ *
+ * @param stream
+ * @param input
+ * @param parsingCallback
+ * null if the callback is not necessary
+ * @return
+ * @throws Exception
+ */
+ static public IUIResource loadAsResource(InputStream stream, URL input)
+ throws Exception {
+ return XWTLoaderManager.getActive().loadAsResource(stream, input);
+ }
+
+ /**
+ * Load the content from IUIResource.
+ *
+ * @param input
+ * @param parsingCallback
+ * null if the callback is not necessary
+ * @return
+ * @throws Exception
+ */
+ static public IUIResource loadAsResource(URL input,
+ IBeforeParsingCallback parsingCallback) throws Exception {
+ return XWTLoaderManager.getActive().loadAsResource(null, input,
+ parsingCallback);
+ }
+
+ /**
+ * Load the content from IUIResource.
+ *
+ * @param input
+ * @return
+ * @throws Exception
+ */
+ static public IUIResource loadAsResource(URL input) throws Exception {
+ return XWTLoaderManager.getActive().loadAsResource(null, input);
+ }
+
+ /**
+ * Load the file content under a UI Object with a DataContext. All widget
+ * will be created. This method returns the root element. The DataContext
+ * will be associated to the root element.
+ */
+ static public Object load(Object parent, IUIResource resource,
+ Object dataContext) throws Exception {
+ return XWTLoaderManager.getActive().load(parent, resource, dataContext);
+ }
+
+ static public Object load(Object parent, IUIResource resource,
+ Map<String, Object> options) throws Exception {
+ return XWTLoaderManager.getActive().load(parent, resource, options);
+ }
+
+ /**
+ * Open and show the file content in a new Shell.
+ */
+ static public void open(final URL url) throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(url);
+ }
+
+ /**
+ * Open and show the file content in a new Shell.
+ */
+ static public void open(final Class<?> type) throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(type);
+ }
+
+ /**
+ * Open and show the file content in a new Shell.
+ */
+ static public void open(final IUIResource resource) throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(resource);
+ }
+
+ /**
+ * load the content from a stream with a style, a DataContext and a
+ * ResourceDictionary. The root elements will be hold by UI Object parent
+ */
+ static public Object load(Object parent, InputStream stream, URL file,
+ Object dataContext) throws Exception {
+ return XWTLoaderManager.getActive().load(parent, stream, file,
+ dataContext);
+ }
+
+ /**
+ * load the file content. The corresponding UI element is not yet created
+ */
+ static public void open(URL url, Object dataContext) throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(url, dataContext);
+ }
+
+ /**
+ * load the content from IUIResource. The corresponding UI element is not
+ * yet created
+ */
+ static public void open(IUIResource resource, Object dataContext)
+ throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(resource, dataContext);
+ }
+
+ /**
+ * load the file content. The corresponding UI element is not yet created
+ */
+ static public void open(Class<?> type, Object dataContext) throws Exception {
+ open(type.getResource(type.getSimpleName()
+ + IConstants.XWT_EXTENSION_SUFFIX), dataContext);
+ }
+
+ /**
+ * load the file content. The corresponding UI element is not yet created
+ */
+ static public void open(URL url, Map<String, Object> options)
+ throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(url, options);
+ }
+
+ /**
+ * load the content from IUIResource. The corresponding UI element is not
+ * yet created
+ */
+ static public void open(IUIResource resource, Map<String, Object> options)
+ throws Exception {
+ XWT.checkInitialization();
+ XWTLoaderManager.getActive().open(resource, options);
+ }
+
+ static public Object convertFrom(Class<?> targetType, String string) {
+ return XWTLoaderManager.getActive().convertFrom(targetType, string);
+ }
+
+ static public Object loadWithOptions(URL url, Map<String, Object> options)
+ throws Exception {
+ return XWTLoaderManager.getActive().loadWithOptions(url, options);
+ }
+
+ static public Object loadWithOptions(IUIResource resource,
+ Map<String, Object> options) throws Exception {
+ return XWTLoaderManager.getActive().loadWithOptions(resource, options);
+ }
+
+ /**
+ *
+ * @param stream
+ * @param url
+ * @param options
+ * @return
+ * @throws Exception
+ */
+ static public Object load(InputStream stream, URL url) throws Exception {
+ XWT.checkInitialization();
+ return loadWithOptions(stream, url, Collections.EMPTY_MAP);
+ }
+
+ /**
+ *
+ * @param stream
+ * @param url
+ * @param options
+ * @return
+ * @throws Exception
+ */
+ static public Object loadWithOptions(InputStream stream, URL url,
+ Map<String, Object> options) throws Exception {
+ XWT.checkInitialization();
+ return XWTLoaderManager.getActive().loadWithOptions(stream, url,
+ options);
+ }
+
+ /**
+ * Metaclass services to return all registered Metaclasses.
+ *
+ * @param stream
+ * @param url
+ * @param loadData
+ * @return
+ * @throws Exception
+ */
+ static public IMetaclass[] getAllMetaclasses() {
+ return XWTLoaderManager.getActive().getAllMetaclasses();
+ }
+
+ /**
+ * Get the corresponding Metaclass
+ *
+ * @param tagName
+ * @param ns
+ * The namespace
+ * @return
+ */
+ static public IMetaclass getMetaclass(String tagName, String ns) {
+ return XWTLoaderManager.getActive().getMetaclass(tagName, ns);
+ }
+
+ /**
+ * Register a Data converter
+ *
+ * @param converter
+ * @param type
+ */
+ public static void registerEventGroup(Class<?> type, IEventGroup eventGroup) {
+ XWTLoaderManager.getActive().registerEventGroup(type, eventGroup);
+ }
+
+ /**
+ * Register a Data converter
+ *
+ * @param converter
+ * @param type
+ */
+ public static void registerConvertor(IConverter converter) {
+ XWTLoaderManager.getActive().registerConvertor(converter);
+ }
+
+ /**
+ * Register a command to a name
+ *
+ * @param name
+ * @param command
+ */
+ public static void registerCommand(String name, ICommand command) {
+ XWTLoaderManager.getActive().registerCommand(name, command);
+ }
+
+ /**
+ * Add a default style
+ *
+ * @param style
+ * @return
+ */
+ public static void addDefaultStyle(IStyle style) {
+ XWTLoaderManager.getActive().addDefaultStyle(style);
+ }
+
+ public static void addDataProviderFactory(String name,
+ IDataProviderFactory dataProviderFactory) {
+ XWTLoaderManager.getActive().addDataProviderFactory(name,
+ dataProviderFactory);
+ }
+
+ public static void removeDataProviderFactory(String name) {
+ XWTLoaderManager.getActive().removeDataProviderFactory(name);
+ }
+
+ public static void removeDataProviderFactory(
+ IDataProviderFactory dataProviderFactory) {
+ XWTLoaderManager.getActive().removeDataProviderFactory(
+ dataProviderFactory);
+ }
+
+ public static Collection<IDataProviderFactory> getDataProviderFactories() {
+ return XWTLoaderManager.getActive().getDataProviderFactories();
+ }
+
+ /**
+ * Register UI type
+ *
+ * @param javaclass
+ */
+ static public IMetaclass registerMetaclass(Class<?> type) {
+ return XWTLoaderManager.getActive().registerMetaclass(type);
+ }
+
+ /**
+ * Register UI type
+ *
+ * @param javaclass
+ */
+ static public void registerMetaclass(IMetaclass type) {
+ XWTLoaderManager.getActive().registerMetaclass(type);
+ }
+
+ /**
+ * Get the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public Object getPropertyValue(Object uiElement, IProperty property) {
+ return XWTLoaderManager.getActive().getPropertyValue(uiElement,
+ property);
+ }
+
+ /**
+ * Get the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public Object getPropertyValue(Object uiElement, String propertyName) {
+ IMetaclass metaclass = XWT.getMetaclass(uiElement);
+ IProperty property = metaclass.findProperty(propertyName);
+ if (property == null) {
+ return null;
+ }
+ return XWTLoaderManager.getActive().getPropertyValue(uiElement,
+ property);
+ }
+
+ /**
+ * Set the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public void setPropertyValue(Object uiElement, IProperty property,
+ Object value) {
+ XWTLoaderManager.getActive().setPropertyValue(uiElement, property,
+ value);
+ }
+
+ /**
+ * Set the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public void setPropertyValue(Object uiElement, String propertyName,
+ Object value) {
+ IMetaclass metaclass = XWT.getMetaclass(uiElement);
+ IProperty property = metaclass.findProperty(propertyName);
+ if (property == null) {
+ throw new XWTException("Property " + propertyName + " not found.");
+ }
+ XWTLoaderManager.getActive().setPropertyValue(uiElement, property,
+ value);
+ }
+
+ /**
+ * Remove the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public void removePropertyValue(Object uiElement, IProperty property) {
+ XWTLoaderManager.getActive().removePropertyValue(uiElement, property);
+ }
+
+ /**
+ * Remove the dynamic property value
+ *
+ * @param javaclass
+ */
+ static public boolean hasPropertyValue(Object uiElement, IProperty property) {
+ return XWTLoaderManager.getActive().hasPropertyValue(uiElement,
+ property);
+ }
+
+ /**
+ * Find a Data converter
+ *
+ * @param converter
+ * @param type
+ */
+ static public IConverter findConvertor(Class<?> source, Class<?> target) {
+ return XWTLoaderManager.getActive().findConvertor(source, target);
+ }
+
+ /**
+ * Switch current loading context
+ *
+ */
+ public static void setLoadingContext(ILoadingContext loadingContext) {
+ XWTLoaderManager.getActive().setLoadingContext(loadingContext);
+ }
+
+ /**
+ * Return current loading context
+ *
+ * @return ILoadingContext
+ */
+ public static ILoadingContext getLoadingContext() {
+ return XWTLoaderManager.getActive().getLoadingContext();
+ }
+
+ /**
+ * Add a tracking option
+ *
+ * @param tracking
+ */
+ static public void addTracking(Tracking tracking) {
+ XWTLoaderManager.getActive().addTracking(tracking);
+ }
+
+ /**
+ * Test if the tracking on argument is enabled.
+ *
+ * @param tracking
+ * @return
+ */
+ static public boolean isTracking(Tracking tracking) {
+ return XWTLoaderManager.getActive().isTracking(tracking);
+ }
+
+ /**
+ * Get all tracking options
+ *
+ * @return
+ */
+ static public Set<Tracking> getTrackings() {
+ return XWTLoaderManager.getActive().getTrackings();
+ }
+
+ /**
+ * Set up the default ICLRFactory
+ *
+ * @param factory
+ */
+ static public void setCLRFactory(ICLRFactory factory) {
+ XWTLoaderManager.getActive().setCLRFactory(factory);
+ }
+
+ static public boolean checkInitialization() {
+ if (isAllInitializersInitialized()) {
+ return false;
+ }
+ return checkInitialization(-1);
+ }
+
+ static public boolean checkInitialization(long timeoutMillis) {
+ long started = System.currentTimeMillis();
+ while (true) {
+ if (timeoutMillis != -1
+ && System.currentTimeMillis() - started > timeoutMillis) {
+ return false;
+ }
+
+ if (isAllInitializersInitialized()) {
+ return false;
+ }
+
+ try {
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ return false;
+ }
+ }
+ }
+
+ private static boolean isAllInitializersInitialized() {
+ synchronized (initializers) {
+ for (IXWTInitializer initializer : initializers) {
+ if (!initializer.isInitialized()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * The default CLRFactory.
+ *
+ * @return
+ */
+ static public ICLRFactory getCLRFactory() {
+ return XWTLoaderManager.getActive().getCLRFactory();
+ }
+
+ /**
+ * Find a command by name
+ *
+ * @param name
+ * @return
+ */
+ static public ICommand getCommand(String name) {
+ return XWTLoaderManager.getActive().getCommand(name);
+ }
+
+ public static IDataProvider findDataProvider(Object dataContext) {
+ return XWTLoaderManager.getActive().findDataProvider(dataContext);
+ }
+
+ static public Realm getRealm() {
+ return XWTLoaderManager.getActive().getRealm();
+ }
+
+ static public boolean isXWTNamespace(String namespace) {
+ return IConstants.XWT_X_NAMESPACE.equals(namespace)
+ || IConstants.XWT_NAMESPACE.equals(namespace)
+ || namespace.startsWith(IConstants.XAML_CLR_NAMESPACE_PROTO);
+ }
+
+ /**
+ * Check if the value of a property is to resolve.
+ *
+ * @param type
+ * type of property
+ * @return
+ */
+ public static boolean isFileResolveType(Class<?> type) {
+ return XWTLoaderManager.getActive().isFileResolveType(type);
+ }
+
+ /**
+ * Register the value of a property is to resolve.
+ *
+ * @param type
+ * type of property
+ * @return
+ */
+ public static void registerFileResolveType(Class<?> type) {
+ XWTLoaderManager.getActive().registerFileResolveType(type);
+ }
+
+ /**
+ * Register the value of a property is to resolve.
+ *
+ * @param type
+ * type of property
+ * @return
+ */
+ public static void unregisterFileResolveType(Class<?> type) {
+ XWTLoaderManager.getActive().unregisterFileResolveType(type);
+ }
+
+ static class DisplayThread extends Thread implements Listener {
+ protected long startTime = -1;
+ protected boolean toStop = false;
+ protected Runnable runnable;
+
+ public DisplayThread(Runnable runnable) {
+ this.runnable = runnable;
+ }
+
+ public void handleEvent(Event event) {
+ }
+ }
+
+ /**
+ * Run in UI context.
+ *
+ * @param runnable
+ */
+ public static void runOnUIThread(final Runnable runnable) {
+ String platform = SWT.getPlatform();
+ if (platform.startsWith("win") || platform.endsWith("cocoa") || platform.startsWith("rap")) {
+ XWTLoaderManager.getDefault();
+ runnable.run();
+ } else if (platform.endsWith("gtk")) {
+ synchronized (displayLock) {
+ if (displayThread == null || !displayThread.isAlive()) {
+ try {
+ Field field = Display.class.getDeclaredField("Default");
+ if (field != null) {
+ field.setAccessible(true);
+ Display defaultDisplay = (Display) field.get(null);
+ if (defaultDisplay != null) {
+ displayThread = defaultDisplay.getThread();
+ }
+ }
+ } catch (Exception e) {
+ }
+ }
+
+ if (displayThread == null || !displayThread.isAlive()) {
+ displayThread = new Thread() {
+ private long startTime = -1;
+ private Display display;
+ private boolean toStop = false;
+ private boolean ignoreNotification = false;
+ protected Runnable runnable = new Runnable() {
+ public void run() {
+ if (ignoreNotification) {
+ startTime = -1;
+ return;
+ }
+ if (startTime == -1) {
+ startTime = System.currentTimeMillis();
+ } else {
+ if ((System.currentTimeMillis() - startTime) > 10000
+ && display.getActiveShell() == null
+ && display.getShells().length == 0) {
+ toStop = true;
+ display.wake();
+ } else {
+ startTime = System.currentTimeMillis();
+ }
+ }
+ }
+ };
+
+ @Override
+ public void run() {
+ // Set default XWT ICLRFactory
+ XWTLoaderManager.getDefault();
+ display = Display.getDefault();
+ runnable.run();
+ while (true) {
+ if (!display.readAndDispatch()) {
+ display.timerExec(10000, runnable);
+ display.sleep();
+ ignoreNotification = true;
+ }
+ if (toStop) {
+ break;
+ }
+ startTime = -1;
+ }
+ }
+ };
+ displayThread.start();
+ } else {
+ XWTLoaderManager.getDefault();
+ XWT.checkInitialization();
+ Display display = Display.findDisplay(displayThread);
+ if (display != null) {
+ display.syncExec(runnable);
+ }
+ }
+ }
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ public static void addInitializer(IXWTInitializer initializer) {
+ synchronized (initializers) {
+ if (!XWTLoaderManager.isStarted()) {
+ initializers.add(initializer);
+ }
+ }
+ }
+
+ static List<IXWTInitializer> getInitializers() {
+ return initializers;
+ }
+
+ public static Object findParent(Object element, Class<?> type) {
+ Widget widget = UserData.getWidget(element);
+ if (widget == null) {
+ return null;
+ }
+ return UserData.findParent(widget, type);
+ }
+
+ static void runInitializers(IXWTLoader loader) {
+ synchronized (initializers) {
+ for (IXWTInitializer initializer : XWT.getInitializers()) {
+ initializer.initialize(loader);
+ }
+ }
+ }
+}