blob: 4e201ee3e8e2740f0c95774091f4e0569dcfe840 [file] [log] [blame]
package org.eclipse.papyrus.aas.ui.widgets;
import java.util.List;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.papyrus.infra.tools.databinding.MultipleObservableValue;
import org.eclipse.papyrus.infra.ui.emf.databinding.EObjectObservableValueEditingSupport;
import org.eclipse.papyrus.infra.ui.emf.dialog.EObjectTreeReferenceValueEditor;
import org.eclipse.papyrus.infra.widgets.providers.DelegatingStyledLabelProvider;
import org.eclipse.swt.widgets.Composite;
/**
* This class extends TreeReferenceDialog and allow the display of EObjectObservableValue.
*/
public class AASEObjectTreeReferenceValueEditor extends EObjectTreeReferenceValueEditor {
/**
* {@link MultipleObservableValue} which contained all the IObservableValues.
*/
protected MultipleObservableValue multipleObservableValue = new MultipleObservableValue();
/**
* Constructor.
*
* @param parent
* the parent composite.
* @param style
* The style of the composite to create.
*/
public AASEObjectTreeReferenceValueEditor(final Composite parent, final int style) {
super(parent, style);
tree.setHeaderVisible(false);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (null == selection || selection.isEmpty()) {
unsetButton.setEnabled(false);
} else {
unsetButton.setEnabled(true);
}
}
});
}
/**
* {@inheritDoc}
*/
@Override
public void setValueRootContentProvider() {
if (null != treeViewer) {
if (treeViewer.getContentProvider() instanceof AASEObjectObservableValueContentProvider) {
((AASEObjectObservableValueContentProvider) treeViewer.getContentProvider()).setValueRoot(multipleObservableValue);
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void setProvidersTreeViewer() {
treeViewer.setContentProvider(new AASEObjectObservableValueContentProvider(multipleObservableValue));
if (labelProvider instanceof IStyledLabelProvider) {
treeViewer.setLabelProvider(new AASEObjectObservableValueLabelProvider((IStyledLabelProvider) labelProvider));
} else {
treeViewer.setLabelProvider(new AASEObjectObservableValueLabelProvider(new DelegatingStyledLabelProvider(labelProvider)));
}
treeViewer.setInput(""); //$NON-NLS-1$
if (null != tree && null != tree.getTopItem()) {
treeViewer.expandToLevel(tree.getTopItem().getData(), 10);
}
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("rawtypes")
@Override
public IObservableValue createWidgetObservable(final IObservableValue modelProperty) {
multipleObservableValue.getObservableValues().clear();
if (modelProperty.getValue() instanceof EObject) {
TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain((EObject) modelProperty.getValue());
multipleObservableValue.getObservableValues().add(new AASEObjectStructuredObservableValue((EObject) modelProperty.getValue(), null, editingDomain, true, null));
} else if (modelProperty.getValue() instanceof List<?>) {
for (Object object : (List<?>) modelProperty.getValue()) {
if (object instanceof EObject) {
TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(object);
multipleObservableValue.getObservableValues().add(new AASEObjectStructuredObservableValue((EObject) object, null, editingDomain, true, null));
}
}
}
return multipleObservableValue;
}
/**
* {@inheritDoc}
*/
@Override
public EditingSupport createEditingSupport() {
return new EObjectObservableValueEditingSupport(treeViewer, valueFactory);
}
/**
* {@inheritDoc}
*/
@Override
public void unsetAction() {
Object valueModelProperty = modelProperty.getValue();
if (valueModelProperty instanceof EObject) {
setValue(null);
} else if (valueModelProperty instanceof List<?>) {
ITreeSelection structuredSelection = treeViewer.getStructuredSelection();
EList<?> eList = new BasicEList<Object>((List<?>) valueModelProperty);
for (Object selection : structuredSelection.toList()) {
if (selection instanceof AASEObjectStructuredObservableValue) {
AASEObjectStructuredObservableValue rootObservableValue = getRootObservableValue((AASEObjectStructuredObservableValue) selection);
if (eList.contains(rootObservableValue.getObserved())) {
eList.remove(rootObservableValue.getObserved());
}
}
}
setValue(eList);
}
checkCreateInstanceButton();
}
/**
* Returns the root parent of an EObjectStructuredObservableValue.
*
* @param observableValue
* The child ObservableValue.
* @return The root parent
*/
private AASEObjectStructuredObservableValue getRootObservableValue(final AASEObjectStructuredObservableValue observableValue) {
AASEObjectStructuredObservableValue parentRoot = observableValue;
if (null != observableValue.getParent()) {
parentRoot = getRootObservableValue(observableValue.getParent());
}
return parentRoot;
}
/**
* {@inheritDoc}
*/
@Override
public void checkCreateInstanceButton() {
if (null != modelProperty && null != modelProperty.getValueType()) {
Object valueType = modelProperty.getValueType();
if (valueType instanceof EReference) {
int upperBound = ((EReference) valueType).getUpperBound();
int size = multipleObservableValue.getObservableValues().size();
if (-1 != upperBound && size >= upperBound) {
createInstanceButton.setEnabled(false);
} else {
createInstanceButton.setEnabled(true);
}
}
}
}
}