blob: f1350a7218897398b8c9d26b6c30ab89a96a52cc [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.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();
// }
}