//------------------------------------------------------------------------------
// 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.actions.ActionIds;
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.IContributionItem;
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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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 = new ArrayList<IElementType>();
		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,
				GEFActionConstants.MB_ADDITIONS, true, true);
		IContributionItem item = menu.find(ActionIds.MENU_DIAGRAM_ADD);
		if(item != null && item instanceof IMenuManager){
			IMenuManager addMenu = (IMenuManager)item;
			String groupName = DiagramConstants.DIAGRAM_ADD_MENU_GENERAL_GROUP;
			if(getGraphicalViewer().getSelectedEditParts().size() == 0){
			addToMenu(addMenu, null,groupName, true, true);	
			addToMenu(addMenu,DiagramConstants.CREATE_PARTITION, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_START_NODE, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_SYNC_BAR, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_FORK_NODE, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_DECISION_BAR, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_MERGE_NODE, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_END_NODE, 
					groupName, true, true);
			addToMenu(addMenu,DiagramConstants.CREATE_ACTIVITY, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_ITERATION, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_PHASE, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_TASK_DESCRIPTOR, 
					groupName, false, true);
			addToMenu(addMenu,DiagramConstants.CREATE_MILESTONE, 
					groupName, true, true);
			}
		}
	}
}
