/******************************************************************************* * Copyright (c) 2005, 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.ui.properties; import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment; import org.eclipse.bpel.common.ui.flatui.FlatFormData; import org.eclipse.bpel.model.BPELPackage; import org.eclipse.bpel.model.Variable; import org.eclipse.bpel.ui.adapters.AdapterNotification; import org.eclipse.bpel.ui.commands.CompoundCommand; import org.eclipse.bpel.ui.commands.SetVariableKindCommand; import org.eclipse.bpel.ui.commands.SetVariableTypeCommand; import org.eclipse.bpel.ui.dialogs.TypeSelectorDialog; import org.eclipse.bpel.ui.uiextensionmodel.VariableExtension; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.bpel.ui.util.MultiObjectAdapter; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.IStatus; 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.wst.wsdl.Message; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDTypeDefinition; /** * VariableTypeSection provides viewing and editing of the type of a BPEL variable * (whether that be an XSD type, WSDL message, or built-in simple type). */ public class VariableTypeSection extends BPELPropertySection { /** * Make this section use all the vertical space it can get. * */ @Override public boolean shouldUseExtraSpace() { return true; } protected VariableTypeSelector variableTypeSelector; protected Composite parentComposite; protected boolean isMessageTypeAffected(Notification n) { return (n.getFeatureID(Variable.class) == BPELPackage.VARIABLE__MESSAGE_TYPE); } protected boolean isTypeAffected(Notification n) { return (n.getFeatureID(Variable.class) == BPELPackage.VARIABLE__TYPE); } protected boolean isElementAffected(Notification n) { return (n.getFeatureID(Variable.class) == BPELPackage.VARIABLE__ELEMENT); } @Override protected MultiObjectAdapter[] createAdapters() { return new MultiObjectAdapter[] { /* model object */ new BatchedMultiObjectAdapter() { boolean update = false; @Override public void notify (Notification n) { if (update) { return ; } int eventGroup = n.getEventType() / 100; if (eventGroup == AdapterNotification.NOTIFICATION_MARKERS_CHANGED_GROUP) { update = true; return; } if (isMessageTypeAffected(n)) { update = true; return; } if (isTypeAffected(n)) { update = true; return ; } if (isElementAffected(n)) { update = true; return; } if (n.getNotifier() instanceof VariableExtension) { update = true; return ; } } @Override public void finish() { if (update) { updateVariableTypeSelector(); } update = false; } } }; } @Override protected void addAllAdapters() { super.addAllAdapters(); VariableExtension varExt = (VariableExtension)ModelHelper.getExtension(getInput()); if (varExt != null) fAdapters[0].addToObject(varExt); } /** * @author IBM * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date May 15, 2007 */ public class VariableTypeCallback implements VariableTypeSelector.Callback { /** * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectRadioButton(int) */ public void selectRadioButton(int index) { Variable var = (Variable)getInput(); VariableExtension varExt = (VariableExtension)ModelHelper.getExtension(var); CompoundCommand command = new CompoundCommand(); if ((var.getMessageType() != null) || (var.getType() != null) || (var.getXSDElement()) != null) { command.add(new SetVariableTypeCommand(var, (Message)null)); } if ((varExt.getVariableKind() != index)) { command.add(new SetVariableKindCommand(varExt, index)); } if (!command.isEmpty()) getCommandFramework().execute(wrapInShowContextCommand(command)); } /** * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDType(org.eclipse.xsd.XSDTypeDefinition) */ public void selectXSDType(XSDTypeDefinition xsdType) { Variable variable = (Variable)getInput(); Command cmd = new SetVariableTypeCommand(variable, xsdType); getCommandFramework().execute(wrapInShowContextCommand(cmd)); } /** (non-Javadoc) * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectXSDElement(org.eclipse.xsd.XSDElementDeclaration) */ public void selectXSDElement(XSDElementDeclaration xsdElement) { Variable variable = (Variable)getInput(); Command cmd = new SetVariableTypeCommand(variable, xsdElement); getCommandFramework().execute(wrapInShowContextCommand(cmd)); } /** * @see org.eclipse.bpel.ui.properties.VariableTypeSelector.Callback#selectMessageType(org.eclipse.wst.wsdl.Message) */ public void selectMessageType(Message message) { Variable variable = (Variable)getInput(); Command cmd = new SetVariableTypeCommand(variable, message); getCommandFramework().execute(wrapInShowContextCommand(cmd)); } } @Override protected void createClient(Composite parent) { Composite composite = parentComposite = createFlatFormComposite(parent); // https://issues.jboss.org/browse/JBIDE-8045 variableTypeSelector = new VariableTypeSelector(composite, SWT.NONE, getBPELEditor(), fWidgetFactory, new VariableTypeCallback(), false, TypeSelectorDialog.INCLUDE_ALL); FlatFormData data = new FlatFormData(); data.top = new FlatFormAttachment(0,0); data.left = new FlatFormAttachment(0,0); data.right = new FlatFormAttachment(100,0); data.bottom = new FlatFormAttachment(100,0); variableTypeSelector.setLayoutData(data); } /** * */ public void updateVariableTypeSelector() { variableTypeSelector.setVariable((Variable)getInput()); updateMarkers(); } @Override protected void basicSetInput(EObject newInput) { super.basicSetInput(newInput); updateVariableTypeSelector(); } /** * @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext() */ @Override public Object getUserContext() { return variableTypeSelector.getUserContext(); } /** * @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object) */ @Override public void restoreUserContext(Object userContext) { variableTypeSelector.restoreUserContext(userContext); } /** * * @see org.eclipse.bpel.ui.properties.BPELPropertySection#isValidMarker(org.eclipse.core.resources.IMarker) */ @SuppressWarnings("nls") @Override public boolean isValidMarker (IMarker marker) { String context = null; try { context = (String) marker.getAttribute("href.context"); } catch (Exception ex) { return false; } return "name".equals (context) == false; } @Override protected void updateMarkers () { variableTypeSelector.dataTypeLabel.clear(); for(IMarker m : getMarkers(getInput())) { variableTypeSelector.dataTypeLabel.addStatus(BPELUtil.adapt(m, IStatus.class)); } } }