/**
 * 
 */
package org.eclipse.epf.diagramming.base.actions;

import org.eclipse.epf.diagram.core.DiagramCoreResources;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
import org.eclipse.epf.diagram.core.services.DiagramHelper;
import org.eclipse.epf.diagramming.EPFDiagramPlugin;
import org.eclipse.epf.diagramming.edit.parts.ActivityEditPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

/**
 * @author Shashidhar Kannoori
 *
 */
public class DeleteDiagramAction implements IObjectActionDelegate {

	private ActivityEditPart mySelectedElement;
	private IWorkbenchPart targetPart;
	/**
	 * 
	 */
	public DeleteDiagramAction() {
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
	 */
	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
		// TODO Auto-generated method stub
		this.targetPart = targetPart;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
	 */
	public void run(IAction action) {
		if (EPFDiagramPlugin
				.getDefault()
				.getMsgDialog()
				.displayPrompt(
						DiagramCoreResources.DeleteDiagram_text, //$NON-NLS-1$
						DiagramCoreResources.DeleteDiagram_prompt)) { //$NON-NLS-1$
			if(mySelectedElement != null){
				Diagram diagram = (Diagram)mySelectedElement.getModel();
				if(diagram != null){
					try{
						DiagramHelper.deleteDiagram(diagram);
						targetPart.getSite().getPage().closeEditor(
								targetPart.getSite().getPage().getActiveEditor(), false);
					}catch(Exception ex){
						ex.printStackTrace();
					}
				}
			}
		}
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
	 */
	public void selectionChanged(IAction action, ISelection selection) {
		mySelectedElement = null;
		if (selection instanceof IStructuredSelection) {
			IStructuredSelection structuredSelection = (IStructuredSelection) selection;
			if (structuredSelection.size() == 1
					&& structuredSelection.getFirstElement() instanceof ActivityEditPart) {
				mySelectedElement = (ActivityEditPart) structuredSelection
						.getFirstElement();
			}
		}
		if(mySelectedElement != null){
			Diagram diagram = (Diagram)mySelectedElement.getModel();
			if(diagram != null){
				NodeAdapter adapter= BridgeHelper.getNodeAdapter(diagram.getElement());
				if(adapter.isTargetReadOnly()){
					action.setEnabled(false);
				}
			}
		}else{
			action.setEnabled(false);
		}
	}
}
