blob: 91f168f89971fc3ede1189e259d923da6c28a9ce [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
/**
* This command is used to change the features of multiple objects in
* a single batch.
*
* @author Phong Nguyen Le
* @since 1.0
*/
public class BatchCommand extends AbstractCommand {
private Map objectToOldFeatureValuesMap;
private Map objectToNewFeatureValuesMap;
private boolean clear;
/**
* @param clear if true will clear the many-valued feature before adding new values
*/
public BatchCommand(boolean clear) {
super();
this.clear = clear;
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#canExecute()
*/
public boolean canExecute() {
return objectToNewFeatureValuesMap != null && !objectToNewFeatureValuesMap.isEmpty();
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.Command#execute()
*/
public void execute() {
if(objectToNewFeatureValuesMap == null || objectToNewFeatureValuesMap.isEmpty()) {
return;
}
if(objectToOldFeatureValuesMap == null) {
objectToOldFeatureValuesMap = new HashMap();
}
for (Iterator iter = objectToNewFeatureValuesMap.entrySet()
.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
EObject eObj = (EObject) entry.getKey();
Map featureMap = (Map) entry.getValue();
for (Iterator iterator = featureMap.entrySet().iterator(); iterator
.hasNext();) {
entry = (Map.Entry) iterator.next();
EStructuralFeature feature = (EStructuralFeature) entry
.getKey();
if (feature.isMany()) {
if(clear) {
eObj.eSet(feature, entry.getValue());
}
else {
((List) eObj.eGet(feature)).addAll((Collection) entry.getValue());
}
} else {
Object oldValue = eObj.eGet(feature);
if (oldValue != entry.getValue()) {
saveOldFeatureValue(eObj, feature);
eObj.eSet(feature, entry.getValue());
}
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.Command#redo()
*/
public void redo() {
execute();
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#undo()
*/
public void undo() {
if (objectToNewFeatureValuesMap != null && !objectToNewFeatureValuesMap.isEmpty()) {
for (Iterator iter = objectToNewFeatureValuesMap.entrySet()
.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
EObject eObj = (EObject) entry.getKey();
Map featureMap = (Map) entry.getValue();
for (Iterator iterator = featureMap.entrySet().iterator(); iterator
.hasNext();) {
entry = (Map.Entry) iterator.next();
EStructuralFeature feature = (EStructuralFeature) entry
.getKey();
if (feature.isMany()) {
((List) eObj.eGet(feature))
.removeAll((Collection) entry.getValue());
}
}
}
}
// restore old value
//
if (objectToOldFeatureValuesMap != null && !objectToOldFeatureValuesMap.isEmpty()) {
for (Iterator iter = objectToOldFeatureValuesMap.entrySet()
.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
EObject eObj = (EObject) entry.getKey();
Map featureMap = (Map) entry.getValue();
for (Iterator iterator = featureMap.entrySet().iterator(); iterator
.hasNext();) {
entry = (Map.Entry) iterator.next();
EStructuralFeature feature = (EStructuralFeature) entry
.getKey();
eObj.eSet(feature, entry.getValue());
}
}
objectToOldFeatureValuesMap.clear();
}
}
public void addFeatureValue(EObject obj, EStructuralFeature feature, Object value) {
addFeatureValue(getObjectToNewFeatureValuesMap(), obj, feature, value);
}
/**
* Adds values to a 'many' feature.
*
* @param obj
* @param feature the feature with many values
* @param values
*/
public void addFeatureValues(EObject obj, EStructuralFeature feature, Collection values) {
addFeatureValues(getObjectToNewFeatureValuesMap(), obj, feature, values);
}
public Map getObjectToNewFeatureValuesMap() {
if(objectToNewFeatureValuesMap == null) {
objectToNewFeatureValuesMap = new HashMap();
}
return objectToNewFeatureValuesMap;
}
protected void saveOldFeatureValue(EObject eObj,
EStructuralFeature feature) {
Object value = eObj.eGet(feature);
if(feature.isMany()) {
value = new ArrayList((List)value);
}
Map featureMap = (Map) objectToOldFeatureValuesMap.get(eObj);
if (featureMap == null) {
featureMap = new HashMap();
objectToOldFeatureValuesMap.put(eObj, featureMap);
}
featureMap.put(feature, value);
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#dispose()
*/
public void dispose() {
if(objectToNewFeatureValuesMap != null) {
objectToNewFeatureValuesMap.clear();
objectToNewFeatureValuesMap = null;
}
if(objectToOldFeatureValuesMap != null) {
objectToOldFeatureValuesMap.clear();
objectToOldFeatureValuesMap = null;
}
}
public static void addFeatureValue(Map descriptorToNewFeatureValuesMap,
EObject object, EStructuralFeature feature, Object value) {
Map featureMap = (Map) descriptorToNewFeatureValuesMap.get(object);
if (featureMap == null) {
featureMap = new HashMap();
descriptorToNewFeatureValuesMap.put(object, featureMap);
}
if (feature.isMany()) {
List list = (List) featureMap.get(feature);
if (list == null) {
list = new ArrayList();
featureMap.put(feature, list);
}
list.add(value);
} else {
featureMap.put(feature, value);
}
}
public static void addFeatureValues(Map descriptorToNewFeatureValuesMap,
EObject object, EStructuralFeature feature, Collection values) {
Map featureMap = (Map) descriptorToNewFeatureValuesMap.get(object);
if (featureMap == null) {
featureMap = new HashMap();
descriptorToNewFeatureValuesMap.put(object, featureMap);
}
List list = (List) featureMap.get(feature);
if (list == null) {
list = new ArrayList();
featureMap.put(feature, list);
}
list.addAll(values);
}
}