Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryyang2015-05-28 13:04:02 +0000
committeryyang2015-05-28 13:04:02 +0000
commit6ee43239178e65ef80feed6b6c28592a5bc808ed (patch)
treea6643ce2d534e0905308cc26048d9f81168a1a5a
parent2a55e3f3cc81ace5b58605d8554ffe1ef18120aa (diff)
downloadorg.eclipse.xwt-6ee43239178e65ef80feed6b6c28592a5bc808ed.tar.gz
org.eclipse.xwt-6ee43239178e65ef80feed6b6c28592a5bc808ed.tar.xz
org.eclipse.xwt-6ee43239178e65ef80feed6b6c28592a5bc808ed.zip
Bug 468271 - add the ValidationStatus tag
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.java6
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.xwt2
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.java8
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.xwt6
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip_Attribute.xwt6
-rw-r--r--org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/ValidationsTests.java51
-rw-r--r--org.eclipse.xwt/src/org/eclipse/xwt/javabean/ResourceLoader.java4016
-rw-r--r--org.eclipse.xwt/src/org/eclipse/xwt/javabean/metadata/AbstractMetaclass.java60
8 files changed, 2160 insertions, 1995 deletions
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.java b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.java
index b9bcfb5..27b8c1b 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.java
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.java
@@ -21,7 +21,11 @@ public class Validation {
URL url = Validation.class.getResource(Validation.class.getSimpleName()
+ IConstants.XWT_EXTENSION_SUFFIX);
try {
- XWT.open(url);
+ Object object = XWT.load(url);
+
+ Object child = XWT.findElementByName(object, "bbb");
+
+ System.out.println(child.toString());
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.xwt b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.xwt
index 0f750fc..ec4775a 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.xwt
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation.xwt
@@ -10,7 +10,7 @@
<Text x:Name="text1" />
<Text x:name="text2">
<Text.text>
- <Binding elementName="text1" path="text" updateSourceTrigger="PropertyChanged" >
+ <Binding x:Name="bbb" elementName="text1" path="text" updateSourceTrigger="PropertyChanged" >
<Binding.validationRules>
<y:RequiredValidationRule/>
<y:SizeValidationRule/>
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.java b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.java
index c26334e..5ec0802 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.java
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.java
@@ -12,8 +12,12 @@ package org.eclipse.xwt.tests.databinding.validation;
import java.net.URL;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
import org.eclipse.xwt.IConstants;
import org.eclipse.xwt.XWT;
+import org.eclipse.xwt.internal.core.Binding;
public class Validation_ToolTip {
public static void main(String[] args) {
@@ -21,7 +25,11 @@ public class Validation_ToolTip {
URL url = Validation_ToolTip.class.getResource(Validation_ToolTip.class.getSimpleName()
+ IConstants.XWT_EXTENSION_SUFFIX);
try {
+
+ final Display display = new Display();
+
XWT.open(url);
+
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.xwt b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.xwt
index ea7af78..08c77c4 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.xwt
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip.xwt
@@ -16,12 +16,12 @@
</Binding.validationRules>
</Binding>
</Text.text>
- <Text.tooltip>
+ <Text.toolTipText>
<Binding>
<Binding.source>
<ValidationStatus sourceName="MyBinding"/>
- </Binding.source>
+ </Binding.source>
</Binding>
- </Text.tooltip>
+ </Text.toolTipText>
</Text>
</Shell>
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip_Attribute.xwt b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip_Attribute.xwt
index 019ad26..b862c57 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip_Attribute.xwt
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/Validation_ToolTip_Attribute.xwt
@@ -7,7 +7,7 @@
</Shell.layout>
<Label text="Input a text in first Text > 8 characters " />
- <Text x:name="text2"
- text="{Binding elementName=text1,path=text,updateSourceTrigger=PropertyChanged,validationRule=y:SizeValidationRule}"
- tooltip="{Binding source={ValidationStatus sourceName=MyBinding}}"/>
+ <Text x:name="text1"
+ text="{Binding name=MyBinding, elementName=text1,path=text,updateSourceTrigger=PropertyChanged,validationRule=y:SizeValidationRule}"
+ toolTipText="{Binding source={ValidationStatus sourceName=MyBinding}}"/>
</Shell>
diff --git a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/ValidationsTests.java b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/ValidationsTests.java
index de1605e..2c2d884 100644
--- a/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/ValidationsTests.java
+++ b/org.eclipse.xwt.tests/src/org/eclipse/xwt/tests/databinding/validation/ValidationsTests.java
@@ -86,4 +86,55 @@ public class ValidationsTests extends XWTTestCase {
}
});
}
+
+ public void testValidationStatus() throws Exception{
+ URL url = Validation_ToolTip.class.getResource(Validation_ToolTip.class
+ .getSimpleName()
+ + IConstants.XWT_EXTENSION_SUFFIX);
+
+ runTest(url, new Runnable() {
+ public void run() {
+ Text text1 = (Text) XWT.findElementByName(root, "text1");
+ checkValidationStatus(text1);
+ checkValidationStatusOK(text1);
+ }
+
+ private void checkValidationStatusOK(Text text1) {
+ text1.setText("lessthan8");
+ assertEquals(text1.getToolTipText(), "");
+ }
+
+ private void checkValidationStatus(Text text1){
+ text1.setText("more than 8 characters");
+ assertEquals(text1.getToolTipText(), "Value should be 8 - 16 chars long");
+ }
+ });
+ }
+
+ public void testValidationStatus_Attribute() throws Exception{
+ URL url = Validation_ToolTip_Attribute.class.getResource(Validation_ToolTip_Attribute.class
+ .getSimpleName()
+ + IConstants.XWT_EXTENSION_SUFFIX);
+
+ runTest(url, new Runnable() {
+ public void run() {
+ Text text1 = (Text) XWT.findElementByName(root, "text1");
+
+ checkValidationStatusOK(text1);
+
+ checkValidationStatus(text1);
+
+ }
+
+ private void checkValidationStatusOK(Text text1) {
+ text1.setText("lessthan8");
+ assertEquals(text1.getToolTipText(), "");
+ }
+
+ private void checkValidationStatus(Text text1){
+ text1.setText("more than 16 characters");
+ assertEquals(text1.getToolTipText(), "Value should be 8 - 16 chars long");
+ }
+ });
+ }
}
diff --git a/org.eclipse.xwt/src/org/eclipse/xwt/javabean/ResourceLoader.java b/org.eclipse.xwt/src/org/eclipse/xwt/javabean/ResourceLoader.java
index 3aa2e34..68a99f0 100644
--- a/org.eclipse.xwt/src/org/eclipse/xwt/javabean/ResourceLoader.java
+++ b/org.eclipse.xwt/src/org/eclipse/xwt/javabean/ResourceLoader.java
@@ -1,1974 +1,2042 @@
-/*******************************************************************************
- * 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.javabean;
-
-import java.io.File;
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.databinding.conversion.IConverter;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ControlEditor;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-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.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.xwt.ICLRFactory;
-import org.eclipse.xwt.IConstants;
-import org.eclipse.xwt.IDataProvider;
-import org.eclipse.xwt.IEventHandler;
-import org.eclipse.xwt.IEventInvoker;
-import org.eclipse.xwt.IIndexedElement;
-import org.eclipse.xwt.ILoadingContext;
-import org.eclipse.xwt.INamespaceHandler;
-import org.eclipse.xwt.IStyle;
-import org.eclipse.xwt.IXWTLoader;
-import org.eclipse.xwt.ResourceDictionary;
-import org.eclipse.xwt.Tracking;
-import org.eclipse.xwt.XWT;
-import org.eclipse.xwt.XWTException;
-import org.eclipse.xwt.XWTLoader;
-import org.eclipse.xwt.XWTMaps;
-import org.eclipse.xwt.annotation.UI;
-import org.eclipse.xwt.callback.ICreatedCallback;
-import org.eclipse.xwt.callback.ILoadedCallback;
-import org.eclipse.xwt.core.IBinding;
-import org.eclipse.xwt.core.IDynamicBinding;
-import org.eclipse.xwt.core.IDynamicValueBinding;
-import org.eclipse.xwt.core.IRenderingContext;
-import org.eclipse.xwt.core.IVisualElementLoader;
-import org.eclipse.xwt.core.Setter;
-import org.eclipse.xwt.core.Style;
-import org.eclipse.xwt.input.ICommand;
-import org.eclipse.xwt.internal.core.Core;
-import org.eclipse.xwt.internal.core.DataBindingTrack;
-import org.eclipse.xwt.internal.core.IEventController;
-import org.eclipse.xwt.internal.core.ScopeKeeper;
-import org.eclipse.xwt.internal.utils.ClassLoaderUtil;
-import org.eclipse.xwt.internal.utils.DocumentObjectSorter;
-import org.eclipse.xwt.internal.utils.LoggerManager;
-import org.eclipse.xwt.internal.utils.NamespaceHelper;
-import org.eclipse.xwt.internal.utils.ObjectUtil;
-import org.eclipse.xwt.internal.utils.TableEditorHelper;
-import org.eclipse.xwt.internal.utils.UserData;
-import org.eclipse.xwt.internal.xml.Attribute;
-import org.eclipse.xwt.internal.xml.DocumentObject;
-import org.eclipse.xwt.internal.xml.Element;
-import org.eclipse.xwt.javabean.metadata.properties.PropertiesConstants;
-import org.eclipse.xwt.javabean.metadata.properties.TableItemProperty;
-import org.eclipse.xwt.jface.JFacesHelper;
-import org.eclipse.xwt.metadata.IEvent;
-import org.eclipse.xwt.metadata.IMetaclass;
-import org.eclipse.xwt.metadata.IProperty;
-import org.eclipse.xwt.metadata.IValueLoading;
-import org.eclipse.xwt.utils.PathHelper;
-
-/**
- * @author jliu (jin.liu@soyatec.com)
- */
-public class ResourceLoader implements IVisualElementLoader {
- static Map<String, Object> EMPTY_MAP = Collections.EMPTY_MAP;
-
- static final String RESOURCE_LOADER_PROPERTY = "XWT.ResourceLoader";
-
- private static final String COLUMN = "Column";
-
- private Map<String, Object> options;
-
- protected ResourceLoader parentLoader;
- protected IRenderingContext context;
- protected IXWTLoader loader;
-
- protected Object scopedObject;
- protected ScopeKeeper nameScoped;
- protected LoadingData loadData = new LoadingData();
-
- protected Event loadedEvent = new Event();
-
- class LoadingData {
- protected LoadingData parent;
- protected Object clr;
- protected Collection<IStyle> styles = Collections.EMPTY_LIST;
- private Object currentWidget = null;
- private Object host = null;
- private Object dataContext = null;
-
- public Object getDataContext() {
- return dataContext;
- }
-
- public void setDataContext(Object dataContext) {
- this.dataContext = dataContext;
- }
-
- public Object getHost() {
- return host;
- }
-
- public Object getCurrentWidget() {
- return currentWidget;
- }
-
- public Object findElement(Class<?> type) {
- if (type.isInstance(currentWidget)) {
- return currentWidget;
- }
- if (parent != null) {
- return parent.findElement(type);
- }
- return null;
- }
-
- public void setCurrentWidget(Object currentWidget) {
- this.currentWidget = currentWidget;
- }
-
- public LoadingData getParent() {
- return parent;
- }
-
- public LoadingData() {
- }
-
- public LoadingData(LoadingData loadingData, Object host) {
- this.parent = loadingData;
- this.styles = loadingData.styles;
- this.clr = loadingData.clr;
- this.currentWidget = loadingData.currentWidget;
- this.dataContext = loadingData.dataContext;
- this.host = host;
- }
-
- public Collection<IStyle> getStyles() {
- return styles;
- }
-
- public void setStyles(Collection<IStyle> styles) {
- this.styles = styles;
- }
-
- public Object getClr() {
- return clr;
- }
-
- public void setClr(Object clr) {
- this.clr = clr;
- }
-
- public void inject(Object targetObject, String name) {
- doInject(targetObject, name, null);
- }
-
- protected void doInject(Object targetObject, String name,
- Object previousClr) {
- Class<?> filedType = targetObject.getClass();
- if (clr != null && (previousClr != clr || previousClr == null)) {
- for (Field field : clr.getClass().getDeclaredFields()) {
- UI annotation = field.getAnnotation(UI.class);
- if (annotation != null) {
- if (!field.getType().isAssignableFrom(filedType)) {
- continue;
- }
- String annotationValue = annotation.value();
- if (annotationValue == null
- || annotationValue.length() == 0) {
- if (field.getName().equals(name)) {
- field.setAccessible(true);
- try {
- field.set(clr, targetObject);
- return;
- } catch (Exception e) {
- }
- }
- } else if (annotationValue.equals(name)) {
- field.setAccessible(true);
- try {
- field.set(clr, targetObject);
- break;
- } catch (Exception e) {
- }
- }
- }
- }
- }
- if (parent != null) {
- parent.doInject(targetObject, name, clr);
- }
- }
-
- public void updateEvent(IRenderingContext context, Widget control,
- IEvent event, String handler) {
- IEventController eventController = UserData
- .updateEventController(control);
- Method method = null;
- Object clrObject = null;
- LoadingData current = this;
- ResourceLoader currentParentLoader = parentLoader;
- while (current != null) {
- Object receiver = current.getClr();
- if (receiver instanceof IEventHandler) {
- IEventHandler eventManager = (IEventHandler) receiver;
- IEventInvoker eventInvoker = eventManager.getEventInvoker(
- handler, control.getClass(), Event.class);
- if (eventInvoker != null) {
- eventController.setEvent(event, control, control,
- eventInvoker);
- }
- } else if (receiver != null) {
- Class<?> clazz = receiver.getClass();
- method = ObjectUtil.findMethod(clazz, handler,
- control.getClass(), Event.class);
- if (method == null) {
- method = ObjectUtil.findMethod(clazz, handler,
- Event.class);
- }
- if (method == null) {
- // Load again.
- clazz = ClassLoaderUtil.loadClass(
- context.getLoadingContext(), clazz.getName());
- method = ObjectUtil.findMethod(clazz, handler,
- Event.class);
- }
- if (method == null) {
- method = ObjectUtil.findMethod(clazz, handler);
- }
- if (method != null) {
- clrObject = receiver;
- eventController.setEvent(event, control, clrObject,
- control, method);
- break;
- }
- }
- current = current.getParent();
- if (current == null && currentParentLoader != null) {
- current = currentParentLoader.loadData;
- currentParentLoader = currentParentLoader.parentLoader;
- }
- }
- if (method == null) {
- LoggerManager.log(new XWTException("Event handler \"" + handler
- + "\" is not found."));
- }
- }
-
- public void end() {
- if (parent == null || clr != parent.getClr()) {
- Method method = ObjectUtil.findDeclaredMethod(clr.getClass(),
- "initializeComponent");
- if (method == null) {
- method = ObjectUtil.findDeclaredMethod(clr.getClass(),
- "InitializeComponent");
- }
- if (method != null) {
- try {
- method.setAccessible(true);
- method.invoke(clr);
- } catch (Exception e) {
- LoggerManager.log(e);
- }
- }
- }
- }
-
- public void addStyle(IStyle style) {
- if (styles == Collections.EMPTY_LIST) {
- styles = new ArrayList<IStyle>();
- }
- styles.add(style);
- }
- }
-
- private DataBindingTrack dataBindingTrack;
-
- /**
- * @param context
- */
- public ResourceLoader(IRenderingContext context, IXWTLoader loader) {
- this.context = context;
- this.loader = loader;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.xwt.IVisualElementLoader#createUIElement(org.eclipse.
- * e4.xwt.Element, org.eclipse.xwt.ILoadData,
- * org.eclipse.xwt.IResourceDictionary)
- */
- public Object createUIElement(Element element, Map<String, Object> options) {
- try {
- this.options = options;
- Object container = options.get(IXWTLoader.CONTAINER_PROPERTY);
- Widget parent = UserData.getWidget(container);
- if (!loader.getTrackings().isEmpty()) {
- dataBindingTrack = new DataBindingTrack();
- }
- parentLoader = (ResourceLoader) options
- .get(RESOURCE_LOADER_PROPERTY);
- options.remove(RESOURCE_LOADER_PROPERTY);
- ResourceDictionary resourceDictionary = (ResourceDictionary) options
- .get(IXWTLoader.RESOURCE_DICTIONARY_PROPERTY);
-
- if (resourceDictionary != null) {
- Object styles = resourceDictionary.get(Core.DEFAULT_STYLES_KEY);
- if (styles != null) {
- loadData.setStyles((Collection<IStyle>) styles);
- resourceDictionary.remove(Core.DEFAULT_STYLES_KEY);
- }
- }
- if (!options.containsKey(IXWTLoader.CLASS_FACTORY_PROPERTY)) {
- try {
- options.put(IXWTLoader.CLASS_FACTORY_PROPERTY,
- loader.getCLRFactory());
- } catch (UnsupportedOperationException e) {
- if (options.isEmpty()) {
- options = new HashMap<String, Object>();
- options.put(IXWTLoader.CLASS_FACTORY_PROPERTY,
- loader.getCLRFactory());
- } else {
- throw e;
- }
- }
- }
-
- Object control = doCreate(parent, element, null, options);
-
- // get databinding messages and print into console view
- if (dataBindingTrack != null) {
- String dataBindingMessage = dataBindingTrack
- .getDataBindMessage();// getDataBindMessage();
- org.eclipse.xwt.ILogger log = loader.getLogger();
- log.addMessage(dataBindingMessage, Tracking.DATABINDING);
- log.printInfo(dataBindingMessage, Tracking.DATABINDING,
- loader.getTrackings());
- }
- if (control instanceof Composite) {
- ((Composite) control).layout();
- }
- ILoadedCallback loadedAction = (ILoadedCallback) options
- .get(IXWTLoader.LOADED_CALLBACK);
- if (loadedAction != null) {
- loadedAction.onLoaded(control);
- }
- return control;
- } catch (Exception e) {
- if (e instanceof RuntimeException) {
- throw ((RuntimeException) e);
- }
-
- throw new XWTException(e);
- }
- }
-
- protected Object doCreate(Object parent, Element element,
- Class<?> constraintType, Map<String, Object> options)
- throws Exception {
- int styles = -1;
- if (options.containsKey(IXWTLoader.INIT_STYLE_PROPERTY)) {
- styles = (Integer) options.get(IXWTLoader.INIT_STYLE_PROPERTY);
- }
-
- ResourceDictionary dico = (ResourceDictionary) options
- .get(IXWTLoader.RESOURCE_DICTIONARY_PROPERTY);
- Object dataContext = options.get(IXWTLoader.DATACONTEXT_PROPERTY);
- Object bindingContext = options
- .get(IXWTLoader.BINDING_CONTEXT_PROPERTY);
- String name = element.getName();
- String namespace = element.getNamespace();
- if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)) {
- if (IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
- return null;
- }
- if (IConstants.XAML_X_TYPE.equalsIgnoreCase(name)
- && constraintType != null
- && constraintType instanceof Class<?>) {
- DocumentObject[] children = element.getChildren();
- if (children != null && children.length > 0) {
- if (children[0] instanceof Element) {
- Element type = (Element) children[0];
- IMetaclass metaclass = loader.getMetaclass(
- type.getName(), type.getNamespace());
- if (metaclass != null) {
- return metaclass.getType();
- }
- }
- } else {
- String content = element.getContent();
- return loader.convertFrom(Class.class, content);
- }
- }
- return null;
- }
- IMetaclass metaclass = loader.getMetaclass(name, namespace);
- if (constraintType != null
- && !(IBinding.class.isAssignableFrom(metaclass.getType()))
- && (!constraintType.isAssignableFrom(metaclass.getType()))) {
- if (!constraintType.isArray()
- || !constraintType.getComponentType().isAssignableFrom(
- metaclass.getType())) {
- IConverter converter = XWT.findConvertor(metaclass.getType(),
- constraintType);
- if (converter == null) {
- return null;
- }
- }
- }
- Object targetObject = null;
- Integer styleValue = getStyleValue(element, styles);
-
- if (parent == null || metaclass.getType() == Shell.class) {
- if (dataBindingTrack != null) {
- dataBindingTrack.addWidgetElement(element);
- }
- Shell shell = null;
- if ((parent == null && metaclass.getType() != Shell.class)
- || styleValue == null || styleValue == -1) {
- styleValue = SWT.SHELL_TRIM;
- }
- Display display = Display.getCurrent();
- shell = new Shell(display, styleValue);
- targetObject = shell;
- invokeCreatededAction(element, targetObject);
- loadData.setCurrentWidget(shell);
-
- if (metaclass.getType() != Shell.class) {
- shell.setLayout(new FillLayout());
- return doCreate(targetObject, element, constraintType, options);
- } else {
- if (bindingContext != null) {
- setBindingContext(metaclass, targetObject, dico,
- bindingContext);
- }
- if (dataContext != null) {
- setDataContext(metaclass, targetObject, dico, dataContext);
- }
- }
- pushStack(parent);
-
- // for Shell
- Attribute classAttribute = element.getAttribute(
- IConstants.XWT_X_NAMESPACE, IConstants.XAML_X_CLASS);
- if (classAttribute != null) {
- String className = classAttribute.getContent();
- loadShellCLR(className, shell);
- } else {
- Attribute classFactoryAttribute = element.getAttribute(
- IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_CLASS_FACTORY);
- ICLRFactory clrFactory = (ICLRFactory) options
- .get(XWTLoader.CLASS_FACTORY_PROPERTY);
- if (classFactoryAttribute != null) {
- String content = classFactoryAttribute.getContent();
- Object clr = loadFactoryCLR(content, clrFactory);
- loadData.setClr(clr);
- UserData.setCLR(shell, clr);
- } else {
- if (clrFactory != null) {
- Object clr = clrFactory.createCLR(null, options);
- loadData.setClr(clr);
- UserData.setCLR(shell, clr);
- }
- }
- }
- } else {
- pushStack(parent);
-
- //
- // load the content in case of UserControl
- //
- Class<?> type = metaclass.getType();
- URL file = type.getResource(type.getSimpleName()
- + IConstants.XWT_EXTENSION_SUFFIX);
- if (file != null && nameScoped != null) {
- if (parent instanceof Composite) {
- Object childDataContext = getDataContext(element,
- (Widget) parent);
- Object childBindingContext = getBindingContext(element,
- (Widget) parent);
- if (dataContext != null) {
- childDataContext = dataContext;
- }
- if (bindingContext != null) {
- childBindingContext = bindingContext;
- }
- Map<String, Object> nestedOptions = new HashMap<String, Object>();
- nestedOptions.put(IXWTLoader.CONTAINER_PROPERTY, parent);
- if (styleValue != null) {
- nestedOptions.put(IXWTLoader.INIT_STYLE_PROPERTY,
- styleValue);
- }
- nestedOptions.put(IXWTLoader.DATACONTEXT_PROPERTY,
- childDataContext);
- nestedOptions.put(IXWTLoader.BINDING_CONTEXT_PROPERTY,
- childBindingContext);
- nestedOptions.put(RESOURCE_LOADER_PROPERTY, this);
- nestedOptions.put(IXWTLoader.CLASS_FACTORY_PROPERTY, null); // disable
- // the
- // global
- // setting
- targetObject = loader.loadWithOptions(file, nestedOptions);
- if (targetObject == null) {
- return null;
- }
- invokeCreatededAction(element, targetObject);
- } else
- throw new XWTException(
- "Cannot add user control: Parent is not a composite");
- } else {
- Object[] parameters = null;
- if (TableViewerColumn.class.isAssignableFrom(type)) {
- int columnIndex = getColumnIndex(element);
- parameters = (styleValue != null ? new Object[] { parent,
- styleValue, columnIndex } : new Object[] { parent,
- SWT.NONE, columnIndex });
- } else {
- parameters = (styleValue != null ? new Object[] { parent,
- styleValue } : new Object[] { parent });
- }
-
- // x:Class
- {
- boolean hasClass = false;
- Attribute classAttribute = element
- .getAttribute(IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_CLASS);
- if (classAttribute != null) {
- String className = classAttribute.getContent();
- targetObject = loadCLR(className, parameters,
- metaclass.getType(), options);
- hasClass = true;
- } else {
- Object clr = options.get(XWTLoader.CLASS_PROPERTY);
- if (clr != null) {
- loadData.setClr(clr);
- hasClass = true;
- }
- }
- if (!hasClass) {
- Attribute classFactoryAttribute = element.getAttribute(
- IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_CLASS_FACTORY);
- ICLRFactory clrFactory = (ICLRFactory) options
- .get(XWTLoader.CLASS_FACTORY_PROPERTY);
- if (classFactoryAttribute != null) {
- Object clr = loadFactoryCLR(
- classFactoryAttribute.getContent(),
- clrFactory);
- if (clr != null) {
- loadData.setClr(clr);
- }
- } else {
- if (clrFactory != null) {
- loadData.setClr(clrFactory.createCLR(null,
- options));
- }
- }
- }
-
- if (targetObject == null) {
- targetObject = metaclass.newInstance(parameters);
- invokeCreatededAction(element, targetObject);
- Widget widget = UserData.getWidget(targetObject);
- if (widget != null) {
- Object clr = loadData.getClr();
- if (clr != null) {
- UserData.setCLR(widget, clr);
- }
- }
- } else {
- metaclass = loader.getMetaclass(targetObject);
- }
- }
-
- if (targetObject == null) {
- return null;
- }
- }
- }
- Widget widget = UserData.getWidget(targetObject);
- if (widget != null) {
- loadData.setCurrentWidget(targetObject);
- }
- if (scopedObject == null && widget != null) {
- scopedObject = widget;
- nameScoped = new ScopeKeeper((parent == null ? null
- : UserData.findScopeKeeper((Widget) parent)), widget);
- UserData.bindNameContext((Widget) widget, nameScoped);
- }
-
- // set first data context and resource dictionary
- setDataContext(metaclass, targetObject, dico, dataContext);
- if (bindingContext != null) {
- setBindingContext(metaclass, targetObject, dico, bindingContext);
- }
-
- if (dataBindingTrack != null) {
- dataBindingTrack.tracking(targetObject, element, dataContext);
- }
-
- // set parent relationship and viewer
- if (targetObject instanceof Widget) {
- if (parent != null) {
- UserData.setParent(targetObject, parent);
- }
- } else if (JFacesHelper.isViewer(targetObject)) {
- UserData.setParent(targetObject, parent);
- UserData.setViewer(targetObject, targetObject);
- } else if (targetObject instanceof TableItemProperty.Cell) {
- ((TableItemProperty.Cell) targetObject)
- .setParent((TableItem) parent);
- }
-
- applyStyles(element, targetObject);
-
- for (Map.Entry<String, Object> entry : options.entrySet()) {
- String key = entry.getKey();
- if (IXWTLoader.Utilities.isPropertyName(key)) {
- continue;
- }
- IProperty property = metaclass.findProperty(key);
- if (property == null) {
- throw new XWTException("Property " + key + " not found.");
- }
- property.setValue(targetObject, entry.getValue());
- }
-
- Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
- init(metaclass, targetObject, element, delayedAttributes);
- if (targetObject instanceof Style && element.getChildren().length > 0) {
- Collection<Setter> setters = new ArrayList<Setter>();
- for (DocumentObject doc : element.getChildren()) {
- Object child = doCreate(targetObject, (Element) doc, null,
- Collections.EMPTY_MAP);
- if (!(child instanceof Setter)) {
- throw new XWTException("Setter is expected in Style.");
- }
- setters.add((Setter) child);
- }
- ((Style) targetObject).setSetters(setters
- .toArray(new Setter[setters.size()]));
- } else if (targetObject instanceof ControlEditor) {
- for (DocumentObject doc : element.getChildren()) {
- Object editor = doCreate(parent, (Element) doc, null,
- Collections.EMPTY_MAP);
- if (editor != null && editor instanceof Control) {
- ((ControlEditor) targetObject).setEditor((Control) editor);
- ((Control) editor).setData(
- PropertiesConstants.DATA_CONTROLEDITOR_OF_CONTROL,
- targetObject);
- }
- }
- } else if (targetObject instanceof IDataProvider) {
- for (DocumentObject doc : element.getChildren()) {
- if (IConstants.XWT_X_NAMESPACE.equals(doc.getNamespace())) {
- String content = doc.getContent();
- if (content != null) {
- ((IDataProvider) targetObject).setProperty(
- doc.getName(), content);
- }
- }
- }
- } else {
- for (DocumentObject doc : element.getChildren()) {
- doCreate(targetObject, (Element) doc, null,
- Collections.EMPTY_MAP);
- }
- }
-
- iniDelayedAttribute(metaclass, targetObject, element, null,
- delayedAttributes);
-
- postCreation(targetObject);
- popStack();
- return targetObject;
- }
-
- protected void iniDelayedAttribute(IMetaclass metaclass,
- Object targetObject, Element element, String namespace,
- Map<String, IProperty> delayedAttributes) throws Exception {
- Set<String> keys = delayedAttributes.keySet();
- while (!keys.isEmpty()) {
- for (String delayed : keys.toArray(new String[keys.size()])) {
- IProperty property = delayedAttributes.get(delayed);
- boolean hasDependency = false;
- IProperty[] dependencies = property.getLoadingType()
- .getDependencies();
- if (dependencies.length > 0) {
- for (IProperty dependency : dependencies) {
- if (delayedAttributes.containsValue(dependency)) {
- hasDependency = true;
- break;
- }
- }
- }
- if (!hasDependency) {
- initAttribute(metaclass, targetObject, element, null,
- delayed);
- keys.remove(delayed);
- }
- }
- }
- }
-
- /**
- * This method is invoked directly after creation of component instance, but
- * before applying its attributes and creating children.
- *
- * @param element
- * the source element in XML.
- * @param targetObject
- * the created visual object.
- */
- protected void postCreation0(Element element, Object targetObject) {
- }
-
- private void invokeCreatededAction(Element element, Object targetObject) {
- if (targetObject != null) {
- postCreation0(element, targetObject);
- }
- if (options != null) {
- ICreatedCallback createdAction = (ICreatedCallback) options
- .get(IXWTLoader.CREATED_CALLBACK);
- if (createdAction != null) {
- createdAction.onCreated(targetObject);
- }
- }
- }
-
- /**
- * This method is invoked after full creation of component, i.e. after
- * creating its instance, applying its attributes and creating children.
- */
- protected void postCreation(Object target) {
- }
-
- protected void setDataContext(IMetaclass metaclass, Object targetObject,
- ResourceDictionary dico, Object dataContext)
- throws IllegalAccessException, InvocationTargetException,
- NoSuchFieldException {
- Object control = null;
- IMetaclass widgetMetaclass = metaclass;
- if (JFacesHelper.isViewer(targetObject)) {
- Widget widget = JFacesHelper.getControl(targetObject);
- widgetMetaclass = loader.getMetaclass(widget.getClass());
- control = targetObject;
- } else if (targetObject instanceof Widget) {
- control = (Widget) targetObject;
- } else {
- control = loadData.getCurrentWidget();
- }
- if (control != null) {
- if (targetObject instanceof IDynamicBinding) {
- IDynamicBinding dynamicBinding = (IDynamicBinding) targetObject;
- dynamicBinding.setControl(control);
- dynamicBinding.setHost(loadData.getHost());
- }
- if (dico != null) {
- UserData.setResources(control, dico);
- }
- if (dataContext != null) {
- IProperty property = widgetMetaclass
- .findProperty(IConstants.XAML_DATA_CONTEXT);
- if (property != null) {
- property.setValue(UserData.getWidget(control), dataContext);
- } else {
- throw new XWTException("DataContext is missing in "
- + widgetMetaclass.getType().getName());
- }
- }
- }
- }
-
- protected void setBindingContext(IMetaclass metaclass, Object targetObject,
- ResourceDictionary dico, Object bindingContext)
- throws IllegalAccessException, InvocationTargetException,
- NoSuchFieldException {
- Object control = null;
- IMetaclass widgetMetaclass = metaclass;
- if (JFacesHelper.isViewer(targetObject)) {
- Widget widget = JFacesHelper.getControl(targetObject);
- widgetMetaclass = loader.getMetaclass(widget.getClass());
- control = targetObject;
- } else if (targetObject instanceof Widget) {
- control = (Widget) targetObject;
- } else {
- control = loadData.getCurrentWidget();
- }
- if (control != null) {
- if (targetObject instanceof IDynamicBinding) {
- IDynamicBinding dynamicBinding = (IDynamicBinding) targetObject;
- dynamicBinding.setControl(control);
- dynamicBinding.setHost(loadData.getHost());
- }
- if (dico != null) {
- UserData.setResources(control, dico);
- }
- if (bindingContext != null) {
- IProperty property = widgetMetaclass
- .findProperty(IConstants.XAML_BINDING_CONTEXT);
- if (property != null) {
- property.setValue(UserData.getWidget(control),
- bindingContext);
- } else {
- throw new XWTException("DataContext is missing in "
- + widgetMetaclass.getType().getName());
- }
- }
- }
- }
-
- protected void applyStyles(Element element, Object targetObject)
- throws Exception {
- if (targetObject instanceof Widget) {
- Widget widget = (Widget) targetObject;
- Map<String, Object> dico = UserData.getLocalResources(widget);
- Attribute attribute = element
- .getAttribute(IConstants.XAML_RESOURCES);
- if (attribute == null) {
- attribute = element.getAttribute(IConstants.XWT_NAMESPACE,
- IConstants.XAML_RESOURCES);
- }
- if (attribute != null) {
- if (attribute.getChildren().length > 0) {
- if (dico == null) {
- dico = new ResourceDictionary();
- UserData.setResources(widget, dico);
- }
-
- for (DocumentObject doc : attribute.getChildren()) {
- Element elem = (Element) doc;
- Object doCreate = doCreate(widget, elem, null,
- EMPTY_MAP);
- Attribute keyAttribute = elem.getAttribute(
- IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_KEY);
- if (keyAttribute == null) {
- keyAttribute = elem.getAttribute(
- IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_TYPE);
- }
- if (keyAttribute != null) {
- dico.put(keyAttribute.getContent(), doCreate);
- }
- if (doCreate instanceof IStyle) {
- IStyle style = (IStyle) doCreate;
- loadData.addStyle(style);
- }
- }
- }
- }
-
- // apply the styles defined in parent's resources via TargetType
- Widget current = widget;
- while (current != null) {
- dico = UserData.getLocalResources(current);
- if (dico != null) {
- for (Object value : dico.values()) {
- if (value instanceof Style) {
- Style style = (Style) value;
- Class<?> targetType = style.getTargetType();
- if (targetType != null
- && targetType.isInstance(widget)) {
- style.apply(targetObject);
- }
- }
- }
- }
- current = UserData.getTreeParent(current);
- }
- }
-
- for (IStyle style : loadData.getStyles()) {
- style.applyStyle(targetObject);
- }
- }
-
- protected int getColumnIndex(Element columnElement) {
- String name = columnElement.getName();
- String namespace = columnElement.getNamespace();
- IMetaclass metaclass = loader.getMetaclass(name, namespace);
- int index = -1;
- Class<?> type = metaclass.getType();
- if (TableViewerColumn.class.isAssignableFrom(type)) {
- DocumentObject parent = columnElement.getParent();
- List<DocumentObject> children = DocumentObjectSorter.sortWithAttr(
- parent.getChildren(), "Index");
- index = children.indexOf(columnElement);
- }
-
- return index;
- }
-
- /**
- * @param tableItem
- */
- protected void installTableEditors(TableItem tableItem) {
- Table table = tableItem.getParent();
- TableColumn[] columns = table.getColumns();
- if (columns == null || columns.length == 0) {
- return;
- }
- for (TableColumn tableColumn : columns) {
- Object data = tableColumn
- .getData(PropertiesConstants.DATA_DEFINED_EDITOR);
- if (data == null || !(data instanceof Element)) {
- continue;
- }
- int column = table.indexOf(tableColumn);
- Element editor = (Element) data;
- try {
- TableEditor tableEditor = (TableEditor) doCreate(table, editor,
- null, EMPTY_MAP);
- if (tableEditor != null) {
- tableEditor.setColumn(column);
- tableEditor.setItem(tableItem);
- }
- } catch (Exception e) {
- continue;
- }
- }
- }
-
- protected Object getDataContext(Element element, Widget swtObject) {
- // x:DataContext
- try {
- Object dataContext = loadData.getDataContext();
- if (dataContext != null) {
- return dataContext;
- }
- {
- Attribute dataContextAttribute = element
- .getAttribute(IConstants.XAML_DATA_CONTEXT);
- if (dataContextAttribute != null) {
- Widget composite = (Widget) swtObject;
- DocumentObject documentObject = dataContextAttribute
- .getChildren()[0];
- if (IConstants.XAML_STATICRESOURCES.equals(documentObject
- .getName())
- || IConstants.XAML_DYNAMICRESOURCES
- .equals(documentObject.getName())) {
- String key = documentObject.getContent();
- dataContext = new StaticResourceBinding(composite, key);
- loadData.setDataContext(dataContext);
- return dataContext;
- } else if (IConstants.XAML_BINDING.equals(documentObject
- .getName())) {
- dataContext = doCreate(swtObject,
- (Element) documentObject, null, EMPTY_MAP);
- loadData.setDataContext(dataContext);
- return dataContext;
- } else {
- LoggerManager.log(new UnsupportedOperationException(
- documentObject.getName()));
- }
- }
- }
- } catch (Exception e) {
- LoggerManager.log(e);
- }
-
- return null;
- }
-
- protected Object getBindingContext(Element element, Widget swtObject) {
- // x:DataContext
- try {
- {
- Attribute dataContextAttribute = element
- .getAttribute(IConstants.XAML_BINDING_CONTEXT);
- if (dataContextAttribute != null) {
- Widget composite = (Widget) swtObject;
- DocumentObject documentObject = dataContextAttribute
- .getChildren()[0];
- if (IConstants.XAML_STATICRESOURCES.equals(documentObject
- .getName())
- || IConstants.XAML_DYNAMICRESOURCES
- .equals(documentObject.getName())) {
- String key = documentObject.getContent();
- return new StaticResourceBinding(composite, key);
- } else if (IConstants.XAML_BINDING.equals(documentObject
- .getName())) {
- return doCreate(swtObject, (Element) documentObject,
- null, EMPTY_MAP);
- } else {
- LoggerManager.log(new UnsupportedOperationException(
- documentObject.getName()));
- }
- }
- }
- } catch (Exception e) {
- LoggerManager.log(e);
- }
-
- return null;
- }
-
- protected void pushStack(Object host) {
- loadData = new LoadingData(loadData, host);
- }
-
- protected void popStack() {
- LoadingData previous = loadData;
- loadData = previous.getParent();
-
- previous.end();
- }
-
- protected Integer getStyleValue(Element element, int styles) {
- Attribute attribute = element.getAttribute(IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_STYLE);
- if (attribute == null) {
- if (styles != -1) {
- return styles;
- }
- return null;
- }
- if (styles == -1) {
- return (Integer) loader.findConvertor(String.class, Integer.class)
- .convert(attribute.getContent());
- }
- return styles
- | (Integer) loader.findConvertor(String.class, Integer.class)
- .convert(attribute.getContent());
- }
-
- protected void init(IMetaclass metaclass, Object targetObject,
- Element element, Map<String, IProperty> delayedAttributes)
- throws Exception {
- // editors for TableItem,
- if (targetObject instanceof TableItem) {
- installTableEditors((TableItem) targetObject);
- }
-
- // x:DataContext
- if (loadData.getDataContext() == null) {
- Attribute dataContextAttribute = element
- .getAttribute(IConstants.XAML_DATA_CONTEXT);
- if (dataContextAttribute != null) {
- IProperty property = metaclass
- .findProperty(IConstants.XAML_DATA_CONTEXT);
- Widget composite = (Widget) UserData.getWidget(targetObject);
- DocumentObject documentObject = dataContextAttribute
- .getChildren()[0];
- if (IConstants.XAML_STATICRESOURCES.equals(documentObject
- .getName())
- || IConstants.XAML_DYNAMICRESOURCES
- .equals(documentObject.getName())) {
- String key = documentObject.getContent();
- property.setValue(composite, new StaticResourceBinding(
- composite, key));
- } else if (IConstants.XAML_BINDING.equals(documentObject
- .getName())) {
- Object object = doCreate(targetObject,
- (Element) documentObject, null, EMPTY_MAP);
- property.setValue(composite, object);
- } else {
- LoggerManager.log(new UnsupportedOperationException(
- documentObject.getName()));
- }
- }
- }
-
- HashSet<String> done = new HashSet<String>();
-
- Attribute nameAttr = element.getAttribute(IConstants.XAML_X_NAME);
- if (nameAttr == null) {
- nameAttr = element.getAttribute(IConstants.XWT_X_NAMESPACE,
- IConstants.XAML_X_NAME);
- }
- if (nameAttr != null && UserData.getWidget(targetObject) != null) {
- String value = nameAttr.getContent();
- loadData.inject(targetObject, value);
-
- nameScoped.addNamedObject(value, targetObject);
- UserData.setElementName(targetObject, value, false);
- done.add(IConstants.XAML_X_NAME);
- }
-
- for (String attrName : element.attributeNames()) {
- IProperty property = metaclass.findProperty(attrName);
-
- if (property == null) {
- IMetaclass mc = XWT.getMetaclass(targetObject);
- property = mc.findProperty(attrName);
-
- if (property != null) {
- metaclass = mc;
- }
- }
-
- if (IConstants.XWT_X_NAMESPACE.equals(element
- .getAttribute(attrName).getNamespace())) {
- continue;
- } else if (delayedAttributes != null
- && property != null
- && property.getLoadingType().getValueLoading() != IValueLoading.Normal)
- delayedAttributes.put(attrName, property);
- else {
- if (!done.contains(attrName)) {
- initAttribute(metaclass, targetObject, element, null,
- attrName);
- done.add(attrName);
- }
- }
- }
-
- for (String namespace : element.attributeNamespaces()) {
- if (IConstants.XWT_X_NAMESPACE.equals(namespace)) {
- for (String attrName : element.attributeNames(namespace)) {
- if ("class".equalsIgnoreCase(attrName)
- || IConstants.XAML_STYLE.equalsIgnoreCase(attrName)) {
- continue; // done before
- } else if (IConstants.XAML_X_NAME
- .equalsIgnoreCase(attrName)) {
- nameScoped.addNamedObject(
- element.getAttribute(namespace, attrName)
- .getContent(), targetObject);
- done.add(attrName);
- } else if (IConstants.XAML_DATA_CONTEXT
- .equalsIgnoreCase(attrName)) {
- continue; // done before
- } else if (IConstants.XAML_X_ARRAY
- .equalsIgnoreCase(attrName)) {
- IProperty property = metaclass.findProperty(attrName);
- Class<?> type = property.getType();
- Object value = getArrayProperty(type, targetObject,
- element, attrName);
- if (value != null) {
- property.setValue(targetObject, value);
- }
- } else if (IConstants.XAML_RESOURCES
- .equalsIgnoreCase(attrName)) {
- continue;
- } else {
- if (!done.contains(attrName)) {
- initAttribute(metaclass, targetObject, element,
- namespace, attrName);
- done.add(attrName);
- }
- }
- }
- continue;
- }
-
- for (String attrName : element.attributeNames(namespace)) {
- if (IConstants.XAML_X_NAME.equalsIgnoreCase(attrName)
- && (targetObject instanceof Widget)) {
- continue;
- }
- if (!done.contains(attrName)) {
- initAttribute(metaclass, targetObject, element, namespace,
- attrName);
- done.add(attrName);
- }
- }
- }
- for (String attrName : element.attributeNames()) {
- if (IConstants.XAML_X_NAME.equalsIgnoreCase(attrName)
- && UserData.getWidget(targetObject) != null) {
- continue;
- }
- if (!done.contains(attrName)
- && !delayedAttributes.containsKey(attrName)) {
- initAttribute(metaclass, targetObject, element, null, attrName);
- done.add(attrName);
- }
- }
-
- //
- // handle foreigner namespace
- //
- for (String namespace : element.attributeNamespaces()) {
- if (XWT.isXWTNamespace(namespace)) {
- continue;
- }
- INamespaceHandler namespaceHandler = loader
- .getNamespaceHandler(namespace);
- if (namespaceHandler != null) {
- for (String attrName : element.attributeNames(namespace)) {
- Attribute attribute = element.getAttribute(namespace,
- attrName);
- Widget widget = UserData.getWidget(loadData
- .getCurrentWidget());
- namespaceHandler.handleAttribute(widget, targetObject,
- attrName, attribute.getContent());
- }
- }
- }
- }
-
- protected Object getArrayProperty(Class<?> type, Object swtObject,
- DocumentObject docObject, String attrName)
- throws IllegalAccessException, InvocationTargetException,
- NoSuchFieldException {
- Class<?> arrayType = null;
- if (type == Object.class) {
- if (docObject instanceof Element) {
- Element element = (Element) docObject;
- Attribute attribute = element.getAttribute(IConstants.XWT_NAMESPACE, IConstants.XAML_X_TYPE);
- if (attribute == null) {
- throw new XWTException("The type attribute is missing in the element x:Array.");
- }
- String value = attribute.getContent();
- IMetaclass metaclass = XWT.getMetaclass(value, attribute.getNamespace());
- if (metaclass == null) {
- throw new XWTException("The type \"" + value + "\" is not found.");
- }
- arrayType = metaclass.getType();
- }
- }
- else {
- if (!type.isArray()) {
- throw new XWTException("Type mismatch: property " + attrName
- + " isn't an array.");
- }
- arrayType = type.getComponentType();
- }
- if (arrayType != null) {
- List<Object> list = new ArrayList<Object>();
- for (DocumentObject childModel : docObject.getChildren()) {
- if (!(childModel instanceof Element)) {
- continue;
- }
- Object child = createInstance(swtObject, (Element) childModel);
- list.add(child);
- }
- Object[] array = (Object[]) Array.newInstance(arrayType,
- list.size());
- list.toArray(array);
-
- for (int i = 0; i < array.length; i++) {
- if (array[i] instanceof IIndexedElement) {
- ((IIndexedElement) array[i]).setIndex(swtObject, i);
- }
- }
- return array;
- }
- return null;
- }
-
- @SuppressWarnings("unchecked")
- protected Object getCollectionProperty(Class<?> type, Object swtObject,
- DocumentObject element, String attrName)
- throws IllegalAccessException, InvocationTargetException,
- NoSuchFieldException {
- Collection<Object> collector = null;
- if (type.isInterface()) {
- collector = new ArrayList<Object>();
- } else {
- if (Modifier.isAbstract(type.getModifiers())) {
- LoggerManager.log(new XWTException("Collection "
- + type.getSimpleName() + " is abstract type"));
- }
- try {
- collector = (Collection) type.newInstance();
- } catch (InstantiationException e) {
- LoggerManager.log(new XWTException(e));
- }
- }
-
- for (DocumentObject childModel : element.getChildren()) {
- if (!(childModel instanceof Element)) {
- continue;
- }
- Object child = createInstance(swtObject, (Element) childModel);
- collector.add(child);
- if (child instanceof IIndexedElement) {
- ((IIndexedElement) child).setIndex(swtObject,
- collector.size() - 1);
- }
- }
- return collector;
- }
-
- protected String findNamespace(DocumentObject context, String prefix) {
- while (context != null && !(context instanceof Element)) {
- context = context.getParent();
- }
- if (context == null) {
- return null;
- }
- Element element = (Element) context;
-
- if (prefix != null) {
- prefix = (prefix.length() == 0 ? null : prefix);
- }
-
- String namespace = element.getXmlns(prefix);
- if (namespace != null) {
- return namespace;
- }
- DocumentObject parent = element.getParent();
- return findNamespace(parent, prefix);
- }
-
- protected Object createInstance(Object swtObject, Element element) {
- String name = element.getName();
- String namespace = element.getNamespace();
- if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)
- && IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
- return null;
- }
- try {
- Class<?> type = NamespaceHelper.loadCLRClass(
- context.getLoadingContext(), name, namespace);
- IMetaclass metaclass = loader.getMetaclass(name, namespace);
- if (type == null) {
- if (metaclass != null)
- type = metaclass.getType();
- }
- if (metaclass == null) {
- throw new XWTException("Class for " + name + " is not found.");
- }
- // type = expected type;
- // Need to support the
- String content = element.getContent();
- Object instance = null;
- if (content == null) {
- instance = metaclass.newInstance(new Object[] { swtObject });
- invokeCreatededAction(element, instance);
- if (instance instanceof TableEditor) {
- // TODO should be moved into IMetaclass
- TableEditor tableEditor = (TableEditor) instance;
- if (swtObject instanceof TableItem) {
- TableItem item = (TableItem) swtObject;
- tableEditor.setItem(item);
- for (DocumentObject doc : element.getChildren()) {
- Control control = (Control) doCreate(
- ((TableItem) swtObject).getParent(),
- (Element) doc, null, EMPTY_MAP);
- tableEditor.setEditor(control);
- int column = getColumnValue(element);
- TableEditorHelper.initEditor(item, control, column);
- }
- }
- }
- } else {
- Constructor<?> constructor = type.getConstructor(type);
- if (constructor != null) {
- instance = constructor.newInstance(loader.convertFrom(type,
- content));
- invokeCreatededAction(element, instance);
- } else {
- LoggerManager.log(new XWTException("Constructor \"" + name
- + "(" + type.getSimpleName() + ")\" is not found"));
- }
- }
- Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
- init(metaclass, instance, element, delayedAttributes);
- iniDelayedAttribute(metaclass, instance, element, null,
- delayedAttributes);
-
- for (DocumentObject doc : element.getChildren()) {
- doCreate(instance, (Element) doc, null, Collections.EMPTY_MAP);
- }
- return instance;
- } catch (Exception e) {
- LoggerManager.log(e);
- }
- return null;
- }
-
- static protected int getColumnValue(Element context) {
- Attribute attribute = context.getAttribute(COLUMN);
- if (attribute != null) {
- String content = attribute.getContent();
- if (content != null) {
- return Integer.parseInt(content);
- }
- }
- return 0;
- }
-
- protected void loadShellCLR(String className, Shell shell) {
- Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
- className);
- try {
- Object instance = type.newInstance();
- loadData.setClr(instance);
- UserData.setCLR(shell, instance);
- } catch (Exception e) {
- LoggerManager.log(e);
- }
- }
-
- protected Object loadFactoryCLR(String value, ICLRFactory factory) {
- String token;
- String arg;
- if (value.startsWith("+")) {
- if (factory == null) {
- throw new XWTException("ICLRFactory option is missing.");
- }
- arg = value.substring(1).trim();
- return factory.createCLR(arg, options);
- } else {
- StringTokenizer stringTokenizer = new StringTokenizer(value);
- if (!stringTokenizer.hasMoreTokens()) {
- throw new XWTException("x:ClassFactory is empty");
- }
- token = stringTokenizer.nextToken();
- arg = value.substring(token.length()).trim();
- }
- int index = token.lastIndexOf('.');
- if (index != -1) {
- String memberName = token.substring(index + 1);
- String typeName = token.substring(0, index);
- Class<?> type = ClassLoaderUtil.loadClass(
- context.getLoadingContext(), typeName);
- if (type != null) {
- Object member = ClassLoaderUtil.loadMember(
- context.getLoadingContext(), type, memberName, false);
- if (member instanceof ICLRFactory) {
- factory = (ICLRFactory) member;
- }
- if (factory != null) {
- return factory.createCLR(arg, options);
- }
- }
- }
- Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
- token);
- if (type != null && ICLRFactory.class.isAssignableFrom(type)) {
- try {
- ICLRFactory localFactory = (ICLRFactory) type.newInstance();
- return localFactory.createCLR(arg, options);
- } catch (Exception e) {
- throw new XWTException(e);
- }
- }
- throw new XWTException(value + " ClassFactory not found.");
- }
-
- protected Object loadCLR(String className, Object[] parameters,
- Class<?> currentTagType, Map<String, Object> options) {
- Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
- className);
- if (type == null) {
- return null;
- }
- try {
- Object clr = options.get(XWTLoader.CLASS_PROPERTY);
- if (clr != null && type.isInstance(clr)) {
- loadData.setClr(clr);
- if (clr instanceof Widget) {
- UserData.setCLR((Widget) clr, clr);
- }
- } else if (currentTagType != null
- && currentTagType.isAssignableFrom(type)) {
- IMetaclass metaclass = loader.getMetaclass(type);
- Object instance = metaclass.newInstance(parameters);
- loadData.setClr(instance);
- // use x:Class's instance
- if (instance instanceof Widget) {
- UserData.setCLR((Widget) instance, instance);
- }
- return instance;
- } else {
- Object instance = type.newInstance();
- loadData.setClr(instance);
- if (instance instanceof Widget) {
- UserData.setCLR((Widget) instance, instance);
- }
- }
- } catch (Exception e) {
- LoggerManager.log(e);
- }
- return null;
- }
-
- protected void initAttribute(IMetaclass metaclass, Object targetObject,
- Element element, String namespace, String attrName)
- throws Exception {
- if (attrName.indexOf('.') != -1) {
- String[] segments = attrName.split("\\.");
- IMetaclass currentMetaclass = metaclass;
- Object target = targetObject;
- for (int i = 0; i < segments.length - 1; i++) {
- IProperty property = currentMetaclass.findProperty(segments[i]);
- if (property != null) {
- target = property.getValue(target);
- if (target == null) {
- LoggerManager.log(new XWTException("Property \""
- + segments[i] + "\" is null."));
- }
- currentMetaclass = loader.getMetaclass(target);
- } else {
- LoggerManager.log(new XWTException("Property \""
- + segments[i] + "\" not found in "
- + element.getName() + "."));
- }
- }
- initSegmentAttribute(currentMetaclass,
- segments[segments.length - 1], target, element, namespace,
- attrName);
- return;
- }
- initSegmentAttribute(metaclass, attrName, targetObject, element,
- namespace, attrName);
- }
-
- protected void addCommandExecuteListener(String commandName,
- final Widget targetButton) {
- final ICommand commandObj = loader.getCommand(commandName);
- if (commandObj != null) {
- targetButton.addListener(SWT.Selection, new Listener() {
- public void handleEvent(Event event) {
- commandObj.execute(targetButton);
- }
- });
- }
- }
-
- protected void initSegmentAttribute(IMetaclass metaclass,
- String propertyName, Object target, Element element,
- String namespace, String attrName) throws Exception {
- Attribute attribute = namespace == null ? element
- .getAttribute(attrName) : element.getAttribute(namespace,
- attrName);
- if (attribute == null) {
- attribute = element.getAttribute(attrName);
- }
- IProperty property = null;
- boolean isAttached = false;
- {
- String namePrefix = attribute.getNamePrefix();
- if (namePrefix == null) {
- property = metaclass.findProperty(propertyName);
- } else {
- //
- IMetaclass metaclassAttached = loader.getMetaclass(namePrefix,
- attribute.getNamespace());
- if (metaclassAttached != null) {
- property = metaclassAttached.findProperty(propertyName);
- isAttached = true;
- } else {
- LoggerManager.log(attribute.getNamespace() + " -> "
- + namePrefix + " is not found.");
- return;
- }
- }
- }
-
- if (propertyName.equals(IConstants.XAML_DATA_CONTEXT)) {
- property = null;
- }
- if (IConstants.XAML_COMMAND.equalsIgnoreCase(propertyName)
- && ICommand.class.isAssignableFrom(property.getType())
- && (target instanceof Widget)) {
- addCommandExecuteListener(attribute.getContent(), (Widget) target);
- }
- if (property == null) {
- if (options.get(IXWTLoader.DESIGN_MODE_PROPERTY) == Boolean.TRUE) {
- return;
- }
- // prepare event
- IEvent event = metaclass.findEvent(attrName);
- if (event == null) {
- return;
- }
- // add events for controls and items.
- if (!(target instanceof Widget)) {
- return;
- }
- loadData.updateEvent(context, (Widget) target, event,
- attribute.getContent());
- return;
- }
-
- String contentValue = attribute.getContent();
- if ("MenuItem".equalsIgnoreCase(element.getName())
- && "Text".equalsIgnoreCase(attrName)) {
- Attribute attributeAccelerator = element
- .getAttribute("Accelerator");
- if (attributeAccelerator != null) {
- contentValue = contentValue + '\t'
- + getContentValue(attributeAccelerator.getContent());
- }
- }
-
- if (contentValue != null && "Accelerator".equalsIgnoreCase(attrName)) {
- contentValue = XWTMaps.getCombAccelerator(contentValue);
- if (contentValue.contains("'")) {
- contentValue = removeSubString(contentValue, "'");
- }
- }
- if (contentValue != null
- && loader.isFileResolveType(property.getType())) {
- contentValue = getImagePath(contentValue);
- }
- // if (contentValue != null
- // && (URL.class.isAssignableFrom(property.getType()))) {
- // contentValue = getSourceURL(contentValue);
- // }
- Object value = null;
- DocumentObject[] children = attribute.getChildren();
- boolean usingExistingValue = false;
- if (contentValue == null) {
- Class<?> type = property.getType();
- if (Collection.class.isAssignableFrom(type)) {
- value = getCollectionProperty(type, target, attribute, attrName);
- } else {
- Object directTarget = null;
- if (TableViewerColumn.class.isAssignableFrom(type)
- && attrName.equalsIgnoreCase("columns")) {
- children = DocumentObjectSorter.sortWithAttr(children,
- "Index").toArray(
- new DocumentObject[children.length]);
- } else {
- try {
- Object propertyValue = property.getValue(target);
- if (UserData.getWidget(propertyValue) != null) {
- directTarget = propertyValue;
- // use the existing property value as parent,
- // not need to add the constraint
- if (!property.isValueAsParent()) {
- if (isChildTypeCompatible(attribute, type)) {
- directTarget = null;
- } else {
- type = null;
- usingExistingValue = true;
- }
- }
- }
- } catch (Exception e) {
- }
- }
- if (directTarget == null) {
- directTarget = target;
- }
-
- for (DocumentObject child : children) {
- String name = child.getName();
- String ns = child.getNamespace();
- if (name.equalsIgnoreCase(IConstants.XAML_X_STATIC)
- && ns.equals(IConstants.XWT_X_NAMESPACE)) {
- value = getStaticValue(child);
- } else if (name
- .equalsIgnoreCase(IConstants.XAML_STATICRESOURCES)
- && ns.equals(IConstants.XWT_NAMESPACE)) {
- String key = child.getContent();
- value = new StaticResourceBinding(
- loadData.getCurrentWidget(), key);
- } else if ((IConstants.XWT_X_NAMESPACE.equals(ns) && IConstants.XAML_X_ARRAY
- .equalsIgnoreCase(name))) {
- value = getArrayProperty(property.getType(),
- directTarget, child, name);
- } else if (property.getType().isArray()) {
- value = getArrayProperty(property.getType(),
- directTarget, attribute, name);
- break;
- } else if (isAssignableFrom(element, TableColumn.class)
- && isAssignableFrom(child, TableEditor.class)) {
- value = child;
- } else if (TableViewerColumn.class
- .isAssignableFrom(property.getType())
- && attribute.getContent() != null) {
- value = attribute.getContent();
- } else {
- if ("Null".equals(child.getName())
- && IConstants.XWT_X_NAMESPACE.equals(child
- .getNamespace())) {
- property.setValue(directTarget, null);
- return;
- } else {
- value = doCreate(directTarget, (Element) child,
- type, EMPTY_MAP);
- if (value == null
- && type != null
- && !(type == Table.class
- && "TableColumn".equals(child
- .getName()) && Table.class
- .isInstance(directTarget))) {
- throw new XWTException(child.getName()
- + " cannot be a content of "
- + type.getName() + " "
- + target.getClass().getName() + "."
- + property.getName());
- }
- if (value instanceof IDynamicBinding) {
- ((IDynamicBinding) value).setType(attrName);
- }
- }
- }
- }
- }
- }
- if (contentValue != null && value == null
- && !IConstants.XAML_COMMAND.equalsIgnoreCase(propertyName)) {
- if (property.getType().isInstance(Class.class)) {
- int index = contentValue.lastIndexOf(':');
- if (index != -1) {
- String prefix = contentValue.substring(0, index);
- contentValue = findNamespace(attribute, prefix)
- + contentValue.substring(index);
- }
- }
- value = loader.convertFrom(property.getType(), contentValue);
- }
- if (!usingExistingValue) {
- if (value != null) {
- Class<?> propertyType = property.getType();
- if (!propertyType.isAssignableFrom(value.getClass())
- || (value instanceof IBinding && !(IBinding.class
- .isAssignableFrom(propertyType)))) {
- Object orginalValue = value;
- IConverter converter = loader.findConvertor(
- value.getClass(), propertyType);
- if (converter != null) {
- value = converter.convert(value);
- if (value != null
- && orginalValue instanceof IBinding
- && !propertyType.isAssignableFrom(value
- .getClass())) {
- converter = loader.findConvertor(value.getClass(),
- propertyType);
- if (converter != null) {
- value = converter.convert(value);
- } else {
- LoggerManager.log(new XWTException("Convertor "
- + value.getClass().getSimpleName()
- + "->" + propertyType.getSimpleName()
- + " is not found"));
- }
- }
- } else {
- LoggerManager.log(new XWTException("Convertor "
- + value.getClass().getSimpleName() + "->"
- + propertyType.getSimpleName()
- + " is not found"));
- }
- }
- if (isAttached) {
- UserData.setLocalData(target, property, value);
- } else {
- if (value instanceof IDynamicValueBinding) {
- IDynamicValueBinding dynamicValueBinding = (IDynamicValueBinding) value;
- dynamicValueBinding.setControl(loadData
- .findElement(Widget.class));
- dynamicValueBinding.setProperty(property);
- dynamicValueBinding.setObject(target);
- }
- property.setValue(target, value);
- }
- } else {
- if (value == null) {
- value = property.getValue(target);
- }
- if (value != null) {
- // create children.
- for (DocumentObject child : children) {
- String name = child.getName();
- String ns = child.getNamespace();
- if (!IConstants.XWT_X_NAMESPACE.equals(ns)
- || !IConstants.XAML_X_ARRAY
- .equalsIgnoreCase(name)) {
- Class<?> type = property.getType();
- if (!Collection.class.isAssignableFrom(type)) {
- doCreate(value, (Element) child, null,
- EMPTY_MAP);
- }
- }
- }
- }
- }
- }
-
- if (attribute.attributeNames(IConstants.XWT_NAMESPACE).length > 0) {
- IMetaclass propertyMetaclass = loader.getMetaclass(property
- .getType());
- if (value == null) {
- value = property.getValue(target);
- }
- if (value != null) {
- Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
- init(propertyMetaclass, value, attribute, delayedAttributes);
- iniDelayedAttribute(metaclass, target, element, namespace,
- delayedAttributes);
- }
- }
- }
-
- protected boolean isChildTypeCompatible(Attribute attribute, Class<?> type) {
- DocumentObject[] children = attribute.getChildren();
- if (children.length != 1) {
- return false;
- }
- DocumentObject child = children[0];
- if (!(child instanceof Element)) {
- return false;
- }
- Element childElement = (Element) child;
-
- String name = childElement.getName();
- String namespace = childElement.getNamespace();
- IMetaclass metaclass = loader.getMetaclass(name, namespace);
- if (metaclass == null) {
- return false;
- }
- return type.isAssignableFrom(metaclass.getType());
- }
-
- /**
- * @param contentValue
- * @return
- */
- protected String getSourceURL(String contentValue) {
- URL url = null;
- try {
- url = new URL(contentValue);
- } catch (MalformedURLException e) {
- if (!contentValue.startsWith("/")) {
- contentValue = "/" + contentValue;
- }
- ILoadingContext loadingContext = context.getLoadingContext();
- URL resource = loadingContext.getResource(contentValue);
- if (resource == null) {
- try {
- resource = new URL(context.getResourcePath() + contentValue);
- return resource.toString();
- } catch (MalformedURLException e1) {
- }
- } else {
- return resource.toString();
- }
- }
- if (url != null) {
- return url.toString();
- }
- return contentValue;
- }
-
- protected Class<?> getJavaType(DocumentObject element) {
- String name = element.getName();
- String namespace = element.getNamespace();
- if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)
- && IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
- return null;
- }
- IMetaclass metaclass = loader.getMetaclass(name, namespace);
- if (metaclass == null) {
- return null;
- }
- return metaclass.getType();
- }
-
- protected boolean isAssignableFrom(DocumentObject element, Class<?> type) {
- Class<?> targetType = getJavaType(element);
- if (targetType == null) {
- return false;
- }
- return targetType.isAssignableFrom(type);
- }
-
- protected Object getStaticValue(DocumentObject child) {
- DocumentObject[] children = child.getChildren();
- if (children.length == 1) {
- Element element = (Element) children[0];
- if (element != null) {
- return ClassLoaderUtil.loadStaticMember(
- context.getLoadingContext(), element);
- }
- }
- return null;
- }
-
- protected String getImagePath(String contentValue) {
- String value = contentValue;
- try {
- File file = new File(contentValue);
- if (file.exists()) {
- return file.toURI().toURL().toString();
- }
- if (!contentValue.startsWith("/")) {
- URL url = context.getResourcePath();
- if (url != null) {
- return url.toString() + "/" + contentValue;
- }
- contentValue = "/" + contentValue;
- }
- ILoadingContext loadingContext = context.getLoadingContext();
- URL resource = loadingContext.getResource(contentValue);
- if (resource == null) {
- URL resourcePath = context.getResourcePath();
- String fPath = resourcePath.toString();
- String absolutePath = PathHelper.getAbsolutePath(fPath,
- contentValue);
- if ((file = new File(absolutePath)).exists()) {
- return file.toURI().toURL().toString();
- }
- resource = new URL(absolutePath);
- }
- return resource.toString();
- } catch (MalformedURLException e) {
- return value;
- }
- }
-
- protected String removeSubString(String str, String subString) {
- StringBuffer stringBuffer = new StringBuffer();
- int lenOfsource = str.length();
- int i;
- int posStart;
- for (posStart = 0; (i = str.indexOf(subString, posStart)) >= 0; posStart = i
- + subString.length()) {
- stringBuffer.append(str.substring(posStart, i));
- }
- if (posStart < lenOfsource) {
- stringBuffer.append(str.substring(posStart));
- }
- return stringBuffer.toString();
- }
-
- protected String getContentValue(String text) {
- StringBuffer stringBuffer = new StringBuffer();
- String subString = "SWT.";
- String str = XWTMaps.getCombAccelerator(text);
-
- if (str.contains(subString)) {
- str = removeSubString(str, subString);
- }
- if (str.contains("'")) {
- str = removeSubString(str, "'");
- }
- if (str.contains(" ")) {
- str = removeSubString(str, " ");
- }
- if (str.contains("|")) {
- str = str.replace('|', '+');
- }
- stringBuffer.append(str);
- return stringBuffer.toString();
- }
-}
+/*******************************************************************************
+ * 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.javabean;
+
+import java.io.File;
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.databinding.conversion.IConverter;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ControlEditor;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+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.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.xwt.ICLRFactory;
+import org.eclipse.xwt.IConstants;
+import org.eclipse.xwt.IDataProvider;
+import org.eclipse.xwt.IEventHandler;
+import org.eclipse.xwt.IEventInvoker;
+import org.eclipse.xwt.IIndexedElement;
+import org.eclipse.xwt.ILoadingContext;
+import org.eclipse.xwt.INamespaceHandler;
+import org.eclipse.xwt.IStyle;
+import org.eclipse.xwt.IXWTLoader;
+import org.eclipse.xwt.ResourceDictionary;
+import org.eclipse.xwt.Tracking;
+import org.eclipse.xwt.XWT;
+import org.eclipse.xwt.XWTException;
+import org.eclipse.xwt.XWTLoader;
+import org.eclipse.xwt.XWTMaps;
+import org.eclipse.xwt.annotation.UI;
+import org.eclipse.xwt.callback.ICreatedCallback;
+import org.eclipse.xwt.callback.ILoadedCallback;
+import org.eclipse.xwt.core.IBinding;
+import org.eclipse.xwt.core.IDynamicBinding;
+import org.eclipse.xwt.core.IDynamicValueBinding;
+import org.eclipse.xwt.core.IRenderingContext;
+import org.eclipse.xwt.core.IVisualElementLoader;
+import org.eclipse.xwt.core.Setter;
+import org.eclipse.xwt.core.Style;
+import org.eclipse.xwt.core.ValidationStatus;
+import org.eclipse.xwt.input.ICommand;
+import org.eclipse.xwt.internal.core.Binding;
+import org.eclipse.xwt.internal.core.Core;
+import org.eclipse.xwt.internal.core.DataBindingTrack;
+import org.eclipse.xwt.internal.core.IEventController;
+import org.eclipse.xwt.internal.core.ScopeKeeper;
+import org.eclipse.xwt.internal.utils.ClassLoaderUtil;
+import org.eclipse.xwt.internal.utils.DocumentObjectSorter;
+import org.eclipse.xwt.internal.utils.LoggerManager;
+import org.eclipse.xwt.internal.utils.NamespaceHelper;
+import org.eclipse.xwt.internal.utils.ObjectUtil;
+import org.eclipse.xwt.internal.utils.TableEditorHelper;
+import org.eclipse.xwt.internal.utils.UserData;
+import org.eclipse.xwt.internal.xml.Attribute;
+import org.eclipse.xwt.internal.xml.DocumentObject;
+import org.eclipse.xwt.internal.xml.Element;
+import org.eclipse.xwt.javabean.metadata.properties.PropertiesConstants;
+import org.eclipse.xwt.javabean.metadata.properties.TableItemProperty;
+import org.eclipse.xwt.jface.JFacesHelper;
+import org.eclipse.xwt.metadata.IEvent;
+import org.eclipse.xwt.metadata.IMetaclass;
+import org.eclipse.xwt.metadata.IProperty;
+import org.eclipse.xwt.metadata.IValueLoading;
+import org.eclipse.xwt.utils.PathHelper;
+
+/**
+ * @author jliu (jin.liu@soyatec.com)
+ */
+public class ResourceLoader implements IVisualElementLoader {
+ static Map<String, Object> EMPTY_MAP = Collections.EMPTY_MAP;
+
+ static private String VALIDATION_STATUS_CONSTANT = "status";
+
+ static final String RESOURCE_LOADER_PROPERTY = "XWT.ResourceLoader";
+
+ private static final String COLUMN = "Column";
+
+ private Map<String, Object> options;
+
+ private Collection<Binding> bindings;
+
+ private Collection<ValidationStatus> status;
+
+ public Collection<Binding> getBindings() {
+ return bindings;
+ }
+
+ protected ResourceLoader parentLoader;
+ protected IRenderingContext context;
+ protected IXWTLoader loader;
+
+ protected Object scopedObject;
+ protected ScopeKeeper nameScoped;
+ protected LoadingData loadData = new LoadingData();
+
+ protected Event loadedEvent = new Event();
+
+ class LoadingData {
+ protected LoadingData parent;
+ protected Object clr;
+ protected Collection<IStyle> styles = Collections.EMPTY_LIST;
+ private Object currentWidget = null;
+ private Object host = null;
+ private Object dataContext = null;
+
+ public Object getDataContext() {
+ return dataContext;
+ }
+
+ public void setDataContext(Object dataContext) {
+ this.dataContext = dataContext;
+ }
+
+ public Object getHost() {
+ return host;
+ }
+
+ public Object getCurrentWidget() {
+ return currentWidget;
+ }
+
+ public Object findElement(Class<?> type) {
+ if (type.isInstance(currentWidget)) {
+ return currentWidget;
+ }
+ if (parent != null) {
+ return parent.findElement(type);
+ }
+ return null;
+ }
+
+ public void setCurrentWidget(Object currentWidget) {
+ this.currentWidget = currentWidget;
+ }
+
+ public LoadingData getParent() {
+ return parent;
+ }
+
+ public LoadingData() {
+ }
+
+ public LoadingData(LoadingData loadingData, Object host) {
+ this.parent = loadingData;
+ this.styles = loadingData.styles;
+ this.clr = loadingData.clr;
+ this.currentWidget = loadingData.currentWidget;
+ this.dataContext = loadingData.dataContext;
+ this.host = host;
+ }
+
+ public Collection<IStyle> getStyles() {
+ return styles;
+ }
+
+ public void setStyles(Collection<IStyle> styles) {
+ this.styles = styles;
+ }
+
+ public Object getClr() {
+ return clr;
+ }
+
+ public void setClr(Object clr) {
+ this.clr = clr;
+ }
+
+ public void inject(Object targetObject, String name) {
+ doInject(targetObject, name, null);
+ }
+
+ protected void doInject(Object targetObject, String name,
+ Object previousClr) {
+ Class<?> filedType = targetObject.getClass();
+ if (clr != null && (previousClr != clr || previousClr == null)) {
+ for (Field field : clr.getClass().getDeclaredFields()) {
+ UI annotation = field.getAnnotation(UI.class);
+ if (annotation != null) {
+ if (!field.getType().isAssignableFrom(filedType)) {
+ continue;
+ }
+ String annotationValue = annotation.value();
+ if (annotationValue == null
+ || annotationValue.length() == 0) {
+ if (field.getName().equals(name)) {
+ field.setAccessible(true);
+ try {
+ field.set(clr, targetObject);
+ return;
+ } catch (Exception e) {
+ }
+ }
+ } else if (annotationValue.equals(name)) {
+ field.setAccessible(true);
+ try {
+ field.set(clr, targetObject);
+ break;
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+ }
+ if (parent != null) {
+ parent.doInject(targetObject, name, clr);
+ }
+ }
+
+ public void updateEvent(IRenderingContext context, Widget control,
+ IEvent event, String handler) {
+ IEventController eventController = UserData
+ .updateEventController(control);
+ Method method = null;
+ Object clrObject = null;
+ LoadingData current = this;
+ ResourceLoader currentParentLoader = parentLoader;
+ while (current != null) {
+ Object receiver = current.getClr();
+ if (receiver instanceof IEventHandler) {
+ IEventHandler eventManager = (IEventHandler) receiver;
+ IEventInvoker eventInvoker = eventManager.getEventInvoker(
+ handler, control.getClass(), Event.class);
+ if (eventInvoker != null) {
+ eventController.setEvent(event, control, control,
+ eventInvoker);
+ }
+ } else if (receiver != null) {
+ Class<?> clazz = receiver.getClass();
+ method = ObjectUtil.findMethod(clazz, handler,
+ control.getClass(), Event.class);
+ if (method == null) {
+ method = ObjectUtil.findMethod(clazz, handler,
+ Event.class);
+ }
+ if (method == null) {
+ // Load again.
+ clazz = ClassLoaderUtil.loadClass(
+ context.getLoadingContext(), clazz.getName());
+ method = ObjectUtil.findMethod(clazz, handler,
+ Event.class);
+ }
+ if (method == null) {
+ method = ObjectUtil.findMethod(clazz, handler);
+ }
+ if (method != null) {
+ clrObject = receiver;
+ eventController.setEvent(event, control, clrObject,
+ control, method);
+ break;
+ }
+ }
+ current = current.getParent();
+ if (current == null && currentParentLoader != null) {
+ current = currentParentLoader.loadData;
+ currentParentLoader = currentParentLoader.parentLoader;
+ }
+ }
+ if (method == null) {
+ LoggerManager.log(new XWTException("Event handler \"" + handler
+ + "\" is not found."));
+ }
+ }
+
+ public void end() {
+ if (parent == null || clr != parent.getClr()) {
+ Method method = ObjectUtil.findDeclaredMethod(clr.getClass(),
+ "initializeComponent");
+ if (method == null) {
+ method = ObjectUtil.findDeclaredMethod(clr.getClass(),
+ "InitializeComponent");
+ }
+ if (method != null) {
+ try {
+ method.setAccessible(true);
+ method.invoke(clr);
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+ }
+ }
+ }
+
+ public void addStyle(IStyle style) {
+ if (styles == Collections.EMPTY_LIST) {
+ styles = new ArrayList<IStyle>();
+ }
+ styles.add(style);
+ }
+ }
+
+ private DataBindingTrack dataBindingTrack;
+
+ /**
+ * @param context
+ */
+ public ResourceLoader(IRenderingContext context, IXWTLoader loader) {
+ this.context = context;
+ this.loader = loader;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.xwt.IVisualElementLoader#createUIElement(org.eclipse.
+ * e4.xwt.Element, org.eclipse.xwt.ILoadData,
+ * org.eclipse.xwt.IResourceDictionary)
+ */
+ public Object createUIElement(Element element, Map<String, Object> options) {
+ try {
+ this.options = options;
+ Object container = options.get(IXWTLoader.CONTAINER_PROPERTY);
+ Widget parent = UserData.getWidget(container);
+ if (!loader.getTrackings().isEmpty()) {
+ dataBindingTrack = new DataBindingTrack();
+ }
+ parentLoader = (ResourceLoader) options
+ .get(RESOURCE_LOADER_PROPERTY);
+ options.remove(RESOURCE_LOADER_PROPERTY);
+ ResourceDictionary resourceDictionary = (ResourceDictionary) options
+ .get(IXWTLoader.RESOURCE_DICTIONARY_PROPERTY);
+
+ if (resourceDictionary != null) {
+ Object styles = resourceDictionary.get(Core.DEFAULT_STYLES_KEY);
+ if (styles != null) {
+ loadData.setStyles((Collection<IStyle>) styles);
+ resourceDictionary.remove(Core.DEFAULT_STYLES_KEY);
+ }
+ }
+ if (!options.containsKey(IXWTLoader.CLASS_FACTORY_PROPERTY)) {
+ try {
+ options.put(IXWTLoader.CLASS_FACTORY_PROPERTY,
+ loader.getCLRFactory());
+ } catch (UnsupportedOperationException e) {
+ if (options.isEmpty()) {
+ options = new HashMap<String, Object>();
+ options.put(IXWTLoader.CLASS_FACTORY_PROPERTY,
+ loader.getCLRFactory());
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ Object control = doCreate(parent, element, null, options);
+
+ // get databinding messages and print into console view
+ if (dataBindingTrack != null) {
+ String dataBindingMessage = dataBindingTrack
+ .getDataBindMessage();// getDataBindMessage();
+ org.eclipse.xwt.ILogger log = loader.getLogger();
+ log.addMessage(dataBindingMessage, Tracking.DATABINDING);
+ log.printInfo(dataBindingMessage, Tracking.DATABINDING,
+ loader.getTrackings());
+ }
+ if (control instanceof Composite) {
+ ((Composite) control).layout();
+ }
+ ILoadedCallback loadedAction = (ILoadedCallback) options
+ .get(IXWTLoader.LOADED_CALLBACK);
+ if (loadedAction != null) {
+ loadedAction.onLoaded(control);
+ }
+ return control;
+ } catch (Exception e) {
+ if (e instanceof RuntimeException) {
+ throw ((RuntimeException) e);
+ }
+
+ throw new XWTException(e);
+ }
+ }
+
+ protected Object doCreate(Object parent, Element element,
+ Class<?> constraintType, Map<String, Object> options)
+ throws Exception {
+ int styles = -1;
+ if (options.containsKey(IXWTLoader.INIT_STYLE_PROPERTY)) {
+ styles = (Integer) options.get(IXWTLoader.INIT_STYLE_PROPERTY);
+ }
+
+ ResourceDictionary dico = (ResourceDictionary) options
+ .get(IXWTLoader.RESOURCE_DICTIONARY_PROPERTY);
+ Object dataContext = options.get(IXWTLoader.DATACONTEXT_PROPERTY);
+ Object bindingContext = options
+ .get(IXWTLoader.BINDING_CONTEXT_PROPERTY);
+ String name = element.getName();
+ String namespace = element.getNamespace();
+ if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)) {
+ if (IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
+ return null;
+ }
+ if (IConstants.XAML_X_TYPE.equalsIgnoreCase(name)
+ && constraintType != null
+ && constraintType instanceof Class<?>) {
+ DocumentObject[] children = element.getChildren();
+ if (children != null && children.length > 0) {
+ if (children[0] instanceof Element) {
+ Element type = (Element) children[0];
+ IMetaclass metaclass = loader.getMetaclass(
+ type.getName(), type.getNamespace());
+ if (metaclass != null) {
+ return metaclass.getType();
+ }
+ }
+ } else {
+ String content = element.getContent();
+ return loader.convertFrom(Class.class, content);
+ }
+ }
+ return null;
+ }
+ IMetaclass metaclass = loader.getMetaclass(name, namespace);
+ if (constraintType != null
+ && !(IBinding.class.isAssignableFrom(metaclass.getType()))
+ && (!constraintType.isAssignableFrom(metaclass.getType()))) {
+ if (!constraintType.isArray()
+ || !constraintType.getComponentType().isAssignableFrom(
+ metaclass.getType())) {
+ IConverter converter = XWT.findConvertor(metaclass.getType(),
+ constraintType);
+ if (converter == null) {
+ return null;
+ }
+ }
+ }
+ Object targetObject = null;
+ Integer styleValue = getStyleValue(element, styles);
+
+ if (parent == null || metaclass.getType() == Shell.class) {
+ if (dataBindingTrack != null) {
+ dataBindingTrack.addWidgetElement(element);
+ }
+ Shell shell = null;
+ if ((parent == null && metaclass.getType() != Shell.class)
+ || styleValue == null || styleValue == -1) {
+ styleValue = SWT.SHELL_TRIM;
+ }
+ Display display = Display.getCurrent();
+ shell = new Shell(display, styleValue);
+ targetObject = shell;
+ invokeCreatededAction(element, targetObject);
+ loadData.setCurrentWidget(shell);
+
+ if (metaclass.getType() != Shell.class) {
+ shell.setLayout(new FillLayout());
+ return doCreate(targetObject, element, constraintType, options);
+ } else {
+ if (bindingContext != null) {
+ setBindingContext(metaclass, targetObject, dico,
+ bindingContext);
+ }
+ if (dataContext != null) {
+ setDataContext(metaclass, targetObject, dico, dataContext);
+ }
+ }
+ pushStack(parent);
+
+ // for Shell
+ Attribute classAttribute = element.getAttribute(
+ IConstants.XWT_X_NAMESPACE, IConstants.XAML_X_CLASS);
+ if (classAttribute != null) {
+ String className = classAttribute.getContent();
+ loadShellCLR(className, shell);
+ } else {
+ Attribute classFactoryAttribute = element.getAttribute(
+ IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_CLASS_FACTORY);
+ ICLRFactory clrFactory = (ICLRFactory) options
+ .get(XWTLoader.CLASS_FACTORY_PROPERTY);
+ if (classFactoryAttribute != null) {
+ String content = classFactoryAttribute.getContent();
+ Object clr = loadFactoryCLR(content, clrFactory);
+ loadData.setClr(clr);
+ UserData.setCLR(shell, clr);
+ } else {
+ if (clrFactory != null) {
+ Object clr = clrFactory.createCLR(null, options);
+ loadData.setClr(clr);
+ UserData.setCLR(shell, clr);
+ }
+ }
+ }
+ } else {
+ pushStack(parent);
+
+ //
+ // load the content in case of UserControl
+ //
+ Class<?> type = metaclass.getType();
+ URL file = type.getResource(type.getSimpleName()
+ + IConstants.XWT_EXTENSION_SUFFIX);
+ if (file != null && nameScoped != null) {
+ if (parent instanceof Composite) {
+ Object childDataContext = getDataContext(element,
+ (Widget) parent);
+ Object childBindingContext = getBindingContext(element,
+ (Widget) parent);
+ if (dataContext != null) {
+ childDataContext = dataContext;
+ }
+ if (bindingContext != null) {
+ childBindingContext = bindingContext;
+ }
+ Map<String, Object> nestedOptions = new HashMap<String, Object>();
+ nestedOptions.put(IXWTLoader.CONTAINER_PROPERTY, parent);
+ if (styleValue != null) {
+ nestedOptions.put(IXWTLoader.INIT_STYLE_PROPERTY,
+ styleValue);
+ }
+ nestedOptions.put(IXWTLoader.DATACONTEXT_PROPERTY,
+ childDataContext);
+ nestedOptions.put(IXWTLoader.BINDING_CONTEXT_PROPERTY,
+ childBindingContext);
+ nestedOptions.put(RESOURCE_LOADER_PROPERTY, this);
+ nestedOptions.put(IXWTLoader.CLASS_FACTORY_PROPERTY, null); // disable
+ // the
+ // global
+ // setting
+ targetObject = loader.loadWithOptions(file, nestedOptions);
+ if (targetObject == null) {
+ return null;
+ }
+ invokeCreatededAction(element, targetObject);
+ } else
+ throw new XWTException(
+ "Cannot add user control: Parent is not a composite");
+ } else {
+ Object[] parameters = null;
+ if (TableViewerColumn.class.isAssignableFrom(type)) {
+ int columnIndex = getColumnIndex(element);
+ parameters = (styleValue != null ? new Object[] { parent,
+ styleValue, columnIndex } : new Object[] { parent,
+ SWT.NONE, columnIndex });
+ } else {
+ parameters = (styleValue != null ? new Object[] { parent,
+ styleValue } : new Object[] { parent });
+ }
+
+ // x:Class
+ {
+ boolean hasClass = false;
+ Attribute classAttribute = element
+ .getAttribute(IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_CLASS);
+ if (classAttribute != null) {
+ String className = classAttribute.getContent();
+ targetObject = loadCLR(className, parameters,
+ metaclass.getType(), options);
+ hasClass = true;
+ } else {
+ Object clr = options.get(XWTLoader.CLASS_PROPERTY);
+ if (clr != null) {
+ loadData.setClr(clr);
+ hasClass = true;
+ }
+ }
+ if (!hasClass) {
+ Attribute classFactoryAttribute = element.getAttribute(
+ IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_CLASS_FACTORY);
+ ICLRFactory clrFactory = (ICLRFactory) options
+ .get(XWTLoader.CLASS_FACTORY_PROPERTY);
+ if (classFactoryAttribute != null) {
+ Object clr = loadFactoryCLR(
+ classFactoryAttribute.getContent(),
+ clrFactory);
+ if (clr != null) {
+ loadData.setClr(clr);
+ }
+ } else {
+ if (clrFactory != null) {
+ loadData.setClr(clrFactory.createCLR(null,
+ options));
+ }
+ }
+ }
+
+ if (targetObject == null) {
+ targetObject = metaclass.newInstance(parameters);
+ invokeCreatededAction(element, targetObject);
+ Widget widget = UserData.getWidget(targetObject);
+ if (widget != null) {
+ Object clr = loadData.getClr();
+ if (clr != null) {
+ UserData.setCLR(widget, clr);
+ }
+ }
+ } else {
+ metaclass = loader.getMetaclass(targetObject);
+ }
+ }
+
+ if (targetObject == null) {
+ return null;
+ }
+ }
+ }
+ Widget widget = UserData.getWidget(targetObject);
+ if (widget != null) {
+ loadData.setCurrentWidget(targetObject);
+ }
+ if (scopedObject == null && widget != null) {
+ scopedObject = widget;
+ nameScoped = new ScopeKeeper((parent == null ? null
+ : UserData.findScopeKeeper((Widget) parent)), widget);
+ UserData.bindNameContext((Widget) widget, nameScoped);
+ }
+
+ // set first data context and resource dictionary
+ setDataContext(metaclass, targetObject, dico, dataContext);
+ if (bindingContext != null) {
+ setBindingContext(metaclass, targetObject, dico, bindingContext);
+ }
+
+ if (dataBindingTrack != null) {
+ dataBindingTrack.tracking(targetObject, element, dataContext);
+ }
+
+ // set parent relationship and viewer
+ if (targetObject instanceof Widget) {
+ if (parent != null) {
+ UserData.setParent(targetObject, parent);
+ }
+ } else if (JFacesHelper.isViewer(targetObject)) {
+ UserData.setParent(targetObject, parent);
+ UserData.setViewer(targetObject, targetObject);
+ } else if (targetObject instanceof TableItemProperty.Cell) {
+ ((TableItemProperty.Cell) targetObject)
+ .setParent((TableItem) parent);
+ }
+
+ applyStyles(element, targetObject);
+
+ for (Map.Entry<String, Object> entry : options.entrySet()) {
+ String key = entry.getKey();
+ if (IXWTLoader.Utilities.isPropertyName(key)) {
+ continue;
+ }
+ IProperty property = metaclass.findProperty(key);
+ if (property == null) {
+ throw new XWTException("Property " + key + " not found.");
+ }
+ property.setValue(targetObject, entry.getValue());
+ }
+
+ Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
+ init(metaclass, targetObject, element, delayedAttributes);
+ if (targetObject instanceof Style && element.getChildren().length > 0) {
+ Collection<Setter> setters = new ArrayList<Setter>();
+ for (DocumentObject doc : element.getChildren()) {
+ Object child = doCreate(targetObject, (Element) doc, null,
+ Collections.EMPTY_MAP);
+ if (!(child instanceof Setter)) {
+ throw new XWTException("Setter is expected in Style.");
+ }
+ setters.add((Setter) child);
+ }
+ ((Style) targetObject).setSetters(setters
+ .toArray(new Setter[setters.size()]));
+ } else if (targetObject instanceof ControlEditor) {
+ for (DocumentObject doc : element.getChildren()) {
+ Object editor = doCreate(parent, (Element) doc, null,
+ Collections.EMPTY_MAP);
+ if (editor != null && editor instanceof Control) {
+ ((ControlEditor) targetObject).setEditor((Control) editor);
+ ((Control) editor).setData(
+ PropertiesConstants.DATA_CONTROLEDITOR_OF_CONTROL,
+ targetObject);
+ }
+ }
+ } else if (targetObject instanceof IDataProvider) {
+ for (DocumentObject doc : element.getChildren()) {
+ if (IConstants.XWT_X_NAMESPACE.equals(doc.getNamespace())) {
+ String content = doc.getContent();
+ if (content != null) {
+ ((IDataProvider) targetObject).setProperty(
+ doc.getName(), content);
+ }
+ }
+ }
+ } else {
+ for (DocumentObject doc : element.getChildren()) {
+ doCreate(targetObject, (Element) doc, null,
+ Collections.EMPTY_MAP);
+ }
+ }
+
+ iniDelayedAttribute(metaclass, targetObject, element, null,
+ delayedAttributes);
+
+ postCreation(targetObject);
+ popStack();
+ return targetObject;
+ }
+
+ protected void iniDelayedAttribute(IMetaclass metaclass,
+ Object targetObject, Element element, String namespace,
+ Map<String, IProperty> delayedAttributes) throws Exception {
+ Set<String> keys = delayedAttributes.keySet();
+ while (!keys.isEmpty()) {
+ for (String delayed : keys.toArray(new String[keys.size()])) {
+ IProperty property = delayedAttributes.get(delayed);
+ boolean hasDependency = false;
+ IProperty[] dependencies = property.getLoadingType()
+ .getDependencies();
+ if (dependencies.length > 0) {
+ for (IProperty dependency : dependencies) {
+ if (delayedAttributes.containsValue(dependency)) {
+ hasDependency = true;
+ break;
+ }
+ }
+ }
+ if (!hasDependency) {
+ initAttribute(metaclass, targetObject, element, null,
+ delayed);
+ keys.remove(delayed);
+ }
+ }
+ }
+ }
+
+ /**
+ * This method is invoked directly after creation of component instance, but
+ * before applying its attributes and creating children.
+ *
+ * @param element
+ * the source element in XML.
+ * @param targetObject
+ * the created visual object.
+ */
+ protected void postCreation0(Element element, Object targetObject) {
+
+ if (targetObject instanceof IDynamicBinding) {
+ if (bindings == null)
+ bindings = new ArrayList<Binding>();
+ bindings.add((Binding) targetObject);
+ }
+ }
+
+ private void invokeCreatededAction(Element element, Object targetObject) {
+ if (targetObject != null) {
+ postCreation0(element, targetObject);
+ }
+ if (options != null) {
+ ICreatedCallback createdAction = (ICreatedCallback) options
+ .get(IXWTLoader.CREATED_CALLBACK);
+ if (createdAction != null) {
+ createdAction.onCreated(targetObject);
+ }
+ }
+ }
+
+ /**
+ * This method is invoked after full creation of component, i.e. after
+ * creating its instance, applying its attributes and creating children.
+ */
+ protected void postCreation(Object target) {
+
+ // after create a binding with validationstatus tag, the datasource of
+ // the binding should be updated to the corresponding bindingcontext
+ Collection<ValidationStatus> removedStatus = new ArrayList<>();
+ if (status != null && !status.isEmpty()) {
+ for (ValidationStatus validationStatus : status) {
+ if (bindings != null && !bindings.isEmpty()) {
+ for (Binding binding : bindings) {
+ if (binding.getName() != null
+ && validationStatus.getSourceName() != null
+ && validationStatus.getSourceName().equals(
+ binding.getName())) {
+ removedStatus.add(validationStatus);
+ Control control = (Control) validationStatus
+ .getControl();
+ if (binding.getControl().equals(control))
+ if (binding != null) {
+ Binding targetBinding = (Binding) validationStatus
+ .getParent();
+ targetBinding.setSource(binding
+ .getBindingContext());
+ targetBinding
+ .setPath(VALIDATION_STATUS_CONSTANT);
+ }
+ }
+ }
+ }
+ }
+ if (removedStatus != null) {
+ status.removeAll(removedStatus);
+ removedStatus.clear();
+ }
+ }
+
+ }
+
+ protected void setDataContext(IMetaclass metaclass, Object targetObject,
+ ResourceDictionary dico, Object dataContext)
+ throws IllegalAccessException, InvocationTargetException,
+ NoSuchFieldException {
+ Object control = null;
+ IMetaclass widgetMetaclass = metaclass;
+ if (JFacesHelper.isViewer(targetObject)) {
+ Widget widget = JFacesHelper.getControl(targetObject);
+ widgetMetaclass = loader.getMetaclass(widget.getClass());
+ control = targetObject;
+ } else if (targetObject instanceof Widget) {
+ control = (Widget) targetObject;
+ } else {
+ control = loadData.getCurrentWidget();
+ }
+ if (control != null) {
+ if (targetObject instanceof IDynamicBinding) {
+ IDynamicBinding dynamicBinding = (IDynamicBinding) targetObject;
+ dynamicBinding.setControl(control);
+ dynamicBinding.setHost(loadData.getHost());
+ }
+ if (dico != null) {
+ UserData.setResources(control, dico);
+ }
+ if (dataContext != null) {
+ IProperty property = widgetMetaclass
+ .findProperty(IConstants.XAML_DATA_CONTEXT);
+ if (property != null) {
+ property.setValue(UserData.getWidget(control), dataContext);
+ } else {
+ throw new XWTException("DataContext is missing in "
+ + widgetMetaclass.getType().getName());
+ }
+ }
+ }
+ }
+
+ protected void setBindingContext(IMetaclass metaclass, Object targetObject,
+ ResourceDictionary dico, Object bindingContext)
+ throws IllegalAccessException, InvocationTargetException,
+ NoSuchFieldException {
+ Object control = null;
+ IMetaclass widgetMetaclass = metaclass;
+ if (JFacesHelper.isViewer(targetObject)) {
+ Widget widget = JFacesHelper.getControl(targetObject);
+ widgetMetaclass = loader.getMetaclass(widget.getClass());
+ control = targetObject;
+ } else if (targetObject instanceof Widget) {
+ control = (Widget) targetObject;
+ } else {
+ control = loadData.getCurrentWidget();
+ }
+ if (control != null) {
+ if (targetObject instanceof IDynamicBinding) {
+ IDynamicBinding dynamicBinding = (IDynamicBinding) targetObject;
+ dynamicBinding.setControl(control);
+ dynamicBinding.setHost(loadData.getHost());
+ }
+ if (dico != null) {
+ UserData.setResources(control, dico);
+ }
+ if (bindingContext != null) {
+ IProperty property = widgetMetaclass
+ .findProperty(IConstants.XAML_BINDING_CONTEXT);
+ if (property != null) {
+ property.setValue(UserData.getWidget(control),
+ bindingContext);
+ } else {
+ throw new XWTException("DataContext is missing in "
+ + widgetMetaclass.getType().getName());
+ }
+ }
+ }
+ }
+
+ protected void applyStyles(Element element, Object targetObject)
+ throws Exception {
+ if (targetObject instanceof Widget) {
+ Widget widget = (Widget) targetObject;
+ Map<String, Object> dico = UserData.getLocalResources(widget);
+ Attribute attribute = element
+ .getAttribute(IConstants.XAML_RESOURCES);
+ if (attribute == null) {
+ attribute = element.getAttribute(IConstants.XWT_NAMESPACE,
+ IConstants.XAML_RESOURCES);
+ }
+ if (attribute != null) {
+ if (attribute.getChildren().length > 0) {
+ if (dico == null) {
+ dico = new ResourceDictionary();
+ UserData.setResources(widget, dico);
+ }
+
+ for (DocumentObject doc : attribute.getChildren()) {
+ Element elem = (Element) doc;
+ Object doCreate = doCreate(widget, elem, null,
+ EMPTY_MAP);
+ Attribute keyAttribute = elem.getAttribute(
+ IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_KEY);
+ if (keyAttribute == null) {
+ keyAttribute = elem.getAttribute(
+ IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_TYPE);
+ }
+ if (keyAttribute != null) {
+ dico.put(keyAttribute.getContent(), doCreate);
+ }
+ if (doCreate instanceof IStyle) {
+ IStyle style = (IStyle) doCreate;
+ loadData.addStyle(style);
+ }
+ }
+ }
+ }
+
+ // apply the styles defined in parent's resources via TargetType
+ Widget current = widget;
+ while (current != null) {
+ dico = UserData.getLocalResources(current);
+ if (dico != null) {
+ for (Object value : dico.values()) {
+ if (value instanceof Style) {
+ Style style = (Style) value;
+ Class<?> targetType = style.getTargetType();
+ if (targetType != null
+ && targetType.isInstance(widget)) {
+ style.apply(targetObject);
+ }
+ }
+ }
+ }
+ current = UserData.getTreeParent(current);
+ }
+ }
+
+ for (IStyle style : loadData.getStyles()) {
+ style.applyStyle(targetObject);
+ }
+ }
+
+ protected int getColumnIndex(Element columnElement) {
+ String name = columnElement.getName();
+ String namespace = columnElement.getNamespace();
+ IMetaclass metaclass = loader.getMetaclass(name, namespace);
+ int index = -1;
+ Class<?> type = metaclass.getType();
+ if (TableViewerColumn.class.isAssignableFrom(type)) {
+ DocumentObject parent = columnElement.getParent();
+ List<DocumentObject> children = DocumentObjectSorter.sortWithAttr(
+ parent.getChildren(), "Index");
+ index = children.indexOf(columnElement);
+ }
+
+ return index;
+ }
+
+ /**
+ * @param tableItem
+ */
+ protected void installTableEditors(TableItem tableItem) {
+ Table table = tableItem.getParent();
+ TableColumn[] columns = table.getColumns();
+ if (columns == null || columns.length == 0) {
+ return;
+ }
+ for (TableColumn tableColumn : columns) {
+ Object data = tableColumn
+ .getData(PropertiesConstants.DATA_DEFINED_EDITOR);
+ if (data == null || !(data instanceof Element)) {
+ continue;
+ }
+ int column = table.indexOf(tableColumn);
+ Element editor = (Element) data;
+ try {
+ TableEditor tableEditor = (TableEditor) doCreate(table, editor,
+ null, EMPTY_MAP);
+ if (tableEditor != null) {
+ tableEditor.setColumn(column);
+ tableEditor.setItem(tableItem);
+ }
+ } catch (Exception e) {
+ continue;
+ }
+ }
+ }
+
+ protected Object getDataContext(Element element, Widget swtObject) {
+ // x:DataContext
+ try {
+ Object dataContext = loadData.getDataContext();
+ if (dataContext != null) {
+ return dataContext;
+ }
+ {
+ Attribute dataContextAttribute = element
+ .getAttribute(IConstants.XAML_DATA_CONTEXT);
+ if (dataContextAttribute != null) {
+ Widget composite = (Widget) swtObject;
+ DocumentObject documentObject = dataContextAttribute
+ .getChildren()[0];
+ if (IConstants.XAML_STATICRESOURCES.equals(documentObject
+ .getName())
+ || IConstants.XAML_DYNAMICRESOURCES
+ .equals(documentObject.getName())) {
+ String key = documentObject.getContent();
+ dataContext = new StaticResourceBinding(composite, key);
+ loadData.setDataContext(dataContext);
+ return dataContext;
+ } else if (IConstants.XAML_BINDING.equals(documentObject
+ .getName())) {
+ dataContext = doCreate(swtObject,
+ (Element) documentObject, null, EMPTY_MAP);
+ loadData.setDataContext(dataContext);
+ return dataContext;
+ } else {
+ LoggerManager.log(new UnsupportedOperationException(
+ documentObject.getName()));
+ }
+ }
+ }
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+
+ return null;
+ }
+
+ protected Object getBindingContext(Element element, Widget swtObject) {
+ // x:DataContext
+ try {
+ {
+
+ Attribute dataContextAttribute = element
+ .getAttribute(IConstants.XAML_BINDING_CONTEXT);
+ if (dataContextAttribute != null) {
+ Widget composite = (Widget) swtObject;
+ DocumentObject documentObject = dataContextAttribute
+ .getChildren()[0];
+ if (IConstants.XAML_STATICRESOURCES.equals(documentObject
+ .getName())
+ || IConstants.XAML_DYNAMICRESOURCES
+ .equals(documentObject.getName())) {
+ String key = documentObject.getContent();
+ return new StaticResourceBinding(composite, key);
+ } else if (IConstants.XAML_BINDING.equals(documentObject
+ .getName())) {
+ return doCreate(swtObject, (Element) documentObject,
+ null, EMPTY_MAP);
+ } else {
+ LoggerManager.log(new UnsupportedOperationException(
+ documentObject.getName()));
+ }
+ }
+ }
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+
+ return null;
+ }
+
+ protected void pushStack(Object host) {
+ loadData = new LoadingData(loadData, host);
+ }
+
+ protected void popStack() {
+ LoadingData previous = loadData;
+ loadData = previous.getParent();
+
+ previous.end();
+ }
+
+ protected Integer getStyleValue(Element element, int styles) {
+ Attribute attribute = element.getAttribute(IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_STYLE);
+ if (attribute == null) {
+ if (styles != -1) {
+ return styles;
+ }
+ return null;
+ }
+ if (styles == -1) {
+ return (Integer) loader.findConvertor(String.class, Integer.class)
+ .convert(attribute.getContent());
+ }
+ return styles
+ | (Integer) loader.findConvertor(String.class, Integer.class)
+ .convert(attribute.getContent());
+ }
+
+ protected void init(IMetaclass metaclass, Object targetObject,
+ Element element, Map<String, IProperty> delayedAttributes)
+ throws Exception {
+ // editors for TableItem,
+ if (targetObject instanceof TableItem) {
+ installTableEditors((TableItem) targetObject);
+ }
+
+ // x:DataContext
+ if (loadData.getDataContext() == null) {
+ Attribute dataContextAttribute = element
+ .getAttribute(IConstants.XAML_DATA_CONTEXT);
+ if (dataContextAttribute != null) {
+ IProperty property = metaclass
+ .findProperty(IConstants.XAML_DATA_CONTEXT);
+ Widget composite = (Widget) UserData.getWidget(targetObject);
+ DocumentObject documentObject = dataContextAttribute
+ .getChildren()[0];
+ if (IConstants.XAML_STATICRESOURCES.equals(documentObject
+ .getName())
+ || IConstants.XAML_DYNAMICRESOURCES
+ .equals(documentObject.getName())) {
+ String key = documentObject.getContent();
+ property.setValue(composite, new StaticResourceBinding(
+ composite, key));
+ } else if (IConstants.XAML_BINDING.equals(documentObject
+ .getName())) {
+ Object object = doCreate(targetObject,
+ (Element) documentObject, null, EMPTY_MAP);
+ property.setValue(composite, object);
+ } else {
+ LoggerManager.log(new UnsupportedOperationException(
+ documentObject.getName()));
+ }
+ }
+ }
+
+ HashSet<String> done = new HashSet<String>();
+
+ Attribute nameAttr = element.getAttribute(IConstants.XAML_X_NAME);
+ if (nameAttr == null) {
+ nameAttr = element.getAttribute(IConstants.XWT_X_NAMESPACE,
+ IConstants.XAML_X_NAME);
+ }
+ if (nameAttr != null && UserData.getWidget(targetObject) != null) {
+ String value = nameAttr.getContent();
+ loadData.inject(targetObject, value);
+
+ nameScoped.addNamedObject(value, targetObject);
+ UserData.setElementName(targetObject, value, false);
+ done.add(IConstants.XAML_X_NAME);
+ }
+
+ for (String attrName : element.attributeNames()) {
+ IProperty property = metaclass.findProperty(attrName);
+
+ if (property == null) {
+ IMetaclass mc = XWT.getMetaclass(targetObject);
+ property = mc.findProperty(attrName);
+
+ if (property != null) {
+ metaclass = mc;
+ }
+ }
+
+ if (IConstants.XWT_X_NAMESPACE.equals(element
+ .getAttribute(attrName).getNamespace())) {
+ continue;
+ } else if (delayedAttributes != null
+ && property != null
+ && property.getLoadingType().getValueLoading() != IValueLoading.Normal)
+ delayedAttributes.put(attrName, property);
+ else {
+ if (!done.contains(attrName)) {
+ initAttribute(metaclass, targetObject, element, null,
+ attrName);
+ done.add(attrName);
+ }
+ }
+ }
+
+ for (String namespace : element.attributeNamespaces()) {
+ if (IConstants.XWT_X_NAMESPACE.equals(namespace)) {
+ for (String attrName : element.attributeNames(namespace)) {
+ if ("class".equalsIgnoreCase(attrName)
+ || IConstants.XAML_STYLE.equalsIgnoreCase(attrName)) {
+ continue; // done before
+ } else if (IConstants.XAML_X_NAME
+ .equalsIgnoreCase(attrName)) {
+ nameScoped.addNamedObject(
+ element.getAttribute(namespace, attrName)
+ .getContent(), targetObject);
+ done.add(attrName);
+ } else if (IConstants.XAML_DATA_CONTEXT
+ .equalsIgnoreCase(attrName)) {
+ continue; // done before
+ } else if (IConstants.XAML_X_ARRAY
+ .equalsIgnoreCase(attrName)) {
+ IProperty property = metaclass.findProperty(attrName);
+ Class<?> type = property.getType();
+ Object value = getArrayProperty(type, targetObject,
+ element, attrName);
+ if (value != null) {
+ property.setValue(targetObject, value);
+ }
+ } else if (IConstants.XAML_RESOURCES
+ .equalsIgnoreCase(attrName)) {
+ continue;
+ } else {
+ if (!done.contains(attrName)) {
+ initAttribute(metaclass, targetObject, element,
+ namespace, attrName);
+ done.add(attrName);
+ }
+ }
+ }
+ continue;
+ }
+
+ for (String attrName : element.attributeNames(namespace)) {
+ if (IConstants.XAML_X_NAME.equalsIgnoreCase(attrName)
+ && (targetObject instanceof Widget)) {
+ continue;
+ }
+ if (!done.contains(attrName)) {
+ initAttribute(metaclass, targetObject, element, namespace,
+ attrName);
+ done.add(attrName);
+ }
+ }
+ }
+ for (String attrName : element.attributeNames()) {
+ if (IConstants.XAML_X_NAME.equalsIgnoreCase(attrName)
+ && UserData.getWidget(targetObject) != null) {
+ continue;
+ }
+ if (!done.contains(attrName)
+ && !delayedAttributes.containsKey(attrName)) {
+ initAttribute(metaclass, targetObject, element, null, attrName);
+ done.add(attrName);
+ }
+ }
+
+ //
+ // handle foreigner namespace
+ //
+ for (String namespace : element.attributeNamespaces()) {
+ if (XWT.isXWTNamespace(namespace)) {
+ continue;
+ }
+ INamespaceHandler namespaceHandler = loader
+ .getNamespaceHandler(namespace);
+ if (namespaceHandler != null) {
+ for (String attrName : element.attributeNames(namespace)) {
+ Attribute attribute = element.getAttribute(namespace,
+ attrName);
+ Widget widget = UserData.getWidget(loadData
+ .getCurrentWidget());
+ namespaceHandler.handleAttribute(widget, targetObject,
+ attrName, attribute.getContent());
+ }
+ }
+ }
+ }
+
+ protected Object getArrayProperty(Class<?> type, Object swtObject,
+ DocumentObject docObject, String attrName)
+ throws IllegalAccessException, InvocationTargetException,
+ NoSuchFieldException {
+ Class<?> arrayType = null;
+ if (type == Object.class) {
+ if (docObject instanceof Element) {
+ Element element = (Element) docObject;
+ Attribute attribute = element.getAttribute(
+ IConstants.XWT_NAMESPACE, IConstants.XAML_X_TYPE);
+ if (attribute == null) {
+ throw new XWTException(
+ "The type attribute is missing in the element x:Array.");
+ }
+ String value = attribute.getContent();
+ IMetaclass metaclass = XWT.getMetaclass(value,
+ attribute.getNamespace());
+ if (metaclass == null) {
+ throw new XWTException("The type \"" + value
+ + "\" is not found.");
+ }
+ arrayType = metaclass.getType();
+ }
+ } else {
+ if (!type.isArray()) {
+ throw new XWTException("Type mismatch: property " + attrName
+ + " isn't an array.");
+ }
+ arrayType = type.getComponentType();
+ }
+ if (arrayType != null) {
+ List<Object> list = new ArrayList<Object>();
+ for (DocumentObject childModel : docObject.getChildren()) {
+ if (!(childModel instanceof Element)) {
+ continue;
+ }
+ Object child = createInstance(swtObject, (Element) childModel);
+ list.add(child);
+ }
+ Object[] array = (Object[]) Array.newInstance(arrayType,
+ list.size());
+ list.toArray(array);
+
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] instanceof IIndexedElement) {
+ ((IIndexedElement) array[i]).setIndex(swtObject, i);
+ }
+ }
+ return array;
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Object getCollectionProperty(Class<?> type, Object swtObject,
+ DocumentObject element, String attrName)
+ throws IllegalAccessException, InvocationTargetException,
+ NoSuchFieldException {
+ Collection<Object> collector = null;
+ if (type.isInterface()) {
+ collector = new ArrayList<Object>();
+ } else {
+ if (Modifier.isAbstract(type.getModifiers())) {
+ LoggerManager.log(new XWTException("Collection "
+ + type.getSimpleName() + " is abstract type"));
+ }
+ try {
+ collector = (Collection) type.newInstance();
+ } catch (InstantiationException e) {
+ LoggerManager.log(new XWTException(e));
+ }
+ }
+
+ for (DocumentObject childModel : element.getChildren()) {
+ if (!(childModel instanceof Element)) {
+ continue;
+ }
+ Object child = createInstance(swtObject, (Element) childModel);
+ collector.add(child);
+ if (child instanceof IIndexedElement) {
+ ((IIndexedElement) child).setIndex(swtObject,
+ collector.size() - 1);
+ }
+ }
+ return collector;
+ }
+
+ protected String findNamespace(DocumentObject context, String prefix) {
+ while (context != null && !(context instanceof Element)) {
+ context = context.getParent();
+ }
+ if (context == null) {
+ return null;
+ }
+ Element element = (Element) context;
+
+ if (prefix != null) {
+ prefix = (prefix.length() == 0 ? null : prefix);
+ }
+
+ String namespace = element.getXmlns(prefix);
+ if (namespace != null) {
+ return namespace;
+ }
+ DocumentObject parent = element.getParent();
+ return findNamespace(parent, prefix);
+ }
+
+ protected Object createInstance(Object swtObject, Element element) {
+ String name = element.getName();
+ String namespace = element.getNamespace();
+ if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)
+ && IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
+ return null;
+ }
+ try {
+ Class<?> type = NamespaceHelper.loadCLRClass(
+ context.getLoadingContext(), name, namespace);
+ IMetaclass metaclass = loader.getMetaclass(name, namespace);
+ if (type == null) {
+ if (metaclass != null)
+ type = metaclass.getType();
+ }
+ if (metaclass == null) {
+ throw new XWTException("Class for " + name + " is not found.");
+ }
+ // type = expected type;
+ // Need to support the
+ String content = element.getContent();
+ Object instance = null;
+ if (content == null) {
+ instance = metaclass.newInstance(new Object[] { swtObject });
+ invokeCreatededAction(element, instance);
+ if (instance instanceof TableEditor) {
+ // TODO should be moved into IMetaclass
+ TableEditor tableEditor = (TableEditor) instance;
+ if (swtObject instanceof TableItem) {
+ TableItem item = (TableItem) swtObject;
+ tableEditor.setItem(item);
+ for (DocumentObject doc : element.getChildren()) {
+ Control control = (Control) doCreate(
+ ((TableItem) swtObject).getParent(),
+ (Element) doc, null, EMPTY_MAP);
+ tableEditor.setEditor(control);
+ int column = getColumnValue(element);
+ TableEditorHelper.initEditor(item, control, column);
+ }
+ }
+ }
+ } else {
+ Constructor<?> constructor = type.getConstructor(type);
+ if (constructor != null) {
+ instance = constructor.newInstance(loader.convertFrom(type,
+ content));
+ invokeCreatededAction(element, instance);
+ } else {
+ LoggerManager.log(new XWTException("Constructor \"" + name
+ + "(" + type.getSimpleName() + ")\" is not found"));
+ }
+ }
+ Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
+ init(metaclass, instance, element, delayedAttributes);
+ iniDelayedAttribute(metaclass, instance, element, null,
+ delayedAttributes);
+
+ for (DocumentObject doc : element.getChildren()) {
+ doCreate(instance, (Element) doc, null, Collections.EMPTY_MAP);
+ }
+ return instance;
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+ return null;
+ }
+
+ static protected int getColumnValue(Element context) {
+ Attribute attribute = context.getAttribute(COLUMN);
+ if (attribute != null) {
+ String content = attribute.getContent();
+ if (content != null) {
+ return Integer.parseInt(content);
+ }
+ }
+ return 0;
+ }
+
+ protected void loadShellCLR(String className, Shell shell) {
+ Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
+ className);
+ try {
+ Object instance = type.newInstance();
+ loadData.setClr(instance);
+ UserData.setCLR(shell, instance);
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+ }
+
+ protected Object loadFactoryCLR(String value, ICLRFactory factory) {
+ String token;
+ String arg;
+ if (value.startsWith("+")) {
+ if (factory == null) {
+ throw new XWTException("ICLRFactory option is missing.");
+ }
+ arg = value.substring(1).trim();
+ return factory.createCLR(arg, options);
+ } else {
+ StringTokenizer stringTokenizer = new StringTokenizer(value);
+ if (!stringTokenizer.hasMoreTokens()) {
+ throw new XWTException("x:ClassFactory is empty");
+ }
+ token = stringTokenizer.nextToken();
+ arg = value.substring(token.length()).trim();
+ }
+ int index = token.lastIndexOf('.');
+ if (index != -1) {
+ String memberName = token.substring(index + 1);
+ String typeName = token.substring(0, index);
+ Class<?> type = ClassLoaderUtil.loadClass(
+ context.getLoadingContext(), typeName);
+ if (type != null) {
+ Object member = ClassLoaderUtil.loadMember(
+ context.getLoadingContext(), type, memberName, false);
+ if (member instanceof ICLRFactory) {
+ factory = (ICLRFactory) member;
+ }
+ if (factory != null) {
+ return factory.createCLR(arg, options);
+ }
+ }
+ }
+ Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
+ token);
+ if (type != null && ICLRFactory.class.isAssignableFrom(type)) {
+ try {
+ ICLRFactory localFactory = (ICLRFactory) type.newInstance();
+ return localFactory.createCLR(arg, options);
+ } catch (Exception e) {
+ throw new XWTException(e);
+ }
+ }
+ throw new XWTException(value + " ClassFactory not found.");
+ }
+
+ protected Object loadCLR(String className, Object[] parameters,
+ Class<?> currentTagType, Map<String, Object> options) {
+ Class<?> type = ClassLoaderUtil.loadClass(context.getLoadingContext(),
+ className);
+ if (type == null) {
+ return null;
+ }
+ try {
+ Object clr = options.get(XWTLoader.CLASS_PROPERTY);
+ if (clr != null && type.isInstance(clr)) {
+ loadData.setClr(clr);
+ if (clr instanceof Widget) {
+ UserData.setCLR((Widget) clr, clr);
+ }
+ } else if (currentTagType != null
+ && currentTagType.isAssignableFrom(type)) {
+ IMetaclass metaclass = loader.getMetaclass(type);
+ Object instance = metaclass.newInstance(parameters);
+ loadData.setClr(instance);
+ // use x:Class's instance
+ if (instance instanceof Widget) {
+ UserData.setCLR((Widget) instance, instance);
+ }
+ return instance;
+ } else {
+ Object instance = type.newInstance();
+ loadData.setClr(instance);
+ if (instance instanceof Widget) {
+ UserData.setCLR((Widget) instance, instance);
+ }
+ }
+ } catch (Exception e) {
+ LoggerManager.log(e);
+ }
+ return null;
+ }
+
+ protected void initAttribute(IMetaclass metaclass, Object targetObject,
+ Element element, String namespace, String attrName)
+ throws Exception {
+ if (attrName.indexOf('.') != -1) {
+ String[] segments = attrName.split("\\.");
+ IMetaclass currentMetaclass = metaclass;
+ Object target = targetObject;
+ for (int i = 0; i < segments.length - 1; i++) {
+ IProperty property = currentMetaclass.findProperty(segments[i]);
+ if (property != null) {
+ target = property.getValue(target);
+ if (target == null) {
+ LoggerManager.log(new XWTException("Property \""
+ + segments[i] + "\" is null."));
+ }
+ currentMetaclass = loader.getMetaclass(target);
+ } else {
+ LoggerManager.log(new XWTException("Property \""
+ + segments[i] + "\" not found in "
+ + element.getName() + "."));
+ }
+ }
+ initSegmentAttribute(currentMetaclass,
+ segments[segments.length - 1], target, element, namespace,
+ attrName);
+ return;
+ }
+ initSegmentAttribute(metaclass, attrName, targetObject, element,
+ namespace, attrName);
+ }
+
+ protected void addCommandExecuteListener(String commandName,
+ final Widget targetButton) {
+ final ICommand commandObj = loader.getCommand(commandName);
+ if (commandObj != null) {
+ targetButton.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event event) {
+ commandObj.execute(targetButton);
+ }
+ });
+ }
+ }
+
+ protected void initSegmentAttribute(IMetaclass metaclass,
+ String propertyName, Object target, Element element,
+ String namespace, String attrName) throws Exception {
+ Attribute attribute = namespace == null ? element
+ .getAttribute(attrName) : element.getAttribute(namespace,
+ attrName);
+ if (attribute == null) {
+ attribute = element.getAttribute(attrName);
+ }
+ IProperty property = null;
+ boolean isAttached = false;
+ {
+ String namePrefix = attribute.getNamePrefix();
+ if (namePrefix == null) {
+ property = metaclass.findProperty(propertyName);
+ } else {
+ //
+ IMetaclass metaclassAttached = loader.getMetaclass(namePrefix,
+ attribute.getNamespace());
+ if (metaclassAttached != null) {
+ property = metaclassAttached.findProperty(propertyName);
+ isAttached = true;
+ } else {
+ LoggerManager.log(attribute.getNamespace() + " -> "
+ + namePrefix + " is not found.");
+ return;
+ }
+ }
+ }
+
+ if (propertyName.equals(IConstants.XAML_DATA_CONTEXT)) {
+ property = null;
+ }
+ if (IConstants.XAML_COMMAND.equalsIgnoreCase(propertyName)
+ && ICommand.class.isAssignableFrom(property.getType())
+ && (target instanceof Widget)) {
+ addCommandExecuteListener(attribute.getContent(), (Widget) target);
+ }
+ if (property == null) {
+ if (options.get(IXWTLoader.DESIGN_MODE_PROPERTY) == Boolean.TRUE) {
+ return;
+ }
+ // prepare event
+ IEvent event = metaclass.findEvent(attrName);
+ if (event == null) {
+ return;
+ }
+ // add events for controls and items.
+ if (!(target instanceof Widget)) {
+ return;
+ }
+ loadData.updateEvent(context, (Widget) target, event,
+ attribute.getContent());
+ return;
+ }
+
+ String contentValue = attribute.getContent();
+ if ("MenuItem".equalsIgnoreCase(element.getName())
+ && "Text".equalsIgnoreCase(attrName)) {
+ Attribute attributeAccelerator = element
+ .getAttribute("Accelerator");
+ if (attributeAccelerator != null) {
+ contentValue = contentValue + '\t'
+ + getContentValue(attributeAccelerator.getContent());
+ }
+ }
+
+ if (contentValue != null && "Accelerator".equalsIgnoreCase(attrName)) {
+ contentValue = XWTMaps.getCombAccelerator(contentValue);
+ if (contentValue.contains("'")) {
+ contentValue = removeSubString(contentValue, "'");
+ }
+ }
+ if (contentValue != null
+ && loader.isFileResolveType(property.getType())) {
+ contentValue = getImagePath(contentValue);
+ }
+ // if (contentValue != null
+ // && (URL.class.isAssignableFrom(property.getType()))) {
+ // contentValue = getSourceURL(contentValue);
+ // }
+ Object value = null;
+ DocumentObject[] children = attribute.getChildren();
+ boolean usingExistingValue = false;
+ if (contentValue == null) {
+ Class<?> type = property.getType();
+ if (Collection.class.isAssignableFrom(type)) {
+ value = getCollectionProperty(type, target, attribute, attrName);
+ } else {
+ Object directTarget = null;
+ if (TableViewerColumn.class.isAssignableFrom(type)
+ && attrName.equalsIgnoreCase("columns")) {
+ children = DocumentObjectSorter.sortWithAttr(children,
+ "Index").toArray(
+ new DocumentObject[children.length]);
+ } else {
+ try {
+ Object propertyValue = property.getValue(target);
+ if (UserData.getWidget(propertyValue) != null) {
+ directTarget = propertyValue;
+ // use the existing property value as parent,
+ // not need to add the constraint
+ if (!property.isValueAsParent()) {
+ if (isChildTypeCompatible(attribute, type)) {
+ directTarget = null;
+ } else {
+ type = null;
+ usingExistingValue = true;
+ }
+ }
+ }
+ } catch (Exception e) {
+ }
+ }
+ if (directTarget == null) {
+ directTarget = target;
+ }
+
+ for (DocumentObject child : children) {
+ String name = child.getName();
+ String ns = child.getNamespace();
+ if (name.equalsIgnoreCase(IConstants.XAML_X_STATIC)
+ && ns.equals(IConstants.XWT_X_NAMESPACE)) {
+ value = getStaticValue(child);
+ } else if (name
+ .equalsIgnoreCase(IConstants.XAML_STATICRESOURCES)
+ && ns.equals(IConstants.XWT_NAMESPACE)) {
+ String key = child.getContent();
+ value = new StaticResourceBinding(
+ loadData.getCurrentWidget(), key);
+ } else if ((IConstants.XWT_X_NAMESPACE.equals(ns) && IConstants.XAML_X_ARRAY
+ .equalsIgnoreCase(name))) {
+ value = getArrayProperty(property.getType(),
+ directTarget, child, name);
+ } else if (property.getType().isArray()) {
+ value = getArrayProperty(property.getType(),
+ directTarget, attribute, name);
+ break;
+ } else if (isAssignableFrom(element, TableColumn.class)
+ && isAssignableFrom(child, TableEditor.class)) {
+ value = child;
+ } else if (TableViewerColumn.class
+ .isAssignableFrom(property.getType())
+ && attribute.getContent() != null) {
+ value = attribute.getContent();
+ } else {
+ if ("Null".equals(child.getName())
+ && IConstants.XWT_X_NAMESPACE.equals(child
+ .getNamespace())) {
+ property.setValue(directTarget, null);
+ return;
+ } else {
+ value = doCreate(directTarget, (Element) child,
+ type, EMPTY_MAP);
+ if (value == null
+ && type != null
+ && !(type == Table.class
+ && "TableColumn".equals(child
+ .getName()) && Table.class
+ .isInstance(directTarget))) {
+ throw new XWTException(child.getName()
+ + " cannot be a content of "
+ + type.getName() + " "
+ + target.getClass().getName() + "."
+ + property.getName());
+ }
+ if (value instanceof IDynamicBinding) {
+ ((IDynamicBinding) value).setType(attrName);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (contentValue != null && value == null
+ && !IConstants.XAML_COMMAND.equalsIgnoreCase(propertyName)) {
+ if (property.getType().isInstance(Class.class)) {
+ int index = contentValue.lastIndexOf(':');
+ if (index != -1) {
+ String prefix = contentValue.substring(0, index);
+ contentValue = findNamespace(attribute, prefix)
+ + contentValue.substring(index);
+ }
+ }
+ value = loader.convertFrom(property.getType(), contentValue);
+ }
+ if (!usingExistingValue) {
+ if (value != null) {
+ Class<?> propertyType = property.getType();
+ if (!propertyType.isAssignableFrom(value.getClass())
+ || (value instanceof IBinding && !(IBinding.class
+ .isAssignableFrom(propertyType)))) {
+ Object orginalValue = value;
+ IConverter converter = loader.findConvertor(
+ value.getClass(), propertyType);
+ if (converter != null) {
+ value = converter.convert(value);
+ if (value != null
+ && orginalValue instanceof IBinding
+ && !propertyType.isAssignableFrom(value
+ .getClass())) {
+ converter = loader.findConvertor(value.getClass(),
+ propertyType);
+ if (converter != null) {
+ value = converter.convert(value);
+ } else {
+ LoggerManager.log(new XWTException("Convertor "
+ + value.getClass().getSimpleName()
+ + "->" + propertyType.getSimpleName()
+ + " is not found"));
+ }
+ }
+ } else {
+ LoggerManager.log(new XWTException("Convertor "
+ + value.getClass().getSimpleName() + "->"
+ + propertyType.getSimpleName()
+ + " is not found"));
+ }
+ }
+ if (isAttached) {
+ UserData.setLocalData(target, property, value);
+ } else {
+ if (value instanceof IDynamicValueBinding) {
+ IDynamicValueBinding dynamicValueBinding = (IDynamicValueBinding) value;
+ dynamicValueBinding.setControl(loadData
+ .findElement(Widget.class));
+ dynamicValueBinding.setProperty(property);
+ dynamicValueBinding.setObject(target);
+ }
+ // deal with validation staus
+ if ((value instanceof ValidationStatus)
+ && (property.getName().equals("source"))
+ && (target instanceof Binding)) {
+ ValidationStatus validationStatus = (ValidationStatus) value;
+ validationStatus.setParent(target);
+ if (status == null)
+ status = new ArrayList<>();
+ status.add(validationStatus);
+ } else {
+ property.setValue(target, value);
+
+ }
+ }
+ } else {
+ if (value == null) {
+ value = property.getValue(target);
+ }
+ if (value != null) {
+ // create children.
+ for (DocumentObject child : children) {
+ String name = child.getName();
+ String ns = child.getNamespace();
+ if (!IConstants.XWT_X_NAMESPACE.equals(ns)
+ || !IConstants.XAML_X_ARRAY
+ .equalsIgnoreCase(name)) {
+ Class<?> type = property.getType();
+ if (!Collection.class.isAssignableFrom(type)) {
+ doCreate(value, (Element) child, null,
+ EMPTY_MAP);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (attribute.attributeNames(IConstants.XWT_NAMESPACE).length > 0) {
+ IMetaclass propertyMetaclass = loader.getMetaclass(property
+ .getType());
+ if (value == null) {
+ value = property.getValue(target);
+ }
+ if (value != null) {
+ Map<String, IProperty> delayedAttributes = new HashMap<String, IProperty>();
+ init(propertyMetaclass, value, attribute, delayedAttributes);
+ iniDelayedAttribute(metaclass, target, element, namespace,
+ delayedAttributes);
+ }
+ }
+ }
+
+ protected boolean isChildTypeCompatible(Attribute attribute, Class<?> type) {
+ DocumentObject[] children = attribute.getChildren();
+ if (children.length != 1) {
+ return false;
+ }
+ DocumentObject child = children[0];
+ if (!(child instanceof Element)) {
+ return false;
+ }
+ Element childElement = (Element) child;
+
+ String name = childElement.getName();
+ String namespace = childElement.getNamespace();
+ IMetaclass metaclass = loader.getMetaclass(name, namespace);
+ if (metaclass == null) {
+ return false;
+ }
+ return type.isAssignableFrom(metaclass.getType());
+ }
+
+ /**
+ * @param contentValue
+ * @return
+ */
+ protected String getSourceURL(String contentValue) {
+ URL url = null;
+ try {
+ url = new URL(contentValue);
+ } catch (MalformedURLException e) {
+ if (!contentValue.startsWith("/")) {
+ contentValue = "/" + contentValue;
+ }
+ ILoadingContext loadingContext = context.getLoadingContext();
+ URL resource = loadingContext.getResource(contentValue);
+ if (resource == null) {
+ try {
+ resource = new URL(context.getResourcePath() + contentValue);
+ return resource.toString();
+ } catch (MalformedURLException e1) {
+ }
+ } else {
+ return resource.toString();
+ }
+ }
+ if (url != null) {
+ return url.toString();
+ }
+ return contentValue;
+ }
+
+ protected Class<?> getJavaType(DocumentObject element) {
+ String name = element.getName();
+ String namespace = element.getNamespace();
+ if (IConstants.XWT_X_NAMESPACE.equalsIgnoreCase(namespace)
+ && IConstants.XAML_X_NULL.equalsIgnoreCase(name)) {
+ return null;
+ }
+ IMetaclass metaclass = loader.getMetaclass(name, namespace);
+ if (metaclass == null) {
+ return null;
+ }
+ return metaclass.getType();
+ }
+
+ protected boolean isAssignableFrom(DocumentObject element, Class<?> type) {
+ Class<?> targetType = getJavaType(element);
+ if (targetType == null) {
+ return false;
+ }
+ return targetType.isAssignableFrom(type);
+ }
+
+ protected Object getStaticValue(DocumentObject child) {
+ DocumentObject[] children = child.getChildren();
+ if (children.length == 1) {
+ Element element = (Element) children[0];
+ if (element != null) {
+ return ClassLoaderUtil.loadStaticMember(
+ context.getLoadingContext(), element);
+ }
+ }
+ return null;
+ }
+
+ protected String getImagePath(String contentValue) {
+ String value = contentValue;
+ try {
+ File file = new File(contentValue);
+ if (file.exists()) {
+ return file.toURI().toURL().toString();
+ }
+ if (!contentValue.startsWith("/")) {
+ URL url = context.getResourcePath();
+ if (url != null) {
+ return url.toString() + "/" + contentValue;
+ }
+ contentValue = "/" + contentValue;
+ }
+ ILoadingContext loadingContext = context.getLoadingContext();
+ URL resource = loadingContext.getResource(contentValue);
+ if (resource == null) {
+ URL resourcePath = context.getResourcePath();
+ String fPath = resourcePath.toString();
+ String absolutePath = PathHelper.getAbsolutePath(fPath,
+ contentValue);
+ if ((file = new File(absolutePath)).exists()) {
+ return file.toURI().toURL().toString();
+ }
+ resource = new URL(absolutePath);
+ }
+ return resource.toString();
+ } catch (MalformedURLException e) {
+ return value;
+ }
+ }
+
+ protected String removeSubString(String str, String subString) {
+ StringBuffer stringBuffer = new StringBuffer();
+ int lenOfsource = str.length();
+ int i;
+ int posStart;
+ for (posStart = 0; (i = str.indexOf(subString, posStart)) >= 0; posStart = i
+ + subString.length()) {
+ stringBuffer.append(str.substring(posStart, i));
+ }
+ if (posStart < lenOfsource) {
+ stringBuffer.append(str.substring(posStart));
+ }
+ return stringBuffer.toString();
+ }
+
+ protected String getContentValue(String text) {
+ StringBuffer stringBuffer = new StringBuffer();
+ String subString = "SWT.";
+ String str = XWTMaps.getCombAccelerator(text);
+
+ if (str.contains(subString)) {
+ str = removeSubString(str, subString);
+ }
+ if (str.contains("'")) {
+ str = removeSubString(str, "'");
+ }
+ if (str.contains(" ")) {
+ str = removeSubString(str, " ");
+ }
+ if (str.contains("|")) {
+ str = str.replace('|', '+');
+ }
+ stringBuffer.append(str);
+ return stringBuffer.toString();
+ }
+}
diff --git a/org.eclipse.xwt/src/org/eclipse/xwt/javabean/metadata/AbstractMetaclass.java b/org.eclipse.xwt/src/org/eclipse/xwt/javabean/metadata/AbstractMetaclass.java
index 3bb21a8..5c6daac 100644
--- a/org.eclipse.xwt/src/org/eclipse/xwt/javabean/metadata/AbstractMetaclass.java
+++ b/org.eclipse.xwt/src/org/eclipse/xwt/javabean/metadata/AbstractMetaclass.java
@@ -26,6 +26,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Composite;
@@ -41,6 +42,7 @@ import org.eclipse.xwt.XWT;
import org.eclipse.xwt.XWTException;
import org.eclipse.xwt.XWTMaps;
import org.eclipse.xwt.core.IBinding;
+import org.eclipse.xwt.internal.core.Binding;
import org.eclipse.xwt.internal.utils.UserData;
import org.eclipse.xwt.javabean.metadata.properties.BeanProperty;
import org.eclipse.xwt.javabean.metadata.properties.DynamicProperty;
@@ -139,35 +141,47 @@ public abstract class AbstractMetaclass implements IMetaclass {
addTypedEvent(IEventConstants.DEACTIVATE, SWT.Deactivate);
addTypedEvent(IEventConstants.DEFAULT_SELECTION,
SWT.DefaultSelection);
- addTypedEvent(IEventConstants.DEICONIFY, XWTMaps.getEvent("swt.deiconify"));
+ addTypedEvent(IEventConstants.DEICONIFY,
+ XWTMaps.getEvent("swt.deiconify"));
addTypedEvent(IEventConstants.DISPOSE, SWT.Dispose);
addTypedEvent(IEventConstants.DRAG_SELECT, SWT.DragDetect);
- addTypedEvent(IEventConstants.ERASE_ITEM, XWTMaps.getEvent("swt.eraseitem"));
+ addTypedEvent(IEventConstants.ERASE_ITEM,
+ XWTMaps.getEvent("swt.eraseitem"));
addTypedEvent(IEventConstants.EXPAND, SWT.Expand);
addTypedEvent(IEventConstants.FOCUS_IN, SWT.FocusIn);
addTypedEvent(IEventConstants.FOCUS_OUT, SWT.FocusOut);
- addTypedEvent(IEventConstants.HARD_KEY_DOWN, XWTMaps.getEvent("swt.hardkeydown"));
- addTypedEvent(IEventConstants.HARD_KEY_UP, XWTMaps.getEvent("swt.hardkeyup"));
+ addTypedEvent(IEventConstants.HARD_KEY_DOWN,
+ XWTMaps.getEvent("swt.hardkeydown"));
+ addTypedEvent(IEventConstants.HARD_KEY_UP,
+ XWTMaps.getEvent("swt.hardkeyup"));
addTypedEvent(IEventConstants.HELP, SWT.Help);
addTypedEvent(IEventConstants.HIDE, SWT.Hide);
- addTypedEvent(IEventConstants.ICONIFY, XWTMaps.getEvent("swt.iconify"));
+ addTypedEvent(IEventConstants.ICONIFY,
+ XWTMaps.getEvent("swt.iconify"));
addTypedEvent(IEventConstants.KEY_DOWN, SWT.KeyDown);
addTypedEvent(IEventConstants.KEY_UP, SWT.KeyUp);
- addTypedEvent(IEventConstants.MEASURE_ITEM, XWTMaps.getEvent("swt.measureitem"));
+ addTypedEvent(IEventConstants.MEASURE_ITEM,
+ XWTMaps.getEvent("swt.measureitem"));
addTypedEvent(IEventConstants.MENU_DETECT, SWT.MenuDetect);
addTypedEvent(IEventConstants.MODIFY, SWT.Modify);
addTypedEvent(IEventConstants.MOUSE_DOUBLE_CLICK,
SWT.MouseDoubleClick);
addTypedEvent(IEventConstants.MOUSE_DOWN, SWT.MouseDown);
- addTypedEvent(IEventConstants.MOUSE_ENTER, XWTMaps.getEvent("swt.mouseenter"));
- addTypedEvent(IEventConstants.MOUSE_EXIT, XWTMaps.getEvent("swt.mouseexit"));
- addTypedEvent(IEventConstants.MOUSE_HOVER, XWTMaps.getEvent("swt.mousehover"));
- addTypedEvent(IEventConstants.MOUSE_MOVE, XWTMaps.getEvent("swt.mousemove"));
+ addTypedEvent(IEventConstants.MOUSE_ENTER,
+ XWTMaps.getEvent("swt.mouseenter"));
+ addTypedEvent(IEventConstants.MOUSE_EXIT,
+ XWTMaps.getEvent("swt.mouseexit"));
+ addTypedEvent(IEventConstants.MOUSE_HOVER,
+ XWTMaps.getEvent("swt.mousehover"));
+ addTypedEvent(IEventConstants.MOUSE_MOVE,
+ XWTMaps.getEvent("swt.mousemove"));
addTypedEvent(IEventConstants.MOUSE_UP, SWT.MouseUp);
- addTypedEvent(IEventConstants.MOUSE_WHEEL, XWTMaps.getEvent("swt.mousewheel"));
+ addTypedEvent(IEventConstants.MOUSE_WHEEL,
+ XWTMaps.getEvent("swt.mousewheel"));
addTypedEvent(IEventConstants.MOVE, SWT.Move);
addTypedEvent(IEventConstants.PAINT, XWTMaps.getEvent("swt.paint"));
- addTypedEvent(IEventConstants.PAINT_ITEM, XWTMaps.getEvent("swt.paintitem"));
+ addTypedEvent(IEventConstants.PAINT_ITEM,
+ XWTMaps.getEvent("swt.paintitem"));
addTypedEvent(IEventConstants.RESIZE, SWT.Resize);
addTypedEvent(IEventConstants.SELECTION, SWT.Selection); // sash
addTypedEvent(IEventConstants.SET_DATA, SWT.SetData);
@@ -176,7 +190,8 @@ public abstract class AbstractMetaclass implements IMetaclass {
addTypedEvent(IEventConstants.SHOW, SWT.Show);
addTypedEvent(IEventConstants.TRAVERSE, SWT.Traverse);
addTypedEvent(IEventConstants.VERIFY, SWT.Verify);
- addTypedEvent(IEventConstants.IME_COMPOSITION, XWTMaps.getEvent("swt.imecomposition"));
+ addTypedEvent(IEventConstants.IME_COMPOSITION,
+ XWTMaps.getEvent("swt.imecomposition"));
}
buildTypedEvents = true;
}
@@ -404,7 +419,26 @@ public abstract class AbstractMetaclass implements IMetaclass {
int count = 0;
Class<?> childType = childElement.getClass();
+ // deal with the ValidationStatus tag
+ IMetaclass childMetaclass = XWT.getMetaclass(childElement);
+
+ if (childMetaclass.getType().equals(
+ org.eclipse.xwt.core.ValidationStatus.class)
+ && parentMetaclass.getClass()
+ .equals(BindingMetaclass.class)) {
+ IProperty childControlProperty = childMetaclass
+ .findProperty("control");
+ IProperty parentControlProperty = parentMetaclass
+ .findProperty("control");
+
+
+
+ childControlProperty.setValue(childElement,
+ parentControlProperty.getValue(parent));
+ }
+
for (IProperty property : properties) {
+
Class<?> propertyType = property.getType();
if (propertyType == null || propertyType == Object.class) {
continue;

Back to the top