/******************************************************************************* * 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.ArrayList; import java.util.List; import org.eclipse.bpel.common.ui.assist.FieldAssistAdapter; import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants; import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment; import org.eclipse.bpel.common.ui.flatui.FlatFormData; import org.eclipse.bpel.model.BPELFactory; import org.eclipse.bpel.model.Invoke; import org.eclipse.bpel.model.OnEvent; import org.eclipse.bpel.model.OnMessage; import org.eclipse.bpel.model.PartnerLink; import org.eclipse.bpel.model.Process; import org.eclipse.bpel.model.Receive; import org.eclipse.bpel.model.Reply; import org.eclipse.bpel.model.Scope; import org.eclipse.bpel.model.Variable; import org.eclipse.bpel.model.Variables; import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType; import org.eclipse.bpel.model.partnerlinktype.Role; import org.eclipse.bpel.model.util.BPELUtils; import org.eclipse.bpel.ui.BPELUIPlugin; import org.eclipse.bpel.ui.IHelpContextIds; import org.eclipse.bpel.ui.Messages; import org.eclipse.bpel.ui.adapters.ILabeledElement; import org.eclipse.bpel.ui.commands.AddPartnerLinkCommand; import org.eclipse.bpel.ui.commands.AddVariableCommand; import org.eclipse.bpel.ui.commands.CompoundCommand; import org.eclipse.bpel.ui.commands.SetCommand; import org.eclipse.bpel.ui.commands.SetOnEventVariableTypeCommand; import org.eclipse.bpel.ui.commands.SetOperationCommand; import org.eclipse.bpel.ui.commands.SetPartnerLinkCommand; import org.eclipse.bpel.ui.commands.SetVariableCommand; import org.eclipse.bpel.ui.commands.SetWSDLFaultCommand; import org.eclipse.bpel.ui.details.providers.ModelLabelProvider; import org.eclipse.bpel.ui.details.providers.ModelTreeLabelProvider; import org.eclipse.bpel.ui.details.providers.OperationContentProvider; import org.eclipse.bpel.ui.details.providers.PartnerLinkContentProvider; import org.eclipse.bpel.ui.details.providers.PartnerLinkTreeContentProvider; import org.eclipse.bpel.ui.details.providers.PartnerRoleFilter; import org.eclipse.bpel.ui.details.providers.WSDLFaultContentProvider; import org.eclipse.bpel.ui.details.tree.ITreeNode; import org.eclipse.bpel.ui.details.tree.OperationTreeNode; import org.eclipse.bpel.ui.details.tree.PartnerLinkTreeNode; import org.eclipse.bpel.ui.details.tree.TreeNode; import org.eclipse.bpel.ui.dialogs.PartnerLinkRoleSelectorDialog; import org.eclipse.bpel.ui.dialogs.PartnerLinkTypeSelectorDialog; import org.eclipse.bpel.ui.proposal.providers.ModelContentProposalProvider; import org.eclipse.bpel.ui.proposal.providers.RunnableProposal; import org.eclipse.bpel.ui.proposal.providers.Separator; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.bpel.ui.util.ListMap; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.bpel.ui.util.MultiObjectAdapter; import org.eclipse.bpel.ui.util.NameDialog; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.commands.Command; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalListener; import org.eclipse.jface.fieldassist.IControlContentAdapter; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; 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.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; 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.Part; import org.eclipse.wst.wsdl.PortType; import org.eclipse.wst.wsdl.WSDLFactory; import org.eclipse.xsd.XSDElementDeclaration; /** * Details section for the Partner/PortType/Operation properties of a * Receive/Reply/Invoke activity and OnMessage. */ public class InvokeImplSection extends BPELPropertySection { static final String NONE = Messages.InvokeImplSection_None_1; protected static final int PARTNER_CONTEXT = 0; protected static final int OPERATION_CONTEXT = 1; protected static final int FAULTNAME_CONTEXT = 4; private int lastChangeContext = -1; private Composite parentComposite; private Label partnerLabel; private Text partnerName; private Label interfaceLabel, operationLabel; private Hyperlink interfaceName; private Button partnerBrowseButton; private Text operationText; private Button faultButton; private boolean isInvoke; private PartnerRoleFilter fPartnerRoleFilter = new PartnerRoleFilter(); private Label quickPickLabel; private Tree quickPickTree; private TreeViewer quickPickTreeViewer; private Composite faultComposite; private Label faultLabel; private Text faultText; // https://issues.jboss.org/browse/JBIDE-7861 private boolean ignoreQuickPickSelection = false; // https://issues.jboss.org/browse/JBIDE-8305 private Label messageOrElementLabel; private Text messageOrElementText; private IControlContentAdapter fTextContentAdapter = new TextContentAdapter() { @Override public void insertControlContents(Control control, String text, int cursorPosition) { if (text != null) { super.insertControlContents(control, text, cursorPosition); } } @Override public void setControlContents(Control control, String text, int cursorPosition) { if (text != null) { super.setControlContents(control, text, cursorPosition); } } }; private Button operationButton; private RunnableProposal fWSDLEditRunnableProposal; public static final int SPLIT_POINT = 55; public static final int SPLIT_POINT_OFFSET = 3 * IDetailsAreaConstants.HSPACE; private static final PartnerLink IGNORE_PARTNER_LINK = BPELFactory.eINSTANCE.createPartnerLink(); private static final Operation IGNORE_OPERATION = WSDLFactory.eINSTANCE.createOperation(); /** * Stretch this section to maximum use of space */ @Override public boolean shouldUseExtraSpace () { return true; } private static List<String> getVariablesNamesInUse(EObject parent) { List<String> variablesNames = new ArrayList<String>(); // https://issues.jboss.org/browse/JBIDE-8042 // grab all visible variables, not just Process and Scope variables // NOTE: this includes implicit variables defined in ForEach Variable[] variables = BPELUtil.getVisibleVariables((EObject)parent); for (Variable var : variables) { variablesNames.add(var.getName()); } return variablesNames; } /** * The same as labelWordFor(), except these strings don't contain mnemonics! * @param direction * @return the label */ private String plainLabelWordFor (EObject input, int direction) { if (isInvoke || !(input instanceof Reply)) { return (direction == ModelHelper.OUTGOING || direction == ModelHelper.NOT_SPECIFIED)? Messages.InvokeImplDetails_Request_3_Plain:Messages.InvokeImplDetails_Response_4_Plain; } return (direction == ModelHelper.OUTGOING || direction == ModelHelper.NOT_SPECIFIED)? Messages.InvokeImplDetails_Response_4_Plain:Messages.InvokeImplDetails_Request_3_Plain; } @Override protected MultiObjectAdapter[] createAdapters() { return new MultiObjectAdapter[] { /* model object */ new MultiObjectAdapter() { @Override public void notify(Notification n) { try { Object input = getInput(); boolean upp = false; // TODO: can the calls to updatePortTypeWidgets() be improved? if (ModelHelper.isPartnerAffected(input, n)) { upp = true; updatePartnerWidgets(); updatePortTypeWidgets(); updateOperationWidgets(); updateMessageOrElementWidgets(); // https://issues.jboss.org/browse/JBIDE-8305 updateFaultWidgets(); } else if (ModelHelper.isOperationAffected(input, n)) { upp = true; updatePortTypeWidgets(); updateOperationWidgets(); updateMessageOrElementWidgets(); // https://issues.jboss.org/browse/JBIDE-8305 updateFaultWidgets(); } else { updateFaultWidgets(); } // Update the response variable widgets, because if the operation // is one-way, these widgets should be disabled. rearrangeWidgets(); if (replyTypeEnabled() && ModelHelper.isFaultNameAffected(input, n)) { updateFaultWidgets(); } } catch (Exception e) { BPELUIPlugin.log(e); } } }, }; } protected boolean replyTypeEnabled () { if ((getInput() instanceof Reply) == false) { return false; } return true; } private void doChildLayout() { faultComposite.setVisible( replyTypeEnabled() ); parentComposite.layout(true); } @Override protected void basicSetInput(EObject input) { super.basicSetInput(input); rearrangeWidgets(); updateQuickPickWidgets(); updatePartnerWidgets(); updatePortTypeWidgets(); updateOperationWidgets(); updateMessageOrElementWidgets(); // https://issues.jboss.org/browse/JBIDE-8305 updateFaultWidgets(); } private void rearrangeWidgets() { Object input = getInput(); isInvoke = (input instanceof Invoke); fPartnerRoleFilter.setRequireMyRole( !isInvoke ); fPartnerRoleFilter.setRequirePartnerRole( isInvoke ); doChildLayout(); } private Composite createPartnerWidgets(Composite top, Composite parent) { FlatFormData data; final Composite composite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE); } data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); composite.setLayoutData(data); partnerLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplDetails_Partner__10); partnerName = fWidgetFactory.createText(composite, EMPTY_STRING, SWT.NONE); partnerBrowseButton = fWidgetFactory.createButton(composite,EMPTY_STRING,SWT.ARROW | SWT.DOWN | SWT.RIGHT ); // Content Assist for Partner Link RunnableProposal proposal = new RunnableProposal() { @Override public String getLabel() { return Messages.InvokeImplSection_0; } public void run() { createPartnerLink ( BPELUtils.getProcess( getInput () ) , null ); } }; RunnableProposal proposal2 = new RunnableProposal() { @Override public String getLabel() { return Messages.InvokeImplSection_1; } public void run() { createPartnerLink ( ModelHelper.getContainingScope( getInput()), null); } }; RunnableProposal proposal3 = new RunnableProposal() { @Override public String getLabel() { return Messages.InvokeImplSection_2; } public void run() { CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll( basicCommandList( getInput() , null, null )) ; getCommandFramework().execute( cmd ); } }; PartnerLinkContentProvider provider = new PartnerLinkContentProvider(); ModelContentProposalProvider proposalProvider; proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider () { @Override public Object value() { return getInput(); } }, provider,fPartnerRoleFilter ); proposalProvider.addProposalToEnd( new Separator () ); proposalProvider.addProposalToEnd( proposal ); proposalProvider.addProposalToEnd( proposal2 ); proposalProvider.addProposalToEnd( proposal3 ); proposalProvider.addProposalToEnd( getWSDLEdit() ); final FieldAssistAdapter contentAssist = new FieldAssistAdapter ( partnerName, fTextContentAdapter, proposalProvider, null, null, true ); // contentAssist.setLabelProvider( new ModelLabelProvider () ); contentAssist.setPopupSize( new Point(300,100) ); contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); contentAssist.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE); contentAssist.addContentProposalListener( proposal ); contentAssist.addContentProposalListener( proposal2 ); contentAssist.addContentProposalListener( proposal3 ); contentAssist.addContentProposalListener( getWSDLEdit() ); contentAssist.addContentProposalListener(new IContentProposalListener () { public void proposalAccepted(IContentProposal chosenProposal) { if (chosenProposal.getContent() == null) { return ; } PartnerLink pl = null; try { pl = (PartnerLink) ((Adapter)chosenProposal).getTarget(); } catch (Throwable t) { return ; } CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll( basicCommandList(getInput(),pl,null) ); getCommandFramework().execute(cmd); } }); // End of Content Assist for variable partnerBrowseButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { contentAssist.openProposals(); } }); partnerName.addListener(SWT.KeyDown, new Listener () { public void handleEvent(Event event) { if (event.keyCode == SWT.CR) { findAndSetOrCreatePartnerLink( partnerName.getText() ); } } }); // End of content assist for partner link data = new FlatFormData(); data.right = new FlatFormAttachment(100, 0); data.top = new FlatFormAttachment(partnerName,+2,SWT.TOP); data.bottom = new FlatFormAttachment(partnerName,-2,SWT.BOTTOM); partnerBrowseButton.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(partnerLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(partnerBrowseButton, 0); partnerName.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(partnerName, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(partnerName, 0, SWT.CENTER); partnerLabel.setLayoutData(data); partnerBrowseButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { contentAssist.openProposals(); } }); return composite; } // private void browseForPartnerLink () { // // Shell shell = partnerLabel.getShell(); // EObject model = getInput(); // PartnerLinkSelectorDialog dialog = new PartnerLinkSelectorDialog(shell, model); // if (dialog.open() == Window.OK) { // PartnerLink partner = dialog.getPartnerLink(); // // List<Command> cmds = basicCommandList( model , null, null ); // // SetCommand cmd = (SetCommand) ListMap.Find(cmds, new ListMap.Visitor() { // public Object visit(Object obj) { // return (obj instanceof SetPartnerLinkCommand ? obj : ListMap.IGNORE ); // } // }); // // cmd.setNewValue( partner ); // CompoundCommand ccmd = new CompoundCommand(); // ccmd.getCommands().addAll(cmds); // lastChangeContext = PARTNER_CONTEXT; // getCommandFramework().execute(wrapInShowContextCommand(ccmd)); // } // } private Composite createPortTypeWidgets (Composite top, Composite parent) { FlatFormData data; if (true) { return top ; } final Composite composite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE); } data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); composite.setLayoutData(data); interfaceLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplSection_3); interfaceName = fWidgetFactory.createHyperlink(composite, EMPTY_STRING, SWT.NONE); interfaceName.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { PortType pt = ModelHelper.getPortType(getInput()); if (pt != null) { BPELUtil.openEditor( pt, getBPELEditor() ); } } }); interfaceName.setToolTipText(Messages.InvokeImplSection_4); data = new FlatFormData(); data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(interfaceLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(100,0); interfaceName.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(interfaceName, 0); data.top = new FlatFormAttachment(interfaceName, 0, SWT.CENTER); interfaceLabel.setLayoutData(data); return composite; } private Composite createOperationWidgets(Composite top, Composite parent) { FlatFormData data; final Composite composite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE ); } data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); composite.setLayoutData(data); operationLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplDetails_Operation__19); operationText = fWidgetFactory.createText(composite,EMPTY_STRING,SWT.NONE); operationButton = fWidgetFactory.createButton(composite,EMPTY_STRING,SWT.ARROW|SWT.CENTER|SWT.DOWN); // Provide Content Assist for the variables OperationContentProvider provider = new OperationContentProvider(); ModelContentProposalProvider proposalProvider; proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider () { @Override public Object value() { return getInput(); } }, provider); proposalProvider.addProposalToEnd( new Separator () ); proposalProvider.addProposalToEnd( getWSDLEdit() ); final FieldAssistAdapter contentAssist = new FieldAssistAdapter ( operationText, fTextContentAdapter, proposalProvider, null, null, true ); // contentAssist.setLabelProvider( new ModelLabelProvider () ); contentAssist.setPopupSize( new Point(300,100) ); contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); contentAssist.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE); contentAssist.addContentProposalListener( getWSDLEdit() ); contentAssist.addContentProposalListener(new IContentProposalListener () { public void proposalAccepted(IContentProposal chosenProposal) { if (chosenProposal.getContent() == null) { return ; } Operation oper = null; try { oper = (Operation) ((Adapter)chosenProposal).getTarget(); } catch (Throwable t) { return ; } List<Command> list = basicCommandList(getInput(), IGNORE_PARTNER_LINK , oper ); CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll (list); getCommandFramework().execute( cmd ); } }); // End of Content Assist for variable operationButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { contentAssist.openProposals(); } }); operationText.addListener(SWT.KeyDown, new Listener () { public void handleEvent(Event event) { if (event.keyCode == SWT.CR) { findAndSetOperation ( operationText.getText() ); } } }); // end of content assist data = new FlatFormData(); data.right = new FlatFormAttachment(100,0); data.top = new FlatFormAttachment(operationText,+2,SWT.TOP); data.bottom = new FlatFormAttachment(operationText,-2,SWT.BOTTOM); operationButton.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(operationLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(operationButton, 0); operationText.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(operationText, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(operationText, 0, SWT.CENTER); operationLabel.setLayoutData(data); // operationViewer.addFilter(AddNullFilter.getInstance()); // operationViewer.setLabelProvider(new ModelLabelProvider()); // operationViewer.setContentProvider(new OperationContentProvider()); // operationViewer.setSorter(ModelViewerSorter.getInstance()); // operationViewer.addSelectionChangedListener(new ISelectionChangedListener() { // public void selectionChanged(SelectionChangedEvent event) { // IStructuredSelection sel = (IStructuredSelection)operationViewer.getSelection(); // // TODO: if changing to a one-way operation, clear the response variable (if any) // PartnerLink partnerLink = ModelHelper.getPartnerLink(getInput()); // // CompoundCommand cmd = new CompoundCommand(); // Command child = null; // PortType portType = getEffectivePortType(partnerLink); // Operation op = (Operation)sel.getFirstElement(); // // if (op == null) portType = null; // // child = new SetPortTypeCommand(getInput(), portType); // if (child.canExecute()) cmd.add(child); // // child = new SetOperationCommand(getInput(), op); // if (child.canExecute()) { // if (replyTypeEnabled()) { // Command setFaultCommand = new SetWSDLFaultCommand(getInput(), null); // if (setFaultCommand.canExecute()) cmd.add(setFaultCommand); // } // cmd.add(child); cmd.setLabel(child.getLabel()); // } // // if (getInput() instanceof OnEvent) { // child = new SetOnEventVariableTypeCommand((OnEvent)getInput()); // cmd.add(child); // } // blockOperationUpdates = true; // lastChangeContext = OPERATION_CONTEXT; // try { // getCommandFramework().execute(wrapInShowContextCommand(cmd)); // } finally { // blockOperationUpdates = false; // } // } // }); return composite; } // https://issues.jboss.org/browse/JBIDE-8305 private Composite createMessageOrElementWidgets(Composite top, Composite parent) { FlatFormData data; final Composite composite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE ); } data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); composite.setLayoutData(data); messageOrElementLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplDetails_MessageTypeOrElement); messageOrElementText = fWidgetFactory.createText(composite,EMPTY_STRING,SWT.NONE); messageOrElementText.setEditable(false); // read-only text for visual feedback of Quick Pick tree selection data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(messageOrElementLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(operationButton, 0); messageOrElementText.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(messageOrElementText, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(messageOrElementText, 0, SWT.CENTER); messageOrElementLabel.setLayoutData(data); return composite; } // protected Composite createInputVariableWidgets(Composite top, Composite parent) { // FlatFormData data; // // final Composite composite = inputVariableComposite = createFlatFormComposite(parent); // data = new FlatFormData(); // if (top == null) { // data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); // } else { // data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE); // } // data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); // data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); // composite.setLayoutData(data); // // inputVariableLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplSection_7); // inputVariableText = fWidgetFactory.createText(composite,EMPTY_STRING); // inputVariableButton = fWidgetFactory.createButton(composite, EMPTY_STRING, SWT.ARROW|SWT.DOWN|SWT.CENTER); // // // Provide Content Assist for the variables // // Content assist on partnerName // RunnableProposal proposal = new RunnableProposal() { // // @Override // public String getLabel() { // return Messages.InvokeImplSection_10; // } // public void run() { // createVariable ( // ModelHelper.getProcess( getInput () ), // null, // isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING); // } // }; // // RunnableProposal proposal2 = new RunnableProposal() { // // @Override // public String getLabel() { // return Messages.InvokeImplSection_11; // } // public void run() { // createVariable ( // getInput (), // null, // isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING); // } // }; // // RunnableProposal proposal3 = new RunnableProposal() { // @Override // public String getLabel() { // return Messages.InvokeImplSection_12; // } // public void run() { // int direction = isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING; // getCommandFramework().execute( new SetVariableCommand(getInput(),null,direction) ); // } // }; // // VariableContentProvider provider = new VariableContentProvider(); // ModelContentProposalProvider proposalProvider; // proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider () { // @Override // public Object value() { // return getInput(); // } // }, provider,fInputVariableFilter); // // proposalProvider.addProposalToEnd( new Separator () ); // proposalProvider.addProposalToEnd( proposal ); // proposalProvider.addProposalToEnd( proposal2 ); // proposalProvider.addProposalToEnd( proposal3 ); // // final FieldAssistAdapter contentAssist = new FieldAssistAdapter ( // inputVariableText, // fTextContentAdapter, // proposalProvider, // null, // null ); // // // contentAssist.setLabelProvider( new ModelLabelProvider () ); // contentAssist.setPopupSize( new Point(300,100) ); // contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); // contentAssist.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE); // contentAssist.addContentProposalListener( proposal ); // contentAssist.addContentProposalListener( proposal2 ); // contentAssist.addContentProposalListener( proposal3 ); // contentAssist.addContentProposalListener(new IContentProposalListener () { // // public void proposalAccepted(IContentProposal chosenProposal) { // if (chosenProposal.getContent() == null) { // return ; // } // Variable variable = null; // try { // variable = (Variable) ((Adapter)chosenProposal).getTarget(); // } catch (Throwable t) { // return ; // } // SetVariableCommand cmd = new SetVariableCommand(getInput(),variable); // getCommandFramework().execute( cmd ); // } // }); // // // End of Content Assist for variable // inputVariableButton.addListener(SWT.Selection, new Listener() { // public void handleEvent(Event event) { // contentAssist.openProposals(); // } // }); // // inputVariableText.addListener(SWT.KeyDown, new Listener () { // public void handleEvent(Event event) { // if (event.keyCode == SWT.CR) { // findAndSetOrCreateVariable( inputVariableText.getText(), // isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING ); // } // } // }); // // data = new FlatFormData(); // data.right = new FlatFormAttachment(100,0); // data.top = new FlatFormAttachment(inputVariableText,+2,SWT.TOP); // data.bottom = new FlatFormAttachment(inputVariableText,-2,SWT.BOTTOM); // inputVariableButton.setLayoutData(data); // // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(operationLabel, STANDARD_LABEL_WIDTH_SM)); // data.right = new FlatFormAttachment(inputVariableButton, 0); // inputVariableText.setLayoutData(data); // // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, 0); // data.right = new FlatFormAttachment(inputVariableText, -IDetailsAreaConstants.HSPACE); // data.top = new FlatFormAttachment(inputVariableText, 0, SWT.CENTER); // inputVariableLabel.setLayoutData(data); // // return composite; // // // } // /** // * The output variable widgets are only pertaining to Invoke activity, if there is // * an output message on the partner link // * // * @param top // * @param parent // * @return the output variable composite // */ // // protected Composite createOutputVariableComposite (Composite top, Composite parent) { // FlatFormData data; // // final Composite composite = outputVariableComposite = createFlatFormComposite(parent); // // data = new FlatFormData(); // if (top == null) { // data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); // } else { // data.top = new FlatFormAttachment( top, IDetailsAreaConstants.VSPACE); // } // data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); // data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); // composite.setLayoutData(data); // // outputVariableLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplSection_13); // outputVariableText = fWidgetFactory.createText(composite,EMPTY_STRING); // outputVariableButton = fWidgetFactory.createButton(composite, EMPTY_STRING, SWT.ARROW|SWT.DOWN|SWT.CENTER); // // // Provide Content Assist for the operation // // // Runnable proposal. // RunnableProposal proposal = new RunnableProposal() { // // @Override // public String getLabel() { // return Messages.InvokeImplSection_16; // } // public void run() { // createVariable ( ModelHelper.getProcess( getInput () ),null,ModelHelper.INCOMING ); // } // }; // // RunnableProposal proposal2 = new RunnableProposal() { // @Override // public String getLabel() { // return "Create Local Output Variable"; //$NON-NLS-1$ // } // public void run() { // createVariable (getInput (),null,ModelHelper.INCOMING); // } // }; // // // RunnableProposal proposal3 = new RunnableProposal() { // @Override // public String getLabel() { // return "Clear Output Variable"; //$NON-NLS-1$ // } // public void run() { // getCommandFramework().execute( new SetVariableCommand(getInput(),null,ModelHelper.INCOMING) ); // } // }; // // VariableContentProvider provider = new VariableContentProvider(); // ModelContentProposalProvider proposalProvider; // proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider () { // @Override // public Object value() { // return getInput(); // } // }, provider,fOutputVariableFilter); // // proposalProvider.addProposalToEnd( new Separator () ); // proposalProvider.addProposalToEnd( proposal ); // proposalProvider.addProposalToEnd( proposal2 ); // proposalProvider.addProposalToEnd( proposal3 ); // // final FieldAssistAdapter contentAssist = new FieldAssistAdapter ( // outputVariableText, // fTextContentAdapter, // proposalProvider, // null, // null ); // // // contentAssist.setLabelProvider( new ModelLabelProvider () ); // contentAssist.setPopupSize( new Point(300,100) ); // contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); // contentAssist.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE ); // contentAssist.addContentProposalListener( proposal ); // contentAssist.addContentProposalListener( proposal2 ); // contentAssist.addContentProposalListener( proposal3 ); // contentAssist.addContentProposalListener(new IContentProposalListener () { // // public void proposalAccepted (IContentProposal chosenProposal) { // if (chosenProposal.getContent() == null) { // return ; // } // Variable variable = null; // try { // variable = (Variable) ((Adapter)chosenProposal).getTarget(); // } catch (Throwable t) { // return ; // } // SetVariableCommand cmd = new SetVariableCommand(getInput(),variable, ModelHelper.INCOMING ); // getCommandFramework().execute( cmd ); // } // }); // // // End of Content Assist for operation // // outputVariableButton.addListener(SWT.Selection, new Listener() { // public void handleEvent(Event event) { // contentAssist.openProposals(); // } // }); // outputVariableText.addListener(SWT.KeyDown, new Listener () { // public void handleEvent(Event event) { // if (event.keyCode == SWT.CR) { // findAndSetOrCreateVariable( outputVariableText.getText(),ModelHelper.INCOMING ); // } // } // }); // // data = new FlatFormData(); // data.right = new FlatFormAttachment(100,0); // data.top = new FlatFormAttachment(outputVariableText,+2,SWT.TOP); // data.bottom = new FlatFormAttachment(outputVariableText,-2,SWT.BOTTOM); // outputVariableButton.setLayoutData(data); // // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(operationLabel, STANDARD_LABEL_WIDTH_SM)); // data.right = new FlatFormAttachment(outputVariableButton,0); // outputVariableText.setLayoutData(data); // // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, 0); // data.right = new FlatFormAttachment(outputVariableText, -IDetailsAreaConstants.HSPACE); // data.top = new FlatFormAttachment(outputVariableText, 0, SWT.CENTER); // outputVariableLabel.setLayoutData(data); // // return composite; // } // private String getVariableDialogTitle(EObject target, int direction) { // if (fModelObject instanceof Invoke) { // return (direction == ModelHelper.OUTGOING) ? // Messages.InvokeImplSection_Select_Request_Variable_1 : // Messages.InvokeImplSection_Select_Response_Variable_1; // } // return (direction == ModelHelper.OUTGOING) ? // Messages.InvokeImplSection_Select_Response_Variable_1 : // Messages.InvokeImplSection_Select_Request_Variable_1; // } private Composite createFaultComposite(Composite top, Composite parent) { FlatFormData data; final Composite composite = faultComposite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top, IDetailsAreaConstants.VSPACE); } data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(InvokeImplSection.SPLIT_POINT, -InvokeImplSection.SPLIT_POINT_OFFSET); composite.setLayoutData(data); faultLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplDetails_Fault_Name__25); faultText = fWidgetFactory.createText(composite, EMPTY_STRING); faultButton = fWidgetFactory.createButton(composite, EMPTY_STRING, SWT.ARROW | SWT.DOWN | SWT.CENTER); // Provide Content Assist for the operation WSDLFaultContentProvider provider = new WSDLFaultContentProvider(); ModelContentProposalProvider proposalProvider; proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider() { @Override public Object value() { return ModelHelper.getOperation(getInput()); } }, provider); RunnableProposal proposalClearFault = new RunnableProposal() { @Override public String getLabel() { return Messages.InvokeImplSection_25; } public void run() { CompoundCommand cmd = new CompoundCommand(); cmd.add(new SetWSDLFaultCommand(getInput(), null)); getCommandFramework().execute( cmd ); } }; proposalProvider.addProposalToEnd(new Separator()); proposalProvider.addProposalToEnd(proposalClearFault); final FieldAssistAdapter contentAssist = new FieldAssistAdapter( faultText, fTextContentAdapter, proposalProvider, null, null, true); // contentAssist.setLabelProvider(new ModelLabelProvider()); contentAssist.setPopupSize(new Point(300, 100)); contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); contentAssist .setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE); contentAssist.addContentProposalListener(new IContentProposalListener() { public void proposalAccepted(IContentProposal chosenProposal) { if (chosenProposal.getContent() == null) { return; } Fault fault = null; try { fault = (Fault) ((Adapter) chosenProposal) .getTarget(); } catch (Throwable t) { return; } CompoundCommand cmd = new CompoundCommand(); cmd.add(new SetWSDLFaultCommand(getInput(), fault)); getCommandFramework().execute( cmd ); } }); contentAssist.addContentProposalListener( proposalClearFault ); // End of Content Assist for fault faultButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { contentAssist.openProposals(); } }); data = new FlatFormData(); data.right = new FlatFormAttachment(100, 0); data.top = new FlatFormAttachment(faultText, +2, SWT.TOP); data.bottom = new FlatFormAttachment(faultText, -2, SWT.BOTTOM); faultButton.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth( operationLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(faultButton, 0); faultText.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(faultText, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(faultText, 0, SWT.CENTER); faultLabel.setLayoutData(data); return composite; } // protected Composite createFaultNameWidgets(Composite top, Composite parent) { // FlatFormData data; // // Composite composite = faultNameComposite = createFlatFormComposite(parent); // data = new FlatFormData(); // if (top == null) { // data.top = new FlatFormAttachment (0,IDetailsAreaConstants.VSPACE); // } else { // data.top = new FlatFormAttachment (top,IDetailsAreaConstants.VSPACE); // } // data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); // data.right = new FlatFormAttachment(SPLIT_POINT, -SPLIT_POINT_OFFSET); // composite.setLayoutData(data); // // Label faultNameLabel = fWidgetFactory.createLabel(composite, Messages.InvokeImplDetails_Fault_Name__25); // // faultNameCombo = fWidgetFactory.createCCombo(composite); // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultNameLabel, STANDARD_LABEL_WIDTH_SM)); // data.right = new FlatFormAttachment(100, -SHORT_BUTTON_WIDTH-IDetailsAreaConstants.HSPACE); // faultNameCombo.setLayoutData(data); // // faultNameViewer = new CComboViewer(faultNameCombo); // faultNameViewer.setLabelProvider(new ModelLabelProvider()); // faultNameViewer.setContentProvider(new WSDLFaultContentProvider()); // faultNameViewer.setSorter(ModelViewerSorter.getInstance()); // faultNameViewer.addFilter(AddNullFilter.getInstance()); // faultNameViewer.addSelectionChangedListener(new ISelectionChangedListener() { // public void selectionChanged(SelectionChangedEvent event) { // IStructuredSelection sel = (IStructuredSelection)faultNameViewer.getSelection(); // Fault fault = (Fault)sel.getFirstElement(); // CompoundCommand cmd = new CompoundCommand(); // cmd.add(new SetWSDLFaultCommand(getInput(), fault)); // /* WDG: removed command */ // lastChangeContext = FAULTNAME_CONTEXT; // getCommandFramework().execute(wrapInShowContextCommand(cmd)); // } // }); // // data = new FlatFormData(); // data.left = new FlatFormAttachment(0, 0); // data.right = new FlatFormAttachment(faultNameCombo, -IDetailsAreaConstants.HSPACE); // data.top = new FlatFormAttachment(faultNameCombo, 0, SWT.CENTER); // faultNameLabel.setLayoutData(data); // // return composite; // } private Composite createQuickPick (Composite top, Composite parent) { FlatFormData data; final Composite composite = createFlatFormComposite(parent); data = new FlatFormData(); if (top == null) { data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); } else { data.top = new FlatFormAttachment(top,IDetailsAreaConstants.VSPACE); } data.left = new FlatFormAttachment(SPLIT_POINT, SPLIT_POINT_OFFSET); data.right = new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE); data.bottom = new FlatFormAttachment(100,-IDetailsAreaConstants.VSPACE); composite.setLayoutData(data); quickPickLabel = fWidgetFactory.createLabel(composite, "Quick Pick:"); //$NON-NLS-1$ // Tree viewer for variable structure ... quickPickTree = fWidgetFactory.createTree(composite, SWT.NONE); PartnerLinkTreeContentProvider treeContentProvider = new PartnerLinkTreeContentProvider(true); quickPickTreeViewer = new TreeViewer(quickPickTree); quickPickTreeViewer.setContentProvider(treeContentProvider); quickPickTreeViewer.setLabelProvider(new ModelTreeLabelProvider()); quickPickTreeViewer.addFilter( fPartnerRoleFilter ); quickPickTreeViewer.setInput ( null ); // https://issues.jboss.org/browse/JBIDE-8305 // show tree down to message part level so that tree node highlight works // when the tree viewer is constructed. quickPickTreeViewer.setAutoExpandLevel(5); // end tree viewer for variable structure data = new FlatFormData(); data.top = new FlatFormAttachment ( 0,0); data.left = new FlatFormAttachment(0,0); quickPickLabel.setLayoutData(data); data = new FlatFormData(); data.top = new FlatFormAttachment( quickPickLabel, IDetailsAreaConstants.VSPACE); data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); data.right = new FlatFormAttachment(100,-IDetailsAreaConstants.HSPACE); data.bottom = new FlatFormAttachment(100,-IDetailsAreaConstants.HSPACE); quickPickTree.setLayoutData(data); quickPickTreeViewer.addSelectionChangedListener( new ISelectionChangedListener () { public void selectionChanged(SelectionChangedEvent event) { // https://issues.jboss.org/browse/JBIDE-7861 // ignore if the selection event came from updateQuickPickSelection() if (ignoreQuickPickSelection) ignoreQuickPickSelection = false; else quickPickSelectionChanged ( event.getSelection() ); } }); return composite; } @Override protected void createClient(Composite parent) { Composite composite = parentComposite = createFlatFormComposite(parent); Composite ref = createPartnerWidgets(null,composite); ref = createPortTypeWidgets(ref, composite); ref = createOperationWidgets(ref,composite); ref = createMessageOrElementWidgets(ref,composite); // https://issues.jboss.org/browse/JBIDE-8305 ref = createFaultComposite ( ref, composite ); // This creates it on the top ref = createQuickPick(null,composite); PlatformUI.getWorkbench().getHelpSystem().setHelp( parentComposite, IHelpContextIds.PROPERTY_PAGE_INVOKE_IMPLEMENTATION); } private void updatePartnerWidgets() { PartnerLink partnerLink = ModelHelper.getPartnerLink(getInput()); if (partnerLink == null) { partnerName.setText(EMPTY_STRING); } else { ILabeledElement labeledElement = BPELUtil.adapt(partnerLink, ILabeledElement.class); // https://issues.jboss.org/browse/JBIDE-7861 partnerName.setText(labeledElement.getLabel(partnerLink)); updateQuickPickSelection(partnerLink); } } // protected void updateInputVariableWidgets () { // // if (isInvoke) { // inputVariableLabel.setText(Messages.InvokeImplSection_22); // } else { // inputVariableLabel.setText(Messages.InvokeImplSection_23); // } // // Variable inputVar = ModelHelper.getVariable(getInput(), // isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING); // // if (inputVar != null) { // inputVariableText.setText( inputVar.getName() ); // } else { // inputVariableText.setText(EMPTY_STRING); // } // // //Figure out the type of the message. // fInputVariableFilter.clear(); // Object type = ModelHelper.getVariableType( getInput(), isInvoke ? ModelHelper.OUTGOING : ModelHelper.INCOMING ); // if (type != null && type instanceof Message) { // fInputVariableFilter.setType( (Message) type ); // } // } // protected void updateOutputVariableWidgets () { // // outputVariableComposite.setVisible( isInvoke ); // // if ( !isInvoke ) { // return ; // } // // Variable outputVar = ModelHelper.getVariable(getInput(), ModelHelper.INCOMING); // if (outputVar != null) { // outputVariableText.setText(outputVar.getName()); // } else { // outputVariableText.setText(EMPTY_STRING); // } // // //Figure out the type of the message. // fOutputVariableFilter.clear(); // Object type = ModelHelper.getVariableType( getInput(), ModelHelper.INCOMING ); // if (type != null) { // if (type instanceof Message) { // fOutputVariableFilter.setType( (Message) type ); // } // } // } // TODO: move these to ModelHelper? private PortType getEffectivePortType (PartnerLink partnerLink) { if (partnerLink != null) { Role role = isInvoke? partnerLink.getPartnerRole() : partnerLink.getMyRole(); return ModelHelper.getRolePortType(role); } return null; } private void updateQuickPickWidgets () { fPartnerRoleFilter.setRequireMyRole( !isInvoke ); fPartnerRoleFilter.setRequirePartnerRole( isInvoke ); Object myInput = getInput(); if ( myInput != quickPickTreeViewer.getInput() ) { quickPickTreeViewer.setInput( myInput ); if (myInput != null) { quickPickTree.getVerticalBar().setSelection(0); } } } // https://issues.jboss.org/browse/JBIDE-7861 // update the Quick Pick tree with currently selected model object private void updateQuickPickSelection(Object model) { ignoreQuickPickSelection = true; TreeItem[] items = quickPickTree.getItems(); for (int i=0; i<items.length; ++i) { if ( updateQuickPickSelection(model, items[i])) break; } } private boolean updateQuickPickSelection(Object model, TreeItem item) { Object data = item.getData(); if ( data instanceof TreeNode ) { Object obj = ((TreeNode)data).getModelObject(); if (obj instanceof PartnerLink) { PartnerLink partnerLink = ModelHelper.getPartnerLink(getInput()); if (obj!=partnerLink) return false; } // https://issues.jboss.org/browse/JBIDE-8305 else if (obj instanceof Input) { obj = ModelHelper.getMessageType(obj); } else if (obj instanceof Part) { obj = ModelHelper.getVariableTypeFrom(obj); } if (model==obj) { quickPickTree.setSelection(item); return true; } TreeItem[] items = item.getItems(); for (int i=0; i<items.length; ++i) { if ( updateQuickPickSelection(model, items[i])) return true;; } } return false; } private void updatePortTypeWidgets() { if (interfaceName == null) { return ; } PartnerLink partnerLink = ModelHelper.getPartnerLink(getInput()); PortType portType = getEffectivePortType(partnerLink); if (portType == null) { interfaceName.setText(Messages.InvokeImplSection_None_1); interfaceName.setEnabled(false); } else { ILabeledElement labeledElement = BPELUtil.adapt(portType, ILabeledElement.class); interfaceName.setText(labeledElement.getLabel(portType)); interfaceName.setEnabled(true); } } private void updateOperationWidgets() { Operation operation = ModelHelper.getOperation(getInput()); if (operation != null) { operationText.setText( operation.getName() ); // https://issues.jboss.org/browse/JBIDE-7861 updateQuickPickSelection(operation); } else { operationText.setText ( EMPTY_STRING ); } if (getInput() instanceof OnEvent) { // https://issues.jboss.org/browse/JBIDE-8305 // show the message type or message part in the quick pick tree OnEvent onEvent = (OnEvent)getInput(); Message message = onEvent.getMessageType(); if (message!=null) { updateQuickPickSelection(message); } else { XSDElementDeclaration element = onEvent.getXSDElement(); if (element!=null) updateQuickPickSelection(element); } } } // https://issues.jboss.org/browse/JBIDE-8305 private void updateMessageOrElementWidgets() { boolean visible = (getInput() instanceof OnEvent); if (visible) { OnEvent onEvent = (OnEvent)getInput(); String text = ""; String label = Messages.InvokeImplDetails_MessageTypeOrElement; if (onEvent.getVariable()!=null) { Message message = onEvent.getMessageType(); if (message!=null) { text = message.getQName().getLocalPart(); label = Messages.InvokeImplDetails_MessageType; } else { XSDElementDeclaration element = onEvent.getXSDElement(); if (element!=null) { text = element.getName(); label = Messages.InvokeImplDetails_Element; } } } messageOrElementText.setText(text); messageOrElementLabel.setText(label); } messageOrElementLabel.setVisible(visible); messageOrElementText.setVisible(visible); } /** * replyFaultEnabled() Checks if the active activity is a reply activity and * has a fault name * * @return - true When the active activity is a reply activity and has a * fault set. * - false When the active activity is no reply activity. * When the active activity is a reply activity and the fault is * set. */ protected boolean replyFaultEnabled() { if (isInvoke) return false; if (!(getInput() instanceof Reply)) return false; boolean faultEnabled = (ModelHelper.getFaultName(getInput()) != null); return faultEnabled; } protected void updateFaultWidgets () { boolean faultEnabled = replyFaultEnabled(); if (faultEnabled) { Fault fault = ModelHelper.getWSDLFault(getInput()); if (fault != null) { faultText.setText( fault.getName() ); } else { faultText.setText ( EMPTY_STRING ); } } else { faultText.setText ( EMPTY_STRING ); } } /** * @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeShown() */ @Override public void aboutToBeShown() { super.aboutToBeShown(); doChildLayout(); } /** * @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext() */ @Override public Object getUserContext() { return Integer.valueOf( lastChangeContext ); } /** * @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object) */ @Override public void restoreUserContext(Object userContext) { int i = ((Integer)userContext).intValue(); switch (i) { case PARTNER_CONTEXT: partnerName.setFocus(); return; case OPERATION_CONTEXT: operationText.setFocus(); return; case FAULTNAME_CONTEXT: faultText.setFocus(); return; } throw new IllegalStateException(); } private void findAndSetOperation (String text) { text = text.trim(); EObject model = getInput(); PortType portType = ModelHelper.getPortType( model ); List<Command> cmdList = basicCommandList( model , IGNORE_PARTNER_LINK, null ); Operation op = null; if (text.length() > 0) { op = (Operation) ModelHelper.findElementByName( portType , text, Operation.class); if (op != null) { // set that operation SetOperationCommand cmd = (SetOperationCommand) ListMap.Find(cmdList, new ListMap.Visitor () { public Object visit(Object obj) { return (obj instanceof SetOperationCommand ? obj : ListMap.IGNORE ); } }); cmd.setNewValue(op); // https://issues.jboss.org/browse/JBIDE-7861 // set new operation in the command list for (int i=0; i<cmdList.size(); ++i) { if ( cmdList.get(i) instanceof SetOperationCommand) { cmdList.set(i, cmd); break; } } } } CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll( cmdList ); getCommandFramework().execute ( cmd ); if (op!=null) updateQuickPickSelection(op); } // void findAndSetOrCreateVariable (String text, int direction) { // // text = text.trim(); // EObject model = getInput(); // // SetVariableCommand cmd = new SetVariableCommand(getInput(),null,direction); // if (text.length() > 0) { // Variable variable = (Variable) ModelHelper.findElementByName(ModelHelper.getContainingScope(model), // text, Variable.class); // if (variable == null) { // // createVariable (getInput(), text,direction ); // return ; // } // // cmd.setNewValue( variable ); // } // // getCommandFramework().execute ( cmd ); // } // /** // * Create an input variable, set it to the right type, and set the input variable // * pon the activity. // * // * @param ref the object on which to create the variable (Scope or Process) // * @param name the name of the variable, or null // * @param the direction of the variable // */ // // void createVariable ( EObject ref, String name, int direction ) { // // Variable variable = BPELFactory.eINSTANCE.createVariable(); // // if (name == null) { // name = plainLabelWordFor( direction ); // } // // Message messageType = null; // XSDElementDeclaration elementType = null; // // Object type = ModelHelper.getVariableType( getInput(), direction ); // // if (type != null && type instanceof Message) { // messageType = (Message) type; // if (messageType.getEParts().size() == 1) { // Part part = (Part) messageType.getEParts().get(0); // elementType = part.getElementDeclaration(); // } // } // // // ask for the name, we know the type. // NameDialog nameDialog = new NameDialog( // inputVariableComposite.getShell(), // Messages.VariableSelectorDialog_New_Variable_4, // Messages.VariableSelectorDialog_Variable_Name_5, // name, // BPELUtil.getNCNameValidator()); // // if (nameDialog.open() == Window.CANCEL) { // return ; // } // // // set name and type // variable.setName ( nameDialog.getValue() ); // // if ( elementType != null ) { // variable.setXSDElement(elementType); // } else if (messageType != null) { // variable.setMessageType ( messageType ); // } // // // create the variable and then set the input variable to it. // CompoundCommand cmd = new CompoundCommand(); // cmd.add ( new AddVariableCommand(ref,variable) ); // cmd.add ( new SetVariableCommand(getInput(), variable, direction) ); // // getCommandFramework().execute( cmd ); // } void findAndSetOrCreatePartnerLink ( String name ) { name = name.trim(); EObject model = getInput(); PartnerLink pl = null; if (name.length() > 0) { pl = (PartnerLink) ModelHelper.findElementByName(ModelHelper.getContainingScope(model), name, PartnerLink.class); // does not exist if (pl == null) { // https://issues.jboss.org/browse/JBIDE-7861 pl = createPartnerLink ( ModelHelper.getContainingScope(model), name ); if (pl!=null) updateQuickPickSelection(pl); return ; } } CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll( basicCommandList(model, pl, null)); getCommandFramework().execute ( cmd ); if (pl!=null) updateQuickPickSelection(pl); } private PartnerLink createPartnerLink ( EObject ref , String name ) { PartnerLink pl = BPELFactory.eINSTANCE.createPartnerLink(); if (name == null) { name = EMPTY_STRING; } // ask for the name, we know the type. NameDialog nameDialog = new NameDialog( parentComposite.getShell(), Messages.PartnerLinkSelectorDialog_5, Messages.PartnerLinkSelectorDialog_6, name, BPELUtil.getNCNameValidator()); if (nameDialog.open() == Window.CANCEL) { return null; } PartnerLinkTypeSelectorDialog dialog = new PartnerLinkTypeSelectorDialog( partnerName.getShell(), getInput()); if (dialog.open() == Window.CANCEL) { return null; } Object result = dialog.getFirstResult(); PartnerLinkType plt = null; if (result != null && result instanceof PartnerLinkType) { plt = (PartnerLinkType) result; } // Ask user about role EList<Role> list = plt.getRole(); if (list.size() > 1){ PartnerLinkRoleSelectorDialog roleDialog = new PartnerLinkRoleSelectorDialog(parentComposite.getShell(), list, plt); if (isInvoke){ roleDialog.setTitle(Messages.PartnerRoleSelectorDialog_Title_PartnerRole); } else { roleDialog.setTitle(Messages.PartnerRoleSelectorDialog_Title_MyRole); } if (roleDialog.open() == Window.CANCEL){ return null; } if (isInvoke){ pl.setPartnerRole(list.get(roleDialog.getSelectedRole())); } else { pl.setMyRole(list.get(roleDialog.getSelectedRole())); } } else { if (isInvoke){ pl.setPartnerRole(list.get(0)); } else { pl.setMyRole(list.get(0)); } } // set name and type pl.setName ( nameDialog.getValue() ); pl.setPartnerLinkType( plt ); // ask for partner link type List<Command> cmds = basicCommandList(getInput(), pl, null); cmds.add(0, new AddPartnerLinkCommand( ref, pl )); // CompoundCommand cmd = new CompoundCommand(); cmd.getCommands().addAll(cmds); getCommandFramework().execute(cmd); // TODO: Is there any way to refresh quick pick without this hack? quickPickTreeViewer.setInput ( null ); updateQuickPickWidgets(); return pl; } /** * Handle the quick pick from the partner link tree. * * The logic here will attempt to fill in as much of the details * as possible. It may create variables necessary to for the partner * activity to make sense. * * @param selection the selection from the tree */ private void quickPickSelectionChanged ( ISelection selection ) { if (selection.isEmpty()) { return ; } ITreeSelection treeSelection = (ITreeSelection) selection; quickPickSelectionChanged ( treeSelection.getPaths() ); } private void quickPickSelectionChanged ( TreePath[] paths ) { // Assumption is that we are single selection ... if (paths.length > 0) { quickPickSelectionChanged ( paths[0] ); } } private void quickPickSelectionChanged ( TreePath path ) { // The tree view contains nodes which may have multiple parents // so we have to walk the selection using the visual elements // org.eclipse.bpel.ui.details.tree.PartnerLinkTreeNode@3905e3 // org.eclipse.bpel.ui.details.tree.PortTypeTreeNode@13d765c // org.eclipse.bpel.ui.details.tree.OperationTreeNode@fcc070 // org.eclipse.bpel.ui.details.tree.MessageTypeTreeNode@1167d36 // org.eclipse.bpel.ui.details.tree.PartTreeNode@33910a // org.eclipse.bpel.ui.details.tree.XSDElementDeclarationTreeNode@1e96ffd // // https://issues.jboss.org/browse/JBIDE-7861 if (ignoreQuickPickSelection) return; EObject input = getInput(); List cmdList = basicCommandList( input , null, null); PartnerLink pl = null; Operation op = null; Part part = null; SetCommand setCommand = null; for (int i=0,j=path.getSegmentCount(); i < j; i++) { Object model = null; try { model = ((ITreeNode) path.getSegment(i)).getModelObject(); } catch (Exception ex) { // should not happen BPELUIPlugin.log(ex); break; } if (model instanceof PartnerLink) { pl = (PartnerLink) model; setCommand = (SetCommand) ListMap.Find ( cmdList, new ListMap.Visitor() { public Object visit(Object obj) { return (obj instanceof SetPartnerLinkCommand ? obj : ListMap.IGNORE); } }); setCommand.setNewValue( pl ); } else if (model instanceof PortType) { // we don't do anything here ... } else if (model instanceof Operation) { op = (Operation) model; setCommand = (SetCommand) ListMap.Find ( cmdList, new ListMap.Visitor() { public Object visit(Object obj) { return (obj instanceof SetOperationCommand ? obj : ListMap.IGNORE); } }); setCommand.setNewValue( op ); // attempt to locate a variable matching the type alterCommands (cmdList,input,pl,op,(Input) op.getInput() ); alterCommands (cmdList,input,pl,op,(Output)op.getOutput() ); } else if (model instanceof Part) { // https://issues.jboss.org/browse/JBIDE-8305 // if a message part was selected, set the OnEvent "element" attribute part = (Part) model; setCommand = (SetCommand) ListMap.Find ( cmdList, new ListMap.Visitor() { public Object visit(Object obj) { return (obj instanceof SetOnEventVariableTypeCommand ? obj : ListMap.IGNORE); } }); if (setCommand!=null) setCommand.setNewValue( part.getElementDeclaration() ); } // System.out.println( "segment[" + i + "]=" + path.getSegment( i )); } CompoundCommand cmd = new CompoundCommand (); cmd.getCommands().addAll (cmdList) ; getCommandFramework().execute( cmd ); } private void alterCommands (List<Command> list, EObject input, PartnerLink pl , Operation op, Input msg ) { if (input instanceof Receive || input instanceof OnMessage || input instanceof OnEvent) { if (pl.getMyRole() == null || msg == null) { return ; } alterCommands(list, input, msg.getEMessage() , pl); } if (input instanceof Invoke) { if (pl.getPartnerRole() == null || msg == null) { return ; } alterCommands(list, input,msg.getEMessage(),pl); } } private void alterCommands (List<Command> cmds, EObject input, PartnerLink pl, Operation op, Output msg) { if (input instanceof Reply) { if (pl.getMyRole() == null || msg == null) { return ; } alterCommands(cmds,input,msg.getEMessage(),pl); } if (input instanceof Invoke) { if (pl.getPartnerRole() == null || msg == null) { return; } alterCommands(cmds,input,msg.getEMessage(),pl,ModelHelper.INCOMING); } } private void alterCommands ( List<Command> cmds, EObject input, Message msg, PartnerLink pl) { alterCommands ( cmds, input,msg,pl, ModelHelper.NOT_SPECIFIED); } private void alterCommands (List<Command> cmds, EObject input, Message msg, PartnerLink pl, final int direction) { Variable variable = findVariable(input, msg, pl); if (variable == null) { // no such variable, create one variable = BPELFactory.eINSTANCE.createVariable(); String name = pl.getName() + plainLabelWordFor(input, direction); List<String> variablesNamesInUse = getVariablesNamesInUse(input); if (variablesNamesInUse.contains(name)) { int index = 1; while (variablesNamesInUse.contains(name + index)) { index++; } name = name + index; } variable.setName ( name ); variable.setMessageType( msg ); // https://issues.jboss.org/browse/JBIDE-8305 // don't create a new variable for OnEvent - this is an "implicit" variable if (input instanceof OnEvent == false) cmds.add(0, new AddVariableCommand(input, variable)); } SetVariableCommand cmd = (SetVariableCommand) ListMap.Find(cmds, new ListMap.Visitor() { public Object visit(Object obj) { if (obj instanceof SetVariableCommand) { SetVariableCommand svc = (SetVariableCommand) obj; if (svc.getDirection() == direction) { return svc; } } return ListMap.IGNORE; } }); cmd.setNewValue( variable ); } /** * Find and select an appropriate variable based on the Message type passed. * The partner link is passed to be used a heuristic in the name search to decided * between several variables that match the requested type. * * @param input the input element * @param msg the message whose variable type we have to find. * @param pl partner link, optional * @return the chosen variable or null */ private Variable findVariable ( EObject input, Message msg , PartnerLink pl ) { Variable list[] = null; // https://issues.jboss.org/browse/JBIDE-8048 // this property section is also used by OnEvent if (input instanceof OnEvent) { OnEvent oe = (OnEvent)input; list = new Variable[] { oe.getVariable() }; } else list = ModelHelper.getVariablesOfType( input, msg ); if ( list.length == 1 ) { return list[0]; } if ( list.length > 0 ) { if (pl == null) { return list[0]; } // apply a simple heuristic based on having the partner link in the name. String plName = pl.getName(); for(int i=0; i < list.length; i++) { if ( list[i].getName().indexOf( plName ) >= 0) { return list[i]; } } // nothing matched better on name return list[0]; } // can't find anything matching. return null; } /** * Return the basic command list for attempting to manipulate the partner activity. * The list returned must be ordered, in the sense that the commands with the most * significance are done first. All the commands will generally be executed, the idea * being that if only partner link is selected, then the reset of the attributes of the * partner activity will be reset. * * @param input * @return the list of basic commands that are used to manipulate the partner activity */ private List<Command> basicCommandList (EObject input, PartnerLink pl, Operation op) { List<Command> list = new ArrayList<Command>(8); if (pl != IGNORE_PARTNER_LINK) { list.add ( new SetPartnerLinkCommand(input, pl) ); } if (op != IGNORE_OPERATION) { list.add ( new SetOperationCommand(input, op) ); } // These are leaf commands, that can be executed on their own list.add ( new SetVariableCommand(input,null) ); if (input instanceof OnEvent) { list.add( new SetOnEventVariableTypeCommand((OnEvent)input) ); } else if (input instanceof Reply) { list.add ( new SetWSDLFaultCommand (input, null) ); } else if (input instanceof Invoke) { list.add ( new SetVariableCommand (input, null, ModelHelper.INCOMING) ); } return list; } /** * This shows up in a couple of places, so we share it. * @return the runnable proposal for WSDL editing. */ private RunnableProposal getWSDLEdit ( ) { if (fWSDLEditRunnableProposal == null) { fWSDLEditRunnableProposal = new RunnableProposal() { @Override public String getLabel() { return Messages.InvokeImplSection_24; } public void run() { PortType pt = ModelHelper.getPortType(getInput()); if (pt != null) { BPELUtil.openEditor( pt, getBPELEditor() ); } } }; } return fWSDLEditRunnableProposal; } }