blob: c1608e4dd3aeb2182fa288f6eb1632d28a479f01 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2012 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.merrimac.dialogs;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.bpmn2.Bpmn2Package;
import org.eclipse.bpmn2.modeler.core.preferences.ModelEnablements;
import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.graphiti.ui.editor.DiagramEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.dialogs.ListDialog;
/**
* @author Bob Brodt
*
*/
public class ModelSubclassSelectionDialog extends ListDialog {
protected EClass listItemClass;
protected List<EClass> items;
protected DiagramEditor diagramEditor;
public ModelSubclassSelectionDialog(DiagramEditor diagramEditor, EObject object, EStructuralFeature feature) {
this(diagramEditor, object, feature, null);
}
public ModelSubclassSelectionDialog(DiagramEditor diagramEditor, EObject object, EStructuralFeature feature, EClass listItemClass) {
super(diagramEditor.getSite().getShell());
this.diagramEditor = diagramEditor;
if (listItemClass==null)
listItemClass = (EClass)feature.getEType(); // allow a classcast exception
this.listItemClass = listItemClass;
ModelEnablements modelEnablement = (ModelEnablements)diagramEditor.getAdapter(ModelEnablements.class);
items = new ArrayList<EClass>();
if (listItemClass!=null
&& !listItemClass.isAbstract()
&& !listItemClass.isInterface()
&& modelEnablement.isEnabled(listItemClass))
items.add(listItemClass);
for (EClassifier eclassifier : Bpmn2Package.eINSTANCE.getEClassifiers()) {
if (eclassifier instanceof EClass) {
EClass eclass = (EClass)eclassifier;
if (eclass.getEAllSuperTypes().contains(listItemClass)) {
if (modelEnablement.isEnabled(eclass)) {
items.add(eclass);
}
}
}
}
filterList(items);
if (items.size()>1) {
setContentProvider(new IStructuredContentProvider() {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public Object[] getElements(Object inputElement) {
return items.toArray();
}
});
setLabelProvider(new ILabelProvider() {
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
@Override
public Image getImage(Object element) {
return null;
}
@Override
public String getText(Object element) {
return ModelUtil.toCanonicalString( ((EClass)element).getName() );
}
});
setTitle(NLS.bind(
Messages.ModelSubclassSelectionDialog_Title,
ModelUtil.toCanonicalString(listItemClass.getName()))
);
setAddCancelButton(true);
setHelpAvailable(false);
setInput(new Object());
}
}
public TargetRuntime getTargetRuntime() {
return (TargetRuntime) diagramEditor.getAdapter(TargetRuntime.class);
}
// allow override to add/remove items from the superset
protected void filterList(List<EClass> items) {
}
@Override
public int open() {
if (items.size()<=1) {
return Window.OK;
}
return super.open();
}
@Override
public Object[] getResult() {
if (items.size()==0) {
return new Object[] { listItemClass };
}
if (items.size()==1) {
return new Object[] { items.get(0) };
}
return super.getResult();
}
}