/*******************************************************************************
* 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.papyrus.xwt.internal.utils;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.papyrus.xwt.IObservableValueListener;
import org.eclipse.papyrus.xwt.XWT;
import org.eclipse.papyrus.xwt.core.IUserDataConstants;
import org.eclipse.papyrus.xwt.core.TriggerBase;
import org.eclipse.papyrus.xwt.databinding.BindingContext;
import org.eclipse.papyrus.xwt.databinding.IBindingContext;
import org.eclipse.papyrus.xwt.internal.core.IEventController;
import org.eclipse.papyrus.xwt.internal.core.ScopeKeeper;
import org.eclipse.papyrus.xwt.javabean.Controller;
import org.eclipse.papyrus.xwt.jface.JFacesHelper;
import org.eclipse.papyrus.xwt.metadata.IProperty;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.ControlEditor;
import org.eclipse.swt.custom.TableTreeItem;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Caret;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.ExpandItem;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.ToolTip;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
public class UserData {
private HashMap<Object, Object> dictionary = null;
private IObservableValueListener observableValueManager;
protected IObservableValueListener getObservableValueManager() {
return observableValueManager;
}
protected void setObservableValueManager(IObservableValueListener observableValueManager) {
this.observableValueManager = observableValueManager;
}
public void setData(Object key, Object value) {
if(dictionary == null) {
dictionary = new HashMap<Object, Object>();
}
dictionary.put(key, value);
if(observableValueManager != null && (key instanceof IProperty)) {
IObservableValue observableValue = observableValueManager.getValue((IProperty)key);
observableValue.setValue(value);
}
}
public Object getData(Object key) {
if(dictionary == null) {
return null;
}
return dictionary.get(key);
}
public Object removeData(Object key) {
if(dictionary == null) {
return null;
}
return dictionary.remove(key);
}
public boolean containsKey(Object key) {
if(dictionary == null) {
return false;
}
return dictionary.containsKey(key);
}
public Collection<Object> keySet() {
if(dictionary == null) {
return Collections.emptyList();
}
return dictionary.keySet();
}
public static boolean isUIElementType(Object element) {
if(element instanceof Class<?>) {
Class<?> elementType = (Class<?>)element;
return Widget.class.isAssignableFrom(elementType) || Viewer.class.isAssignableFrom(elementType) || ControlEditor.class.isAssignableFrom(elementType);
}
return false;
}
public static void bindNameContext(Object element, ScopeKeeper nameContext) {
Widget widget = getWidget(element);
if(widget == null) {
return;
}
UserData dataDictionary = updateDataDictionary(widget);
if(dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY) != null) {
throw new IllegalStateException("Name context is already set");
}
dataDictionary.setData(IUserDataConstants.XWT_NAMECONTEXT_KEY, nameContext);
}
protected static UserData updateDataDictionary(Object target) {
Widget widget = getWidget(target);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
dataDictionary = new UserData();
widget.setData(IUserDataConstants.XWT_USER_DATA_KEY, dataDictionary);
}
return dataDictionary;
}
public static Shell findShell(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
if(widget instanceof Shell) {
return (Shell)widget;
}
Control parent = (Control)findParent(widget, Control.class);
if(parent != null) {
return parent.getShell();
}
return null;
}
/**
* Find the root widget used by XWT. In fact, it tries to find the root
* ScopeKeeper
*
* @param element
* @return
*/
public static Widget findRootWidget(Object element) {
Widget root = null;
Widget current = getWidget(element);
while(current != null) {
ScopeKeeper scopeKeeper = findScopeKeeper(current);
if(scopeKeeper != null) {
root = current;
}
current = getTreeParent(current);
}
return root;
}
public static Composite findCompositeParent(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
Control control = getParent(widget);
while(control != null && !(control instanceof Composite)) {
control = getParent(control);
}
return (Composite)control;
}
public static Object findParent(Widget element, Class<?> type) {
Widget widget = getTreeParent(element);
while(widget != null && !(type.isInstance(widget))) {
widget = getTreeParent(widget);
}
return widget;
}
public static ScopeKeeper findScopeKeeper(Object element) {
ScopeKeeper scopeKeeper = getLocalScopeKeeper(element);
if(scopeKeeper != null) {
return scopeKeeper;
}
Widget parent = getTreeParent(element);
if(parent != null && !parent.isDisposed()) {
return findScopeKeeper(parent);
}
return null;
}
public static Widget findScopeRoot(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
Widget current = widget;
while(current != null) {
UserData dataDictionary = (UserData)current.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
Object data = dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY);
if(data != null) {
return current;
}
}
current = getTreeParent(current);
}
return null;
}
public static ScopeKeeper getLocalScopeKeeper(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
Object data = dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY);
if(data != null) {
return (ScopeKeeper)data;
}
}
return null;
}
public static Object findElementByName(Object context, String name) {
Widget widget = getWidget(context);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
ScopeKeeper nameContext = (ScopeKeeper)dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY);
if(nameContext != null) {
Object element = nameContext.getNamedObject(name);
if(element != null) {
return element;
}
}
}
Widget parent = getTreeParent(widget);
if(parent != null) {
return findElementByName(parent, name);
}
return null;
}
public static String getElementName(Object object) {
Widget widget = getWidget(object);
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
return (String)dataDictionary.getData(IUserDataConstants.XWT_NAME_KEY);
}
return null;
}
public static void setElementName(Object object, String name, boolean updateScope) {
Widget widget = getWidget(object);
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
dataDictionary.setData(IUserDataConstants.XWT_NAME_KEY, name);
if(updateScope) {
ScopeKeeper keeper = findScopeKeeper(object);
if(keeper != null) {
keeper.addNamedObject(name, object);
}
}
}
}
public static void setCLR(Object widget, Object type) {
setLocalData(widget, IUserDataConstants.XWT_CLR_KEY, type);
}
public static Object getCLR(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
Object data = dataDictionary.getData(IUserDataConstants.XWT_CLR_KEY);
if(data != null) {
return data;
}
}
Widget parent = getParent(widget);
if(parent != null) {
return getCLR(parent);
}
return null;
}
public static Widget getTreeParent(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
widget = (Widget)dataDictionary.getData(IUserDataConstants.XWT_PARENT_KEY);
if(widget != null) {
return widget;
}
}
return getParent(element);
}
public static Control getParent(Object element) {
Widget widget = getWidget(element);
if(widget instanceof Control) {
Control control = (Control)widget;
return control.getParent();
} else if(widget instanceof Menu) {
Menu item = (Menu)widget;
return item.getParent();
} else if(widget instanceof MenuItem) {
MenuItem item = (MenuItem)widget;
Menu menu = item.getParent();
if(menu == null) {
return null;
}
return menu.getParent();
} else if(widget instanceof ScrollBar) {
ScrollBar item = (ScrollBar)widget;
return item.getParent();
} else if(widget instanceof ToolTip) {
ToolTip item = (ToolTip)widget;
return item.getParent();
} else if(widget instanceof CoolItem) {
CoolItem item = (CoolItem)widget;
return item.getParent();
} else if(widget instanceof CTabItem) {
CTabItem item = (CTabItem)widget;
return item.getParent();
} else if(widget instanceof ExpandItem) {
ExpandItem item = (ExpandItem)widget;
return item.getParent();
} else if(widget instanceof TabItem) {
TabItem item = (TabItem)widget;
return item.getParent();
} else if(widget instanceof TableColumn) {
TableColumn item = (TableColumn)widget;
return item.getParent();
} else if(widget instanceof TableItem) {
TableItem item = (TableItem)widget;
return item.getParent();
} else if(widget instanceof TableTreeItem) {
TableTreeItem item = (TableTreeItem)widget;
return item.getParent();
} else if(widget instanceof ToolItem) {
ToolItem item = (ToolItem)widget;
return item.getParent();
} else if(widget instanceof TreeColumn) {
TreeColumn item = (TreeColumn)widget;
return item.getParent();
} else if(widget instanceof TreeItem) {
TreeItem item = (TreeItem)widget;
return item.getParent();
} else if(widget instanceof Caret) {
Caret item = (Caret)widget;
return item.getParent();
}
return null;
}
public static IEventController findEventController(Object widget) {
return (IEventController)findData(widget, IUserDataConstants.XWT_CONTROLLER_KEY);
}
public static Object getDataContext(Object widget) {
return findData(widget, IUserDataConstants.XWT_DATACONTEXT_KEY);
}
public static IBindingContext getBindingContext(Object widget) {
return (IBindingContext)findData(widget, IUserDataConstants.XWT_BINDING_CONTEXT_KEY);
}
public static TriggerBase[] getTriggers(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return TriggerBase.EMPTY_ARRAY;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
TriggerBase[] triggers = (TriggerBase[])dataDictionary.getData(IUserDataConstants.XWT_TRIGGERS_KEY);
if(triggers != null) {
return triggers;
}
}
return TriggerBase.EMPTY_ARRAY;
}
public static void setTriggers(Object widget, TriggerBase[] triggers) {
setLocalData(widget, IUserDataConstants.XWT_TRIGGERS_KEY, triggers);
}
public static Widget getDataContextHost(Object element) {
Widget widget = getWidget(element);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
Object host = null;
if(dataDictionary != null) {
host = dataDictionary.getData(IUserDataConstants.XWT_DATACONTEXT_KEY);
if(host != null) {
return widget;
}
}
Widget parent = widget;
while(parent != null) {
dataDictionary = (UserData)parent.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
host = dataDictionary.getData(IUserDataConstants.XWT_DATACONTEXT_KEY);
if(host != null) {
return parent;
}
parent = (Widget)dataDictionary.getData(IUserDataConstants.XWT_PARENT_KEY);
} else {
parent = getParent(parent);
}
}
return null;
}
public static void setBindingContext(Object widget, Object bindingContext) {
setLocalData(widget, IUserDataConstants.XWT_BINDING_CONTEXT_KEY, bindingContext);
}
public static void setDataContext(Object widget, Object dataContext) {
setLocalData(widget, IUserDataConstants.XWT_DATACONTEXT_KEY, dataContext);
}
public static Widget getWidget(Object target) {
if(JFacesHelper.isViewer(target)) {
return JFacesHelper.getControl(target);
} else if(target instanceof Widget) {
return (Widget)target;
} else if(target instanceof TableViewerColumn) {
return ((TableViewerColumn)target).getColumn();
} else if(target instanceof ControlEditor) {
return ((ControlEditor)target).getEditor();
}
return null;
}
public static Viewer getLocalViewer(Object object) {
return (Viewer)getLocalData(object, IUserDataConstants.XWT_VIEWER_KEY);
}
public static Object getLocalDataContext(Object object) {
return getLocalData(object, IUserDataConstants.XWT_DATACONTEXT_KEY);
}
public static boolean hasLocalDataContext(Object object) {
return hasLocalData(object, IUserDataConstants.XWT_DATACONTEXT_KEY);
}
public static Object getLocalData(Object object, IProperty property) {
Widget widget = getWidget(object);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return null;
}
return dataDictionary.getData(property);
}
public static Object getLocalData(Object object, String key) {
Widget widget = getWidget(object);
if(widget == null) {
return null;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return null;
}
return dataDictionary.getData(key);
}
public static boolean hasLocalData(Object object, String propertyName) {
Widget widget = getWidget(object);
if(widget == null) {
return false;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return false;
}
return dataDictionary.containsKey(propertyName);
}
public static boolean hasLocalData(Object object, IProperty property) {
Widget widget = getWidget(object);
if(widget == null) {
return false;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return false;
}
return dataDictionary.containsKey(property);
}
public static void removeLocalData(Object object, IProperty property) {
Widget widget = getWidget(object);
if(widget == null) {
return;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return;
}
dataDictionary.removeData(property);
}
public static void removeLocalData(Object object, String key) {
Widget widget = getWidget(object);
if(widget == null) {
return;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary == null) {
return;
}
dataDictionary.removeData(key);
}
public static Map<String, Object> getLocalResources(Object object) {
return (Map<String, Object>)getLocalData(object, IUserDataConstants.XWT_RESOURCES_KEY);
}
public static Object findResource(Object object, String key) {
Map<String, Object> map = (Map<String, Object>)getLocalData(object, IUserDataConstants.XWT_RESOURCES_KEY);
if(map.containsKey(key)) {
return map.get(key);
}
Object parent = getTreeParent(object);
if(parent != null) {
return findResource(parent, key);
}
return null;
}
public static void setResources(Object object, Map<?, ?> resources) {
setLocalData(object, IUserDataConstants.XWT_RESOURCES_KEY, resources);
}
public static void setParent(Object object, Object parent) {
setLocalData(object, IUserDataConstants.XWT_PARENT_KEY, parent);
}
public static void setViewer(Object object, Object parent) {
setLocalData(object, IUserDataConstants.XWT_VIEWER_KEY, parent);
}
public static void setEventController(Object object, IEventController controller) {
setLocalData(object, IUserDataConstants.XWT_CONTROLLER_KEY, controller);
}
public static IEventController updateEventController(Object object) {
UserData dataDictionary = updateDataDictionary(object);
IEventController controller = (IEventController)dataDictionary.getData(IUserDataConstants.XWT_CONTROLLER_KEY);
if(controller == null) {
controller = new Controller();
dataDictionary.setData(IUserDataConstants.XWT_CONTROLLER_KEY, controller);
}
return controller;
}
public static void setLocalData(Object object, String key, Object value) {
UserData dataDictionary = updateDataDictionary(object);
dataDictionary.setData(key, value);
}
public static void setLocalData(Object object, IProperty property, Object value) {
UserData dataDictionary = updateDataDictionary(object);
dataDictionary.setData(property, value);
}
public static IObservableValueListener getObservableValueManager(Object object) {
Widget widget = getWidget(object);
if(widget == null) {
return null;
}
UserData userData = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(userData != null) {
return userData.getObservableValueManager();
}
return null;
}
public static void setObservableValueManager(Object object, IObservableValueListener eventManager) {
Widget widget = getWidget(object);
if(widget == null) {
throw new IllegalStateException("Not SWT Widget");
}
UserData userData = updateDataDictionary(object);
userData.setObservableValueManager(eventManager);
}
public static Object findData(Object object, String key) {
Widget widget = getWidget(object);
if(widget == null) {
return Collections.EMPTY_MAP;
}
UserData dataDictionary = (UserData)widget.getData(IUserDataConstants.XWT_USER_DATA_KEY);
Object resources = null;
if(dataDictionary != null) {
resources = dataDictionary.getData(key);
if(resources != null) {
return resources;
}
}
Widget parent = widget;
while(parent != null) {
dataDictionary = (UserData)parent.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
resources = dataDictionary.getData(key);
if(resources != null) {
return resources;
}
parent = (Widget)dataDictionary.getData(IUserDataConstants.XWT_PARENT_KEY);
} else {
parent = getParent(parent);
}
}
return null;
}
public static Map<?, ?> getResources(Object object) {
return (Map<?, ?>)findData(object, IUserDataConstants.XWT_RESOURCES_KEY);
}
public static void setObjectName(Object object, String name) {
Widget widget = getWidget(object);
ScopeKeeper nameScoped;
if(UserData.findElementByName(widget, name) != null) {
// throw an exception or log a message?
return;
}
Widget parent = UserData.getTreeParent(widget);
UserData dataDictionary = (UserData)parent.getData(IUserDataConstants.XWT_USER_DATA_KEY);
if(dataDictionary != null) {
if(dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY) != null) {
nameScoped = (ScopeKeeper)dataDictionary.getData(IUserDataConstants.XWT_NAMECONTEXT_KEY);
} else {
ScopeKeeper parentNameScope = findScopeKeeper(parent);
nameScoped = new ScopeKeeper(parentNameScope, widget);
bindNameContext(parent, nameScoped);
}
nameScoped.addNamedObject(name, widget);
}
// throw an exception or log a message?
}
public static IBindingContext createBindingContext(Object host) {
Widget widget = getWidget(host);
final IBindingContext dataBindingContext = new BindingContext(widget);
dataBindingContext.setRealm(XWT.getRealm());
widget.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
dataBindingContext.dispose();
}
});
UserData.setLocalData(host, IUserDataConstants.XWT_BINDING_CONTEXT_KEY, dataBindingContext);
return dataBindingContext;
}
}