blob: 9fee3bc37dc24f02bdb0fd7852bfbaabe2c0c533 [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 java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.bpel.common.ui.details.ButtonIValue;
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.Assign;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.Copy;
import org.eclipse.bpel.model.From;
import org.eclipse.bpel.model.To;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.AddCopyCommand;
import org.eclipse.bpel.ui.commands.RemoveCopyCommand;
import org.eclipse.bpel.ui.commands.SwapCopyCommand;
import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.MultiObjectAdapter;
import org.eclipse.core.resources.IMarker;
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.ListViewer;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
/**
* AssignImplDetails allows viewing and editing of the copy elements in an
* Assign.
*
* The input of this section is the Assign activity.
*
*
* @author IBM Original Contribution
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Jun 7, 2007
*
*/
@SuppressWarnings("nls")
public class AssignImplSection extends BPELPropertySection {
static String CURRENT_INDEX_PROPERTY = "currentIndex";
/** The to section */
CategorySection fToSection = new CategorySection(this);
/** The from section */
CategorySection fFromSection = new CategorySection(this);
/** The current copy rule being edited. */
Copy fCurrentCopy;
org.eclipse.swt.widgets.List fCopyList;
Composite copySelectComposite;
protected ListViewer fCopyListViewer;
Button fDeleteCopy;
Button fMoveUp;
Button fMoveDown;
Button fKeepSrcElement;
Button fIgnoreMissingSourceData;
EditController fKeepSrcElementController;
EditController fIgnoreMissingSourceDataController;
/**
*
*/
public AssignImplSection() {
super();
List<IAssignCategory> fToAllowed = defaultToCategories();
fToAllowed.addAll(BPELUIRegistry.getInstance()
.getAdditionalAssignCategories());
List<IAssignCategory> fFromAllowed = defaultFromCategories();
fFromAllowed.addAll(BPELUIRegistry.getInstance()
.getAdditionalAssignCategories());
fToSection.fAllowed = fToAllowed.toArray(fToSection.fAllowed);
fFromSection.fAllowed = fFromAllowed.toArray(fFromSection.fAllowed);
}
protected ArrayList<IAssignCategory> defaultToCategories() {
return new ArrayList<IAssignCategory>(
Arrays.asList(new IAssignCategory[] {
new VariablePartAssignCategory(this),
new ExpressionAssignCategory(this),
new VariablePropertyAssignCategory(this),
new PartnerRoleAssignCategory(this, false) }));
}
protected ArrayList<IAssignCategory> defaultFromCategories() {
return new ArrayList<IAssignCategory>(
Arrays.asList(new IAssignCategory[] {
new VariablePartAssignCategory(this),
new ExpressionAssignCategory(this),
new LiteralAssignCategory(this),
new VariablePropertyAssignCategory(this),
new PartnerRoleAssignCategory(this, true),
new EndpointReferenceAssignCategory(this),
new OpaqueAssignCategory(this) }));
}
@Override
protected MultiObjectAdapter[] createAdapters() {
return new MultiObjectAdapter[] {
/* model object */
new MultiObjectAdapter() {
@Override
public void notify(Notification n) {
adjustCopyRulesList();
if (n.getFeature() == BPELPackage.eINSTANCE.getAssign_Copy()) {
Copy copy = (Copy) n.getNewValue();
Assign assign = getModel();
if (copy != null) {
selectCopyInList(assign.getCopy().indexOf(copy));
}
}
}
}, };
}
@Override
protected void addAllAdapters() {
super.addAllAdapters();
EList<Copy> list = ((Assign) getInput()).getCopy();
for (Copy copy : list) {
fAdapters[0].addToObject(copy);
if (copy.getFrom() != null)
fAdapters[0].addToObject(copy.getFrom());
if (copy.getTo() != null)
fAdapters[0].addToObject(copy.getTo());
}
}
protected void createCopySelectWidgets(Composite parent) {
FlatFormData data;
Composite c = copySelectComposite = createFlatFormComposite(parent);
Button insertCopy = fWidgetFactory.createButton(c,
Messages.AssignImplDetails_New__5, SWT.PUSH);
fDeleteCopy = fWidgetFactory.createButton(c,
Messages.AssignImplDetails_Delete__6, SWT.PUSH);
fMoveUp = fWidgetFactory.createButton(c, "Move Up", SWT.PUSH);
fMoveDown = fWidgetFactory.createButton(c, "Move Down", SWT.PUSH);
fCopyList = fWidgetFactory.createList(c, SWT.BORDER | SWT.V_SCROLL
| SWT.SINGLE);
int preferredWidth = 200;
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(0, preferredWidth);
data.top = new FlatFormAttachment(0, 0);
data.bottom = new FlatFormAttachment(100, 0);
c.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.top = new FlatFormAttachment(0, 0);
data.bottom = new FlatFormAttachment(insertCopy,
-IDetailsAreaConstants.VSPACE);
fCopyList.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(50, 0);
data.bottom = new FlatFormAttachment(fMoveUp, 0);
insertCopy.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(insertCopy, 0);
data.right = new FlatFormAttachment(100, 0);
data.bottom = new FlatFormAttachment(fMoveDown, 0);
fDeleteCopy.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(50, 0);
data.bottom = new FlatFormAttachment(100, 0);
fMoveUp.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(fMoveUp, 0);
data.right = new FlatFormAttachment(100, 0);
data.bottom = new FlatFormAttachment(100, 0);
fMoveDown.setLayoutData(data);
insertCopy.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Copy copy = BPELFactory.eINSTANCE.createCopy();
getCommandFramework().execute(
wrapInShowContextCommand(new AddCopyCommand(
(Assign) getInput(), copy)));
refreshAdapters();
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
fDeleteCopy.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Assign assign = getModel();
int index = fCopyList.getSelectionIndex();
index = (index == assign.getCopy().size() - 1) ? index - 1
: index;
getCommandFramework().execute(
wrapInShowContextCommand(new RemoveCopyCommand(
(Assign) getInput(), fCurrentCopy)));
selectCopyInList(index);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
fCopyList.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
int index = fCopyList.getSelectionIndex();
selectCopyInList(index);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
fMoveUp.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Assign assign = getModel();
int index = fCopyList.getSelectionIndex();
getCommandFramework().execute(
wrapInShowContextCommand(new SwapCopyCommand(assign,
index, index - 1)));
selectCopyInList(index - 1);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
fMoveDown.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Assign assign = getModel();
int index = fCopyList.getSelectionIndex();
getCommandFramework().execute(
wrapInShowContextCommand(new SwapCopyCommand(assign,
index, index + 1)));
selectCopyInList(index + 1);
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
}
protected void createCategorySectionWidgets(Composite composite,
final CategorySection section, boolean isFrom) {
FlatFormData data;
section.fLabel = fWidgetFactory.createLabel(composite,
isFrom ? Messages.AssignImplDetails_From__1
: Messages.AssignImplDetails_To__2);
section.fCombo = new Combo(composite, SWT.FLAT | SWT.BORDER
| SWT.READ_ONLY);
data = new FlatFormData();
if (isFrom) {
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(
section.fLabel, STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(50,
-IDetailsAreaConstants.CENTER_SPACE);
} else {
data.left = new FlatFormAttachment(50,
IDetailsAreaConstants.CENTER_SPACE
+ BPELUtil.calculateLabelWidth(section.fLabel,
STANDARD_LABEL_WIDTH_SM));
data.right = new FlatFormAttachment(100, 0);
}
data.top = new FlatFormAttachment(0, 0);
section.fCombo.setLayoutData(data);
data = new FlatFormData();
if (isFrom) {
data.left = new FlatFormAttachment(0, 0);
} else {
data.left = new FlatFormAttachment(50,
IDetailsAreaConstants.CENTER_SPACE);
}
data.right = new FlatFormAttachment(section.fCombo,
-IDetailsAreaConstants.CENTER_SPACE);
data.top = new FlatFormAttachment(section.fCombo, 0, SWT.CENTER);
section.fLabel.setLayoutData(data);
for (IAssignCategory category : section.fAllowed) {
if (category.getName() != null) {
section.fCombo.add(category.getName());
}
}
section.fCombo.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
int index = section.fCombo.getSelectionIndex();
updateCategorySelection(section, index, true);
}
// TODO: is this correct?
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
section.fOuterComposite = createFlatFormComposite(composite);
data = new FlatFormData();
data.left = new FlatFormAttachment(section.fLabel, 0, SWT.LEFT);
data.right = new FlatFormAttachment(section.fCombo, 0, SWT.RIGHT);
data.top = new FlatFormAttachment(section.fCombo,
IDetailsAreaConstants.VSPACE);
data.bottom = new FlatFormAttachment(100, -25);
section.fOuterComposite.setLayoutData(data);
// Create the keepSrcElement check box button
if (isFrom) {
fIgnoreMissingSourceData = fWidgetFactory.createButton(composite,
Messages.AssignImplDetails_IgnoreMissingSourceData,
SWT.CHECK);
data = new FlatFormData();
data.right = new FlatFormAttachment(50,
-IDetailsAreaConstants.HSPACE);
data.bottom = new FlatFormAttachment(100, 0);
fIgnoreMissingSourceData.setLayoutData(data);
fIgnoreMissingSourceDataController = createEditController();
fIgnoreMissingSourceDataController.setFeature(BPELPackage.eINSTANCE
.getCopy_IgnoreMissingFromData());
fIgnoreMissingSourceDataController.setViewIValue(new ButtonIValue(
fIgnoreMissingSourceData));
fIgnoreMissingSourceDataController
.startListeningTo(fIgnoreMissingSourceData);
} else {
fKeepSrcElement = fWidgetFactory.createButton(composite,
Messages.AssignImplDetails_KeepSrcElementName, SWT.CHECK);
data = new FlatFormData();
data.right = new FlatFormAttachment(100,
-IDetailsAreaConstants.HSPACE);
data.bottom = new FlatFormAttachment(100, 0);
fKeepSrcElement.setLayoutData(data);
fKeepSrcElementController = createEditController();
fKeepSrcElementController.setFeature(BPELPackage.eINSTANCE
.getCopy_KeepSrcElementName());
fKeepSrcElementController.setViewIValue(new ButtonIValue(
fKeepSrcElement));
fKeepSrcElementController.startListeningTo(fKeepSrcElement);
}
}
/**
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace()
*/
@Override
public boolean shouldUseExtraSpace() {
return true;
}
@Override
protected void createClient(Composite parent) {
Composite composite = createFlatFormComposite(parent);
createCopySelectWidgets(composite);
Composite mainComposite = createFlatFormComposite(composite);
FlatFormData data = new FlatFormData();
data.left = new FlatFormAttachment(copySelectComposite,
IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(0, 0);
data.right = new FlatFormAttachment(100, 0);
data.bottom = new FlatFormAttachment(100, 0);
mainComposite.setLayoutData(data);
createCategorySectionWidgets(mainComposite, fFromSection, true);
createCategorySectionWidgets(mainComposite, fToSection, false);
PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.PROPERTY_PAGE_ASSIGN);
}
// Total Hack until we have Copy objects in graphical editor
@Override
protected void basicSetInput(EObject newInput) {
saveUserContextToInput();
super.basicSetInput(newInput);
adjustCopyRulesList();
restoreUserContextFromInput();
if (fToSection.fCurrent != null) {
fToSection.fCurrent.refresh();
}
if (fFromSection.fCurrent != null) {
fFromSection.fCurrent.refresh();
}
}
/**
* Called when the copy rule changes or is created.
*
*/
@SuppressWarnings("boxing")
protected void selectCategoriesForInput() {
fKeepSrcElementController.setInput(fCurrentCopy);
fIgnoreMissingSourceDataController.setInput(fCurrentCopy);
if (fCurrentCopy == null) {
fToSection.hideCurrent();
fFromSection.hideCurrent();
fKeepSrcElement.setEnabled(false);
fIgnoreMissingSourceData.setEnabled(false);
return;
}
fKeepSrcElement.setEnabled(true);
fIgnoreMissingSourceData.setEnabled(true);
// Find the proper copy-from category
boolean bFound = false;
for (IAssignCategory category : fFromSection.fAllowed) {
if (category.isCategoryForModel(fCurrentCopy.getFrom())) {
updateCategorySelection(fFromSection, category, false);
bFound = true;
break;
}
}
/** In case we can't find the appropriate one, just display the first one */
if (bFound == false || fFromSection.fCurrent == null) {
updateCategorySelection(fFromSection, 0, false);
}
// Find the proper copy-to category
bFound = false;
for (IAssignCategory category : fToSection.fAllowed) {
if (category.isCategoryForModel(fCurrentCopy.getTo())) {
updateCategorySelection(fToSection, category, false);
bFound = true;
break;
}
}
/** In case we can't find the appropriate one, just display the first one */
if (bFound == false || fToSection.fCurrent == null) {
updateCategorySelection(fToSection, 0, false);
}
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#refresh()
*/
@Override
public void refresh() {
super.refresh();
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeHidden()
*/
@Override
public void aboutToBeHidden() {
super.aboutToBeHidden();
if (fToSection.fCurrent != null) {
fToSection.fCurrent.aboutToBeHidden();
}
if (fFromSection.fCurrent != null) {
fFromSection.fCurrent.aboutToBeHidden();
}
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#aboutToBeShown()
*/
@Override
public void aboutToBeShown() {
super.aboutToBeShown();
if (fToSection.fCurrent != null) {
fToSection.fCurrent.aboutToBeShown();
}
if (fFromSection.fCurrent != null) {
fFromSection.fCurrent.aboutToBeShown();
}
}
protected void adjustCopyRulesList() {
Assign assign = getModel();
EList<Copy> copyList = assign.getCopy();
int sz = copyList.size();
int idx = fCopyList.getSelectionIndex();
String[] items = new String[sz];
for (int i = 0; i < sz; i++) {
Copy copy = copyList.get(i);
items[i] = asText(copy.getFrom()) + " to " + asText(copy.getTo());
}
fCopyList.setItems(items);
if (idx != -1) {
fCopyList.setSelection(idx);
}
fDeleteCopy.setEnabled(sz > 0);
fToSection.fCombo.setEnabled(sz > 0);
fFromSection.fCombo.setEnabled(sz > 0);
}
private String asText(From from) {
for (IAssignCategory category : fFromSection.fAllowed) {
if (category.isCategoryForModel(from)) {
return category.getName();
}
}
return "?";
}
private String asText(To to) {
for (IAssignCategory category : fToSection.fAllowed) {
if (category.isCategoryForModel(to)) {
return category.getName();
}
}
return "?";
}
void updateCategorySelection(CategorySection section, int index,
boolean bVisual) {
updateCategorySelection(section, section.fAllowed[index], bVisual);
}
void updateCategorySelection(CategorySection section,
IAssignCategory newCurrent, boolean bVisual) {
/** Hide current */
section.hideCurrent();
/** Update current to the one that picked from */
section.fCurrent = newCurrent;
section.ensureCategoryCompositeCreated();
if (bVisual == false) {
section.updateCombo();
}
if (section == fToSection) {
if (bVisual || fCurrentCopy.getTo() == null) {
fCurrentCopy.setTo(BPELFactory.eINSTANCE.createTo());
}
section.fCurrent.setInput(fCurrentCopy.getTo());
} else {
if (bVisual || fCurrentCopy.getFrom() == null) {
fCurrentCopy.setFrom(BPELFactory.eINSTANCE.createFrom());
}
section.fCurrent.setInput(fCurrentCopy.getFrom());
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
// https://jira.jboss.org/browse/JBIDE-7351
// construct an initializer if From is empty
if (section.fCurrent instanceof LiteralAssignCategory)
VariableInitializationSection.createDefaultInitializer(getBPELEditor(), fCurrentCopy.getFrom(), fCurrentCopy.getTo());
}
section.showCurrent();
section.fCurrent.refresh();
refreshAdapters();
// TODO: should the categories only store when a widget change is
// committed?
// Cons of that idea:
// - Changing the category in the combo, but *not* changing anything
// else,
// then clicking elsewhere and back, would cause the combo to revert.
// - The OpaqueAssignCategory doesn't have any widgets..
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext()
*/
@SuppressWarnings("boxing")
@Override
public Object getUserContext() {
Assign assign = getModel();
if (assign == null) {
return -1;
}
return assign.getCopy().indexOf(fCurrentCopy);
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object)
*/
@SuppressWarnings("boxing")
@Override
public void restoreUserContext(Object userContext) {
int idx = 0;
if (userContext instanceof Number) {
Number num = (Number) userContext;
idx = num.intValue();
}
selectCopyInList(idx);
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#gotoMarker(org.eclipse.core.resources.IMarker)
*/
@Override
public void gotoMarker(IMarker marker) {
// TODO: This code do nothing and sometime causes NPE (from==null), so
// temporary disabled (Oleg)
// String uriFragment =
// marker.getAttribute(IBPELUIConstants.MARKER_ATT_FROM, EMPTY_STRING);
// EObject from = fModelObject.eResource().getEObject(uriFragment);
// EObject copy = from.eContainer();
// currentCopyIndex = ((Assign)getModel()).getCopy().indexOf(copy);
refresh();
}
/*
* Select copy, refresh buttons & categories
*/
private void selectCopyInList(int index) {
EList<Copy> list = ((Assign) getModel()).getCopy();
if (index < 0 || index >= list.size()) {
fCurrentCopy = null;
fMoveUp.setEnabled(false);
fMoveDown.setEnabled(false);
} else {
fCurrentCopy = list.get(index);
fCopyList.select(index);
fMoveUp.setEnabled(index > 0);
fMoveDown.setEnabled(index < fCopyList.getItemCount() - 1);
}
selectCategoriesForInput();
}
}