/******************************************************************************* * 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.runtime.jboss.jbpm5.property; import org.eclipse.bpmn2.BaseElement; import org.eclipse.bpmn2.Participant; import org.eclipse.bpmn2.Process; import org.eclipse.bpmn2.di.BPMNDiagram; import org.eclipse.bpmn2.modeler.core.LifecycleEvent; import org.eclipse.bpmn2.modeler.core.LifecycleEvent.EventType; 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.DefaultDetailComposite; import org.eclipse.bpmn2.modeler.core.merrimac.clad.ListCompositeColumnProvider; 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.TextObjectEditor; import org.eclipse.bpmn2.modeler.core.model.ModelDecorator; import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences; import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime; import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.DroolsFactory; import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.DroolsPackage; import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.ExternalProcess; import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.MetaDataType; import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.MetaValueType; import org.eclipse.bpmn2.modeler.ui.property.DescriptionPropertySection; import org.eclipse.bpmn2.modeler.ui.property.ExtensionValueListComposite; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.swt.widgets.Composite; /** * This is an empty tab section which simply exists to hide the "Basic" tab * defined the editor UI plugin. * * @author Bob Brodt * */ public class JbpmDescriptionPropertySection extends DescriptionPropertySection { MetaDataTable metaDataTable = null; class MetaDataTable extends ExtensionValueListComposite { BaseElement be; public MetaDataTable(Composite parent, BaseElement be) { super(parent, DEFAULT_STYLE); this.be = be; } @Override protected EObject addListItem(EObject object, EStructuralFeature feature) { // generate a unique global variable name String base = "elementname"; //$NON-NLS-1$ int suffix = 1; String name = base + suffix; for (;;) { boolean found = false; for (Object md : ModelDecorator.getAllExtensionAttributeValues(object, MetaDataType.class)) { if (name.equals(((MetaDataType) md).getName())) { found = true; break; } } if (!found) break; name = base + ++suffix; } MetaDataType newData = DroolsFactory.eINSTANCE.createMetaDataType(); MetaValueType newValue = DroolsFactory.eINSTANCE.createMetaValueType(); newValue.setValue(""); newData.setName(name); newData.setMetaValue(newValue); // This editor lifecycle event is normally triggered by the Bpmn2ModelerFactory // when an object is created. We need to send this event from here to make sure // a {@see ProcessVariableNameChangeAdapter} is attached to the object. TargetRuntime rt = TargetRuntime.getRuntime(object); LifecycleEvent.notify(EventType.BUSINESSOBJECT_CREATED, newData, rt); addExtensionValue(newData); return newData; } protected int createColumnProvider(EObject theobject, EStructuralFeature thefeature) { if (columnProvider==null) { getColumnProvider(theobject,thefeature); } return columnProvider.getColumns().size(); } @Override public ListCompositeColumnProvider getColumnProvider(EObject object, EStructuralFeature feature) { columnProvider = super.getColumnProvider(object, feature); columnProvider.addRaw(new TableColumn(object, object.eClass().getEStructuralFeature("id")) { //$NON-NLS-1$ public String getText(Object element) { String text = null; if (element instanceof MetaDataType) { MetaDataType metaData = (MetaDataType) element; MetaValueType metaValue = metaData.getMetaValue(); if (metaValue!=null) text = metaValue.getValue(); } return text==null ? "" : text; } @Override public String getHeaderText() { return "Value"; } @Override public CellEditor createCellEditor(Composite parent) { // need to override this to avoid any problems return null; } }).setEditable(true); return columnProvider; } @Override public AbstractDetailComposite createDetailComposite(Class eClass, final Composite parent, int style) { AbstractDetailComposite detailComposite = new DefaultDetailComposite(parent, style) { @Override public void createBindings(EObject be) { super.createBindings(be); if (be instanceof MetaDataType) { MetaDataType metaData = (MetaDataType) be; MetaValueType metaValue = metaData.getMetaValue(); ObjectEditor editor = new TextObjectEditor(this,metaValue,DroolsPackage.eINSTANCE.getMetaValueType_Value()); editor.createControl(this.getAttributesParent(),"Value"); } } }; return detailComposite; } } @Override protected AbstractDetailComposite createSectionRoot() { return new JbpmDescriptionPropertyComposite(this); } @Override public AbstractDetailComposite createSectionRoot(Composite parent, int style) { return new JbpmDescriptionPropertyComposite(parent, style); } public JbpmDescriptionPropertySection() { super(); } public class JbpmDescriptionPropertyComposite extends DescriptionDetailComposite { public JbpmDescriptionPropertyComposite(AbstractBpmn2PropertySection section) { super(section); } public JbpmDescriptionPropertyComposite(Composite parent, int style) { super(parent, style); } @Override public void cleanBindings() { super.cleanBindings(); metaDataTable = null; } @Override public void createBindings(final EObject be) { // for BPMNDiagram objects, pick out the Process and render the // Process attributes Process process = null; if (be instanceof Participant) { process = ((Participant) be).getProcessRef(); } else if (be instanceof BPMNDiagram) { BaseElement bpmnElement = ((BPMNDiagram) be).getPlane().getBpmnElement(); if (bpmnElement instanceof Process) process = (Process) bpmnElement; } else if (be instanceof ExternalProcess) { // TODO: hook into jBPM guvnor instance to fetch additional info // maybe? bindAttribute(be, "name"); //$NON-NLS-1$ return; } if (process == null) { // display the default Description tab super.createBindings(be); } else { // create our own for Process bindDescription(be); bindAttribute(process, "name"); //$NON-NLS-1$ // bindAttribute(process, "id"); // bindAttribute(process, "anyAttribute"); // bindAttribute(process, "isExecutable"); bindList(process, "documentation"); //$NON-NLS-1$ // bindAttribute(process, "adHoc"); // bindList(process, "properties"); // this has moved to // JbpmDataItemsDetailComposite // bindList(process, "laneSets"); // don't need this } if (be instanceof BaseElement) { Bpmn2Preferences preferences = (Bpmn2Preferences) getDiagramEditor().getAdapter(Bpmn2Preferences.class); if (preferences.getShowAdvancedPropertiesTab()) { bindMetaDataTable((BaseElement) be); } } } @Override protected void bindAppearance(EObject be) { // TODO: support the color/appearance extensions defined by jBPM Web Designer } protected void bindMetaDataTable(final BaseElement be) { metaDataTable = new MetaDataTable(this, be); metaDataTable.bindList(be, DroolsPackage.eINSTANCE.getDocumentRoot_MetaData()); metaDataTable.setTitle(Messages.JbpmDescriptionPropertySection_MetaData_Section_Title); } } }