//------------------------------------------------------------------------------
// 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, 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.diagramming.part;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.draw2d.DelegatingLayout;
import org.eclipse.draw2d.FreeformLayer;
import org.eclipse.draw2d.LayeredPane;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.epf.diagram.core.DiagramCoreResources;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagram.core.bridge.DiagramAdapter;
import org.eclipse.epf.diagram.core.bridge.NodeAdapter;
import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
import org.eclipse.epf.diagram.core.part.DiagramFileEditorInputProxy;
import org.eclipse.epf.diagram.core.part.util.DiagramEditorUtil;
import org.eclipse.epf.diagram.core.util.DiagramConstants;
import org.eclipse.epf.diagramming.edit.parts.UMLEditPartFactory;
import org.eclipse.epf.diagramming.providers.UMLElementTypes;
import org.eclipse.epf.library.edit.util.IDiagramManager;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.ui.actions.GEFActionConstants;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IEditorPart;
import org.eclipse.uml2.uml.UMLPackage;

/**
 * @modified
 */
public class DiagramEditor extends org.eclipse.epf.diagram.core.part.AbstractDiagramEditor {
	/**
	 * @generated
	 */
	public static final String ID = "org.eclipse.epf.diagramming.part.DiagramEditorID"; //$NON-NLS-1$


	/**
	 * @generated
	 */
	protected void configureGraphicalViewer() {
		super.configureGraphicalViewer();
		DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer()
				.getRootEditPart();
		LayeredPane printableLayers = (LayeredPane) root
				.getLayer(LayerConstants.PRINTABLE_LAYERS);
		FreeformLayer extLabelsLayer = new FreeformLayer();
		extLabelsLayer.setLayoutManager(new DelegatingLayout());
		printableLayers.addLayerAfter(extLabelsLayer,
				UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER,
				LayerConstants.PRIMARY_LAYER);
		LayeredPane scalableLayers = (LayeredPane) root
				.getLayer(LayerConstants.SCALABLE_LAYERS);
		FreeformLayer scaledFeedbackLayer = new FreeformLayer();
		scaledFeedbackLayer.setEnabled(false);
		scalableLayers.addLayerAfter(scaledFeedbackLayer,
				LayerConstants.SCALED_FEEDBACK_LAYER,
				DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER);
	}

	@Override
	protected PreferencesHint getPreferencesHint() {
		return new PreferencesHint(EPFDiagramEditorPlugin.ID);
	}

	
	/**
	 * @param event
	 */
	protected void handleDoubleClick(Event event) {
		List editParts = getGraphicalViewer().getSelectedEditParts();

		// do nothing if 0 or more than 1 edit parts are selected
		//
		if (editParts.size() != 1)
			return;

		EditPart editPart = (EditPart) editParts.get(0);
		Node node = (Node)editPart.getModel();
		EObject model = node.getElement();
		DiagramFileEditorInputProxy editorInput = (DiagramFileEditorInputProxy)getEditorInput();
		DiagramEditorInput dInput = editorInput.getDiagramEditorInput();

		if(model instanceof org.eclipse.uml2.uml.Activity){
			NodeAdapter nodeAdapter = BridgeHelper.getNodeAdapter(model);
			Object e = null;
			// TODO: handle Wrapper change below line after wrapper implement
				e = nodeAdapter.getElement();
			if(e == null){
				e = BridgeHelper.getMethodElement((EModelElement)model);
			}
			if(e != null){
				IEditorPart parent = getSite().getPage().getActiveEditor();
				DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
						e, dInput.getSuppression(), IDiagramManager.ACTIVITY_DIAGRAM);
				DiagramEditorUtil.openDiagramEditor(getSite().getPage(), input, 
						EPFDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT, new NullProgressMonitor());					

			}
		}

	}
	@Override
	protected void initializeGraphicalViewer() {
		super.initializeGraphicalViewer();
		// Code for disabling the readonly element in the diagram.
//		DiagramEditPart diagramPart = getDiagramEditPart();
//		List children = diagramPart.getChildren();
//		if(!children.isEmpty()){
//			for (Iterator iter = children.iterator(); iter.hasNext();) {
//				EditPart part = (EditPart) iter.next();
//				if(part instanceof GraphicalEditPart){
//					Node node = (Node)part.getModel();
//					if(BridgeHelper.isInherited(node)){
//						((GraphicalEditPart)part).disableEditMode();
//					}
//				}
//			}
//		}
	}
	@Override
	protected void createActions() {
		super.createActions();
		
		
		IAction action = new Action(
				DiagramCoreResources.ActivityDiagram_openActivityDetailDiagram_text) { //$NON-NLS-1$
			public String getId() {
				return DiagramConstants.OPEN_ACTIVITY_DETAIL_DIAGRAM;
			}

			public void run() {
				try {
					EditPart selectedPart = (EditPart) getGraphicalViewer()
							.getSelectedEditParts().get(0);
					IEditorPart parent = getSite().getPage().getActiveEditor();
					if (selectedPart != null) {
						Node view = (Node) selectedPart.getModel();
						DiagramEditPart diagramEditPart = (DiagramEditPart) selectedPart
								.getParent();
						Diagram diagram = (Diagram) diagramEditPart.getModel();
						DiagramAdapter diagramAdapter = BridgeHelper
								.getDiagramAdapter(diagram.getElement());

						NodeAdapter adapter = BridgeHelper.getNodeAdapter(view
								.getElement());
						Object selectedObject = adapter.getWrapper();
						if (selectedObject == null) {
							selectedObject = adapter.getElement();
						}
						// IEditorPart parent =
						// PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
						DiagramEditorInput input = new org.eclipse.epf.diagram.core.part.DiagramEditorInput(
								selectedObject,
								diagramAdapter.getSuppression(),
								IDiagramManager.ACTIVITY_DIAGRAM);
						DiagramEditorUtil
								.openDiagramEditor(
										getSite().getPage(),
										input,
										EPFDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT,
										new NullProgressMonitor());
					}

				} catch (RuntimeException e) {
					e.printStackTrace();
				}
			}

			public boolean isEnabled() {
				List editParts = getGraphicalViewer().getSelectedEditParts();
				if (editParts.size() != 1)
					return false;
				EditPart editPart = (EditPart) editParts.get(0);
				Node node = (Node) editPart.getModel();
				if (node != null && node.getElement() != null
						&& node.getElement() instanceof org.eclipse.uml2.uml.StructuredActivityNode) {
					return true;
				} else {
					return false;
				}
			}
		};
		getActionRegistry().registerAction(action);
		
		
		List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.clear();
		elementTypes.add(UMLElementTypes.ActivityPartition_1008);
		elementTypes.add(UMLElementTypes.ActivityPartition_2001);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Partition_Node_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_PARTITION,
				DiagramCoreResources.ActivityDiagram_Partition_Node_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getActivityPartition(), 
						UMLElementTypes.ActivityPartition_2001)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);
		
		elementTypes.add(UMLElementTypes.InitialNode_1004);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_StartNode_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_START_NODE,
				DiagramCoreResources.ActivityDiagram_StartNode_tooltip, //$NON-NLS-1$
				UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getInitialNode(), 
						UMLElementTypes.InitialNode_1004)); //$NON-NLS-1$
		getActionRegistry().registerAction(action);
		
		elementTypes.clear();
		elementTypes.add(UMLElementTypes.ForkNode_1003);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Fork_Node_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_FORK_NODE, DiagramCoreResources.ActivityDiagram_Fork_Node_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getForkNode(), 
						UMLElementTypes.ForkNode_1003)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);
		
		elementTypes.clear();
		elementTypes.add(UMLElementTypes.JoinNode_1006);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_SyncBar_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_SYNC_BAR, DiagramCoreResources.ActivityDiagram_SyncBar_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getJoinNode(), 
						UMLElementTypes.JoinNode_1006)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.DecisionNode_1005);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_DecisionNode_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_DECISION_BAR,
				DiagramCoreResources.ActivityDiagram_DecisionNode_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getDecisionNode(), 
						UMLElementTypes.DecisionNode_1005)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);
		
		elementTypes.clear();
		elementTypes.add(UMLElementTypes.MergeNode_1002);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Merge_Node_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_MERGE_NODE,
				DiagramCoreResources.ActivityDiagram_Merge_Node_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getDecisionNode(), 
						UMLElementTypes.MergeNode_1002)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.ActivityFinalNode_1001);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_EndNode_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_END_NODE, DiagramCoreResources.ActivityDiagram_EndNode_tooltip
				, UMLElementTypes.getImageDescriptor(UMLPackage.eINSTANCE.getActivityFinalNode(), 
						UMLElementTypes.ActivityFinalNode_1001)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1007);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Activity_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_ACTIVITY,
				DiagramCoreResources.ActivityDiagram_Activity_tooltip
				, UMLElementTypes.getImageDescriptor(null, 
						UMLElementTypes.StructuredActivityNode_1007)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1011);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Iteration_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_ITERATION,
				DiagramCoreResources.ActivityDiagram_Iteration_tooltip
				, UMLElementTypes.getImageDescriptor(null, 
						UMLElementTypes.StructuredActivityNode_1011)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1010);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Phase_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_PHASE, DiagramCoreResources.ActivityDiagram_Phase_tooltip
				, UMLElementTypes.getImageDescriptor(null, 
						UMLElementTypes.StructuredActivityNode_1010)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);

		elementTypes.clear();
		elementTypes.add(UMLElementTypes.ActivityParameterNode_1009);
		action = createAnAction(
				DiagramCoreResources.AbstractDiagram_TaskDescriptor_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_TASK_DESCRIPTOR,
				DiagramCoreResources.AbstractDiagram_TaskDescriptor_tooltip
				, UMLElementTypes.getImageDescriptor(null, 
						UMLElementTypes.ActivityParameterNode_1009)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);
		
		elementTypes.clear();
		elementTypes.add(UMLElementTypes.ActivityParameterNode_1012);
		action = createAnAction(
				DiagramCoreResources.ActivityDiagram_Merge_Node_text, elementTypes, //$NON-NLS-1$
				DiagramConstants.CREATE_MILESTONE,
				DiagramCoreResources.ActivityDiagram_Merge_Node_tooltip
				, UMLElementTypes.getImageDescriptor(null, 
						UMLElementTypes.ActivityParameterNode_1012)); //$NON-NLS-1$

		getActionRegistry().registerAction(action);
		
	}
	
	@Override
	public void contributeToContextMenu(IMenuManager menu) {
		super.contributeToContextMenu(menu);
		addToMenu(menu, DiagramConstants.OPEN_ACTIVITY_DETAIL_DIAGRAM);
		menu.insertAfter(GEFActionConstants.MB_ADDITIONS, new Separator(
				GEFActionConstants.MB_ADDITIONS));

		addToMenu(menu,DiagramConstants.CREATE_PARTITION);
		addToMenu(menu,DiagramConstants.CREATE_START_NODE);
		addToMenu(menu,DiagramConstants.CREATE_SYNC_BAR);
		addToMenu(menu,DiagramConstants.CREATE_FORK_NODE);
		addToMenu(menu,DiagramConstants.CREATE_DECISION_BAR);
		addToMenu(menu,DiagramConstants.CREATE_MERGE_NODE);
		addToMenu(menu,DiagramConstants.CREATE_END_NODE);
		menu.insertAfter(GEFActionConstants.MB_ADDITIONS, new Separator(
				GEFActionConstants.MB_ADDITIONS));
		addToMenu(menu,DiagramConstants.CREATE_ACTIVITY);
		addToMenu(menu,DiagramConstants.CREATE_ITERATION);
		addToMenu(menu,DiagramConstants.CREATE_PHASE);
		addToMenu(menu,DiagramConstants.CREATE_TASK_DESCRIPTOR);
		addToMenu(menu,DiagramConstants.CREATE_MILESTONE);
	}
}
