/******************************************************************************* * 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; } }