blob: 734785c72a97ce24f939d78dceceb4150cd5be5a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.properties;
import org.eclipse.bpel.common.ui.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.model.Catch;
import org.eclipse.bpel.model.FaultHandler;
import org.eclipse.bpel.model.Invoke;
import org.eclipse.bpel.model.Throw;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.model.util.BPELConstants;
import org.eclipse.bpel.ui.IBPELUIConstants;
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.CompoundCommand;
import org.eclipse.bpel.ui.commands.SetFaultNameCommand;
import org.eclipse.bpel.ui.commands.SetFaultNamespaceCommand;
import org.eclipse.bpel.ui.commands.SetVariableCommand;
import org.eclipse.bpel.ui.dialogs.VariableSelectorDialog;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.bpel.ui.util.NamespaceUtils;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* Details section for the fault name referenced in a Throw activity.
*/
public class FaultThrowNameSection extends BPELPropertySection {
protected static final int NAME_BUILTIN_CONTEXT = 0;
protected static final int NAMESPACE_CONTEXT = 1;
protected static final int VARIABLE_CONTEXT = 2;
protected static final int BUILTINRADIO_CONTEXT = 3;
protected static final int USERDEFRADIO_CONTEXT = 4;
protected static final int NAME_USERDEF_CONTEXT = 5;
protected static final int FAULT_VARIABLE_CONTEXT = 6;
protected int lastChangeContext = -1;
protected boolean isCatch, isFaultTypeEnabled;
protected Composite parentComposite;
protected Composite faultTypeComposite, namespaceComposite, faultNameComposite, faultUserDefNameComposite, faultVariableNameComposite;
protected Button builtinRadio, userdefRadio;
protected Button /*namespaceBrowseButton,*/ variableBrowseButton;
protected Text faultNamespaceText, faultUserDefText, variableNameText;
protected CCombo faultNameCombo;
protected Label variableName;
protected ChangeTracker faultNameTracker, faultNamespaceTracker,
faultUserDefNameTracker, variableNameTracker;
@Override
protected MultiObjectAdapter[] createAdapters() {
return new MultiObjectAdapter[] {
/* model object */
new MultiObjectAdapter() {
@Override
public void notify(Notification n) {
if (ModelHelper.isFaultNameAffected(getInput(), n) && builtinRadio.getSelection()) {
updateFaultNameWidgets();
}
else if (ModelHelper.isFaultNameAffected(getInput(), n) && userdefRadio.getSelection()) {
updateUserDefFaultNameWidgets();
}
if (isFaultTypeEnabled && ModelHelper.isFaultNamespaceAffected(getInput(), n)) {
updateFaultNamespaceWidgets();
}
if (ModelHelper.isVariableAffected(getInput(), n, ModelHelper.OUTGOING)) {
updateFaultVariableWidgets();
updateVariableWidgets();
}
}
},
};
}
protected boolean isNamespaceUserDef() {
return isFaultTypeEnabled && userdefRadio.getSelection();
}
@Override
public boolean shouldUseExtraSpace() {
return true;
}
protected void doChildLayout() {
FlatFormData data = null;
FlatFormData data1 = null;
if (isFaultTypeEnabled) {
if (isNamespaceUserDef()) {
data = (FlatFormData)faultUserDefNameComposite.getLayoutData();
data.top = new FlatFormAttachment(namespaceComposite, IDetailsAreaConstants.VSPACE);
data1 = (FlatFormData)faultVariableNameComposite.getLayoutData();
data1.top = new FlatFormAttachment(faultUserDefNameComposite, IDetailsAreaConstants.VSPACE);
} else {
data = (FlatFormData)faultNameComposite.getLayoutData();
data.top = new FlatFormAttachment(faultTypeComposite, IDetailsAreaConstants.VSPACE);
data1 = (FlatFormData)faultVariableNameComposite.getLayoutData();
data1.top = new FlatFormAttachment(faultNameComposite, IDetailsAreaConstants.VSPACE);
}
} else {
data.top = new FlatFormAttachment(0, 0);
}
faultTypeComposite.setVisible(isFaultTypeEnabled);
namespaceComposite.setVisible(isNamespaceUserDef());
faultNameComposite.setVisible(!isNamespaceUserDef());
faultUserDefNameComposite.setVisible(isNamespaceUserDef());
faultVariableNameComposite.setVisible(true);
parentComposite.layout(true);
}
@Override
protected void basicSetInput(EObject input) {
super.basicSetInput(input);
rearrangeWidgets();
}
protected void rearrangeWidgets() {
// hack hack.
isCatch = (getInput() instanceof Catch);
isFaultTypeEnabled = true;
if (isCatch) {
FaultHandler faultHandler = (FaultHandler)getInput().eContainer();
if (faultHandler != null) {
Object maybeInvoke = faultHandler.eContainer();
if (maybeInvoke instanceof Invoke) isFaultTypeEnabled = false;
}
}
doChildLayout();
}
protected void createFaultTypeWidgets(Composite parent) {
FlatFormData data;
Composite composite = faultTypeComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(0, 0);
composite.setLayoutData(data);
Label faultTypeLabel = fWidgetFactory.createLabel(composite, Messages.FaultThrowNameDetails_Fault_Type__13);
builtinRadio = fWidgetFactory.createButton(composite, Messages.FaultThrowNameDetails_Built_in_14, SWT.RADIO);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultTypeLabel, STANDARD_LABEL_WIDTH_SM));
// hack: fudge vertical alignment.
data.top = new FlatFormAttachment(0, 2);
builtinRadio.setLayoutData(data);
builtinRadio.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if (!builtinRadio.getSelection()) return;
doChildLayout();
CompoundCommand compound = new CompoundCommand();
Command cmd = new SetFaultNamespaceCommand(getInput(), BPELConstants.NAMESPACE);
if (cmd.canExecute()) compound.add(cmd);
Command cmd1 = new SetFaultNameCommand(getInput(), BPELConstants.standardFaults[0]);
if(cmd1.canExecute()) compound.add(cmd1);
lastChangeContext = BUILTINRADIO_CONTEXT;
getCommandFramework().execute(wrapInShowContextCommand(compound));
updateUserDefFaultNameWidgets();
updateFaultNameWidgets();
updateFaultNamespaceWidgets();
updateFaultVariableWidgets();
}
public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
});
userdefRadio = fWidgetFactory.createButton(composite, Messages.FaultThrowNameDetails_User_defined_15, SWT.RADIO);
data = new FlatFormData();
data.left = new FlatFormAttachment(builtinRadio, IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(0, 2);
userdefRadio.setLayoutData(data);
userdefRadio.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
if (!userdefRadio.getSelection()) return;
doChildLayout();
// Set the namespace to the process namespace.
Command cmd = new SetFaultNamespaceCommand(getInput(), getProcess().getTargetNamespace());
lastChangeContext = USERDEFRADIO_CONTEXT;
getCommandFramework().execute(wrapInShowContextCommand(cmd));
updateUserDefFaultNameWidgets();
updateFaultNameWidgets();
updateFaultNamespaceWidgets();
updateFaultVariableWidgets();
}
public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
});
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(builtinRadio, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(builtinRadio, 0, SWT.CENTER);
faultTypeLabel.setLayoutData(data);
}
protected void createChangeTrackers() {
IOngoingChange change = new IOngoingChange() {
public String getLabel() {
return IBPELUIConstants.CMD_EDIT_FAULTNAME;
}
public Command createApplyCommand() {
String name = faultNameCombo.getText();
lastChangeContext = NAME_BUILTIN_CONTEXT;
Command command;
CompoundCommand c = new CompoundCommand();
c.add(new SetFaultNameCommand(getInput(), "".equals(name)? null : name)); //$NON-NLS-1$
Command c2 = new SetFaultNamespaceCommand(getInput(), BPELConstants.NAMESPACE);
if (c2.canExecute()) c.add(c2);
command = c;
return wrapInShowContextCommand(command);
}
public void restoreOldState() {
updateFaultNameWidgets();
}
};
faultNameTracker = new ChangeTracker(faultNameCombo, change, getCommandFramework());
change = new IOngoingChange() {
public String getLabel() {
return IBPELUIConstants.CMD_EDIT_FAULTNAME;
}
public Command createApplyCommand() {
String s = faultNamespaceText.getText();
lastChangeContext = NAMESPACE_CONTEXT;
return wrapInShowContextCommand(new SetFaultNamespaceCommand(
getInput(), "".equals(s)? null : s)); //$NON-NLS-1$
}
public void restoreOldState() {
updateFaultNameWidgets();
}
};
faultNamespaceTracker = new ChangeTracker(faultNamespaceText, change, getCommandFramework());
change = new IOngoingChange() {
public String getLabel() {
return IBPELUIConstants.CMD_EDIT_FAULTNAME;
}
public Command createApplyCommand() {
String s = faultUserDefText.getText();
lastChangeContext = NAME_USERDEF_CONTEXT;
return wrapInShowContextCommand(new SetFaultNameCommand(
getInput(), "".equals(s)? null : s)); //$NON-NLS-1$
}
public void restoreOldState() {
updateUserDefFaultNameWidgets();
}
};
faultUserDefNameTracker = new ChangeTracker(faultUserDefText, change, getCommandFramework());
}
protected void createFaultNameWidgets(Composite parent) {
FlatFormData data;
Composite composite = faultNameComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(namespaceComposite, IDetailsAreaConstants.VSPACE);
composite.setLayoutData(data);
Label faultNameLabel = fWidgetFactory.createLabel(composite, Messages.FaultThrowNameDetails_Fault_Name__16);
faultNameCombo = fWidgetFactory.createCCombo(composite);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultNameLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(50, -SHORT_BUTTON_WIDTH-IDetailsAreaConstants.HSPACE-IDetailsAreaConstants.CENTER_SPACE);
data.top = new FlatFormAttachment(0, 0);
faultNameCombo.setItems(BPELConstants.standardFaults);
faultNameCombo.setLayoutData(data);
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);
}
protected void createNamespaceWidgets(Composite parent) {
FlatFormData data;
final Composite composite = namespaceComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(faultTypeComposite, IDetailsAreaConstants.VSPACE);
composite.setLayoutData(data);
//namespaceBrowseButton = wf.createButton(composite, "Browse...", SWT.PUSH);
Label faultNamespaceLabel = fWidgetFactory.createLabel(composite, Messages.FaultThrowNameDetails_Namespace__21);
faultNamespaceText = fWidgetFactory.createText(composite, ""); //$NON-NLS-1$
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultNamespaceLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(50, -SHORT_BUTTON_WIDTH-IDetailsAreaConstants.HSPACE-IDetailsAreaConstants.CENTER_SPACE);
data.top = new FlatFormAttachment(0, +1);
data.bottom = new FlatFormAttachment(100, -1);
faultNamespaceText.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(faultNamespaceText, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(faultNamespaceText, 0, SWT.CENTER);
faultNamespaceLabel.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(faultNamespaceText, IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(100, 0);
data.left = new FlatFormAttachment(100, -STANDARD_BUTTON_WIDTH);
data.top = new FlatFormAttachment(faultNamespaceText, -1, SWT.TOP);
data.bottom = new FlatFormAttachment(faultNamespaceText, +1, SWT.BOTTOM);
//namespaceBrowseButton.setLayoutData(data);
// namespaceBrowseButton.addSelectionListener(new SelectionListener() {
// public void widgetSelected(SelectionEvent e) {
// WorkbenchFileSelectionDialog dialog = new WorkbenchFileSelectionDialog(
// composite.getShell(), BPELUtil.lastWSDLFilePath, IBPELUIConstants.BROWSE_WSDL_DLG_TITLE,
// IBPELUIConstants.EXTENSION_DOT_WSDL);
// if (dialog.open() == WorkbenchFileSelectionDialog.OK) {
// IFile targetFile = ResourcesPlugin.getWorkspace().getRoot().getFile(dialog.getLocationPath());
// // TODO: Load the target file and find the target namespace
// }
// }
// public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
// });
}
protected void createUserDefFaultNameWidgets(Composite parent) {
FlatFormData data;
Composite composite = faultUserDefNameComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(namespaceComposite, IDetailsAreaConstants.VSPACE);
composite.setLayoutData(data);
Label faultUserDefNameLabel = fWidgetFactory.createLabel(composite, Messages.FaultThrowNameDetails_Fault_Name__24);
faultUserDefText = fWidgetFactory.createText(composite, ""); //$NON-NLS-1$
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(faultUserDefNameLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(50, -SHORT_BUTTON_WIDTH-IDetailsAreaConstants.HSPACE-IDetailsAreaConstants.CENTER_SPACE);
data.top = new FlatFormAttachment(0, +1);
faultUserDefText.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(faultUserDefText, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(faultUserDefText, 0, SWT.CENTER);
faultUserDefNameLabel.setLayoutData(data);
}
protected void createVariableWidgets(Composite parent) {
FlatFormData data;
final Composite composite = faultVariableNameComposite = createFlatFormComposite(parent);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(faultNameComposite, IDetailsAreaConstants.VSPACE);
composite.setLayoutData(data);
Label variableLabel = fWidgetFactory.createLabel(composite, Messages.FaultThrowNameDetails_Fault_Variable__27);
variableName = fWidgetFactory.createLabel(composite, "", SWT.NONE); //$NON-NLS-1$
variableBrowseButton = fWidgetFactory.createButton(composite, Messages.FaultThrowNameSection_Browse_1, SWT.PUSH);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(variableLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(variableBrowseButton, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(0, 0);
data.height = FigureUtilities.getTextExtents(variableBrowseButton.getText(), variableBrowseButton.getFont()).height + 4;
variableName.setLayoutData(data);
data = new FlatFormData();
data.top = new FlatFormAttachment(variableName, 0, SWT.TOP);
data.bottom = new FlatFormAttachment(variableName, 2, SWT.BOTTOM);
data.left = new FlatFormAttachment(50, -BPELUtil.calculateButtonWidth(variableBrowseButton, SHORT_BUTTON_WIDTH)-IDetailsAreaConstants.CENTER_SPACE);
data.right = new FlatFormAttachment(50, -IDetailsAreaConstants.CENTER_SPACE);
variableBrowseButton.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(variableName, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(variableName, 0, SWT.CENTER);
variableLabel.setLayoutData(data);
variableBrowseButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Shell shell = composite.getShell();
EObject model = getInput();
VariableSelectorDialog dialog = new VariableSelectorDialog(shell, model, ModelHelper.getVariableType(model, ModelHelper.OUTGOING));
dialog.setTitle(Messages.FaultThrowNameSection_Select_Fault_Variable_2);
if (dialog.open() == Window.OK) {
Variable variable = dialog.getVariable();
Command command = new SetVariableCommand(fModelObject, variable, ModelHelper.OUTGOING);
lastChangeContext = VARIABLE_CONTEXT;
getCommandFramework().execute(wrapInShowContextCommand(command));
}
}
public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); }
});
}
@Override
protected void createClient(Composite parent) {
Composite composite = parentComposite = createFlatFormComposite(parent);
createFaultTypeWidgets(composite);
createUserDefFaultNameWidgets(composite);
createNamespaceWidgets(composite);
createFaultNameWidgets(composite);
createVariableWidgets(composite);
createChangeTrackers();
PlatformUI.getWorkbench().getHelpSystem().setHelp(
parentComposite, IHelpContextIds.PROPERTY_PAGE_FAULT);
}
protected void updateFaultNameWidgets() {
Assert.isNotNull(getInput());
faultNameTracker.stopTracking();
try {
String s = ModelHelper.getFaultName(getInput());
if (s == null) s = ""; //$NON-NLS-1$
if (!s.equals(faultNameCombo.getText())) faultNameCombo.setText(s);
} finally {
faultNameTracker.startTracking();
}
}
protected void updateFaultNamespaceWidgets() {
Assert.isNotNull(getInput());
if (isFaultTypeEnabled) {
faultNamespaceTracker.stopTracking();
try {
String s = ModelHelper.getFaultNamespace(getInput());
if (s == null) {
faultNamespaceText.setText("");//$NON-NLS-1$
} else {
if (!s.equals(faultNamespaceText.getText())) {
faultNamespaceText.setText(NamespaceUtils.convertUriToNamespace(s));
}
}
} finally {
faultNamespaceTracker.startTracking();
}
}
}
protected void updateUserDefFaultNameWidgets() {
Assert.isNotNull(getInput());
faultUserDefNameTracker.stopTracking();
try {
String s = ModelHelper.getFaultName(getInput());
if (s == null) s = ""; //$NON-NLS-1$
if (!s.equals(faultUserDefText.getText())) faultUserDefText.setText(s);
} finally {
faultUserDefNameTracker.startTracking();
}
}
protected void updateFaultTypeWidgets() {
Assert.isNotNull(getInput());
String faultNamespace = ModelHelper.getFaultNamespace(getInput());
boolean isBuiltin = BPELConstants.NAMESPACE.equals(faultNamespace);
if (faultNamespace == null) {
if (ModelHelper.getFaultName(getInput()) == null) isBuiltin = true;
}
builtinRadio.setSelection(isBuiltin);
userdefRadio.setSelection(!isBuiltin);
doChildLayout();
}
protected void updateFaultVariableWidgets() {
Assert.isNotNull(getInput());
Variable v = ((Throw)getInput()).getFaultVariable();
String s = (v==null)? null : v.getName();
if (s == null) s = ""; //$NON-NLS-1$
if (!s.equals(variableName.getText())) variableName.setText(s);
}
protected void updateVariableWidgets() {
Variable variable = ModelHelper.getVariable(getInput(), ModelHelper.OUTGOING);
if (variable == null) {
variableName.setText(Messages.FaultThrowNameSection_None_3);
variableName.setEnabled(false);
} else {
ILabeledElement labeledElement = BPELUtil.adapt(variable, ILabeledElement.class);
variableName.setText(labeledElement.getLabel(variable));
variableName.setEnabled(true);
}
}
@Override
public void refresh() {
super.refresh();
updateFaultTypeWidgets();
updateFaultNamespaceWidgets();
updateFaultNameWidgets();
updateUserDefFaultNameWidgets();
updateFaultVariableWidgets();
updateVariableWidgets();
}
@Override
public Object getUserContext() {
return Integer.valueOf( lastChangeContext );
}
@Override
public void restoreUserContext(Object userContext) {
int i = ((Integer)userContext).intValue();
switch (i) {
case NAME_BUILTIN_CONTEXT: faultNameCombo.setFocus(); return;
case NAMESPACE_CONTEXT: faultNamespaceText.setFocus(); return;
case BUILTINRADIO_CONTEXT: builtinRadio.setFocus(); return;
case USERDEFRADIO_CONTEXT: userdefRadio.setFocus(); return;
case NAME_USERDEF_CONTEXT: faultUserDefText.setFocus(); return;
case FAULT_VARIABLE_CONTEXT: variableNameText.setFocus(); return;
}
throw new IllegalStateException();
}
}