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