/******************************************************************************* | |
* 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 org.eclipse.bpel.model.AbstractAssignBound; | |
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.Messages; | |
import org.eclipse.bpel.ui.adapters.IVirtualCopyRuleSide; | |
import org.eclipse.bpel.ui.commands.CompoundCommand; | |
import org.eclipse.bpel.ui.commands.SetCommand; | |
import org.eclipse.bpel.ui.util.BPELUtil; | |
import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter; | |
import org.eclipse.bpel.ui.util.MultiObjectAdapter; | |
import org.eclipse.emf.common.notify.Notification; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.EStructuralFeature; | |
import org.eclipse.gef.commands.Command; | |
import org.eclipse.swt.layout.FillLayout; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; | |
/** | |
* TODO: when you first set the model object into the details page, it should query the | |
* sections to find out which one thinks it "owns" the model object. If NONE of them | |
* claim to own it, then we will use whatever combo selection is stored in the transient | |
* CopyExtension. The same procedure is followed when refreshing the contents of the | |
* page. | |
* | |
* When you select a *different* category in the combo, we must update the value in the | |
* CopyExtension. We should also replace the existing Copy with an *empty* Copy. | |
* | |
* Categories should become responsible for storing the value into the model themselves. | |
*/ | |
public class ExpressionAssignCategory extends ExpressionSection implements IAssignCategory { | |
/** | |
* @see org.eclipse.bpel.ui.properties.IAssignCategory#isHidden() | |
*/ | |
public boolean isHidden() { | |
return isHidden; | |
} | |
protected BPELPropertySection fOwnerSection; | |
protected Composite composite; | |
protected Composite fParent; | |
protected ExpressionAssignCategory( BPELPropertySection ownerSection ) { | |
this.fOwnerSection = ownerSection; | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage) | |
*/ | |
@Override | |
public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) { | |
super.createControls(parent, aTabbedPropertySheetPage); | |
fParent = parent; | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.IAssignCategory#getComposite() | |
*/ | |
public Composite getComposite() { | |
return fParent; | |
} | |
// This is used by changeHelper to determine what shows up in Undo/Redo. | |
// The return value is FlatFormatted with getName() as the only argument. | |
// Subclasses may override. | |
protected String getLabelFlatFormatString() { | |
return IBPELUIConstants.FORMAT_CMD_SELECT; | |
} | |
protected boolean isToOrFromAffected(Notification n) { | |
// hack: | |
return true; | |
// if (isFrom) { | |
// return (n.getFeatureID(Copy.class) == BPELPackage.COPY__FROM); | |
// } | |
// return (n.getFeatureID(Copy.class) == BPELPackage.COPY__TO); | |
} | |
@Override | |
protected MultiObjectAdapter[] createAdapters() { | |
MultiObjectAdapter adapter = new BatchedMultiObjectAdapter() { | |
boolean needRefresh = false; | |
boolean toOrFromAffected = false; | |
@Override | |
public void notify(Notification n) { | |
needRefresh = isBodyAffected(n); | |
// if (isBodyAffected(n) && !isExecutingStoreCommand) needRefresh = true; | |
if (isToOrFromAffected(n)) { | |
toOrFromAffected = true; | |
} | |
refreshAdapters(); | |
} | |
@Override | |
public void finish() { | |
if (needRefresh || toOrFromAffected) { | |
updateWidgets(); | |
} | |
if (toOrFromAffected) { | |
updateCategoryWidgets(); | |
} | |
toOrFromAffected = false; | |
needRefresh = false; | |
} | |
}; | |
return new MultiObjectAdapter[] { adapter }; | |
} | |
protected void updateCategoryWidgets() { | |
updateEditor(); | |
} | |
/** | |
* Policy: wrap the command with contexts from the ownerSection (rather | |
* than from the category itself). On undo, the ownerSection will delegate | |
* to the category's methods. | |
*/ | |
@Override | |
protected Command wrapInShowContextCommand(Command inner) { | |
return super.wrapInShowContextCommand(inner, fOwnerSection); | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.IAssignCategory#getName() | |
*/ | |
public String getName() { | |
return Messages.ExpressionAssignCategory_Expression_1; | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.IAssignCategory#isCategoryForModel(org.eclipse.emf.ecore.EObject) | |
*/ | |
public boolean isCategoryForModel ( EObject aModel ) { | |
IVirtualCopyRuleSide side = BPELUtil.adapt(aModel, IVirtualCopyRuleSide.class); | |
if (side != null) { | |
return side.getExpression() != null; | |
} | |
return false; | |
} | |
@Override | |
protected Command newStoreToModelCommand (Object body) { | |
CompoundCommand result = new CompoundCommand(); | |
// If there is no condition, create one. | |
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); | |
result.add(new SetCommand( getExpressionTarget(), exp, getStructuralFeature() )); | |
fEditor.addExtraStoreCommands(result); | |
return result; | |
} | |
@Override | |
protected EStructuralFeature getStructuralFeature(EObject object) { | |
if (object instanceof AbstractAssignBound) { | |
return BPELPackage.eINSTANCE.getAbstractAssignBound_Expression(); | |
} | |
return super.getStructuralFeature(object); | |
} | |
/** | |
* This is just a workaround to keep the AssignCategory from changing too much. | |
* @param model the model object | |
*/ | |
public void setInput (EObject model) { | |
basicSetInput(model); | |
addAllAdapters(); | |
Object language = selectedExpressionLanguage (); | |
if (language == NO_EXPRESSION) { | |
doChooseExpressionLanguage ( SAME_AS_PARENT ); | |
} | |
} | |
@Override | |
protected final void createClient(Composite parent) { | |
// ugly HACK to make subclasses work | |
//FlatFormLayout layout = new FlatFormLayout(); | |
//layout.marginHeight = layout.marginWidth = 0; | |
//parent.setLayout(layout); | |
FillLayout fillLayout = new FillLayout(); | |
fillLayout.marginHeight = fillLayout.marginWidth = 0; | |
parent.setLayout(fillLayout); | |
super.createClient(parent); | |
} | |
} | |