blob: 68967587c81e428a83ff59d741b40005a49186f6 [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.HashMap;
import java.util.Map;
import org.eclipse.bpel.model.BPELFactory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.Expression;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.SetCommand;
import org.eclipse.bpel.ui.expressions.IEditorConstants;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
/**
* Details section for the duration/date of a Wait activity and of the OnAlarm activity.
* <p>
* This is a little more involved, because "until" and "for" are mutually exclusive in the model.
* </p>
* TODO: review and complete this class (VZ)
*/
public class WaitConditionSection extends ExpressionSection {
protected Button[] radioButtons;
protected int fButtonCount ;
protected int fCurrentButtonIndex;
@Override
protected String getExpressionType() {
return getButtonExprType(this.fCurrentButtonIndex);
}
/**
* Change the input.
*/
@Override
protected void basicSetInput(EObject newInput) {
super.basicSetInput(newInput);
this.fCurrentButtonIndex = getButtonIndexFromModel();
updateRadioButtonWidgets();
}
/**
* Update the Radio button widgets according to the state of the model.
*/
protected void updateRadioButtonWidgets() {
this.fCurrentButtonIndex = getButtonIndexFromModel();
if (this.fCurrentButtonIndex >= 0) this.radioButtons[this.fCurrentButtonIndex].setSelection(true);
for (int i = 0; i<this.radioButtons.length; i++) {
if (i != this.fCurrentButtonIndex)
this.radioButtons[i].setSelection(false);
}
}
/**
* Creates the radio button widgets.
* @param parent
*/
protected void createRadioButtonWidgets(Composite parent) {
this.fButtonCount = gLabels.length;
Composite radioComposite = getWidgetFactory().createComposite( parent );
radioComposite.setLayout( new GridLayout( 2, true ));
this.radioButtons = new Button[ this.fButtonCount ];
for(int i = 0; i < this.fButtonCount; i++) {
this.radioButtons[i] = this.fWidgetFactory.createButton(radioComposite, gLabels[i], SWT.RADIO);
this.radioButtons[i].addSelectionListener(new SelectionListener() {
public void widgetSelected (SelectionEvent e) {
Button button = (Button)e.getSource();
if (button.getSelection()) {
for (int i = 0; i<radioButtons.length; i++) {
if (radioButtons[i]==button) {
fCurrentButtonIndex = i;
saveExpressionToModel();
break;
}
}
}
}
public void widgetDefaultSelected(SelectionEvent e) { }
});
}
}
protected void createClient(Composite parent) {
super.createClient(parent);
createRadioButtonWidgets( parent );
PlatformUI.getWorkbench().getHelpSystem().setHelp( parent, IHelpContextIds.PROPERTY_PAGE_WAIT );
}
protected String getButtonExprType (int buttonIndex) {
if (buttonIndex == 0) {
return IEditorConstants.ET_DATETIME;
}
if (buttonIndex == 1) {
return IEditorConstants.ET_DURATION;
}
throw new IllegalArgumentException();
}
/**
* This is a map between classes (Wait, OnAlarm)
* and the structural features that they support (For and Until).
*
* Pay particular attention to the indices of the arrays because they are ...
* let's just say "connected"
*/
static final String[] gLabels =
{
Messages.WaitConditionSection_Date_1,
Messages.WaitConditionSection_Duration_2
};
/**
* Button 0 is for "until" (date time)
* Button 1 is for "for" (duration)
*/
static Map<EClass, EStructuralFeature[]> CLASS2FEATURES = new HashMap<EClass, EStructuralFeature[]>();
static {
CLASS2FEATURES.put( BPELPackage.eINSTANCE.getWait() ,
new EStructuralFeature [] {
BPELPackage.eINSTANCE.getWait_Until(),
BPELPackage.eINSTANCE.getWait_For()
});
CLASS2FEATURES.put( BPELPackage.eINSTANCE.getOnAlarm() ,
new EStructuralFeature [] {
BPELPackage.eINSTANCE.getOnAlarm_Until(),
BPELPackage.eINSTANCE.getOnAlarm_For()
});
}
@Override
protected Expression getExprFromModel() {
EObject input = getInput();
EStructuralFeature feature = getStructuralFeature (input);
if (feature == null) {
return null;
}
Object result = input.eGet(feature);
if (result != null && result instanceof Expression) {
return (Expression) result;
}
return null;
}
protected int getButtonIndexFromModel() {
EObject input = getInput();
EStructuralFeature feature = getStructuralFeature(input);
if (feature == null) {
return 1;
}
if (feature.getName().indexOf("until") >= 0) {
return 0;
}
return 1;
}
protected boolean isValidClientUseType (String useType) {
return IBPELUIConstants.USE_TYPE_DEADLINE_CONDITION.equals(useType)
|| IBPELUIConstants.USE_TYPE_DURATION_CONDITION.equals(useType);
}
/**
* We override this parameter-less method since the feature changes as the button selection changes.
* The target of this structural feature (for the SetCommand model mutation change) is the target itself,
* that is the Wait activity.
*/
@Override
protected EStructuralFeature getStructuralFeature() {
return getStructuralFeature ( this.fCurrentButtonIndex );
}
protected EStructuralFeature getStructuralFeature( int index ) {
EStructuralFeature features [] = CLASS2FEATURES.get( getInput().eClass());
assert (features != null) : "Features cannot be null";
return features[ index ];
}
@Override
protected EStructuralFeature getStructuralFeature( EObject eObj ) {
EStructuralFeature features [] = CLASS2FEATURES.get(eObj.eClass() );
for (EStructuralFeature f : features) {
Object result = eObj.eGet(f);
if (result != null) {
return f;
}
}
return null;
}
/**
* Saves the expression to the model.
*/
protected void saveExpressionToModel() {
if( this.modelUpdate.get())
return;
// Usual behavior
EStructuralFeature aFeature = getStructuralFeature();
EObject target = getExpressionTarget();
CompoundCommand result = new CompoundCommand();
Expression exp = BPELFactory.eINSTANCE.createCondition();
exp.setBody( this.expressionText != null ? this.expressionText.getText().trim() : "" );
result.add( new SetCommand( target, getExpression4Target( exp ) , aFeature ));
// Unset the features that should not be set
for (EStructuralFeature feature : CLASS2FEATURES.get( getInput().eClass() ) ) {
if( ! feature.equals( aFeature ) && target.eIsSet(feature))
result.add( new SetCommand(target,null,feature)) ;
}
getCommandFramework().execute( result );
}
}