/******************************************************************************* | |
* 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.core.resources.IMarker; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.EStructuralFeature; | |
import org.eclipse.gef.commands.Command; | |
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. | |
* | |
* This is a little more involved, because "until" and "for" are mutually exclusive in the model. | |
* | |
*/ | |
public class WaitConditionSection extends RadioChoiceExpressionSection { | |
@Override | |
protected Composite createNoEditorWidgets(Composite composite) { | |
return createNoEditorWidgetsCreateComposite(composite, | |
Messages.WaitConditionSection_No_condition_specified_1 + NL + NL + | |
Messages.WaitConditionSection_Create_condition_text_2 , | |
Messages.WaitConditionSection_Create_a_New_Condition_2); | |
} | |
@Override | |
protected String[] getButtonLabels() { | |
return gLabels; | |
} | |
@Override | |
protected String getButtonExprType (int buttonIndex) { | |
if (buttonIndex == 0) { | |
return IEditorConstants.ET_DATETIME; | |
} | |
if (buttonIndex == 1) { | |
return IEditorConstants.ET_DURATION; | |
} | |
throw new IllegalArgumentException(); | |
} | |
@Override | |
protected void radioButtonSelected (int index, Button button) { | |
if (button.getSelection() == false) { | |
return ; | |
} | |
/** Mark the current radio button selection */ | |
fCurrentButtonIndex = index; | |
runCommand(newStoreToModelCommand( getDefaultBody(editorLanguage,getButtonExprType(index) ) ) ) ; | |
} | |
/** | |
* 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; | |
} | |
@SuppressWarnings("nls") | |
@Override | |
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; | |
} | |
@Override | |
protected boolean isValidClientUseType (String useType) { | |
return IBPELUIConstants.USE_TYPE_DEADLINE_CONDITION.equals(useType) | |
|| IBPELUIConstants.USE_TYPE_DURATION_CONDITION.equals(useType); | |
} | |
@Override | |
protected void createClient (Composite parent) { | |
super.createClient(parent); | |
PlatformUI.getWorkbench().getHelpSystem().setHelp( | |
fParentComposite, IHelpContextIds.PROPERTY_PAGE_WAIT); | |
} | |
/** | |
* Return true if the marker is valid for this section. | |
* @return true if so, false otherwise. | |
*/ | |
@Override | |
public boolean isValidMarker (IMarker marker ) { | |
return false; | |
} | |
/** | |
* 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 ( 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 super.getStructuralFeature(eObj); | |
} | |
/** | |
* Here we have to set the feature that we are setting and unset all | |
* the other mutually exclusive features. | |
* | |
* | |
*/ | |
@Override | |
protected Command newStoreToModelCommand (Object body) { | |
CompoundCommand result = new CompoundCommand(); | |
Expression oldExp = getExprFromModel(); | |
Expression exp = BPELFactory.eINSTANCE.createExpression(); | |
// Don't set the language, because if the user has changed the | |
// language, a condition would already exist at this point. | |
if (oldExp != null) { | |
exp.setExpressionLanguage(oldExp.getExpressionLanguage()); | |
} | |
exp.setBody(body); | |
/** Be nice and unset the features that should not be set. */ | |
EStructuralFeature aFeature = getStructuralFeature(); | |
EObject target = getExpressionTarget(); | |
/** Set the feature being edited */ | |
result.add (new SetCommand(target, exp, aFeature)); | |
// Unset others, if set | |
for (EStructuralFeature feature : CLASS2FEATURES.get( getInput().eClass() ) ) { | |
if (feature.equals(aFeature) || target.eIsSet(feature) == false ) { | |
continue; | |
} | |
result.add( new SetCommand(target,null,feature)) ; | |
} | |
return result; | |
} | |
} |