blob: 14bda82f01c7c5fe5ebc0a2b77b1d110c0cd51c7 [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
*******************************************************************************/
package org.eclipse.bpmn2.modeler.ui.property.diagrams;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.bpmn2.Bpmn2Package;
import org.eclipse.bpmn2.DocumentRoot;
import org.eclipse.bpmn2.EndPoint;
import org.eclipse.bpmn2.Import;
import org.eclipse.bpmn2.impl.DefinitionsImpl;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractPropertiesProvider;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultDetailComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.DefaultListComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeContentProvider;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.PropertiesCompositeFactory;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.TableColumn;
import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ObjectEditor;
import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.TextAndButtonObjectEditor;
import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.TextObjectEditor;
import org.eclipse.bpmn2.modeler.core.runtime.ModelExtensionDescriptor;
import org.eclipse.bpmn2.modeler.core.runtime.ModelExtensionDescriptor.Property;
import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
import org.eclipse.bpmn2.modeler.core.utils.ImportUtil;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.bpmn2.modeler.core.utils.NamespaceUtil;
import org.eclipse.bpmn2.modeler.ui.property.dialogs.NamespacesEditingDialog;
import org.eclipse.bpmn2.modeler.ui.property.dialogs.SchemaImportDialog;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreEMap;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
public class DefinitionsPropertyComposite extends DefaultDetailComposite {
public DefinitionsPropertyComposite(Composite parent, int style) {
super(parent, style);
}
private NamespaceListComposite namespacesTable;
/**
* @param section
*/
public DefinitionsPropertyComposite(AbstractBpmn2PropertySection section) {
super(section);
}
@Override
public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
if (propertiesProvider==null) {
propertiesProvider = new AbstractPropertiesProvider(object) {
String[] properties = new String[] {
"name", //$NON-NLS-1$
"targetNamespace", //$NON-NLS-1$
"typeLanguage", //$NON-NLS-1$
"expressionLanguage", //$NON-NLS-1$
"exporter", //$NON-NLS-1$
"exporterVersion", //$NON-NLS-1$
"imports", //$NON-NLS-1$
"namespaces", //$NON-NLS-1$
"rootElements#ItemDefinition", //$NON-NLS-1$
"relationships", //$NON-NLS-1$
"rootElements#PartnerEntity", //$NON-NLS-1$
"rootElements#PartnerRole", //$NON-NLS-1$
// "rootElements#EndPoint", //$NON-NLS-1$
"rootElements#Resource", //$NON-NLS-1$
"rootElements#DataStore", //$NON-NLS-1$
"rootElements#Message", //$NON-NLS-1$
"rootElements#Error", //$NON-NLS-1$
"rootElements#Escalation", //$NON-NLS-1$
"rootElements#Signal", //$NON-NLS-1$
"rootElements#CorrelationProperty", //$NON-NLS-1$
"rootElements#Category", //$NON-NLS-1$
};
@Override
public String[] getProperties() {
return properties;
}
};
}
return propertiesProvider;
}
@Override
public void cleanBindings() {
super.cleanBindings();
namespacesTable = null;
}
@Override
protected Composite bindProperty(EObject be, String property) {
if ("namespaces".equals(property)) {
namespacesTable = new NamespaceListComposite(getPropertySection());
DefinitionsImpl definitions = (DefinitionsImpl)getBusinessObject();
DocumentRoot root = (DocumentRoot) definitions.eContainer();
namespacesTable.bindList(root, Bpmn2Package.eINSTANCE.getDocumentRoot_XMLNSPrefixMap());
namespacesTable.setTitle("Namespaces"); //$NON-NLS-1$
return namespacesTable;
}
return super.bindProperty(be, property);
}
@Override
protected AbstractListComposite bindList(EObject object, EStructuralFeature feature, EClass listItemClass) {
if ("imports".equals(feature.getName())) { //$NON-NLS-1$
ImportListComposite importsTable = new ImportListComposite(getPropertySection());
EStructuralFeature importsFeature = object.eClass().getEStructuralFeature("imports"); //$NON-NLS-1$
importsTable.bindList(object, importsFeature);
return importsTable;
}
else if ("relationships".equals(feature.getName())) { //$NON-NLS-1$
DefaultListComposite table = new DefaultListComposite(getPropertySection());
table.bindList(getBusinessObject(), feature);
return table;
}
else if (listItemClass!=null && listItemClass.getName().equals("EndPoint")) {
EndPointListComposite table = new EndPointListComposite(getPropertySection());
table.bindList(getBusinessObject(), feature);
return table;
}
else {
return super.bindList(object, feature, listItemClass);
}
}
public class NamespaceListComposite extends DefaultListComposite {
public NamespaceListComposite(AbstractBpmn2PropertySection section) {
super(section, ADD_BUTTON | REMOVE_BUTTON | EDIT_BUTTON);
}
@Override
protected EObject addListItem(EObject object, EStructuralFeature feature) {
DocumentRoot root = (DocumentRoot)object;
Map<String,String> map = root.getXMLNSPrefixMap();
NamespacesEditingDialog dialog = new NamespacesEditingDialog(getShell(),
Messages.DefinitionsPropertyComposite_Create_Namespace_Title, map, "",""); //$NON-NLS-1$ //$NON-NLS-2$
if (dialog.open() == Window.OK) {
map.put(dialog.getPrefix(), dialog.getNamespace());
}
return null;
}
@Override
protected Object removeListItem(EObject object, EStructuralFeature feature, int index) {
DocumentRoot root = (DocumentRoot)object;
Map<String,String> map = root.getXMLNSPrefixMap();
for ( Map.Entry<String, String> entry : map.entrySet() ) {
if (index-- == 0) {
map.remove( entry.getKey() );
break;
}
}
return null;
}
@Override
public AbstractDetailComposite createDetailComposite(Class eClass, final Composite parent, int style) {
detailSection.setText(Messages.DefinitionsPropertyComposite_Namespace_Details_Title);
AbstractDetailComposite composite = new DefaultDetailComposite(parent, SWT.NONE) {
@Override
protected void bindAttribute(Composite parent, EObject object, EAttribute attribute, String label) {
if (attribute.getName().equals("key")) { //$NON-NLS-1$
ObjectEditor editor = new TextAndButtonObjectEditor(this,businessObject,attribute) {
@Override
protected void buttonClicked(int buttonId) {
Map.Entry<String, String> entry = (Map.Entry<String, String>)object;
DocumentRoot root = (DocumentRoot)object.eContainer();
Map<String, String> map = (Map<String, String>)root.getXMLNSPrefixMap();
NamespacesEditingDialog dialog = new NamespacesEditingDialog(getShell(), Messages.DefinitionsPropertyComposite_Change_Namespace_Title, map, entry.getKey(),null);
if (dialog.open() == Window.OK) {
setValue(dialog.getPrefix());
}
}
@Override
protected boolean setValue(final Object result) {
// we can't just change the key because the map that contains it
// needs to be updated, so remove old key, then add new.
if (result instanceof String && !((String)result).isEmpty() ) {
final Map.Entry<String, String> entry = (Map.Entry<String, String>)object;
final String oldKey = entry.getKey();
TransactionalEditingDomain domain = getDiagramEditor().getEditingDomain();
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
DocumentRoot root = (DocumentRoot)object.eContainer();
Map<String, String> map = (Map<String, String>)root.getXMLNSPrefixMap();
String value = map.remove(oldKey);
map.put((String)result, value);
}
});
return true;
}
text.setText(ModelUtil.getDisplayName(object, feature));
return false;
}
};
editor.createControl(parent,"Prefix"); //$NON-NLS-1$
}
else {
ObjectEditor editor = new TextObjectEditor(this,businessObject,attribute);
editor.createControl(parent,Messages.DefinitionsPropertyComposite_Namespace_Label);
}
}
};
return composite;
}
@Override
public ListCompositeContentProvider getContentProvider(EObject object, EStructuralFeature feature, EList<EObject>list) {
if (contentProvider==null) {
contentProvider = new ListCompositeContentProvider(this, object, feature, list) {
@Override
public Object[] getElements(Object inputElement) {
List<Object> elements = new ArrayList<Object>();
EcoreEMap<String,String> map = (EcoreEMap<String,String>)inputElement;
for ( Map.Entry<String, String> entry : map.entrySet() ) {
elements.add(entry);
}
return elements.toArray(new EObject[elements.size()]);
}
};
}
return contentProvider;
}
@Override
protected int createColumnProvider(EObject theobject, EStructuralFeature thefeature) {
if (columnProvider==null) {
columnProvider = getColumnProvider(theobject, thefeature);
}
return columnProvider.getColumns().size();
}
@Override
public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
if (columnProvider==null) {
columnProvider = new ListCompositeColumnProvider(this);
columnProvider.addRaw(new NamespacesTableColumn(object, 0));
columnProvider.addRaw(new NamespacesTableColumn(object, 1));
}
return columnProvider;
}
public class NamespacesTableColumn extends TableColumn {
int columnIndex;
public NamespacesTableColumn(EObject object, int columnIndex) {
super(object,(EStructuralFeature)null);
this.columnIndex = columnIndex;
}
@Override
public String getProperty() {
return getHeaderText();
}
@Override
public String getHeaderText() {
if (columnIndex==0)
return Messages.DefinitionsPropertyComposite_Prefix_Label;
return Messages.DefinitionsPropertyComposite_Namespace_Label;
}
@Override
public String getText(Object element) {
Map.Entry<String, String> entry = (Map.Entry<String, String>)element;
if (columnIndex==0)
return entry.getKey();
return entry.getValue();
}
}
}
public class ImportListComposite extends DefaultListComposite {
/**
* @param parent
* @param style
*/
public ImportListComposite(AbstractBpmn2PropertySection section) {
super(section);
}
@Override
public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) {
if (columnProvider==null) {
columnProvider = new ListCompositeColumnProvider(this);
// add a namespace prefix column that does NOT come from the Import object
TableColumn tableColumn = new TableColumn(object,(EStructuralFeature)null) {
@Override
public String getHeaderText() {
return Messages.DefinitionsPropertyComposite_Prefix_Label;
}
@Override
public String getText(Object element) {
Import imp = (Import)element;
String prefix = NamespaceUtil.getPrefixForNamespace(imp.eResource(), imp.getNamespace());
if (prefix!=null)
return prefix;
return ""; //$NON-NLS-1$
}
@Override
public CellEditor createCellEditor (Composite parent) {
CellEditor ce = null;
// TODO: create a dialog cell editor for NS prefix
return ce;
}
};
columnProvider.add(tableColumn);
// add remaining columns
columnProvider.add(new TableColumn(object,PACKAGE.getImport_Namespace())).setEditable(false);
columnProvider.add(new TableColumn(object,PACKAGE.getImport_Location())).setEditable(false);
columnProvider.add(new TableColumn(object,PACKAGE.getImport_ImportType())).setEditable(false);
}
return columnProvider;
}
@Override
protected EObject editListItem(EObject object, EStructuralFeature feature) {
return super.editListItem(object, feature);
}
@Override
protected Object removeListItem(EObject object, EStructuralFeature feature, int index) {
EList<Import> list = (EList<Import>)object.eGet(feature);
Import imp = list.get(index);
ImportUtil.removeImport(imp);
// return super.removeListItem(object, feature, index);
return null;
}
@Override
protected EObject addListItem(EObject object, EStructuralFeature feature) {
SchemaImportDialog dialog = new SchemaImportDialog(getShell());
if (dialog.open() == Window.OK) {
Object result[] = dialog.getResult();
if (result.length == 1) {
ImportUtil importer = new ImportUtil();
return importer.addImport(object, result[0]);
}
}
return null;
}
}
public class ImportDetailComposite extends DefaultDetailComposite {
public ImportDetailComposite(Composite parent, int style) {
super(parent, style);
}
/**
* @param section
*/
public ImportDetailComposite(AbstractBpmn2PropertySection section) {
super(section);
}
@Override
public void createBindings(EObject be) {
final Import imp = (Import)be;
Composite composite = getAttributesParent();
TextObjectEditor editor;
String label;
EStructuralFeature feature;
feature = null;
label = Messages.DefinitionsPropertyComposite_Prefix_Label;
editor = new TextAndButtonObjectEditor(this,be,feature) {
@Override
protected void buttonClicked(int buttonId) {
IInputValidator validator = new IInputValidator() {
@Override
public String isValid(String newText) {
String ns = NamespaceUtil.getNamespaceForPrefix(imp.eResource(), newText);
if (ns==null)
return null;
return NLS.bind(
Messages.DefinitionsPropertyComposite_Invalid_Duplicate,
newText,ns);
}
};
String initialValue = getText();
InputDialog dialog = new InputDialog(
getShell(),
Messages.DefinitionsPropertyComposite_Prefix_Label,
Messages.DefinitionsPropertyComposite_Prefix_Message,
initialValue,
validator);
if (dialog.open()==Window.OK){
setValue(dialog.getValue());
}
}
protected boolean setValue(final Object value) {
// remove old prefix
String prefix = text.getText();
NamespaceUtil.removeNamespaceForPrefix(imp.eResource(), prefix);
// and add new
NamespaceUtil.addNamespace(imp.eResource(), (String)value, imp.getNamespace());
setText((String) value);
return true;
}
protected String getText() {
return getNamespacePrefix();
}
};
editor.createControl(composite,label);
feature = Bpmn2Package.eINSTANCE.getImport_Namespace();
label = ModelUtil.getLabel(be, feature);
editor = new TextObjectEditor(this,be, feature);
editor.createControl(composite,label);
editor.setEditable(false);
feature = Bpmn2Package.eINSTANCE.getImport_Location();
label = ModelUtil.getLabel(be, feature);
editor = new TextObjectEditor(this,be, feature);
editor.createControl(composite,label);
editor.setEditable(false);
feature = Bpmn2Package.eINSTANCE.getImport_ImportType();
label = ModelUtil.getLabel(be, feature);
editor = new TextObjectEditor(this,be, feature);
editor.createControl(composite,label);
editor.setEditable(false);
}
private String getNamespacePrefix() {
Import imp = (Import)businessObject;
String prefix = NamespaceUtil.getPrefixForNamespace(imp.eResource(), imp.getNamespace());
if (prefix==null)
prefix = ""; //$NON-NLS-1$
return prefix;
}
}
public class EndPointListComposite extends DefaultListComposite {
public EndPointListComposite(AbstractBpmn2PropertySection section) {
super(section);
}
@Override
public EClass getListItemClass(EObject object, EStructuralFeature feature) {
return Bpmn2Package.eINSTANCE.getEndPoint();
}
// protected int createColumnProvider(EObject object, EStructuralFeature feature) {
// if (columnProvider==null) {
// columnProvider = new ListCompositeColumnProvider(this);
//
// TargetRuntime rt = getTargetRuntime();
// for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
// if ("EndPoint".equals(md.getType())) {
//
// for (Property p : md.getProperties()) {
// final String name = p.name;
// TableColumn tableColumn = new TableColumn(object,(EStructuralFeature)null) {
// @Override
// public String getHeaderText() {
// return ModelUtil.toDisplayName(name);
// }
//
// @Override
// public String getText(Object element) {
// if (element instanceof EndPoint) {
// EndPoint ep = (EndPoint) element;
// EStructuralFeature feature = ModelUtil.getAnyAttribute(ep, name);
// Object v = ep.eGet(feature);
// if (v!=null)
// return v.toString();
// }
// return ""; //$NON-NLS-1$
// }
//
// @Override
// public CellEditor createCellEditor (Composite parent) {
// CellEditor ce = null;
// return ce;
// }
// };
// columnProvider.add(tableColumn);
// }
// }
// }
// }
// return columnProvider.getColumns().size();
// }
//
// @Override
// public AbstractDetailComposite createDetailComposite(Class eClass, Composite parent, int style) {
// AbstractDetailComposite composite = new DefaultDetailComposite(parent, style) {
//
// protected boolean isModelObjectEnabled(EClass eclass, EStructuralFeature feature) {
// return true;
// }
//
// @Override
// public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
// if (propertiesProvider==null) {
// propertiesProvider = new AbstractPropertiesProvider(object) {
// String[] properties = null;
//
// @Override
// public String[] getProperties() {
// if (properties==null) {
// TargetRuntime rt = getTargetRuntime();
// for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
// if ("EndPoint".equals(md.getType())) {
// properties = new String[md.getProperties().size()];
// int i=0;
// for (Property p : md.getProperties()) {
// properties[i++] = p.name;
// }
// }
// }
// }
//
// return properties;
// }
// };
// }
// return propertiesProvider;
// }
//
// };
//
// return composite;
// }
@Override
protected EObject addListItem(EObject object, EStructuralFeature feature) {
EObject ep = super.addListItem(object, feature);
// TargetRuntime rt = getTargetRuntime();
// for (ModelExtensionDescriptor md : rt.getModelExtensions()) {
// if ("EndPoint".equals(md.getType())) {
// md.populateObject(ep, true);
// }
// }
return ep;
}
}
}