| //------------------------------------------------------------------------------ |
| // 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; |
| } |
| |
| |
| } |