blob: 501c60c586bf85101c07aacaf16417230535f3d4 [file] [log] [blame]
/*******************************************************************************
* 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 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.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();
}
}