/******************************************************************************* * Copyright (c) 2008, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.extensionssample.ui.properties; import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants; import org.eclipse.bpel.common.ui.details.IValue; import org.eclipse.bpel.common.ui.details.TextIValue; import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment; import org.eclipse.bpel.common.ui.flatui.FlatFormData; import org.eclipse.bpel.extensionsample.model.SampleStructuredActivity; import org.eclipse.bpel.model.BPELFactory; import org.eclipse.bpel.model.BPELPackage; import org.eclipse.bpel.model.Variable; import org.eclipse.bpel.ui.adapters.INamedElement; import org.eclipse.bpel.ui.commands.CompoundCommand; import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; import org.eclipse.bpel.ui.properties.BPELPropertySection; import org.eclipse.bpel.ui.properties.EditController; import org.eclipse.bpel.ui.properties.VariableTypeSelector; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter; import org.eclipse.bpel.ui.util.MultiObjectAdapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.commands.Command; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.wst.wsdl.Message; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDTypeDefinition; /* * Bug 120110 * This class implements the detail property tab for the "structured" extension activity * This property detail tab allows definition of a variable name and type, which (presumably) * will be in-scope for the children of this container activity. * * This class demonstrates the use of a change tracker to update the model and keep the XML * source in sync with the property page widgets. * * Note that validation of this activity is not yet implemented. */ public class SampleStructuredActivityPropertySection extends BPELPropertySection { protected VariableTypeSelector variableTypeSelector; protected Composite parentComposite; protected Text variableName; protected EditController variableNameEditController; INamedElement variableNamedElement; public class VariableTypeCallback implements VariableTypeSelector.Callback { /** * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectRadioButton(int) */ /* (non-Javadoc) * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectRadioButton(int) */ public void selectRadioButton(final int index) { throw new IllegalArgumentException("oops!"); } /* (non-Javadoc) * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDType(org.eclipse.xsd.XSDTypeDefinition) */ public void selectXSDType(XSDTypeDefinition xsdType) { applyChanges(xsdType); } /* (non-Javadoc) * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDElement(org.eclipse.xsd.XSDElementDeclaration) */ public void selectXSDElement(XSDElementDeclaration xsdElement) { applyChanges(xsdElement); } /* (non-Javadoc) * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectMessageType(org.eclipse.wst.wsdl.Message) */ public void selectMessageType(Message message) { applyChanges(message); } } private SampleStructuredActivity getActivity() { SampleStructuredActivity activity = (SampleStructuredActivity)getInput(); // make sure this has a Variable if (activity.getVariable() == null) activity.setVariable(BPELFactory.eINSTANCE.createVariable()); return activity; } @Override protected MultiObjectAdapter[] createAdapters() { return new MultiObjectAdapter[] { /* model object */ new BatchedMultiObjectAdapter() { @Override public void notify (Notification n) { } @Override public void finish() { updateVariableTypeSelector(); } } }; } @Override protected void createClient(Composite parent) { FlatFormData data; Composite composite = parentComposite = createFlatFormComposite(parent); Label description = getWidgetFactory().createLabel(composite, "Declare a variable that is in scope only for this structured activity"); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE ); description.setLayoutData(data); Label nameLabel = getWidgetFactory().createLabel(composite, "Variable Name:"); variableName = fWidgetFactory.createText(composite, EMPTY_STRING); data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG)); data.right = new FlatFormAttachment(100, (-2) * IDetailsAreaConstants.HSPACE ); data.top = new FlatFormAttachment(description, 10, SWT.LEFT); variableName.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(variableName, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(variableName, 0, SWT.CENTER); nameLabel.setLayoutData(data); variableTypeSelector = new VariableTypeSelector(composite, SWT.NONE, getBPELEditor(), fWidgetFactory, new VariableTypeCallback()); data = new FlatFormData(); data.top = new FlatFormAttachment(nameLabel,0, SWT.LEFT); data.left = new FlatFormAttachment(0,0); data.right = new FlatFormAttachment(100,0); data.bottom = new FlatFormAttachment(100,0); variableTypeSelector.setLayoutData(data); createChangeTrackers(); } protected void createChangeTrackers() { variableNameEditController = new EditController(getCommandFramework()) { @Override public boolean checkNotification (Notification notification) { return variableNamedElement != null && variableNamedElement.isNameAffected(variableNameEditController.getInput(), notification); } @Override public Command createApplyCommand() { return wrapInShowContextCommand( createCommand(null) ); } }; variableNameEditController.setLabel( BPELPackage.eINSTANCE.getActivity_Name().getName() ); variableNameEditController.setViewIValue(new TextIValue ( variableName )) ; variableNameEditController.setModeIValue(new IValue () { public Object get() { return variableNamedElement != null ? variableNamedElement.getName( variableNameEditController.getInput() ) : null; } public void set (Object object) { if (variableNamedElement != null) { variableNamedElement.setName(variableNameEditController.getInput(),object.toString() ); } } }); variableNameEditController.startListeningTo(variableName); } protected Command createCommand(final EObject type) { CompoundCommand command = new CompoundCommand(); command.add(new AutoUndoCommand(getProcess()) { @Override public void doExecute() { SampleStructuredActivity activity = getActivity(); Variable variable = activity.getVariable(); variable.setName(variableName.getText()); // https://issues.jboss.org/browse/JBIDE-8045 // Data caught by fault handler can be either a Message Type // or an XSD Element. if (type instanceof Message) { variable.setMessageType((Message)type); variable.setXSDElement(null); variable.setType(null); } else if (type instanceof XSDElementDeclaration) { variable.setMessageType(null); variable.setXSDElement((XSDElementDeclaration)type); variable.setType(null); } else if (type instanceof XSDTypeDefinition) { variable.setMessageType(null); variable.setXSDElement(null); variable.setType((XSDTypeDefinition)type); } if (variable==activity.getVariable()) // force update of variable activity.setVariable(null); activity.setVariable(variable); } }); return command; } protected void applyChanges(final EObject type) { Command command = createCommand(type); getCommandFramework().execute(wrapInShowContextCommand(command)); } public void updateVariableName() { if (getActivity() != null ) { Variable variable = getActivity().getVariable(); variableName.setText(variable==null || variable.getName()==null ? "" : variable.getName()); } } public void updateVariableTypeSelector() { if (getActivity() != null ) { Variable variable = getActivity().getVariable(); variableTypeSelector.setVariable(variable); } } @Override protected void basicSetInput(EObject newInput) { if ( newInput instanceof SampleStructuredActivity) { super.basicSetInput(newInput); updateVariableTypeSelector(); updateVariableName(); variableNamedElement = BPELUtil.adapt(getActivity().getVariable(),INamedElement.class); variableNameEditController.setInput(getActivity().getVariable()); } } }