/**
 * 
 */
package org.eclipse.epf.diagram.core.providers;

import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditDomain;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;

/**
 * Class to handle the popupmenu items 
 * @author Shashidhar Kannoori
 */
public class DiagramContextMenuProvider extends
		org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider {

	/**
	 * @param part
	 * @param viewer
	 */
	public DiagramContextMenuProvider(IWorkbenchPart part, EditPartViewer viewer) {
		super(part, viewer);
	}
	
	@Override
	public void menuAboutToShow(IMenuManager menu) {
		super.menuAboutToShow(menu);
		IContributionItem item =  find(ActionIds.ACTION_DELETE_FROM_DIAGRAM);
		if(item != null)
		item.setVisible(false);

		IContributionItem item1=  find(ActionIds.ACTION_DELETE_FROM_MODEL);
		if(item1 != null)
		item1.setVisible(false);
		
		IContributionItem item2 = find(ActionIds.MENU_NAVIGATE);
		if(item2 != null)
		item2.setVisible(false);
		
		IContributionItem item3 = find(ActionFactory.PROPERTIES.getId());
		if(item3 != null)
		item3.setVisible(false);
		
		EditDomain domain = getViewer().getEditDomain();
		if(domain instanceof DiagramEditDomain){
			IEditorPart part=  ((DiagramEditDomain)domain).getEditorPart();
			if(part instanceof AbstractDiagramEditor){
				((AbstractDiagramEditor)part).contributeToContextMenu(menu);
			}
		}
	}
}
