/******************************************************************************* * 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.commands; import org.eclipse.bpel.ui.Messages; import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.osgi.util.NLS; /** * Generic "model-setting" command. Subclasses only need to implement get() and set() * in terms of the particular model property they set. */ public class SetCommand extends AutoUndoCommand { /** Target */ protected EObject fTarget; /** The structural feature we are setting */ protected EStructuralFeature fFeature = null; /** New and old value for the structural feature */ protected Object fNewValue, fOldValue; boolean fExecuteWasSkipped = false; /** * Brand new shiny SetStructuralFeatureCommand command. * * Typically, you would override getDefaultLabel() * * @param aTarget the target EMF object * @param aValue the value to set */ public SetCommand (EObject aTarget, Object aValue ) { super(aTarget); fTarget = aTarget; fNewValue = aValue; } /** * Brand new shiny SetStructuralFeatureCommand command. For example * <pre> * new SetCommand ( copyBpelObject, newTo, BPELPackage.eINSTANCE.getCopy_To() ); * </pre> * * Typically, you would override getDefaultLabel() * * @param aTarget the target EMF object * @param aValue the value to set * @param aFeature the feature id */ public SetCommand (EObject aTarget, Object aValue, EStructuralFeature aFeature ) { this(aTarget,aValue); fNewValue = aValue; fFeature = aFeature; } /** * Get the value of the structural feature from the current target. * @return the value of the structural feature. */ public Object get() { return fTarget.eGet(fFeature); } /** * Set the value of the structural feature. * * @param o */ public void set (Object o) { fTarget.eSet(fFeature, o); } // TODO: THIS SHOULDN'T EXIST. FIX. public void setNewValue (EObject newValue) { this.fNewValue = newValue; } /** * Return the default command label. * @return the default label */ @Override public String getLabel() { if (fFeature == null) { return Messages.SetCommand_Change_1; } return NLS.bind(Messages.SetCommand_Change_2, fFeature.getName(), null ); } protected boolean hasNoEffect() { if (fOldValue == null) return (fNewValue == null); if (fNewValue == null) return false; return fNewValue.equals(fOldValue); } /** * @see org.eclipse.bpel.ui.commands.util.AutoUndoCommand#canDoExecute() */ @Override public boolean canDoExecute() { return true; } /** * @see org.eclipse.bpel.ui.commands.util.AutoUndoCommand#doExecute() */ @Override public void doExecute() { fOldValue = get(); if (hasNoEffect()) { fExecuteWasSkipped = true; } else { set(fNewValue); } } // TODO! // public Resource[] getModifiedResources() { // if (executeWasSkipped) return EMPTY_RESOURCE_ARRAY; // return getResources(); // } }