/*******************************************************************************
* Copyright (c) 2006-2013 The RCP Company 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:
* The RCP Company - initial API and implementation
*******************************************************************************/
package com.rcpcompany.uibindings.internal;
import static java.lang.Math.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.UpdateListStrategy;
import org.eclipse.core.databinding.UpdateSetStrategy;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
import org.eclipse.emf.ecore.util.EObjectEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Widget;
import com.rcpcompany.uibindings.BindingState;
import com.rcpcompany.uibindings.Constants;
import com.rcpcompany.uibindings.IArgumentContext;
import com.rcpcompany.uibindings.IArgumentInformation;
import com.rcpcompany.uibindings.IArgumentProvider;
import com.rcpcompany.uibindings.IArgumentValue;
import com.rcpcompany.uibindings.IBinding;
import com.rcpcompany.uibindings.IBindingContext;
import com.rcpcompany.uibindings.IBindingDataType;
import com.rcpcompany.uibindings.IManager;
import com.rcpcompany.uibindings.IUIBindingsPackage;
import com.rcpcompany.uibindings.utils.EditingDomainUtils;
import com.rcpcompany.utils.basic.ClassUtils;
import com.rcpcompany.utils.basic.ToStringUtils;
import com.rcpcompany.utils.logging.LogUtils;
/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Binding</b></em>'. <!--
* end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getContext <em>Context</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getState <em>State</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#isChangeable <em>Changeable</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getCreationPoint <em>Creation Point
* </em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getId <em>Id</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getType <em>Type</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getLabel <em>Label</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getStaticDataType <em>Static Data Type
* </em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getDataType <em>Data Type</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getModelEType <em>Model EType</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getModelType <em>Model Type</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getUIType <em>UI Type</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getDBBindings <em>DB Bindings</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getMonitoredDBBindings <em>Monitored DB
* Bindings</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getErrorConditions <em>Error Conditions
* </em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getWidget <em>Widget</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getControl <em>Control</em>}</li>
* <li>{@link com.rcpcompany.uibindings.internal.BindingImpl#getExtraArgumentProviders <em>Extra
* Argument Providers</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public abstract class BindingImpl extends BaseObjectImpl implements IBinding {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
protected BindingImpl() {
super();
if (Activator.getDefault().CREATION_POINT_STACK_LEVELS > 0) {
final Throwable cp = new Throwable();
cp.fillInStackTrace();
final StackTraceElement[] stackTrace = cp.getStackTrace();
int i = 0;
for (i = 0; i < stackTrace.length; i++) {
if (stackTrace[i].getMethodName().equals("addBinding")) {
// Ignore this frame as well
i++;
break;
}
}
final StackTraceElement[] newStackTrace = new StackTraceElement[min(stackTrace.length - i,
Activator.getDefault().CREATION_POINT_STACK_LEVELS)];
System.arraycopy(stackTrace, i, newStackTrace, 0, newStackTrace.length);
cp.setStackTrace(newStackTrace);
setCreationPoint(cp);
}
if (Activator.getDefault().TRACE_LIFECYCLE_BINDINGS) {
LogUtils.debug(this, this + " constructed"); //$NON-NLS-1$
}
}
@Override
public void dispose() {
setState(BindingState.DISPOSE_PENDING);
if (Activator.getDefault().TRACE_LIFECYCLE_BINDINGS) {
LogUtils.debug(this, this + " disposed"); //$NON-NLS-1$
}
/*
* The context can be null if the binding was never properly created... which of cause
* should only happen if something doesn't work properly :-)
*/
if (getContext() != null) {
getContext().getOkBindings().remove(this);
}
setState(BindingState.DISPOSED);
setContext(null);
}
@Override
public void setArguments(Map<String, Object> arguments) {
if (arguments == null) return;
getArguments().putAll(arguments);
}
@Override
public void assertTrue(boolean b, String message) {
if (!b) {
LogUtils.throwException(this, message, getCreationPoint());
}
}
@Override
public void addDBBinding(Binding dataBinding, boolean monitorStatus) {
getDBBindings().add(dataBinding);
if (monitorStatus) {
getMonitoredDBBindings().add(dataBinding);
}
}
@Override
public void bindList(IObservableList targetObservableList, IObservableList modelObservableList,
UpdateListStrategy targetToModel, UpdateListStrategy modelToTarget, boolean monitorStatus) {
final Binding b = getContext().getDbContext().bindList(targetObservableList, modelObservableList,
targetToModel, modelToTarget);
addDBBinding(b, monitorStatus);
}
@Override
public void bindSet(IObservableSet targetObservableSet, IObservableSet modelObservableSet,
UpdateSetStrategy targetToModel, UpdateSetStrategy modelToTarget) {
final Binding b = getContext().getDbContext().bindSet(targetObservableSet, modelObservableSet, targetToModel,
modelToTarget);
addDBBinding(b, false);
}
@Override
public Binding bindValue(IObservableValue targetObservableValue, IObservableValue modelObservableValue,
UpdateValueStrategy targetToModel, UpdateValueStrategy modelToTarget, boolean monitorStatus) {
final Binding b = getContext().getDbContext().bindValue(targetObservableValue, modelObservableValue,
targetToModel, modelToTarget);
addDBBinding(b, monitorStatus);
return b;
}
/**
* The default value of the '{@link #getState() <em>State</em>}' attribute. <!-- begin-user-doc
* --> <!-- end-user-doc -->
*
* @see #getState()
* @generated
* @ordered
*/
protected static final BindingState STATE_EDEFAULT = BindingState.INIT;
/**
* The cached value of the '{@link #getState() <em>State</em>}' attribute. <!-- begin-user-doc
* --> <!-- end-user-doc -->
*
* @see #getState()
* @generated
* @ordered
*/
protected BindingState state = STATE_EDEFAULT;
/**
* The default value of the '{@link #isChangeable() <em>Changeable</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #isChangeable()
* @generated
* @ordered
*/
protected static final boolean CHANGEABLE_EDEFAULT = false;
/**
* The default value of the '{@link #getCreationPoint() <em>Creation Point</em>}' attribute.
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getCreationPoint()
* @generated
* @ordered
*/
protected static final Throwable CREATION_POINT_EDEFAULT = null;
/**
* The cached value of the '{@link #getCreationPoint() <em>Creation Point</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getCreationPoint()
* @generated
* @ordered
*/
protected Throwable creationPoint = CREATION_POINT_EDEFAULT;
/**
* The default value of the '{@link #getId() <em>Id</em>}' attribute. <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @see #getId()
* @generated
* @ordered
*/
protected static final String ID_EDEFAULT = null;
/**
* The cached value of the '{@link #getId() <em>Id</em>}' attribute. <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
* @see #getId()
* @generated
* @ordered
*/
protected String id = ID_EDEFAULT;
/**
* The default value of the '{@link #getType() <em>Type</em>}' attribute. <!-- begin-user-doc
* --> <!-- end-user-doc -->
*
* @see #getType()
* @generated
* @ordered
*/
protected static final String TYPE_EDEFAULT = null;
/**
* The default value of the '{@link #getLabel() <em>Label</em>}' attribute. <!-- begin-user-doc
* --> <!-- end-user-doc -->
*
* @see #getLabel()
* @generated
* @ordered
*/
protected static final String LABEL_EDEFAULT = null;
/**
* The cached value of the '{@link #getStaticDataType() <em>Static Data Type</em>}' reference.
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getStaticDataType()
* @generated
* @ordered
*/
protected IBindingDataType staticDataType;
/**
* The cached value of the '{@link #getDBBindings() <em>DB Bindings</em>}' attribute list. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getDBBindings()
* @generated
* @ordered
*/
protected EList<Binding> dbBindings;
/**
* The cached value of the '{@link #getMonitoredDBBindings() <em>Monitored DB Bindings</em>}'
* attribute list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getMonitoredDBBindings()
* @generated
* @ordered
*/
protected EList<Binding> monitoredDBBindings;
/**
* The cached value of the '{@link #getErrorConditions() <em>Error Conditions</em>}' attribute
* list. <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @see #getErrorConditions()
* @generated
* @ordered
*/
protected EList<String> errorConditions;
/**
* The default value of the '{@link #getWidget() <em>Widget</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getWidget()
* @generated
* @ordered
*/
protected static final Widget WIDGET_EDEFAULT = null;
/**
* The default value of the '{@link #getControl() <em>Control</em>}' attribute. <!--
* begin-user-doc --> <!-- end-user-doc -->
*
* @see #getControl()
* @generated
* @ordered
*/
protected static final Control CONTROL_EDEFAULT = null;
/**
* The cached value of the '{@link #getExtraArgumentProviders()
* <em>Extra Argument Providers</em>}' reference list. <!-- begin-user-doc --> <!-- end-user-doc
* -->
*
* @see #getExtraArgumentProviders()
* @generated
* @ordered
*/
protected EList<IArgumentProvider> extraArgumentProviders;
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
protected EClass eStaticClass() {
return IUIBindingsPackage.Literals.BINDING;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public IBindingContext getContext() {
if (eContainerFeatureID() != IUIBindingsPackage.BINDING__CONTEXT) return null;
return (IBindingContext) eContainer();
}
@Override
public EditingDomain getEditingDomain() {
final IBindingContext context = getContext();
if (context == null) return EditingDomainUtils.getEditingDomain();
return context.getEditingDomain();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public NotificationChain basicSetContext(IBindingContext newContext, NotificationChain msgs) {
msgs = eBasicSetContainer((InternalEObject) newContext, IUIBindingsPackage.BINDING__CONTEXT, msgs);
return msgs;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public void setContext(IBindingContext newContext) {
if (newContext != eInternalContainer()
|| (eContainerFeatureID() != IUIBindingsPackage.BINDING__CONTEXT && newContext != null)) {
if (EcoreUtil.isAncestor(this, newContext))
throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
NotificationChain msgs = null;
if (eInternalContainer() != null) {
msgs = eBasicRemoveFromContainer(msgs);
}
if (newContext != null) {
msgs = ((InternalEObject) newContext).eInverseAdd(this, IUIBindingsPackage.BINDING_CONTEXT__BINDINGS,
IBindingContext.class, msgs);
}
msgs = basicSetContext(newContext, msgs);
if (msgs != null) {
msgs.dispatch();
}
} else if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__CONTEXT, newContext,
newContext));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public BindingState getState() {
return state;
}
@Override
public boolean isDisposed() {
switch (getState()) {
case DISPOSE_PENDING:
case DISPOSED:
return true;
default:
return false;
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public void setState(BindingState newState) {
final BindingState oldState = state;
state = newState == null ? STATE_EDEFAULT : newState;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__STATE, oldState, state));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setStateGen(BindingState newState) {
final BindingState oldState = state;
state = newState == null ? STATE_EDEFAULT : newState;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__STATE, oldState, state));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public boolean isChangeable() {
return false;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public Throwable getCreationPoint() {
return creationPoint;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setCreationPoint(Throwable newCreationPoint) {
final Throwable oldCreationPoint = creationPoint;
creationPoint = newCreationPoint;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__CREATION_POINT,
oldCreationPoint, creationPoint));
}
}
/**
* A map with all binding specific arguments added with {@link IBinding#arg(String, Object)}.
*/
private Map<String, Object> myArguments = null;
@Override
public Map<String, Object> getArguments() {
if (myArguments == null) {
myArguments = new HashMap<String, Object>();
}
return myArguments;
}
@Override
public boolean hasArguments() {
return myArguments != null && !myArguments.isEmpty();
}
@Override
public IBinding getParentBinding() {
return null;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public String getId() {
return id;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public void setId(String newId) {
final String oldId = id;
id = newId;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__ID, oldId, id));
}
}
@Override
public Object getArgument(String name) {
if (!hasArguments()) return null;
return getArguments().get(name);
}
/**
* Cached results from {@link #getArgument(String, Class, Object)}.
*/
private final Map<String, Object> myCachedArguments = new HashMap<String, Object>();
/**
* The package prefix name for all internal packages.
*/
private static final String INTERNAL_PACKAGE_NAME = BindingImpl.class.getPackage().getName();
/**
* The package prefix name for all internal spy packages.
*/
private static final String SPY_PACKAGE_NAME = INTERNAL_PACKAGE_NAME + ".spy"; //$NON-NLS-1$
@Override
public void clearCachedArguments() {
myCachedArguments.clear();
}
/**
* Implementation of {@link IArgumentValue}.
*
* @param <ArgumentType> the type of the argument value
*/
public static class ArgumentValue<ArgumentType> implements IArgumentValue<ArgumentType> {
private final Object mySource;
private final ArgumentType myValue;
/**
* Constructs and returns a new argument value object.
*
* @param source the source
* @param value the value
*/
public ArgumentValue(Object source, ArgumentType value) {
super();
mySource = source;
myValue = value;
}
@Override
public Object getSource() {
return mySource;
}
@Override
public ArgumentType getValue() {
return myValue;
}
}
@Override
public <ArgumentType> List<IArgumentValue<ArgumentType>> getArguments(final String name,
final Class<? extends ArgumentType> argumentType, final boolean firstOnly) {
final List<IArgumentValue<ArgumentType>> results = new ArrayList<IArgumentValue<ArgumentType>>();
final String type;
/*
* Prevent recursion
*/
if (!name.equals(Constants.ARG_TYPE)) {
type = getType();
} else {
type = null;
}
final IManager manager = IManager.Factory.getManager();
final IArgumentInformation ai = manager.getArgumentInformation(name);
final Set<IBindingDataType> visitedDataTypes = new HashSet<IBindingDataType>();
final IArgumentContext<ArgumentType> context = new IArgumentContext<ArgumentType>() {
@Override
public IBinding getBinding() {
return BindingImpl.this;
}
@Override
public String getName() {
return name;
}
@Override
public IArgumentInformation getArgumentInformation() {
return ai;
}
@Override
public String getType() {
return type;
}
@Override
public Class<? extends ArgumentType> getArgumentType() {
return argumentType;
}
@Override
public boolean firstOnly() {
return firstOnly;
}
@Override
public void addResult(Object source, ArgumentType value) {
results.add(new ArgumentValue<ArgumentType>(source, value));
}
@Override
public boolean isResultFound() {
return firstOnly() && !results.isEmpty();
}
@Override
public boolean addDataType(IBindingDataType dataType) {
return visitedDataTypes.add(dataType);
}
};
try {
/*
* Try all enabled extenders
*/
addDecoratorExtenderArguments(context);
if (context.isResultFound()) return results;
/*
* Check direct arguments
*/
addDirectArguments(context);
if (context.isResultFound()) return results;
/*
* Add decorator provider arguments
*/
addDecoratorProviderArguments(context);
if (context.isResultFound()) return results;
/*
* Add any arguments from the parent binding: value -> column and column -> viewer
*/
if (context.getArgumentInformation().isLookupParent()) {
final IArgumentProvider parentBinding = getParentBinding();
if (parentBinding != null) {
manager.addArgumentProviderArguments(parentBinding, context);
if (context.isResultFound()) return results;
}
}
/*
* Now use the list of IBDT object to look for annotations.
*/
final IBindingDataType dynamicDataType = getDataType();
if (dynamicDataType != null) {
// LogUtils.debug(this, this + ": " + getStaticDataType() + "/" + getDataType());
dynamicDataType.addArguments(context);
if (context.isResultFound()) return results;
dynamicDataType.addSFSuperContainingClassArguments(context);
if (context.isResultFound()) return results;
dynamicDataType.addSuperDataTypeArguments(context);
if (context.isResultFound()) return results;
}
/*
* Try the (static) model data type...
*/
final IBindingDataType sDataType = getStaticDataType();
if (sDataType != null) {
sDataType.addArguments(context);
if (context.isResultFound()) return results;
sDataType.addSFSuperContainingClassArguments(context);
if (context.isResultFound()) return results;
sDataType.addSuperDataTypeArguments(context);
if (context.isResultFound()) return results;
}
/*
* Now use the parent IBDTs if they exists
*/
if (dynamicDataType != null) {
dynamicDataType.addParentDataTypeArguments(context);
if (context.isResultFound()) return results;
}
/*
* Try the model data type...
*/
if (sDataType != null) {
sDataType.addParentDataTypeArguments(context);
if (context.isResultFound()) return results;
}
/*
* And then any extra argument providers added to the binding
*/
if (eIsSet(IUIBindingsPackage.Literals.BINDING__EXTRA_ARGUMENT_PROVIDERS)) {
for (final IArgumentProvider ap : getExtraArgumentProviders()) {
manager.addArgumentProviderArguments(ap, context);
if (context.isResultFound()) return results;
}
}
return results;
} finally {
if (Activator.getDefault().TRACE_ARGUMENTS
&& (Activator.getDefault().TRACE_ARGUMENT_TYPES == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(name))
&& (Activator.getDefault().TRACE_ARGUMENT_BINDINGS == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(getBaseType()))) {
final StringBuilder sb = new StringBuilder(400);
sb.append(this).append("(").append(name).append(") [firstOnly=").append(firstOnly).append("]");
for (final IArgumentValue<ArgumentType> a : results) {
sb.append("\n '").append(a.getValue()).append("': ").append(a.getSource());
}
LogUtils.debug(this, sb.toString());
}
}
}
/**
* Handles any additions of arguments from decorator extenders.
*
* @param <ArgumentType> the argument type
* @param results the result list
* @param name the name of the wanted argument
* @param argumentType the argument type
* @param firstOnly <code>true</code> if only the first result is of interest
* @return <code>true</code> if ant results was found
*/
public <ArgumentType> void addDecoratorExtenderArguments(IArgumentContext<ArgumentType> context) {
}
/**
* Handles any additions of arguments from decorator provider.
*
* @param <ArgumentType> the argument type
* @param results the result list
* @param name the name of the wanted argument
* @param argumentType the argument type
* @param firstOnly <code>true</code> if only the first result is of interest
* @return <code>true</code> if ant results was found
*/
public <ArgumentType> void addDecoratorProviderArguments(IArgumentContext<ArgumentType> context) {
}
/**
* Handles any additions of arguments from direct arguments.
*
* @param <ArgumentType> the argument type
* @param results the result list
* @param name the name of the wanted argument
* @param argumentType the argument type
* @param firstOnly <code>true</code> if only the first result is of interest
* @return <code>true</code> if ant results was found
*/
public <ArgumentType> void addDirectArguments(IArgumentContext<ArgumentType> context) {
IManager.Factory.getManager().addArgumentProviderArguments(this, context);
}
@Override
public <ArgumentType> ArgumentType getArgument(String name, Class<? extends ArgumentType> argumentType,
ArgumentType defaultValue) {
/*
* Check any cached previous results
*/
if (myCachedArguments.containsKey(name)) {
final Object value = myCachedArguments.get(name);
if (value == null) return null;
if (argumentType.isInstance(value)) {
if (Activator.getDefault().TRACE_ARGUMENT
&& (Activator.getDefault().TRACE_ARGUMENT_TYPES == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(name))
&& (Activator.getDefault().TRACE_ARGUMENT_BINDINGS == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(getBaseType()))) {
LogUtils.debug(this, this + "(" + name + ") [cached]=" + value);
}
return (ArgumentType) value;
}
LogUtils.error(this, "Cached argument '" + name + "' value '" + value + "' not of right type (expected " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ argumentType + ", got " + value.getClass() + "). Ignored.", getCreationPoint()); //$NON-NLS-1$ //$NON-NLS-2$
myCachedArguments.remove(name);
}
final List<IArgumentValue<ArgumentType>> list = getArguments(name, argumentType, true);
/*
* If no results was found, then use the default value
*/
if (list == null || list.size() == 0) {
if (Activator.getDefault().TRACE_ARGUMENT
&& (Activator.getDefault().TRACE_ARGUMENT_TYPES == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(name))
&& (Activator.getDefault().TRACE_ARGUMENT_BINDINGS == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(getBaseType()))) {
LogUtils.debug(this, this + "(" + name + ") [default]=" + defaultValue);
}
myCachedArguments.put(name, defaultValue);
return defaultValue;
}
final ArgumentType value = list.get(0).getValue();
myCachedArguments.put(name, value);
if (Activator.getDefault().TRACE_ARGUMENT
&& (Activator.getDefault().TRACE_ARGUMENT_TYPES == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(name))
&& (Activator.getDefault().TRACE_ARGUMENT_BINDINGS == null || Activator.getDefault().TRACE_ARGUMENT_TYPES
.contains(getBaseType()))) {
LogUtils.debug(this, this + "(" + name + ") [calc]=" + value + "\nsource: " + list.get(0).getSource());
}
return value;
}
@Override
public void registerWidget(Widget widget) {
assertTrue(widget != null, "widget null"); //$NON-NLS-1$
assertTrue(widget.getData(InternalConstants.WIDGET_KEY) == null, widget
+ ": Widget already registered to binding"); //$NON-NLS-1$
widget.setData(InternalConstants.WIDGET_KEY, this);
}
@Override
public void unregisterWidget(Widget widget) {
assertTrue(widget != null, "widget null"); //$NON-NLS-1$
if (!widget.isDisposed()) {
widget.setData(InternalConstants.WIDGET_KEY, null);
}
}
public static IBinding getBindingForWidget(Widget widget) {
if (widget == null) return null;
while (widget != null) {
final IBinding b = (IBinding) widget.getData(InternalConstants.WIDGET_KEY);
if (b != null) return b;
if (widget.isDisposed()) return null;
if (!(widget instanceof Control)) return null;
widget = ((Control) widget).getParent();
}
return null;
}
@Override
public abstract void finish1();
@Override
public void finish2() {
}
@Override
public void finish3() {
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public String getType() {
return getArgument(Constants.ARG_TYPE, String.class, ""); //$NON-NLS-1$
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public String getLabel() {
String name;
name = getArgument(Constants.ARG_LABEL, String.class, null);
if (name == null) {
name = ToStringUtils.formatHumanReadable(getDataType().getName());
}
return name;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public IBindingDataType getStaticDataType() {
return staticDataType;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
public void setStaticDataType(IBindingDataType newStaticDataType) {
final IBindingDataType oldStaticDataType = staticDataType;
staticDataType = newStaticDataType;
if (eNotificationRequired()) {
eNotify(new ENotificationImpl(this, Notification.SET, IUIBindingsPackage.BINDING__STATIC_DATA_TYPE,
oldStaticDataType, staticDataType));
}
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public IBindingDataType getDataType() {
return getStaticDataType();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public EClassifier getModelEType() {
final IBindingDataType dt = getDataType();
if (dt == null) return null;
return dt.getEType();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public Class<?> getModelType() {
final IBindingDataType dt = getDataType();
if (dt == null) return null;
return dt.getDataType();
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public abstract Class<?> getUIType();
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<Binding> getDBBindings() {
if (dbBindings == null) {
dbBindings = new EDataTypeUniqueEList<Binding>(Binding.class, this, IUIBindingsPackage.BINDING__DB_BINDINGS);
}
return dbBindings;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<Binding> getMonitoredDBBindings() {
if (monitoredDBBindings == null) {
monitoredDBBindings = new EDataTypeUniqueEList<Binding>(Binding.class, this,
IUIBindingsPackage.BINDING__MONITORED_DB_BINDINGS);
}
return monitoredDBBindings;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<String> getErrorConditions() {
if (errorConditions == null) {
errorConditions = new EDataTypeUniqueEList<String>(String.class, this,
IUIBindingsPackage.BINDING__ERROR_CONDITIONS);
}
return errorConditions;
}
@Override
public void addErrorCondition(String error) {
LogUtils.error(this, this + ": " + error, getCreationPoint());
getErrorConditions().add(error);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public abstract Widget getWidget();
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public abstract Control getControl();
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public EList<IArgumentProvider> getExtraArgumentProviders() {
if (extraArgumentProviders == null) {
extraArgumentProviders = new EObjectEList<IArgumentProvider>(IArgumentProvider.class, this,
IUIBindingsPackage.BINDING__EXTRA_ARGUMENT_PROVIDERS);
}
return extraArgumentProviders;
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
if (eInternalContainer() != null) {
msgs = eBasicRemoveFromContainer(msgs);
}
return basicSetContext((IBindingContext) otherEnd, msgs);
}
return super.eInverseAdd(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
return basicSetContext(null, msgs);
}
return super.eInverseRemove(otherEnd, featureID, msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
switch (eContainerFeatureID()) {
case IUIBindingsPackage.BINDING__CONTEXT:
return eInternalContainer().eInverseRemove(this, IUIBindingsPackage.BINDING_CONTEXT__BINDINGS,
IBindingContext.class, msgs);
}
return super.eBasicRemoveFromContainerFeature(msgs);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
return getContext();
case IUIBindingsPackage.BINDING__STATE:
return getState();
case IUIBindingsPackage.BINDING__CHANGEABLE:
return isChangeable();
case IUIBindingsPackage.BINDING__CREATION_POINT:
return getCreationPoint();
case IUIBindingsPackage.BINDING__ID:
return getId();
case IUIBindingsPackage.BINDING__TYPE:
return getType();
case IUIBindingsPackage.BINDING__LABEL:
return getLabel();
case IUIBindingsPackage.BINDING__STATIC_DATA_TYPE:
return getStaticDataType();
case IUIBindingsPackage.BINDING__DATA_TYPE:
return getDataType();
case IUIBindingsPackage.BINDING__MODEL_ETYPE:
return getModelEType();
case IUIBindingsPackage.BINDING__MODEL_TYPE:
return getModelType();
case IUIBindingsPackage.BINDING__UI_TYPE:
return getUIType();
case IUIBindingsPackage.BINDING__DB_BINDINGS:
return getDBBindings();
case IUIBindingsPackage.BINDING__MONITORED_DB_BINDINGS:
return getMonitoredDBBindings();
case IUIBindingsPackage.BINDING__ERROR_CONDITIONS:
return getErrorConditions();
case IUIBindingsPackage.BINDING__WIDGET:
return getWidget();
case IUIBindingsPackage.BINDING__CONTROL:
return getControl();
case IUIBindingsPackage.BINDING__EXTRA_ARGUMENT_PROVIDERS:
return getExtraArgumentProviders();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
setContext((IBindingContext) newValue);
return;
case IUIBindingsPackage.BINDING__STATE:
setState((BindingState) newValue);
return;
case IUIBindingsPackage.BINDING__CREATION_POINT:
setCreationPoint((Throwable) newValue);
return;
case IUIBindingsPackage.BINDING__ID:
setId((String) newValue);
return;
case IUIBindingsPackage.BINDING__STATIC_DATA_TYPE:
setStaticDataType((IBindingDataType) newValue);
return;
case IUIBindingsPackage.BINDING__DB_BINDINGS:
getDBBindings().clear();
getDBBindings().addAll((Collection<? extends Binding>) newValue);
return;
case IUIBindingsPackage.BINDING__MONITORED_DB_BINDINGS:
getMonitoredDBBindings().clear();
getMonitoredDBBindings().addAll((Collection<? extends Binding>) newValue);
return;
case IUIBindingsPackage.BINDING__ERROR_CONDITIONS:
getErrorConditions().clear();
getErrorConditions().addAll((Collection<? extends String>) newValue);
return;
case IUIBindingsPackage.BINDING__EXTRA_ARGUMENT_PROVIDERS:
getExtraArgumentProviders().clear();
getExtraArgumentProviders().addAll((Collection<? extends IArgumentProvider>) newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
setContext((IBindingContext) null);
return;
case IUIBindingsPackage.BINDING__STATE:
setState(STATE_EDEFAULT);
return;
case IUIBindingsPackage.BINDING__CREATION_POINT:
setCreationPoint(CREATION_POINT_EDEFAULT);
return;
case IUIBindingsPackage.BINDING__ID:
setId(ID_EDEFAULT);
return;
case IUIBindingsPackage.BINDING__STATIC_DATA_TYPE:
setStaticDataType((IBindingDataType) null);
return;
case IUIBindingsPackage.BINDING__DB_BINDINGS:
getDBBindings().clear();
return;
case IUIBindingsPackage.BINDING__MONITORED_DB_BINDINGS:
getMonitoredDBBindings().clear();
return;
case IUIBindingsPackage.BINDING__ERROR_CONDITIONS:
getErrorConditions().clear();
return;
case IUIBindingsPackage.BINDING__EXTRA_ARGUMENT_PROVIDERS:
getExtraArgumentProviders().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case IUIBindingsPackage.BINDING__CONTEXT:
return getContext() != null;
case IUIBindingsPackage.BINDING__STATE:
return state != STATE_EDEFAULT;
case IUIBindingsPackage.BINDING__CHANGEABLE:
return isChangeable() != CHANGEABLE_EDEFAULT;
case IUIBindingsPackage.BINDING__CREATION_POINT:
return CREATION_POINT_EDEFAULT == null ? creationPoint != null : !CREATION_POINT_EDEFAULT
.equals(creationPoint);
case IUIBindingsPackage.BINDING__ID:
return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
case IUIBindingsPackage.BINDING__TYPE:
return TYPE_EDEFAULT == null ? getType() != null : !TYPE_EDEFAULT.equals(getType());
case IUIBindingsPackage.BINDING__LABEL:
return LABEL_EDEFAULT == null ? getLabel() != null : !LABEL_EDEFAULT.equals(getLabel());
case IUIBindingsPackage.BINDING__STATIC_DATA_TYPE:
return staticDataType != null;
case IUIBindingsPackage.BINDING__DATA_TYPE:
return getDataType() != null;
case IUIBindingsPackage.BINDING__MODEL_ETYPE:
return getModelEType() != null;
case IUIBindingsPackage.BINDING__MODEL_TYPE:
return getModelType() != null;
case IUIBindingsPackage.BINDING__UI_TYPE:
return getUIType() != null;
case IUIBindingsPackage.BINDING__DB_BINDINGS:
return dbBindings != null && !dbBindings.isEmpty();
case IUIBindingsPackage.BINDING__MONITORED_DB_BINDINGS:
return monitoredDBBindings != null && !monitoredDBBindings.isEmpty();
case IUIBindingsPackage.BINDING__ERROR_CONDITIONS:
return errorConditions != null && !errorConditions.isEmpty();
case IUIBindingsPackage.BINDING__WIDGET:
return WIDGET_EDEFAULT == null ? getWidget() != null : !WIDGET_EDEFAULT.equals(getWidget());
case IUIBindingsPackage.BINDING__CONTROL:
return CONTROL_EDEFAULT == null ? getControl() != null : !CONTROL_EDEFAULT.equals(getControl());
case IUIBindingsPackage.BINDING__EXTRA_ARGUMENT_PROVIDERS:
return extraArgumentProviders != null && !extraArgumentProviders.isEmpty();
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public String toString() {
String baseType = getBaseType();
if (hasArguments()) {
for (final Entry<String, Object> e : getArguments().entrySet()) {
String s = e.getValue() == null ? Messages.ValueBindingImpl_NullString : e.getValue().toString();
if (s.length() > 15) {
s = s.substring(0, 3) + "..." + s.substring(s.length() - 3); //$NON-NLS-1$
}
baseType += ", " + e.getKey() + "=" + s; //$NON-NLS-1$ //$NON-NLS-2$
}
}
if (getState() != BindingState.OK) {
baseType += ", STATE=" + getState();
}
return ClassUtils.getLastClassName(this) + "[" + baseType + "]#" + System.identityHashCode(this); //$NON-NLS-1$ //$NON-NLS-2$
}
protected String getBaseType() {
final EClassifier modelEType = getModelEType();
if (modelEType != null) return modelEType.getName();
return "";
}
@Override
public void updateBinding() {
// Do nothing
}
@Override
public void updateBinding(Object[] objects) {
updateBinding();
}
} // BindingImpl