blob: f6395c5064f3b462b7573fe417df6f8d07d920fa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 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.List;
import org.eclipse.bpel.common.ui.assist.FieldAssistAdapter;
import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.details.IOngoingChange;
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.BPELFactory;
import org.eclipse.bpel.model.FromPart;
import org.eclipse.bpel.model.FromParts;
import org.eclipse.bpel.model.Invoke;
import org.eclipse.bpel.model.OnEvent;
import org.eclipse.bpel.model.OnMessage;
import org.eclipse.bpel.model.Receive;
import org.eclipse.bpel.model.Reply;
import org.eclipse.bpel.model.ToPart;
import org.eclipse.bpel.model.ToParts;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.model.util.BPELUtils;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.AddFromPartCommand;
import org.eclipse.bpel.ui.commands.AddToPartCommand;
import org.eclipse.bpel.ui.commands.AddVariableCommand;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.SetVariableCommand;
import org.eclipse.bpel.ui.commands.util.AutoUndoCommand;
import org.eclipse.bpel.ui.details.providers.ModelLabelProvider;
import org.eclipse.bpel.ui.details.providers.VariableContentProvider;
import org.eclipse.bpel.ui.details.providers.VariableFilter;
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.BatchedMultiObjectAdapter;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.bpel.ui.util.NameDialog;
import org.eclipse.bpel.ui.util.PartMappingUtil;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
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.ILabelProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.Operation;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.util.WSDLConstants;
import org.eclipse.xsd.XSDElementDeclaration;
public class InvokeVariableSection extends BPELPropertySection {
/**
* Selection Listener for the "Use Part Mapping" checkbox
*/
private class UsePartMappingCheckboxSelectionListener implements
SelectionListener {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
// Null out the variable/inputVariable/outputVarable fields
CompoundCommand ccmd = new CompoundCommand();
if (ModelHelper.isMessageActivity(getModel(), ModelHelper.INCOMING)) {
ccmd.add(new SetVariableCommand(getModel(), null,
ModelHelper.INCOMING));
}
if (ModelHelper.isMessageActivity(getModel(), ModelHelper.OUTGOING)) {
ccmd.add(new SetVariableCommand(getModel(), null,
ModelHelper.OUTGOING));
}
// Null out the fromParts and toParts
ccmd.add(new AutoUndoCommand(getInput()) {
@Override
public void doExecute() {
try {
ModelHelper.setToParts(getInput(), null);
} catch (IllegalArgumentException e) {
}
try {
ModelHelper.setFromParts(getInput(), null);
} catch (IllegalArgumentException e) {
}
}
});
getCommandFramework().execute(ccmd);
}
}
private VariableFilter fInputVariableFilter = new VariableFilter();
private VariableFilter fOutputVariableFilter = new VariableFilter();
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 inputVariableButton;
private Composite inputVariableComposite;
private Label inputVariableLabel;
private Text inputVariableText;
private Composite nonPartMappingComposite;
private Widget operationLabel;
private Button outputVariableButton;
private Composite outputVariableComposite;
private Label outputVariableLabel;
private Text outputVariableText;
private Composite parentComposite;
private Composite partMappingComposite;
private Button usePartMappingCheckbox;
@Override
protected void addAllAdapters() {
// model object
super.addAllAdapters();
// fromParts
try {
FromParts fromParts = ModelHelper.getFromParts(getModel());
if (fromParts != null) {
fAdapters[0].addToObject(fromParts);
if (fromParts.getChildren() != null) {
// add it to every single fromPart
for (FromPart fromPart : fromParts.getChildren()) {
fAdapters[0].addToObject(fromPart);
}
}
}
} catch (IllegalArgumentException e) {
}
// toParts
try {
ToParts toParts = ModelHelper.getToParts(getModel());
if (toParts != null) {
fAdapters[0].addToObject(toParts);
if (toParts.getChildren() != null) {
// add it to every single fromPart
for (ToPart toPart : toParts.getChildren()) {
fAdapters[0].addToObject(toPart);
}
}
}
} catch (IllegalArgumentException e) {
}
}
@Override
protected void basicSetInput(EObject newInput) {
super.basicSetInput(newInput);
this.usePartMappingCheckbox
.setSelection(shouldUsePartMapping(getModel()));
}
@Override
protected MultiObjectAdapter[] createAdapters() {
return new MultiObjectAdapter[] {
/* model object */
new BatchedMultiObjectAdapter() {
@Override
public void finish() {
refresh();
}
@Override
public void notify(Notification n) {
/*
* This is a hack to make the QuickPicker work: If a variable is
* set to our model object (either by command or by the
* QuickPicker) we deselect the checkbox.
*/
if (ModelHelper.isVariableAffected(getInput(), n,
ModelHelper.INCOMING)
|| ModelHelper.isVariableAffected(getInput(), n,
ModelHelper.OUTGOING)) {
// something has happened to our variable
if (n.getEventType() == Notification.SET
&& n.getNewValue() != null) {
// a new variable has been set
usePartMappingCheckbox.setSelection(false);
try {
ModelHelper.setToParts(getInput(), null);
} catch (IllegalArgumentException e) {
}
try {
ModelHelper.setFromParts(getInput(), null);
} catch (IllegalArgumentException e) {
}
}
}
}
} };
}
@Override
protected void createClient(Composite parent) {
Composite composite = createFlatFormComposite(parent);
createWidgets(composite);
}
private 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(InvokeImplSection.SPLIT_POINT,
-InvokeImplSection.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(BPELUtils.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, 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(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);
}
}
});
// https://issues.jboss.org/browse/JBIDE-8048
// do the same thing when variable name widget loses focus
inputVariableText.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent arg0) {
}
public void focusLost(FocusEvent arg0) {
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
*/
private Composite createOutputVariableWidgets(Composite top,
Composite parent) {
FlatFormData data;
final Composite composite = this.outputVariableComposite = createFlatFormComposite(parent);
if (isReceive()) {
// https://issues.jboss.org/browse/JBIDE-8048
// don't even bother creating widgets we will never use
return composite;
}
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);
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(BPELUtils.getProcess(getInput()), null,
isInvoke() ? ModelHelper.INCOMING
: ModelHelper.OUTGOING);
}
};
RunnableProposal proposal2 = new RunnableProposal() {
@Override
public String getLabel() {
return "Create Local Output Variable"; //$NON-NLS-1$
}
public void run() {
createVariable(getInput(), null,
isInvoke() ? ModelHelper.INCOMING
: ModelHelper.OUTGOING);
}
};
RunnableProposal proposal3 = new RunnableProposal() {
@Override
public String getLabel() {
return "Clear Output Variable"; //$NON-NLS-1$
}
public void run() {
getCommandFramework().execute(
new SetVariableCommand(getInput(), null,
isInvoke() ? ModelHelper.INCOMING
: ModelHelper.OUTGOING));
}
};
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, 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(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 void createPartMappingRows(ILabelProvider labelProvider,
final EObject model, List<Part> messageParts, Group refGroup,
EObject fromPartsOrToParts, final boolean isFromParts) {
FlatFormData data;
CLabel ref = null;
for (final Part part : messageParts) {
boolean isFirst = ref == null;
// create text
final Text text = fWidgetFactory.createText(refGroup, EMPTY_STRING);
Variable var = null;
// get the variable from a fromPart
if (isFromParts) {
FromParts fromParts = (FromParts) fromPartsOrToParts;
if (fromParts != null && !fromParts.getChildren().isEmpty()) {
for (FromPart fromPart : fromParts.getChildren()) {
if (fromPart.getPart() != null
&& fromPart.getPart().equals(part)) {
var = fromPart.getToVariable();
break;
}
}
}
}
// get the variable from a toPart
else {
ToParts toParts = (ToParts) fromPartsOrToParts;
if (toParts != null && !toParts.getChildren().isEmpty()) {
for (ToPart toPart : toParts.getChildren()) {
if (toPart.getPart() != null
&& toPart.getPart().equals(part)) {
var = toPart.getFromVariable();
break;
}
}
}
}
if (var != null) {
text.setText(var.getName());
} else {
text.setText(EMPTY_STRING);
}
Button button = null;
if (model instanceof OnEvent == false) {
text.setEditable(false);
// create button
button = fWidgetFactory.createButton(refGroup, EMPTY_STRING,
SWT.ARROW | SWT.DOWN | SWT.CENTER);
// align button
data = new FlatFormData();
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(text, +2, SWT.TOP);
data.bottom = new FlatFormAttachment(text, -2, SWT.BOTTOM);
button.setLayoutData(data);
}
// align text
data = new FlatFormData();
if (isFirst) {
data.top = new FlatFormAttachment(0,
IDetailsAreaConstants.VSPACE);
} else {
data.top = new FlatFormAttachment(ref,
IDetailsAreaConstants.VSPACE);
}
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
ref, STANDARD_LABEL_WIDTH_LRG));
if (button == null) {
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
} else {
data.right = new FlatFormAttachment(button,
-IDetailsAreaConstants.HSPACE);
}
text.setLayoutData(data);
// create label
ref = new CLabel(refGroup, SWT.LEFT);
ref.setText(labelProvider.getText(part));
ref.setImage(labelProvider.getImage(part));
ref.setBackground(refGroup.getBackground());
// align label
data = new FlatFormData();
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(text,
-IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(text, 0, SWT.CENTER);
ref.setLayoutData(data);
/*
* CONTENT ASSIST
*/
RunnableProposal proposal1 = new RunnableProposal() {
@Override
public String getLabel() {
return "Create global Variable";
}
public void run() {
createVariableForPartMapping(BPELUtils.getProcess(model),
model, part, isFromParts);
}
};
RunnableProposal proposal2 = new RunnableProposal() {
@Override
public String getLabel() {
return "Create local Variable";
}
public void run() {
createVariableForPartMapping(model, model, part,
isFromParts);
}
};
RunnableProposal proposal3 = new RunnableProposal() {
@Override
public String getLabel() {
return "Clear Variable";
}
public void run() {
Command cmd = null;
if (isFromParts) {
cmd = new AddFromPartCommand(model, null, part);
} else {
cmd = new AddToPartCommand(model, null, part);
}
getCommandFramework().execute(cmd);
}
};
VariableFilter filter = new VariableFilter();
if (part.getElementDeclaration() != null) {
filter.setType(part.getElementDeclaration());
} else if (part.getTypeDefinition() != null) {
filter.setType(part.getTypeDefinition());
}
VariableContentProvider provider = new VariableContentProvider();
ModelContentProposalProvider proposalProvider = new ModelContentProposalProvider(
new ModelContentProposalProvider.ValueProvider() {
@Override
public Object value() {
return getInput();
}
}, provider, filter);
proposalProvider.addProposalToEnd(new Separator());
proposalProvider.addProposalToEnd(proposal1);
proposalProvider.addProposalToEnd(proposal2);
proposalProvider.addProposalToEnd(proposal3);
final FieldAssistAdapter contentAssist = new FieldAssistAdapter(
text, fTextContentAdapter, proposalProvider, null, null,
true);
contentAssist.setLabelProvider(labelProvider);
contentAssist.setPopupSize(new Point(300, 100));
contentAssist
.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE);
contentAssist
.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
contentAssist.addContentProposalListener(proposal1);
contentAssist.addContentProposalListener(proposal2);
contentAssist.addContentProposalListener(proposal3);
contentAssist
.addContentProposalListener(new IContentProposalListener() {
public void proposalAccepted(IContentProposal proposal) {
if (proposal.getContent() == null) {
return;
}
Variable variable = null;
try {
variable = (Variable) ((Adapter) proposal)
.getTarget();
} catch (Throwable t) {
return;
}
Command cmd = null;
if (isFromParts) {
cmd = new AddFromPartCommand(model, variable,
part);
} else {
cmd = new AddToPartCommand(model, variable,
part);
}
getCommandFramework().execute(cmd);
}
});
// End of Content Assist for variable
if (button != null) {
button.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
contentAssist.openProposals();
}
});
} else if (model instanceof OnEvent) {
IOngoingChange change = new IOngoingChange() {
public Command createApplyCommand() {
OnEvent onEvent = (OnEvent) model;
String s = text.getText();
if (EMPTY_STRING.equals(s)) {
s = null;
}
CompoundCommand ccmd = new CompoundCommand();
FromParts fromParts = onEvent.getFromParts();
FromPart fromPart = null;
Variable variable = null;
if (fromParts != null
&& fromParts.getChildren() != null) {
for (FromPart fp : fromParts.getChildren()) {
if (part.equals(fp.getPart())) {
fromPart = fp;
}
}
}
if (s != null) {
if (fromPart != null) {
variable = fromPart.getToVariable();
}
if (variable == null) {
variable = BPELFactory.eINSTANCE
.createVariable();
// set the variable's type to the part's type
variable.setType(part.getTypeDefinition());
variable.setXSDElement(part
.getElementDeclaration());
}
variable.setName(s);
ccmd.add(new AddFromPartCommand(onEvent, variable,
part));
} else {
ccmd
.add(new AddFromPartCommand(onEvent, null,
part));
}
return ccmd;
}
public String getLabel() {
return IBPELUIConstants.CMD_SELECT_VARIABLE;
}
public void restoreOldState() {
updatePartMappingWidgets();
}
};
ChangeTracker onEventVariableTracker = new ChangeTracker(text,
change, getCommandFramework());
onEventVariableTracker.startTracking();
}
}
}
/**
* 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
*/
private 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);
}
private void createVariableForPartMapping(EObject ref, EObject model,
Part part, boolean isFromPart) {
Variable variable = BPELFactory.eINSTANCE.createVariable();
// set the variable's type to the part's type
if (part.getTypeDefinition() != null) {
variable.setType(part.getTypeDefinition());
} else if (part.getElementDeclaration() != null) {
variable.setXSDElement(part.getElementDeclaration());
}
// let the user choose a name for the variable
NameDialog nameDialog = new NameDialog(inputVariableComposite
.getShell(), Messages.VariableSelectorDialog_New_Variable_4,
Messages.VariableSelectorDialog_Variable_Name_5, null, BPELUtil
.getNCNameValidator());
if (nameDialog.open() == Window.CANCEL) {
return;
}
variable.setName(nameDialog.getValue());
CompoundCommand cmd = new CompoundCommand();
cmd.add(new AddVariableCommand(ref, variable));
if (isFromPart) {
cmd.add(new AddFromPartCommand(model, variable, part));
} else {
cmd.add(new AddToPartCommand(model, variable, part));
}
getCommandFramework().execute(cmd);
}
private void createWidgets(Composite composite) {
this.parentComposite = composite;
// create the widgets
this.usePartMappingCheckbox = fWidgetFactory.createButton(composite,
"Use WSDL Message Parts Mapping", SWT.CHECK);
this.usePartMappingCheckbox
.addSelectionListener(new UsePartMappingCheckboxSelectionListener());
this.nonPartMappingComposite = createFlatFormComposite(composite);
Composite ref = createInputVariableWidgets(null,
nonPartMappingComposite);
createOutputVariableWidgets(ref, nonPartMappingComposite);
// part mapping composite
this.partMappingComposite = createFlatFormComposite(composite);
// layout the widgets
FlatFormData ffd = new FlatFormData();
ffd.top = new FlatFormAttachment(0, 0);
ffd.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE);
this.usePartMappingCheckbox.setLayoutData(ffd);
ffd = new FlatFormData();
ffd.top = new FlatFormAttachment(this.usePartMappingCheckbox,
IDetailsAreaConstants.VSPACE);
ffd.left = new FlatFormAttachment(0, 0);
ffd.right = new FlatFormAttachment(100, 0);
this.partMappingComposite.setLayoutData(ffd);
ffd = new FlatFormData();
ffd.top = new FlatFormAttachment(this.usePartMappingCheckbox,
IDetailsAreaConstants.VSPACE);
ffd.left = new FlatFormAttachment(0, 0);
ffd.right = new FlatFormAttachment(100, 0);
this.nonPartMappingComposite.setLayoutData(ffd);
}
private 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);
}
/**
* Answer, based on the model, whether we should display "Fault" instead of
* "Response".
*/
private boolean getDisplayFault() {
EObject model = getModel();
if (model instanceof Reply) {
Reply reply = (Reply) model;
if (reply.getFaultName() != null) {
return true;
}
}
return false;
}
private boolean isInvoke() {
return (getInput() instanceof Invoke);
}
private boolean isReply() {
return getInput() instanceof Reply;
}
private boolean isReceive() {
// https://issues.jboss.org/browse/JBIDE-8048
// OnEvent is also a type of Receive
return getInput() instanceof Receive || getInput() instanceof OnMessage || getInput() instanceof OnEvent;
}
/**
* The same as labelWordFor(), except these strings don't contain mnemonics!
*
* @param direction
* @return the label
*/
private String plainLabelWordFor(int direction) {
if (isInvoke()) {
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
public void refresh() {
super.refresh();
boolean showPartMappingComposite = this.usePartMappingCheckbox
.getSelection();
updateWidgets(showPartMappingComposite);
if (showPartMappingComposite) {
updatePartMappingWidgets();
} else {
updateInputVariableWidgets();
updateOutputVariableWidgets();
}
}
private boolean shouldUsePartMapping(EObject model) {
boolean shouldUsePartMapping = false;
if (model instanceof Reply || model instanceof Invoke) {
shouldUsePartMapping = true;
if (ModelHelper.getVariable(model, ModelHelper.OUTGOING) != null) {
return false;
}
}
if (model instanceof Receive || model instanceof Invoke
|| model instanceof OnMessage || model instanceof OnEvent) {
shouldUsePartMapping = true;
if (ModelHelper.getVariable(model, ModelHelper.INCOMING) != null) {
return false;
}
}
return shouldUsePartMapping;
}
private void updateInputVariableWidgets() {
inputVariableComposite.setVisible(!isReply());
if (getInput() instanceof OnEvent) {
// https://issues.jboss.org/browse/JBIDE-8048
// hide the proposal drop-down button - user must enter variable name
inputVariableButton.setVisible(false);
}
if (isReply())
return;
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);
}
}
private void updateOutputVariableWidgets() {
outputVariableComposite.setVisible(!isReceive());
if (isReceive()) {
return;
}
if (isInvoke()) {
outputVariableLabel.setText(Messages.InvokeImplSection_13);
} else {
outputVariableLabel.setText(Messages.InvokeImplSection_23);
}
Variable outputVar = ModelHelper.getVariable(getInput(),
isInvoke() ? ModelHelper.INCOMING : ModelHelper.OUTGOING);
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(),
isInvoke() ? ModelHelper.INCOMING : ModelHelper.OUTGOING);
if (type != null) {
if (type instanceof Message) {
fOutputVariableFilter.setType((Message) type);
}
}
}
private void updatePartMappingWidgets() {
ILabelProvider labelProvider = new ModelLabelProvider();
final EObject model = getModel();
boolean showInputs = ModelHelper.isMessageActivity(model,
(isInvoke() ? ModelHelper.OUTGOING : ModelHelper.INCOMING));
boolean showFaults = getDisplayFault();
boolean showOutputs = !showFaults
&& ModelHelper.isMessageActivity(model,
(isInvoke() ? ModelHelper.INCOMING
: ModelHelper.OUTGOING));
Operation operation = ModelHelper.getOperation(model);
if (operation != null && !operation.eIsProxy()) {
this.usePartMappingCheckbox.setEnabled(true);
List<Part> inputParts = Collections.emptyList();
if (showInputs) {
inputParts = PartMappingUtil.getPartsForPartMapping(operation,
WSDLConstants.INPUT, null);
}
List<Part> outputParts = Collections.emptyList();
if (showOutputs) {
outputParts = PartMappingUtil.getPartsForPartMapping(operation,
WSDLConstants.OUTPUT, null);
}
List<Part> faultParts = Collections.emptyList();
if (showFaults) {
String faultName = ModelHelper.getFaultName(model);
if (faultName != null) {
faultParts = PartMappingUtil.getPartsForPartMapping(
operation, WSDLConstants.FAULT, faultName);
}
}
Group refGroup = null;
// print out all input parts
if (inputParts.size() > 0) {
FromParts fromParts = ModelHelper.getFromParts(model);
FlatFormData data = new FlatFormData();
data.left = new FlatFormAttachment(0,
IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
if (refGroup != null) {
data.top = new FlatFormAttachment(refGroup,
IDetailsAreaConstants.VSPACE);
} else {
data.top = new FlatFormAttachment(0,
IDetailsAreaConstants.VSPACE);
}
refGroup = fWidgetFactory.createGroup(
this.partMappingComposite, "Input(s)");
refGroup.setLayoutData(data);
refGroup.setLayout(new FlatFormLayout());
createPartMappingRows(labelProvider, model, inputParts,
refGroup, fromParts, true);
}
// print out all output parts
if (outputParts.size() > 0) {
ToParts toParts = ModelHelper.getToParts(model);
FlatFormData data = new FlatFormData();
data.left = new FlatFormAttachment(0,
IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
if (refGroup != null) {
data.top = new FlatFormAttachment(refGroup,
IDetailsAreaConstants.VSPACE);
} else {
data.top = new FlatFormAttachment(0,
IDetailsAreaConstants.VSPACE);
}
refGroup = fWidgetFactory.createGroup(
this.partMappingComposite, "Output(s)");
refGroup.setLayoutData(data);
refGroup.setLayout(new FlatFormLayout());
createPartMappingRows(labelProvider, model, outputParts,
refGroup, toParts, false);
}
// print out all fault parts
if (faultParts.size() > 0) {
ToParts toParts = ModelHelper.getToParts(model);
FlatFormData data = new FlatFormData();
data.left = new FlatFormAttachment(0,
IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
if (refGroup != null) {
data.top = new FlatFormAttachment(refGroup,
IDetailsAreaConstants.VSPACE);
} else {
data.top = new FlatFormAttachment(0,
IDetailsAreaConstants.VSPACE);
}
refGroup = fWidgetFactory.createGroup(
this.partMappingComposite, "Fault(s)");
refGroup.setLayoutData(data);
refGroup.setLayout(new FlatFormLayout());
createPartMappingRows(labelProvider, model, faultParts,
refGroup, toParts, false);
}
this.parentComposite.layout(true);
} else {
// TODO - we have an OperationProxy. What shall we do???
this.usePartMappingCheckbox.setEnabled(false);
}
}
private void updateWidgets(boolean showPartMappingComposite) {
if (this.partMappingComposite != null) {
this.partMappingComposite.dispose();
}
this.partMappingComposite = createFlatFormComposite(this.parentComposite);
FlatFormData ffd = new FlatFormData();
ffd.top = new FlatFormAttachment(this.usePartMappingCheckbox,
IDetailsAreaConstants.VSPACE);
ffd.left = new FlatFormAttachment(0, 0);
ffd.right = new FlatFormAttachment(100, 0);
this.partMappingComposite.setLayoutData(ffd);
if (!showPartMappingComposite) {
this.usePartMappingCheckbox.setSelection(false);
this.partMappingComposite.setVisible(false);
this.nonPartMappingComposite.setVisible(true);
} else {
this.usePartMappingCheckbox.setSelection(true);
this.partMappingComposite.setVisible(true);
this.nonPartMappingComposite.setVisible(false);
}
}
}