/******************************************************************************* | |
* Copyright (c) 2006, 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui.properties; | |
import java.util.Arrays; | |
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.BPELPackage; | |
import org.eclipse.bpel.model.Validate; | |
import org.eclipse.bpel.model.Variable; | |
import org.eclipse.bpel.ui.IHelpContextIds; | |
import org.eclipse.bpel.ui.Messages; | |
import org.eclipse.bpel.ui.commands.AddVariableToValidateCommand; | |
import org.eclipse.bpel.ui.commands.CompoundCommand; | |
import org.eclipse.bpel.ui.commands.RemoveValidateVariableCommand; | |
import org.eclipse.bpel.ui.details.providers.AbstractContentProvider; | |
import org.eclipse.bpel.ui.details.providers.ModelLabelProvider; | |
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.emf.common.notify.Notification; | |
import org.eclipse.emf.common.util.EList; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.jface.viewers.ISelectionChangedListener; | |
import org.eclipse.jface.viewers.IStructuredSelection; | |
import org.eclipse.jface.viewers.ListViewer; | |
import org.eclipse.jface.viewers.SelectionChangedEvent; | |
import org.eclipse.jface.viewers.StructuredSelection; | |
import org.eclipse.jface.window.Window; | |
import org.eclipse.swt.SWT; | |
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.Event; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.List; | |
import org.eclipse.swt.widgets.Listener; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.ui.PlatformUI; | |
/** | |
* Details section for the variables of a Validate. | |
*/ | |
public class ValidateVariablesSection extends BPELPropertySection { | |
protected Button fAddButton; | |
protected Button fRemoveButton; | |
List fVariableList; | |
ListViewer fVariablesViewer; | |
/** | |
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace() | |
*/ | |
@Override | |
public boolean shouldUseExtraSpace() { | |
return true; | |
} | |
@Override | |
protected MultiObjectAdapter[] createAdapters() { | |
return new MultiObjectAdapter[] { | |
/* model object and Correlations object */ | |
new MultiObjectAdapter() { | |
@Override | |
public void notify(Notification n) { | |
if (n.getFeature() == BPELPackage.eINSTANCE.getValidate_Variables() ) { | |
updateVariableWidgets(null); | |
refreshAdapters(); | |
} | |
} | |
}, | |
/* correlation(s) and correlation set(s) */ | |
new MultiObjectAdapter() { | |
@Override | |
public void notify(Notification n) { | |
if (n.getNotifier() instanceof Variable) { | |
updateVariableWidgets((Variable)n.getNotifier()); | |
refreshAdapters(); | |
} | |
} | |
} | |
}; | |
} | |
@Override | |
protected void addAllAdapters() { | |
super.addAllAdapters(); | |
Validate validate = getModel(); | |
EList<Variable> variables = validate.getVariables(); | |
if (variables != null) { | |
for(Variable var : variables) { | |
fAdapters[1].addToObject(var); | |
} | |
} | |
} | |
protected void createVariablesWidgets(final Composite composite) { | |
FlatFormData data; | |
fAddButton = fWidgetFactory.createButton(composite, Messages.ValidateDetails_1, SWT.PUSH); | |
fRemoveButton = fWidgetFactory.createButton(composite, Messages.ValidateDetails_2, SWT.PUSH); | |
Label validateVariablesLabel = fWidgetFactory.createLabel(composite, Messages.ValidateDetails_3); | |
fVariableList = fWidgetFactory.createList(composite, SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER ); | |
data = new FlatFormData(); | |
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE ); | |
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); | |
validateVariablesLabel.setLayoutData(data); | |
data = new FlatFormData(); | |
data.width = BPELUtil.calculateButtonWidth(fAddButton, STANDARD_BUTTON_WIDTH); | |
data.right = new FlatFormAttachment(fRemoveButton, -IDetailsAreaConstants.HSPACE); | |
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); | |
fAddButton.setLayoutData(data); | |
data = new FlatFormData(); | |
data.width = BPELUtil.calculateButtonWidth(fRemoveButton, STANDARD_BUTTON_WIDTH); | |
data.right = new FlatFormAttachment(100, (-2) * IDetailsAreaConstants.HSPACE); | |
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE); | |
fRemoveButton.setLayoutData(data); | |
fRemoveButton.setEnabled(false); | |
fAddButton.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)){ | |
@Override | |
protected void computeResult() { | |
Object[] results = getSelectedElements() ; | |
setResult(Arrays.asList(results)); | |
} | |
}; | |
dialog.setMultipleSelection(true); | |
dialog.setTitle(Messages.ValidateDetails_4); | |
if (dialog.open() == Window.OK) { | |
CompoundCommand ccmd = new CompoundCommand(); | |
Variable variable = null; | |
for(Object next : dialog.getResult()) { | |
variable = (Variable) next; | |
ccmd.add(new AddVariableToValidateCommand(getInput(), variable)); | |
} | |
runCommand ( ccmd ); | |
fVariablesViewer.setSelection(new StructuredSelection(variable),true); | |
} | |
} | |
public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } | |
}); | |
Listener removeListener = new Listener() { | |
public void handleEvent(Event e) { | |
if (e.type == SWT.KeyUp && e.character != SWT.DEL) { | |
return; | |
} | |
IStructuredSelection sel = (IStructuredSelection) fVariablesViewer.getSelection(); | |
int selectionIndex = fVariableList.getSelectionIndex(); | |
CompoundCommand ccmd = new CompoundCommand(); | |
for (Object next : sel.toArray()) { | |
Variable var = (Variable) next; | |
ccmd.add(new RemoveValidateVariableCommand(getInput(), var)); | |
} | |
runCommand(ccmd); | |
// selects the element at the deleted element position | |
int items = fVariableList.getItemCount(); | |
if (items > 0) { | |
selectionIndex = (selectionIndex < items) ? selectionIndex : 0; | |
fVariableList.setSelection(selectionIndex); | |
} else { | |
fVariablesViewer.setSelection(StructuredSelection.EMPTY); | |
} | |
} | |
}; | |
fVariableList.addListener(SWT.KeyUp, removeListener); | |
fRemoveButton.addListener(SWT.Selection, removeListener); | |
fRemoveButton.addListener(SWT.DefaultSelection, removeListener); | |
data = new FlatFormData(); | |
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE); | |
data.right = new FlatFormAttachment(100, (-2) * IDetailsAreaConstants.HSPACE ); | |
data.top = new FlatFormAttachment(fAddButton, IDetailsAreaConstants.VSPACE); | |
data.bottom = new FlatFormAttachment(100, (-1) * IDetailsAreaConstants.VSPACE ); | |
fVariableList.setLayoutData(data); | |
fVariablesViewer = new ListViewer(fVariableList); | |
fVariablesViewer.setLabelProvider(new ModelLabelProvider() ); | |
fVariablesViewer.setContentProvider(new AbstractContentProvider(){ | |
@Override | |
public Object[] getElements (Object inputElement) { | |
try { | |
Validate input = (Validate)inputElement; | |
EList<?> l = input.getVariables(); | |
return (l == null)? EMPTY_ARRAY : l.toArray(); | |
} catch (Throwable t) { | |
return EMPTY_ARRAY; | |
} | |
} | |
}); | |
fVariablesViewer.addSelectionChangedListener (new ISelectionChangedListener(){ | |
public void selectionChanged(SelectionChangedEvent event) { | |
fRemoveButton.setEnabled( fVariablesViewer.getSelection().isEmpty() == false); | |
} | |
}); | |
PlatformUI.getWorkbench().getHelpSystem().setHelp( | |
composite, IHelpContextIds.PROPERTY_PAGE_VALIDATE_DETAILS); | |
} | |
@Override | |
protected void createClient(Composite parent) { | |
Composite composite = createFlatFormComposite(parent); | |
createVariablesWidgets(composite); | |
} | |
protected void updateVariableWidgets (Variable var) { | |
Object input = getInput(); | |
if (input == null) { | |
throw new IllegalStateException(); | |
} | |
fVariablesViewer.setInput( input ); | |
if (var != null) { | |
fVariablesViewer.refresh(var, true); | |
} else { | |
fVariablesViewer.refresh(); | |
} | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#refresh() | |
*/ | |
@Override | |
public void refresh() { | |
super.refresh(); | |
updateVariableWidgets(null); | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext() | |
*/ | |
@Override | |
public Object getUserContext() { | |
return ((StructuredSelection)fVariablesViewer.getSelection()).getFirstElement(); | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object) | |
*/ | |
@Override | |
public void restoreUserContext(Object userContext) { | |
fVariableList.setFocus(); | |
if (userContext != null) { | |
fVariablesViewer.setSelection(new StructuredSelection(userContext),true); | |
} else { | |
fVariablesViewer.setSelection(StructuredSelection.EMPTY); | |
} | |
} | |
@Override | |
protected void basicSetInput(EObject newInput) { | |
saveUserContextToInput(); | |
super.basicSetInput(newInput); | |
restoreUserContextFromInput(); | |
} | |
} |