/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.properties;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.ui.provider.PropertyDescriptor;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.widgets.Composite;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.editors.ModelEditorManager;
import org.teiid.designer.ui.viewsupport.ModelObjectPathLabelProvider;
/**
* ModelObjectPropertyDescriptor Extension to PropertyDescriptor
*
* @since 8.0
*/
public class ModelObjectPropertyDescriptor extends PropertyDescriptor {
private boolean showReadOnlyDialog = true;
private boolean lazyLoadValues = false;
public ModelObjectPropertyDescriptor( Object object,
IItemPropertyDescriptor itemPropertyDescriptor ) {
super(object, itemPropertyDescriptor);
}
public void setShowReadOnlyDialog( boolean enable ) {
showReadOnlyDialog = enable;
}
public void setLazyLoadValues( boolean enable ) {
lazyLoadValues = enable;
}
public Object getObject() {
return this.object;
}
/**
* @see org.eclipse.emf.edit.ui.provider.PropertyDescriptor#getLabelProvider()
* @since 4.2
*/
@Override
public ILabelProvider getLabelProvider() {
final Object feature = getFeature();
if ((feature instanceof EAttribute) && FloatAsIntPropertyEditorFactory.supports((EAttribute)feature)) {
return FloatAsIntPropertyEditorFactory.LABEL_PROVIDER;
}
if (feature instanceof EReference) {
int upperBound = ((EReference)feature).getUpperBound();
if (upperBound > 1 || upperBound == ETypedElement.UNBOUNDED_MULTIPLICITY) {
return (getLabelProvider(false));
}
}
return getLabelProvider(true);
}
/**
* Obtains a <code>ILabelProvider</code> whose text of an {@link EObject} includes a location.
*
* @param theUseSuperFlag the flag indicating if the location label provider should be used
* @return the label provider
* @since 4.2
*/
ILabelProvider getLabelProvider( boolean theUseLocationFlag ) {
ILabelProvider result = null;
if (theUseLocationFlag && (getObject() instanceof EObject)) {
result = new ModelObjectPathLabelProvider();
} else {
result = super.getLabelProvider();
}
return result;
}
/**
* The <code>ModelObjectLocationLabelProvider</code> provides location information for each <code>EObject</code>.
*
* @since 4.2
*/
class ModelObjectLocationLabelProvider extends LabelProvider {
ILabelProvider delegate = new ModelObjectPathLabelProvider();
@Override
public String getText( Object theElement ) {
return (theElement instanceof EObject) ? delegate.getText(theElement) : getLabelProvider(false).getText(theElement);
}
}
/**
* Return the cell editor provided by EMF
*
* @param composite
* @return
* @since 4.2
*/
public CellEditor createDelegatePropertyEditor( Composite composite ) {
return super.createPropertyEditor(composite);
}
/**
* Overridden from {@link PropertyDescriptor}. This returns the cell editor that will be used to edit the value of this
* property. This default implementation determines the type of cell editor from the nature of the structural feature.
*/
@Override
public CellEditor createPropertyEditor( Composite composite ) {
if (!itemPropertyDescriptor.canSetProperty(object)) {
return null;
}
if (object instanceof EObject) {
if (!lazyLoadValues) {
if (!ModelEditorManager.autoOpen(UiPlugin.getDefault().getCurrentWorkbenchWindow().getShell(), (EObject)object,
this.showReadOnlyDialog)) {
return null;
}
}
}
return PropertyEditorFactory.createPropertyEditor(composite, itemPropertyDescriptor, this, object, lazyLoadValues);
}
@Override
public Object getFeature() {
return itemPropertyDescriptor.getFeature(object);
}
}