blob: 441c77ce2106781980dd7c5352096e566264c6ec [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}
}