blob: 72b74aeb56285b79b2520aab37a8369a5905fdc4 [file] [log] [blame]
/**
* Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Eugen Neufeld - initial API and implementation
*/
package org.eclipse.emf.ecp.view.mappingdmr.tooling;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.core.databinding.observable.IObserving;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Descriptor;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecp.common.spi.EMFUtils;
import org.eclipse.emf.ecp.view.internal.editor.controls.EditableEReferenceLabelControlSWTRenderer;
import org.eclipse.emf.ecp.view.spi.context.ViewModelContext;
import org.eclipse.emf.ecp.view.spi.mappingdmr.model.VMappingDomainModelReference;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emfforms.spi.common.report.ReportService;
import org.eclipse.emfforms.spi.core.services.databinding.DatabindingFailedException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
/**
* Control for a {@link VMappingDomainModelReference}.
*
* @author Eugen Neufeld
*
*/
@SuppressWarnings("restriction")
public class MappedEClassControlSWTRenderer extends
EditableEReferenceLabelControlSWTRenderer {
/**
* @param vElement the view model element to be rendered
* @param viewContext the view context
* @param reportService the {@link ReportService}
*/
public MappedEClassControlSWTRenderer(VControl vElement, ViewModelContext viewContext,
ReportService reportService) {
super(vElement, viewContext, reportService);
}
/**
* @author Eugen
*
*/
private static final class EClassTreeContentProvider implements ITreeContentProvider {
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public boolean hasChildren(Object element) {
if (EPackage.class.isInstance(element)) {
return true;
}
if (Descriptor.class.isInstance(element)) {
final Descriptor descriptor = (Descriptor) element;
descriptor.getEPackage();
return true;
}
return false;
}
@Override
public Object getParent(Object element) {
if (EClass.class.isInstance(element)) {
return ((EClass) element).eContainer();
}
return null;
}
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
@Override
public Object[] getChildren(Object parentElement) {
if (EPackage.class.isInstance(parentElement)) {
final EPackage ePackage = (EPackage) parentElement;
final Set<EClass> result = new LinkedHashSet<EClass>();
for (final EClassifier classifier : ePackage.getEClassifiers()) {
if (EClass.class.isInstance(classifier)) {
result.add((EClass) classifier);
}
}
return result.toArray();
}
if (Descriptor.class.isInstance(parentElement)) {
return getChildren(((Descriptor) parentElement).getEPackage());
}
if (Registry.class.isInstance(parentElement)) {
return ((Registry) parentElement).values().toArray();
}
if (Collection.class.isInstance(parentElement)) {
return Collection.class.cast(parentElement).toArray();
}
return null;
}
}
@Override
protected void linkValue(Shell shell) {
IObservableValue observableValue;
try {
observableValue = getEMFFormsDatabinding()
.getObservableValue(getVElement().getDomainModelReference(), getViewModelContext().getDomainModel());
} catch (final DatabindingFailedException ex) {
showLinkValueFailedMessageDialog(shell, ex);
return;
}
final VMappingDomainModelReference dmr = (VMappingDomainModelReference) ((IObserving) observableValue)
.getObserved();
observableValue.dispose();
final ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(new AdapterFactory[] {
new ReflectiveItemProviderAdapterFactory(),
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE) });
final AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(
adapterFactory);
final ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(shell, labelProvider,
getContentProvider());
dialog.setAllowMultiple(false);
dialog.setValidator(new ISelectionStatusValidator() {
@Override
public IStatus validate(Object[] selection) {
if (selection.length != 0 && EClass.class.isInstance(selection[0])) {
return Status.OK_STATUS;
}
return new Status(IStatus.ERROR, org.eclipse.emf.ecp.view.internal.editor.controls.Activator.PLUGIN_ID,
"This is not an EClass."); //$NON-NLS-1$
}
});
dialog.setInput(getInput(dmr));
dialog.setMessage("Select an EClass."); //$NON-NLS-1$
dialog.setTitle("Select an EClass."); //$NON-NLS-1$
dialog.setComparator(new ViewerComparator());
final int result = dialog.open();
if (Window.OK == result) {
final Object selection = dialog.getFirstResult();
if (EClass.class.isInstance(selection)) {
final EClass selectedFeature = (EClass) selection;
dmr.setMappedClass(selectedFeature);
}
}
labelProvider.dispose();
}
private ITreeContentProvider getContentProvider() {
return new EClassTreeContentProvider();
}
/**
* @return an instance of the {@link org.eclipse.emf.ecore.EPackage.Registry}
*/
private Object getInput(VMappingDomainModelReference dmr) {
final EClass referenceMap = EReference.class.cast(dmr.getDomainModelEFeature()).getEReferenceType();
final EReference valueReference = EReference.class.cast(referenceMap.getEStructuralFeature("value")); //$NON-NLS-1$
if (valueReference == null) {
return null;
}
return EMFUtils.getSubClasses(valueReference.getEReferenceType());
// return Registry.INSTANCE;
}
}