blob: 4914dd2a60c6518a0858fb4d739eeb035c77e256 [file] [log] [blame]
/*******************************************************************************
* 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));
}
}
}