blob: 9e783531d7d03ee41d1eef03a86fd0380c2360c3 [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.process.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator;
import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.Suppression;
/**
* @author Phong Nguyen Le - Feb 10, 2006
* @since 1.0
*/
public class UpdateSuppressionFromBaseCommand extends AbstractCommand implements
IResourceAwareCommand {
private Suppression suppression;
private Collection elements;
private HashSet inheritedElements;
private AdapterFactory adapterFactory;
private Collection affectedObjects;
private HashMap objectToSuppressionStateMap;
/**
*
*/
public UpdateSuppressionFromBaseCommand() {
super();
}
/**
* @param label
*/
public UpdateSuppressionFromBaseCommand(String label, Collection elements, AdapterFactory adapterFactory, Suppression suppression) {
super(label);
this.elements = elements;
this.adapterFactory = adapterFactory;
this.suppression = suppression;
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#dispose()
*/
public void dispose() {
if(affectedObjects != null) {
affectedObjects.clear();
affectedObjects = null;
}
if(inheritedElements != null) {
inheritedElements.clear();
inheritedElements = null;
}
if(objectToSuppressionStateMap != null) {
objectToSuppressionStateMap.clear();
objectToSuppressionStateMap = null;
}
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.epf.library.edit.command.IResourceAwareCommand#getModifiedResources()
*/
public Collection getModifiedResources() {
Resource resource = suppression.getProcess().eResource();
if(resource != null) {
return Collections.singletonList(resource);
}
else {
return Collections.EMPTY_LIST;
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#getAffectedObjects()
*/
public Collection getAffectedObjects() {
if(affectedObjects == null) {
return super.getAffectedObjects();
}
else {
return affectedObjects;
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.Command#execute()
*/
public void execute() {
if(affectedObjects == null) {
affectedObjects = new ArrayList();
}
else {
affectedObjects.clear();
}
if(objectToSuppressionStateMap == null) {
objectToSuppressionStateMap = new HashMap();
}
else {
objectToSuppressionStateMap.clear();
}
for (Iterator iter = getInheritedElements().iterator(); iter.hasNext();) {
BreakdownElementWrapperItemProvider wrapper = (BreakdownElementWrapperItemProvider) iter.next();
boolean wasSuppressed = suppression.isInSuppressedList(wrapper);
if(suppression.updateSuppressionFromBase(wrapper)) {
affectedObjects.add(wrapper);
objectToSuppressionStateMap.put(wrapper, Boolean.valueOf(wasSuppressed));
}
}
}
/* (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(objectToSuppressionStateMap != null && !objectToSuppressionStateMap.isEmpty()) {
for (Iterator iter = objectToSuppressionStateMap.entrySet().iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
Boolean suppressed = (Boolean) entry.getValue();
if(suppressed.booleanValue()) {
suppression.suppress(Collections.singletonList(entry.getKey()));
}
else {
suppression.reveal(Collections.singletonList(entry.getKey()));
}
}
affectedObjects.clear();
affectedObjects.addAll(elements);
}
}
/* (non-Javadoc)
* @see org.eclipse.emf.common.command.AbstractCommand#prepare()
*/
protected boolean prepare() {
return true;
}
private Collection getInheritedElements() {
if(inheritedElements == null) {
inheritedElements = new HashSet();
for (Iterator iter = elements.iterator(); iter.hasNext();) {
Object element = (Object) iter.next();
for (Iterator treeIter = new AdapterFactoryTreeIterator(adapterFactory, element); treeIter.hasNext();) {
Object e = treeIter.next();
if(ProcessUtil.isInherited(e)) {
inheritedElements.add(e);
}
}
}
}
return inheritedElements;
}
}