/******************************************************************************* | |
* 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 | |
*******************************************************************************/ | |
package org.eclipse.xwt.forms; | |
import java.io.InputStream; | |
import java.net.URL; | |
import java.util.HashMap; | |
import java.util.Map; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
import org.eclipse.swt.widgets.Widget; | |
import org.eclipse.xwt.IConstants; | |
import org.eclipse.xwt.IXWTLoader; | |
import org.eclipse.xwt.XWT; | |
import org.eclipse.xwt.callback.ICreatedCallback; | |
import org.eclipse.xwt.callback.ILoadedCallback; | |
import org.eclipse.xwt.forms.metaclass.ButtonMetaclass; | |
import org.eclipse.xwt.forms.metaclass.CompositeMetaclass; | |
import org.eclipse.xwt.forms.metaclass.ExpandableCompositeMetaclass; | |
import org.eclipse.xwt.forms.metaclass.FormMetaclass; | |
import org.eclipse.xwt.forms.metaclass.FormTextMetaclass; | |
import org.eclipse.xwt.forms.metaclass.HyperlinkMetaclass; | |
import org.eclipse.xwt.forms.metaclass.ImageHyperlinkMetaclass; | |
import org.eclipse.xwt.forms.metaclass.LabelMetaclass; | |
import org.eclipse.xwt.forms.metaclass.ScrolledFormMetaclass; | |
import org.eclipse.xwt.forms.metaclass.ScrolledPageBookMetaclass; | |
import org.eclipse.xwt.forms.metaclass.SectionMetaclass; | |
import org.eclipse.xwt.forms.metaclass.TableMetaclass; | |
import org.eclipse.xwt.forms.metaclass.TextMetaclass; | |
import org.eclipse.xwt.internal.utils.UserData; | |
/** | |
* | |
* @author yyang (yves.yang@soyatec.com) | |
*/ | |
public class XWTForms { | |
private static Object FormsProfile; | |
private static ICreatedCallback CreatedAction = new ICreatedCallback() { | |
public void onCreated(Object sender) { | |
Widget widget = UserData.getWidget(sender); | |
if (widget instanceof Control) { | |
ToolKitUtil.adapt((Control)widget); | |
} | |
} | |
}; | |
private static boolean applyFormsProfile () { | |
if (FormsProfile == null) { | |
FormsProfile = XWT.createUIProfile(); | |
XWT.registerMetaclass(new FormMetaclass()); | |
XWT.registerMetaclass(new ButtonMetaclass()); | |
XWT.registerMetaclass(new LabelMetaclass()); | |
XWT.registerMetaclass(new TextMetaclass()); | |
XWT.registerMetaclass(new TableMetaclass()); | |
XWT.registerMetaclass(new CompositeMetaclass()); | |
XWT.registerMetaclass(new FormTextMetaclass()); | |
XWT.registerMetaclass(new HyperlinkMetaclass()); | |
XWT.registerMetaclass(new ImageHyperlinkMetaclass()); | |
XWT.registerMetaclass(new ExpandableCompositeMetaclass()); | |
XWT.registerMetaclass(new SectionMetaclass()); | |
XWT.registerMetaclass(new ScrolledPageBookMetaclass()); | |
XWT.registerMetaclass(new ScrolledFormMetaclass()); | |
} | |
return XWT.applyProfile(FormsProfile); | |
} | |
/** | |
* Load the file content. All widget will be created but they are showed. This method return the root element. | |
* | |
*/ | |
static public synchronized Object load(URL file) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
return loadWithOptions(file, options); | |
} | |
/** | |
* Load the file content. All widget will be created but they are showed. This method return the root element. | |
* | |
*/ | |
static public synchronized Object load(URL file, Object dataContext) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
options.put(IXWTLoader.DATACONTEXT_PROPERTY, dataContext); | |
return loadWithOptions(file, options); | |
} | |
/** | |
* Load the file content under a Composite. All widget will be created. This method returns the root element. The DataContext will be associated to the root element. | |
*/ | |
static public synchronized Object load(Composite parent, URL file) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
options.put(IXWTLoader.CONTAINER_PROPERTY, parent); | |
return loadWithOptions(file, options); | |
} | |
/** | |
* Load the file content under a Composite 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 synchronized Object load(Composite parent, URL file, Object dataContext) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
options.put(IXWTLoader.CONTAINER_PROPERTY, parent); | |
options.put(IXWTLoader.DATACONTEXT_PROPERTY, dataContext); | |
return loadWithOptions(file, options); | |
} | |
/** | |
* Open and show the file content in a new Shell. | |
*/ | |
static public synchronized void open(URL url) throws Exception { | |
open(url, new HashMap<String, Object>()); | |
} | |
/** | |
* load the content from a stream with a style, a DataContext and a ResourceDictionary. The root elements will be hold by Composite parent | |
*/ | |
static public synchronized Object load(Composite parent, InputStream stream, URL file, Object dataContext) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
options.put(IXWTLoader.CONTAINER_PROPERTY, parent); | |
options.put(IXWTLoader.DATACONTEXT_PROPERTY, dataContext); | |
return loadWithOptions(stream, file, options); | |
} | |
/** | |
* load the file content. The corresponding UI element is not yet created | |
*/ | |
static public synchronized void open(URL url, Object dataContext) throws Exception { | |
HashMap<String, Object> options = new HashMap<String, Object>(); | |
options.put(IXWTLoader.DATACONTEXT_PROPERTY, dataContext); | |
open(url, options); | |
} | |
/** | |
* load the file content. The corresponding UI element is not yet created | |
*/ | |
static public synchronized 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 synchronized void open(URL url, Map<String, Object> options) throws Exception { | |
boolean applied = applyFormsProfile(); | |
try { | |
options.put(IXWTLoader.CREATED_CALLBACK, CreatedAction); | |
XWT.open(url, options); | |
} | |
finally { | |
if (applied) { | |
XWT.restoreProfile(); | |
} | |
} | |
} | |
static public synchronized Object loadWithOptions(URL url, Map<String, Object> options) throws Exception { | |
boolean applied = applyFormsProfile(); | |
try { | |
options.put(IXWTLoader.CREATED_CALLBACK, CreatedAction); | |
return XWT.loadWithOptions(url, options); | |
} | |
finally { | |
if (applied) { | |
XWT.restoreProfile(); | |
} | |
} | |
} | |
/** | |
* | |
* @param stream | |
* @param url | |
* @param options | |
* @return | |
* @throws Exception | |
*/ | |
static public synchronized Object load(InputStream stream, URL url) throws Exception { | |
return loadWithOptions(stream, url, new HashMap<String, Object>()); | |
} | |
/** | |
* | |
* @param stream | |
* @param url | |
* @param options | |
* @return | |
* @throws Exception | |
*/ | |
static public synchronized Object loadWithOptions(InputStream stream, URL url, Map<String, Object> options) throws Exception { | |
boolean applied = applyFormsProfile(); | |
try { | |
options.put(IXWTLoader.CREATED_CALLBACK, CreatedAction); | |
return XWT.loadWithOptions(stream, url, options); | |
} | |
finally { | |
if (applied) { | |
XWT.restoreProfile(); | |
} | |
} | |
} | |
} |