//------------------------------------------------------------------------------
// 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.Iterator;

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.resource.Resource;
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.library.edit.command.IResourceAwareCommand;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
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) {
				ViewUtil.destroy(view);
			}
		}
	}

	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();
	}
}
