blob: aa97ba1adeb7ce5189d06e2d60915497838d3cc1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012, 2013, 2014 Red Hat, Inc.
* All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
*
* @author Bob Brodt
******************************************************************************/
package org.eclipse.bpmn2.modeler.core.adapters;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.bpmn2.Bpmn2Package;
import org.eclipse.bpmn2.FormalExpression;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
* A convenience wrapper class for <b>most</b> of the ExtendedPropertiesAdapter methods.
* <p>
* Most methods provide reasonable defaults for EObjects that can <b>not</b> be adapted
* for {@code ExtendedPropertiesAdapter}
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ExtendedPropertiesProvider {
/**
* See {@link ObjectDescriptor#getLabel()}
*/
public static String getLabel(EObject object) {
String label = ""; //$NON-NLS-1$
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null)
label = adapter.getObjectDescriptor().getLabel();
else if (object!=null)
label = ModelUtil.toCanonicalString(object.eClass().getName());
return label;
}
/**
* See {@link ObjectDescriptor#setLabel(String)}
*/
public static void setLabel(EObject object, String label) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null)
adapter.getObjectDescriptor().setLabel(label);
}
/**
* See {@link FeatureDescriptor#getLabel()}
*/
public static String getLabel(EObject object, EStructuralFeature feature) {
String label = ""; //$NON-NLS-1$
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null)
label = adapter.getFeatureDescriptor(feature).getLabel();
else
label = ModelUtil.toCanonicalString(feature.getName());
label = label.replaceAll(" Ref$", ""); //$NON-NLS-1$ //$NON-NLS-2$
return label;
}
/**
* See {@link FeatureDescriptor#setLabel()}
*/
public static void setLabel(EObject object, EStructuralFeature feature, String label) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null)
adapter.getFeatureDescriptor(feature).setLabel(label);
}
/**
* See {@link ObjectDescriptor#getTextValue()}
*/
public static String getTextValue(EObject object) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
String text = adapter.getObjectDescriptor().getTextValue();
if (text != null && !text.isEmpty()) {
return text;
}
if (object instanceof FormalExpression)
return "";
}
return ModelUtil.toCanonicalString(object);
}
/**
* See {@link ObjectDescriptor#setTextValue(String)}
*/
public static boolean setTextValue(EObject object, String value) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter!=null) {
adapter.getObjectDescriptor().setTextValue(value);
return true;
}
return false;
}
/**
* See {@link FeatureDescriptor#getTextValue()}
*/
public static String getTextValue(EObject object, EStructuralFeature feature) {
if (feature == null)
return getTextValue(object);
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object, feature);
if (adapter != null)
return adapter.getFeatureDescriptor(feature).getTextValue();
try {
Object value = object.eGet(feature);
return value.toString();
} catch (Exception e) {
}
return ""; //$NON-NLS-1$
}
/**
* See {@link FeatureDescriptor#getValue()}
*/
public static Object getValue(final EObject object, final EStructuralFeature feature) {
return getValue(object, feature, -1);
}
/**
* See {@link FeatureDescriptor#getValueList()}
*/
public static List<Object> getValueList(EObject object, EStructuralFeature feature) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object, feature);
return adapter.getFeatureDescriptor(feature).getValueList();
}
/**
* See {@link FeatureDescriptor#getValue(int)}
*/
public static Object getValue(final EObject object, final EStructuralFeature feature, int index) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
Object value = adapter == null ? object.eGet(feature) : adapter.getFeatureDescriptor(feature).getValue(index);
return value;
}
/**
* See {@link FeatureDescriptor#setValue(Object)}
*/
public static boolean setValue(EObject object, EStructuralFeature feature, Object value) {
return setValue(object, feature, value, -1);
}
/**
* See {@link FeatureDescriptor#setValue(Object,int)}
*/
public static boolean setValue(EObject object, EStructuralFeature feature, Object value, int index) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
return adapter.getFeatureDescriptor(feature).setValue(value, index);
}
/**
* See {@link FeatureDescriptor#isMultiLine()}
*/
public static boolean isMultiLineText(EObject object, EStructuralFeature feature) {
if (feature == null)
return false;
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null)
return adapter.getFeatureDescriptor(feature).isMultiLine();
return false;
}
/**
* See {@link FeatureDescriptor#setMultiLine(boolean)}
*/
public static boolean setMultiLineText(EObject object, EStructuralFeature feature, boolean multiLine) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
adapter.getFeatureDescriptor(feature).setMultiLine(multiLine);
return true;
}
return false;
}
/**
* See {@link FeatureDescriptor#getChoiceOfValues()}
*/
public static Hashtable<String, Object> getChoiceOfValues(EObject object, EStructuralFeature feature) {
if (feature == null)
return null;
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object, feature);
try {
return adapter.getFeatureDescriptor(feature).getChoiceOfValues();
}
catch (Exception e) {}
if (feature.getEType() instanceof EEnum) {
EEnum en = (EEnum) feature.getEType();
Hashtable<String, Object> choices = new Hashtable<String, Object>();
for (EEnumLiteral el : en.getELiterals()) {
choices.put(el.getLiteral(), el.getInstance());
}
return choices;
}
return null;
}
/**
* See {@link ExtendedPropertiesAdapter.UI_IS_MULTI_CHOICE}
*/
public static boolean isMultiChoice(EObject object, EStructuralFeature feature) {
if (feature == null) {
return false;
}
if (feature.getEType() instanceof EEnum) {
return true;
}
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_IS_MULTI_CHOICE);
if (result instanceof Boolean)
return ((Boolean) result);
}
if (feature instanceof EReference && feature.isMany()) {
return !((EReference)feature).isContainment();
}
return getChoiceOfValues(object, feature) != null;
}
/**
* See {@link ExtendedPropertiesAdapter.UI_CAN_EDIT}
*/
public static boolean canEdit(EObject object, EStructuralFeature feature) {
if (feature != null && feature.getEType() instanceof EClass) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_EDIT);
if (result instanceof Boolean)
return ((Boolean) result);
}
if (feature instanceof EReference) {
if (((EReference) feature).isContainment())
return true;
if (Bpmn2Package.eINSTANCE.getRootElement().isSuperTypeOf((EClass) feature.getEType()))
return true;
if (feature.isMany())
return true;
return false;
}
return true;
}
return false;
}
/**
* See {@link ExtendedPropertiesAdapter.UI_CAN_CREATE_NEW}
*/
public static boolean canCreateNew(EObject object, EStructuralFeature feature) {
if (feature != null && feature.getEType() instanceof EClass) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_CREATE_NEW);
if (result instanceof Boolean)
return ((Boolean) result);
}
if (feature instanceof EReference) {
if (((EReference) feature).isContainment())
return true;
if (Bpmn2Package.eINSTANCE.getRootElement().isSuperTypeOf((EClass) feature.getEType()))
return true;
return false;
}
return true;
}
return false;
}
/**
* See {@link ExtendedPropertiesAdapter.UI_CAN_EDIT_INLINE}
*/
public static boolean canEditInline(EObject object, EStructuralFeature feature) {
if (feature != null && feature.getEType() instanceof EClass) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter != null) {
Object result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_EDIT_INLINE);
if (result instanceof Boolean)
return ((Boolean) result);
}
}
return false;
}
/**
* See {@link ExtendedPropertiesAdapter.UI_CAN_SET_NULL}
*/
public static boolean canSetNull(EObject object, EStructuralFeature feature) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
Object result = null;
if (adapter != null) {
result = adapter.getProperty(feature, ExtendedPropertiesAdapter.UI_CAN_SET_NULL);
if (result instanceof Boolean && ((Boolean)result)==true)
return true;
}
if (feature != null && feature.getEType() instanceof EClass && result instanceof Boolean) {
return (Boolean) result;
}
return false;
}
/**
* Check if the given object feature is a containment list.
*
* @param object the EObject
* @param feature the object's feature
* @return true if the feature is a reference, and is a containment list.
*/
public static boolean isList(EObject object, EStructuralFeature feature) {
if (feature instanceof EReference) {
return feature.isMany() && ((EReference)feature).isContainment();
}
return false;
}
/**
* Check if the given object feature is a containment feature.
*
* @param object the EObject
* @param feature the object's feature
* @return true if the feature is a reference, and is a containment feature.
*/
public static boolean isContainmentFeature(EObject object, EStructuralFeature feature) {
if (feature instanceof EReference) {
if (((EReference)feature).isContainment()) {
if (feature.getEType() instanceof EClass)
return true;
}
}
return false;
}
/**
* Check if the given object feature is an attribute.
*
* @param object the EObject
* @param feature the object's feature
* @return true if the feature is an attribute.
*/
public static boolean isAttribute(EObject object, EStructuralFeature feature) {
if (feature instanceof EAttribute)
return true;
return false;
}
/**
* Check if the given object feature is a reference.
*
* @param object the EObject
* @param feature the object's feature
* @return true if the feature is a reference.
*/
public static boolean isReference(EObject object, EStructuralFeature feature) {
if (feature instanceof EReference)
return true;
return false;
}
/**
* Get the given object feature's type.
*
* @param object the EObject
* @param feature the object's feature
* @return the feature's type.
*/
public static EClassifier getEType(EObject object, EStructuralFeature feature) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object);
if (adapter!=null) {
adapter.getFeatureDescriptor(feature).getEType();
}
return feature.getEType();
}
/**
* See {@link ExtendedPropertiesAdapter#compare(EObject, EObject, boolean)}
*/
public static boolean compare(EObject object1, EObject object2, boolean similar) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object1);
if (adapter!=null) {
adapter.getObjectDescriptor().compare(object2, similar);
}
return ExtendedPropertiesAdapter.compare(object1, object2, similar);
}
}