blob: 2813622ef6c3df81a0535b232fb8cde01cccccaf [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//Copyright (c) 2005, 2007 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.diagram.core.commands;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.util.AbstractTreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.epf.diagram.core.DiagramCorePlugin;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.services.DiagramService;
import org.eclipse.epf.diagram.model.util.TxUtil;
import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
import org.eclipse.epf.uma.Activity;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
/**
* Command to delete diagram nodes of the deleted breakdown elements.
*
* @author Phong Nguyen Le
* @since 1.2
*/
public class DeleteDiagramNodeCommand extends AbstractCommand implements IResourceAwareCommand {
private Activity activity;
private Collection<?> breakdownElements;
private DiagramService diagramSvc;
public DeleteDiagramNodeCommand(Activity activity, Collection<?> breakdownElements) {
this.activity = activity;
this.breakdownElements = breakdownElements;
}
public Collection<Resource> getModifiedResources() {
if(diagramSvc != null) {
org.eclipse.epf.diagram.core.services.DiagramManager mgr = diagramSvc.getDiagramManager(activity);
if(mgr != null) {
try {
Resource resource = mgr.getResource();
if(resource != null) {
return Collections.singleton(resource);
}
} catch (CoreException e) {
DiagramCorePlugin.getDefault().getLogger().logError(e);
}
}
}
return Collections.EMPTY_LIST;
}
public void execute() {
Collection<Diagram> diagrams = diagramSvc.getDiagrams(activity);
Collection<View> viewsToDelete = new ArrayList<View>();
for (Diagram diagram : diagrams) {
AbstractTreeIterator<View> iterator = new AbstractTreeIterator<View>(diagram, false) {
private static final long serialVersionUID = 1L;
@Override
protected Iterator<? extends View> getChildren(Object object) {
if(object instanceof View) {
return ((View)object).getChildren().iterator();
}
return Collections.EMPTY_LIST.iterator();
}
};
while(iterator.hasNext()) {
View view = iterator.next();
if(breakdownElements.contains(BridgeHelper.getMethodElement(view, activity))) {
viewsToDelete.add(view);
}
}
}
if(!viewsToDelete.isEmpty()) {
for (View view : viewsToDelete) {
final EObject umlElement = view.getElement();
ViewUtil.destroy(view);
// delete UML node as well if it is not deleted yet
//
if(umlElement != null && umlElement.eContainer() != null) {
try {
TxUtil.runInTransaction(umlElement, new Runnable() {
public void run() {
EcoreUtil.delete(umlElement);
}
});
} catch (ExecutionException e) {
DiagramCorePlugin.getDefault().getLogger().logError(e);
}
}
}
}
}
public void redo() {
execute();
}
@Override
public boolean canUndo() {
return false;
}
@Override
protected boolean prepare() {
diagramSvc = new DiagramService();
Collection<Diagram> diagrams = diagramSvc.getDiagrams(activity);
return !diagrams.isEmpty();
}
@Override
public void dispose() {
activity = null;
breakdownElements = null;
diagramSvc.dispose();
}
}