blob: 6b97231fa59ee7f03683fbb2507d32b5c124b5e6 [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 java.util.Collections;
import java.util.Iterator;
import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.details.viewers.CComboViewer;
import org.eclipse.bpel.common.ui.details.widgets.DecoratedLabel;
import org.eclipse.bpel.common.ui.details.widgets.StatusLabel2;
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment;
import org.eclipse.bpel.common.ui.flatui.FlatFormData;
import org.eclipse.bpel.common.ui.flatui.FlatFormLayout;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.adapters.ILabeledElement;
import org.eclipse.bpel.ui.details.providers.AddNullFilter;
import org.eclipse.bpel.ui.details.providers.AddSelectedObjectFilter;
import org.eclipse.bpel.ui.details.providers.FaultContentProvider;
import org.eclipse.bpel.ui.details.providers.ModelLabelProvider;
import org.eclipse.bpel.ui.details.providers.ModelTreeLabelProvider;
import org.eclipse.bpel.ui.details.providers.ModelViewerSorter;
import org.eclipse.bpel.ui.details.providers.OperationContentProvider;
import org.eclipse.bpel.ui.details.providers.PortTypeContentProvider;
import org.eclipse.bpel.ui.details.providers.VariableTypeTreeContentProvider;
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.BrowseUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.eclipse.wst.wsdl.Fault;
import org.eclipse.wst.wsdl.Input;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.Operation;
import org.eclipse.wst.wsdl.Output;
import org.eclipse.wst.wsdl.PortType;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDTypeDefinition;
/**
* A composite for selecting either a "Data Type" (XSD type, or XSD element containing
* an anonymous XSD type) an "Interface" type (actually a WSDL message, specified by
* choosing then Interface+Operation+direction/fault)
*/
public class VariableTypeSelector extends Composite {
public static final int KIND_UNKNOWN = VariableExtension.KIND_UNKNOWN;
public static final int KIND_INTERFACE = VariableExtension.KIND_INTERFACE;
public static final int KIND_DATATYPE = VariableExtension.KIND_DATATYPE;
protected static final int DATATYPE_RADIO_CONTEXT = 1;
protected static final int INTERFACE_RADIO_CONTEXT = 2;
protected static final int OPERATION_INPUTRADIO_CONTEXT = 3;
protected static final int OPERATION_OUTPUTRADIO_CONTEXT = 4;
protected static final int OPERATION_FAULTRADIO_CONTEXT = 5;
protected static final int OPERATION_COMBO_CONTEXT = 6;
protected static final int INTERFACE_COMBO_CONTEXT = 7;
protected static final int INTERFACE_BROWSE_CONTEXT = 8;
protected static final int DATATYPE_BROWSE_CONTEXT = 9;
protected static final int FAULT_COMBO_CONTEXT = 10;
protected int lastChangeContext = -1;
protected boolean inUpdate = false;
protected int kindHint = KIND_UNKNOWN;
public static final int STANDARD_LABEL_WIDTH_SM = 125;
public static final int STANDARD_LABEL_WIDTH_AVG = STANDARD_LABEL_WIDTH_SM * 5/4;
// private static final StructuredViewer dataTypeViewer = null;
protected EObject variableType;
protected Variable myVariable;
protected Button dataTypeRadio, interfaceRadio;
protected Composite dataTypeComposite, interfaceComposite;
protected TabbedPropertySheetWidgetFactory wf;
protected CComboViewer interfaceViewer;
protected Button interfaceBrowseButton;
protected CComboViewer operationViewer;
protected Button operationInputRadio, operationOutputRadio, operationFaultRadio;
protected CComboViewer faultViewer;
protected Label interfaceLabel, operationLabel, faultLabel;
protected AddSelectedObjectFilter interfaceAddSelectedObjectFilter;
protected AddSelectedObjectFilter operationAddSelectedObjectFilter;
protected AddSelectedObjectFilter faultAddSelectedObjectFilter;
protected Button dataTypeBrowseButton;
protected Hyperlink dataTypeNameText;
protected Tree dataTypeTree;
protected TreeViewer dataTypeTreeViewer;
protected StatusLabel2 dataTypeLabel;
protected BPELEditor bpelEditor;
protected Callback callback;
protected Shell shell;
protected boolean nullFilterAdded = false;
protected int filter = TypeSelectorDialog.INCLUDE_ALL;
protected boolean requireLowerTreeSelection = false;
// https://issues.jboss.org/browse/JBIDE-8045
// removed unused "allowElements" param
public VariableTypeSelector(Composite parent, int style, BPELEditor bpelEditor,
TabbedPropertySheetWidgetFactory wf, Callback callback)
{
super(parent, style);
this.bpelEditor = bpelEditor;
this.shell = bpelEditor.getSite().getShell();
this.wf = wf;
this.callback = callback;
Composite parentComposite = createComposite(this);
this.setLayout(new FillLayout(SWT.VERTICAL));
FlatFormLayout formLayout = new FlatFormLayout();
formLayout.marginWidth = formLayout.marginHeight = 0;
parentComposite.setLayout(formLayout);
createDataTypeWidgets(parentComposite);
}
// https://issues.jboss.org/browse/JBIDE-8045
// new constructor to allow constraining the filter checkboxes to only those types
// valid for the object being defined/modified
public VariableTypeSelector(Composite parent, int style, BPELEditor bpelEditor,
TabbedPropertySheetWidgetFactory wf, Callback callback, boolean requireLowerTreeSelection, int filter)
{
this(parent, style, bpelEditor, wf, callback);
this.filter = filter;
this.requireLowerTreeSelection = requireLowerTreeSelection;
}
/**
* Refresh the given CComboViewer, and also make sure selectedObject is selected in it.
*/
protected void refreshCCombo(CComboViewer viewer, Object selectedObject) {
viewer.refresh();
if (selectedObject == null) {
// work-around the null check in StructuredSelection(Object) ctor.
viewer.setSelectionNoNotify(new StructuredSelection(Collections.singletonList(null)), false);
} else {
viewer.setSelectionNoNotify(new StructuredSelection(selectedObject), false);
}
}
protected void selectComposite(int n) {
interfaceRadio.setSelection(n == Callback.KIND_INTERFACE);
interfaceComposite.setVisible(n == Callback.KIND_INTERFACE);
dataTypeRadio.setSelection(n == Callback.KIND_DATATYPE);
dataTypeComposite.setVisible(n == Callback.KIND_DATATYPE);
}
/**
* Expects either a WSDL message, an XSD type, or an XSD element.
*/
public void setVariableType(EObject variableType) {
//System.out.println("setVariableType: "+variableType);
this.variableType = variableType;
refresh();
}
/**
* This method is preferred over the EObject method if the caller has a BPELVariable
* model object, because this method supports hints stored in the VariableExtension.
*/
public void setVariable(Variable variable) {
kindHint = KIND_UNKNOWN;
myVariable = variable;
if (variable != null) {
if (variable.getMessageType() != null) {
setVariableType(variable.getMessageType()); return;
}
if (variable.getType() != null) {
setVariableType(variable.getType()); return;
}
if (variable.getXSDElement() != null) {
setVariableType(variable.getXSDElement()); return;
}
VariableExtension varExt = (VariableExtension)ModelHelper.getExtension(variable);
if (varExt != null) {
kindHint = varExt.getVariableKind();
}
}
setVariableType(null);
}
protected void updateDataTypeWidgets() {
String name = null;
ILabeledElement label = (ILabeledElement) BPELUtil.adapt(variableType, ILabeledElement.class, myVariable);
if (label != null) {
name = label.getLabel(variableType);
}
if (name == null) {
dataTypeNameText.setText(Messages.VariableTypeSelector_None_1);
dataTypeNameText.setEnabled(false);
dataTypeTreeViewer.setInput(null);
dataTypeLabel.setText(Messages.VariableTypeSelector_Data_Type_2);
return ;
}
dataTypeNameText.setText(name);
if (variableType instanceof XSDTypeDefinition) {
dataTypeNameText.setEnabled(true);
dataTypeTreeViewer.setInput(variableType);
dataTypeLabel.setText(Messages.VariableTypeSelector_Data_Type_2);
} else if (variableType instanceof XSDElementDeclaration) {
dataTypeNameText.setEnabled(true);
dataTypeTreeViewer.setInput(variableType);
dataTypeLabel.setText(Messages.VariableTypeSelector_0);
} else if (variableType instanceof Message) {
dataTypeNameText.setEnabled(true);
dataTypeTreeViewer.setInput(variableType);
dataTypeLabel.setText(Messages.VariableTypeSelector_1);
}
// scroll to the top ...
ScrollBar bar = dataTypeTree.getVerticalBar();
if (bar != null) {
bar.setSelection(0);
}
}
protected void updateInterfaceWidgets() {
PortType portType = null;
Operation operation = null;
Message message = null;
if (variableType instanceof Message) {
message = (Message)variableType;
}
if (message != null) operation = BPELUtil.getOperationFromMessage(message);
if (operation != null) portType = (PortType)operation.eContainer();
interfaceViewer.setInput(bpelEditor.getProcess());
interfaceAddSelectedObjectFilter.setSelectedObject(portType);
inUpdate = true;
try {
refreshCCombo(interfaceViewer, portType);
if (operation == null) {
if (!nullFilterAdded) {
operationViewer.addFilter(AddNullFilter.getInstance());
nullFilterAdded = true;
}
} else {
if (nullFilterAdded) {
operationViewer.removeFilter(AddNullFilter.getInstance());
nullFilterAdded = false;
}
}
operationViewer.setInput(portType);
operationAddSelectedObjectFilter.setSelectedObject(operation);
refreshCCombo(operationViewer, operation);
} finally {
inUpdate = false;
}
updateFaultRadio(message, operation);
}
protected void updateCompositeSelection() {
int kind = kindHint;
if (variableType instanceof Message) {
kind = KIND_INTERFACE;
} else if (variableType instanceof XSDTypeDefinition) {
kind = KIND_DATATYPE;
} else if (variableType instanceof XSDElementDeclaration) {
kind = KIND_DATATYPE;
}
if (kind == KIND_UNKNOWN) kind = KIND_DATATYPE;
selectComposite(kind);
doChildLayout();
}
protected void doChildLayout() {
dataTypeComposite.layout(true);
}
/**
*
*/
public void refresh() {
// updateInterfaceWidgets();
updateDataTypeWidgets();
// updateCompositeSelection();
}
/**
* Returns either a WSDL message, an XSD type, an XSD element, or null.
* @return the variable type
*/
public EObject getVariableType() {
return variableType;
}
protected Composite createFlatFormComposite(Composite parent) {
Composite result = createComposite(parent);
FlatFormLayout formLayout = new FlatFormLayout();
formLayout.marginWidth = formLayout.marginHeight = 0;
result.setLayout(formLayout);
return result;
}
/**
* If the widgets are set for faults and the new operation doesn't have any,
* this won't work - use computeMessageFromOperation instead.
*/
protected Message getStoreMessageFromOperation(Operation operation) {
// TODO: dialog box if there are no operations?
Message message = null;
if (operation != null) {
if (operationFaultRadio.getSelection()) {
StructuredSelection sel = (StructuredSelection)faultViewer.getSelection();
Fault fault = (Fault)sel.getFirstElement();
if (fault != null) message = fault.getEMessage();
return message;
} else if (operationOutputRadio.getSelection()) {
Output output = operation.getEOutput();
if (output != null) message = output.getEMessage();
return message;
} else {
Input input = operation.getEInput();
if (input != null) message = input.getEMessage();
return message;
}
}
return message;
}
class RadioListener implements SelectionListener {
int index;
/** Radio listener for indexed button index.
* @param index
*/
public RadioListener(int index) {
this.index = index;
}
public void widgetSelected(SelectionEvent e) {
if (!((Button) e.widget).getSelection())
return;
lastChangeContext = index;
callback.selectRadioButton(index);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
}
protected void createRadioButtonWidgets(Composite composite) {
FlatFormData data;
dataTypeRadio = createButton(composite, Messages.VariableTypeSelector_Data_Type_1, SWT.RADIO);
data = new FlatFormData();
data.top = new FlatFormAttachment(0, 0);
data.left = new FlatFormAttachment(0, 0);
dataTypeRadio.setLayoutData(data);
interfaceRadio = createButton(composite, Messages.VariableTypeSelector_Interface_1, SWT.RADIO);
data = new FlatFormData();
data.top = new FlatFormAttachment(0, 0);
data.left = new FlatFormAttachment(dataTypeRadio, IDetailsAreaConstants.HSPACE);
interfaceRadio.setLayoutData(data);
interfaceRadio.addSelectionListener(new RadioListener(Callback.KIND_INTERFACE));
dataTypeRadio.addSelectionListener(new RadioListener(Callback.KIND_DATATYPE));
}
protected void createInterfaceWidgets(Composite parent) {
FlatFormData data;
Composite composite = interfaceComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.top = new FlatFormAttachment(interfaceRadio, IDetailsAreaConstants.VMARGIN);
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.bottom = new FlatFormAttachment(100, 0);
interfaceComposite.setLayoutData(data);
interfaceBrowseButton = createButton(composite, Messages.VariableTypeSelector_Browse_1, SWT.PUSH);
interfaceLabel = createLabel(composite, Messages.VariableTypeSelector_Interface_2);
CCombo interfaceCombo = createCCombo(composite);
interfaceViewer = new CComboViewer(interfaceCombo);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(interfaceCombo, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(interfaceCombo, 0, SWT.CENTER);
interfaceLabel.setLayoutData(data);
interfaceAddSelectedObjectFilter = new AddSelectedObjectFilter();
interfaceViewer.addFilter(AddNullFilter.getInstance());
interfaceViewer.addFilter(interfaceAddSelectedObjectFilter);
interfaceViewer.setLabelProvider(new ModelLabelProvider());
interfaceViewer.setContentProvider(new PortTypeContentProvider());
interfaceViewer.setSorter(ModelViewerSorter.getInstance());
interfaceViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection)event.getSelection();
PortType portType = (PortType)selection.getFirstElement();
Operation operation = null;
if (portType != null && !portType.getEOperations().isEmpty()) {
operation = (Operation)portType.getEOperations().get(0);
}
lastChangeContext = INTERFACE_COMBO_CONTEXT;
Message message = computeMessageFromOperation(operation);
callback.selectMessageType(message);
updateFaultRadio(message, operation);
}
});
interfaceBrowseButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
PortType portType = BrowseUtil.browseForPortType(bpelEditor.getResourceSet(), shell);
if (portType != null) {
Operation operation = null;
if (!portType.getEOperations().isEmpty()) {
operation = (Operation)portType.getEOperations().get(0);
}
lastChangeContext = INTERFACE_BROWSE_CONTEXT;
Message message = computeMessageFromOperation(operation);
callback.selectMessageType(message);
updateFaultRadio(message, operation);
}
}
});
operationLabel = createLabel(composite, Messages.VariableTypeSelector_Operation_1);
CCombo operationCombo = createCCombo(composite);
operationViewer = new CComboViewer(operationCombo);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(operationCombo, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(operationCombo, 0, SWT.CENTER);
operationLabel.setLayoutData(data);
operationAddSelectedObjectFilter = new AddSelectedObjectFilter();
//operationViewer.addFilter(AddNullFilter.getInstance());
operationViewer.addFilter(operationAddSelectedObjectFilter);
operationViewer.setLabelProvider(new ModelLabelProvider());
operationViewer.setContentProvider(new OperationContentProvider());
operationViewer.setSorter(ModelViewerSorter.getInstance());
operationViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection)event.getSelection();
Operation operation = (Operation)selection.getFirstElement();
lastChangeContext = OPERATION_COMBO_CONTEXT;
Message message = computeMessageFromOperation(operation);
callback.selectMessageType(message);
updateFaultRadio(message, operation);
}
});
Label directionLabel = createLabel(composite, Messages.VariableTypeSelector_Direction_1);
// TODO: should these radio buttons really be a check box for the Reply case??
// - for now no, since I'm afraid it might be kind of confusing.
operationInputRadio = createButton(composite, Messages.VariableTypeSelector_Input_1, SWT.RADIO);
data = new FlatFormData();
data.top = new FlatFormAttachment(operationViewer.getCCombo(), IDetailsAreaConstants.VSPACE);
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(directionLabel, STANDARD_LABEL_WIDTH_SM));
operationInputRadio.setLayoutData(data);
operationInputRadio.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if (!operationInputRadio.getSelection()) return;
StructuredSelection selection = (StructuredSelection)operationViewer.getSelection();
Operation operation = (Operation)selection.getFirstElement();
lastChangeContext = OPERATION_INPUTRADIO_CONTEXT;
callback.selectMessageType(getStoreMessageFromOperation(operation));
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
operationOutputRadio = createButton(composite, Messages.VariableTypeSelector_Output_1, SWT.RADIO);
data = new FlatFormData();
data.top = new FlatFormAttachment(operationInputRadio, 0, SWT.TOP);
data.left = new FlatFormAttachment(operationInputRadio, IDetailsAreaConstants.HSPACE);
operationOutputRadio.setLayoutData(data);
operationOutputRadio.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if (!operationOutputRadio.getSelection()) return;
StructuredSelection selection = (StructuredSelection)operationViewer.getSelection();
Operation operation = (Operation)selection.getFirstElement();
lastChangeContext = OPERATION_OUTPUTRADIO_CONTEXT;
callback.selectMessageType(getStoreMessageFromOperation(operation));
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
operationFaultRadio = createButton(composite, Messages.VariableTypeSelector_Fault_1, SWT.RADIO);
data = new FlatFormData();
data.top = new FlatFormAttachment(operationOutputRadio, 0, SWT.TOP);
data.left = new FlatFormAttachment(operationOutputRadio, IDetailsAreaConstants.HSPACE);
operationFaultRadio.setLayoutData(data);
operationFaultRadio.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if (!operationFaultRadio.getSelection()) return;
StructuredSelection selection = (StructuredSelection)operationViewer.getSelection();
Operation operation = (Operation)selection.getFirstElement();
lastChangeContext = OPERATION_FAULTRADIO_CONTEXT;
// Get the fault from the operation.
Fault fault = (Fault)operation.getEFaults().get(0);
Message message = fault.getEMessage();
callback.selectMessageType(message);
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
faultLabel = createLabel(composite, Messages.VariableTypeSelector_Fault_2);
CCombo faultCombo = createCCombo(composite);
faultViewer = new CComboViewer(faultCombo);
// data = new FlatFormData();
// data.top = new FlatFormAttachment(operationFaultRadio, IDetailsAreaConstants.VSPACE);
// data.left = new FlatFormAttachment(faultLabel, IDetailsAreaConstants.HSPACE);
// faultCombo.setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(faultCombo, 0, SWT.CENTER);
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(faultCombo, -IDetailsAreaConstants.HSPACE);
faultLabel.setLayoutData(data);
faultAddSelectedObjectFilter = new AddSelectedObjectFilter();
faultViewer.addFilter(faultAddSelectedObjectFilter);
faultViewer.setLabelProvider(new ModelLabelProvider());
faultViewer.setContentProvider(new FaultContentProvider());
faultViewer.setSorter(ModelViewerSorter.getInstance());
faultViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection selection = (StructuredSelection)operationViewer.getSelection();
Operation operation = (Operation)selection.getFirstElement();
lastChangeContext = FAULT_COMBO_CONTEXT;
callback.selectMessageType(getStoreMessageFromOperation(operation));
}
});
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(operationCombo, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(operationInputRadio, 0, SWT.CENTER);
directionLabel.setLayoutData(data);
internalSetLayoutData();
}
protected void createDataTypeWidgets(Composite parent) {
FlatFormData data;
Composite composite = dataTypeComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VMARGIN);
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.bottom = new FlatFormAttachment(100, 0);
dataTypeComposite.setLayoutData(data);
dataTypeBrowseButton = createButton(composite, Messages.VariableTypeSelector_Browse_2, SWT.PUSH);
DecoratedLabel label = new DecoratedLabel(composite,SWT.LEFT);
label.setText(Messages.VariableTypeSelector_Data_Type_2);
wf.adapt(label);
dataTypeLabel = new StatusLabel2( label );
// https://jira.jboss.org/browse/JBIDE-7107
dataTypeLabel.getLabel().setBackground(this.getBackground());
dataTypeNameText = createHyperlink(composite, "", SWT.NONE); //$NON-NLS-1$
dataTypeNameText.setToolTipText(Messages.VariableTypeSelector_3);
dataTypeNameText.addHyperlinkListener(new HyperlinkAdapter() {
@Override
public void linkActivated(HyperlinkEvent e) {
// https://issues.jboss.org/browse/JBIDE-8048
// don't bother trying to open editor if variable is not defined
if (getVariableType() != null)
BPELUtil.openEditor(getVariableType(), bpelEditor);
}
});
Label dataTypeTreeLabel = createLabel(composite, Messages.VariableTypeSelector_2);
// Tree viewer for variable structure ...
dataTypeTree = wf.createTree(composite, SWT.NONE);
VariableTypeTreeContentProvider variableContentProvider = new VariableTypeTreeContentProvider(true, true);
dataTypeTreeViewer = new TreeViewer(dataTypeTree);
dataTypeTreeViewer.setContentProvider(variableContentProvider);
dataTypeTreeViewer.setLabelProvider(new ModelTreeLabelProvider());
dataTypeTreeViewer.setInput ( null );
dataTypeTreeViewer.setAutoExpandLevel(3);
// end tree viewer for variable structure
// layout data type label
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(dataTypeLabel.getControl(),
STANDARD_LABEL_WIDTH_SM));
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE);
data.right = new FlatFormAttachment(60,0);
dataTypeNameText.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0,IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(dataTypeNameText, -IDetailsAreaConstants.HSPACE);
// https://jira.jboss.org/browse/JBIDE-7107
data.top = new FlatFormAttachment(dataTypeNameText, -IDetailsAreaConstants.VSPACE, SWT.TOP);
data.bottom = new FlatFormAttachment(dataTypeNameText,0,SWT.BOTTOM);
dataTypeLabel.setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(dataTypeNameText, -2, SWT.TOP);
data.bottom = new FlatFormAttachment(dataTypeLabel.getLabel(), +2, SWT.BOTTOM);
data.right = new FlatFormAttachment(100,-IDetailsAreaConstants.HSPACE);
dataTypeBrowseButton.setLayoutData(data);
dataTypeBrowseButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
// https://issues.jboss.org/browse/JBIDE-8045
Object selection[] = BrowseUtil.browseForVariableType(
bpelEditor.getProcess(), getShell(),requireLowerTreeSelection,filter);
if (selection != null) {
Object xsdType = selection[0];
lastChangeContext = DATATYPE_BROWSE_CONTEXT;
if (xsdType instanceof XSDTypeDefinition) {
// TODO:WDG: if type is anonymous, use enclosing element
callback.selectXSDType((XSDTypeDefinition)xsdType);
} else if (xsdType instanceof XSDElementDeclaration) {
callback.selectXSDElement((XSDElementDeclaration)xsdType);
} else if (xsdType instanceof Message) {
callback.selectMessageType((Message) xsdType);
}
}
}
public void widgetDefaultSelected(SelectionEvent e) { }
});
data = new FlatFormData();
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(dataTypeLabel.getLabel(), 3*IDetailsAreaConstants.VSPACE, SWT.BOTTOM);
dataTypeTreeLabel.setLayoutData(data);
data = new FlatFormData();
// https://jira.jboss.org/browse/JBIDE-7107
// data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(dataTypeLabel.getLabel(), STANDARD_LABEL_WIDTH_SM));
// data.top = new FlatFormAttachment(dataTypeTreeLabel,0, SWT.TOP);
data.left = new FlatFormAttachment(dataTypeTreeLabel,0, SWT.LEFT);
data.top = new FlatFormAttachment(dataTypeTreeLabel,0, SWT.BOTTOM);
data.right = new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE) ;
// https://issues.jboss.org/browse/JBIDE-8048
// make the message structure viewer a wee bit larger than just a single line
data.bottom = new FlatFormAttachment(dataTypeTreeLabel,150, SWT.BOTTOM); //new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE);
dataTypeTree.setLayoutData(data);
}
public interface Callback {
public static final int KIND_DATATYPE = VariableExtension.KIND_DATATYPE;
public static final int KIND_INTERFACE = VariableExtension.KIND_INTERFACE;
public void selectRadioButton(int index);
public void selectXSDType(XSDTypeDefinition xsdType);
public void selectXSDElement(XSDElementDeclaration xsdElement);
public void selectMessageType(Message message);
}
public Object getUserContext() {
return Integer.valueOf( lastChangeContext );
}
public void restoreUserContext(Object userContext) {
switch (((Integer)userContext).intValue()) {
case DATATYPE_RADIO_CONTEXT: dataTypeRadio.setFocus(); return;
case INTERFACE_RADIO_CONTEXT: interfaceRadio.setFocus(); return;
case OPERATION_INPUTRADIO_CONTEXT: operationInputRadio.setFocus(); return;
case OPERATION_OUTPUTRADIO_CONTEXT: operationOutputRadio.setFocus(); return;
case OPERATION_FAULTRADIO_CONTEXT: operationFaultRadio.setFocus(); return;
case OPERATION_COMBO_CONTEXT: operationViewer.getCCombo().setFocus(); return;
case INTERFACE_COMBO_CONTEXT: interfaceViewer.getCCombo().setFocus(); return;
case INTERFACE_BROWSE_CONTEXT: interfaceBrowseButton.setFocus(); return;
case DATATYPE_BROWSE_CONTEXT: dataTypeBrowseButton.setFocus(); return;
case FAULT_COMBO_CONTEXT: faultViewer.getCCombo().setFocus(); return;
}
throw new IllegalStateException();
}
@Override
public void setEnabled(boolean enabled) {
setEnabled(enabled, this,0);
}
void setEnabled ( boolean enabled, Control control , int depth) {
if (control instanceof Composite) {
Composite root = (Composite) control;
Control list[] = root.getChildren();
for(int i=0; i<list.length; i++) {
setEnabled(enabled,list[i],depth+1);
}
}
if (depth > 0) {
control.setEnabled(enabled);
}
}
protected Button createButton(Composite parent, String text, int style) {
return wf.createButton(parent, text, style);
}
protected Composite createComposite(Composite parent) {
return wf.createComposite(parent);
}
protected Label createLabel(Composite parent, String text) {
return wf.createLabel(parent, text);
}
protected Hyperlink createHyperlink(Composite parent, String text, int style) {
return wf.createHyperlink(parent, text, style);
}
protected CCombo createCCombo(Composite parent) {
return wf.createCCombo(parent);
}
protected void internalSetLayoutData() {
FlatFormData data = new FlatFormData();
// data.left = new FlatFormAttachment(50, -IDetailsAreaConstants.CENTER_SPACE + IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(interfaceViewer.getControl(), -1, SWT.TOP);
data.bottom = new FlatFormAttachment(interfaceViewer.getControl(), +1, SWT.BOTTOM);
data.right = new FlatFormAttachment(100,-IDetailsAreaConstants.HSPACE);
interfaceBrowseButton.setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(0, 2);
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(interfaceLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(interfaceBrowseButton, -IDetailsAreaConstants.HSPACE);
interfaceViewer.getControl().setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(interfaceViewer.getControl(), IDetailsAreaConstants.VSPACE);
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(operationLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(interfaceBrowseButton, -IDetailsAreaConstants.HSPACE);
operationViewer.getControl().setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(operationFaultRadio, IDetailsAreaConstants.VSPACE);
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(interfaceBrowseButton, -IDetailsAreaConstants.HSPACE);
faultViewer.getCCombo().setLayoutData(data);
}
protected void updateFaultRadio(Message message, Operation operation) {
boolean isInput = true;
boolean isOutput = false;
boolean isFault = false;
Fault fault = null;
if (operation != null && message != null) {
Iterator it = operation.getEFaults().iterator();
while (it.hasNext()) {
Fault nextFault = (Fault)it.next();
Message faultMessage = nextFault.getEMessage();
if (faultMessage != null && faultMessage.getQName() != null) {
if (faultMessage.getQName().equals(message.getQName())) {
isFault = true;
isInput = false;
isOutput = false;
fault = nextFault;
}
}
}
Output output = operation.getEOutput();
if (output != null) {
Message outputMessage = output.getEMessage();
if (outputMessage != null && outputMessage.getQName() != null) {
if (outputMessage.getQName().equals(message.getQName())) {
isOutput = true;
isInput = false;
isFault = false;
}
}
}
}
operationInputRadio.setSelection(isInput);
operationOutputRadio.setSelection(isOutput);
operationFaultRadio.setSelection(isFault);
operationFaultRadio.setVisible(operation != null && !operation.getEFaults().isEmpty());
faultLabel.setVisible(isFault);
faultViewer.getCCombo().setVisible(isFault);
if (isFault) {
if (operation != null) {
faultViewer.setInput(operation);
refreshCCombo(faultViewer, fault);
}
}
this.layout(true);
faultViewer.getCCombo().getParent().redraw();
faultViewer.getCCombo().redraw();
interfaceComposite.layout(true);
}
/**
* This one handles faults, also whacks the radio buttons when appropriate.
* Use this one after changing the operation, and the other one when
* leaving the operation alone.
*/
protected Message computeMessageFromOperation(Operation operation) {
Message message = null;
if (operationFaultRadio.getSelection()) {
if (operation.getEFaults().isEmpty()) {
operationFaultRadio.setSelection(false);
operationOutputRadio.setSelection(true);
message = getStoreMessageFromOperation(operation);
} else {
Fault fault = (Fault)operation.getEFaults().get(0);
message = fault.getEMessage();
}
} else {
message = getStoreMessageFromOperation(operation);
}
return message;
}
}