/*
 * Copyright (c) 2010, 2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *     Martin Fluegge - initial API and implementation
 *
 */
package org.eclipse.emf.cdo.dawn.examples.acore.diagram.navigator;

import org.eclipse.emf.cdo.dawn.examples.acore.diagram.edit.parts.ACoreRootEditPart;
import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreDiagramEditor;
import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreDiagramEditorPlugin;
import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.AcoreVisualIDRegistry;
import org.eclipse.emf.cdo.dawn.examples.acore.diagram.part.Messages;

import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite;
import org.eclipse.ui.part.FileEditorInput;

import java.util.Iterator;

/**
 * @generated
 */
public class AcoreNavigatorActionProvider extends CommonActionProvider
{

  /**
   * @generated
   */
  private boolean myContribute;

  /**
   * @generated
   */
  private OpenDiagramAction myOpenDiagramAction;

  /**
   * @generated
   */
  @Override
  public void init(ICommonActionExtensionSite aSite)
  {
    super.init(aSite);
    if (aSite.getViewSite() instanceof ICommonViewerWorkbenchSite)
    {
      myContribute = true;
      makeActions((ICommonViewerWorkbenchSite)aSite.getViewSite());
    }
    else
    {
      myContribute = false;
    }
  }

  /**
   * @generated
   */
  private void makeActions(ICommonViewerWorkbenchSite viewerSite)
  {
    myOpenDiagramAction = new OpenDiagramAction(viewerSite);
  }

  /**
   * @generated
   */
  @Override
  public void fillActionBars(IActionBars actionBars)
  {
    if (!myContribute)
    {
      return;
    }
    IStructuredSelection selection = (IStructuredSelection)getContext().getSelection();
    myOpenDiagramAction.selectionChanged(selection);
    if (myOpenDiagramAction.isEnabled())
    {
      actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, myOpenDiagramAction);
    }
  }

  /**
   * @generated
   */
  @Override
  public void fillContextMenu(IMenuManager menu)
  {
  }

  /**
   * @generated
   */
  private class OpenDiagramAction extends Action
  {

    /**
     * @generated
     */
    private Diagram myDiagram;

    /**
     * @generated
     */
    private ICommonViewerWorkbenchSite myViewerSite;

    /**
     * @generated
     */
    public OpenDiagramAction(ICommonViewerWorkbenchSite viewerSite)
    {
      super(Messages.NavigatorActionProvider_OpenDiagramActionName);
      myViewerSite = viewerSite;
    }

    /**
     * @generated
     */
    public final void selectionChanged(IStructuredSelection selection)
    {
      myDiagram = null;
      if (selection.size() == 1)
      {
        Object selectedElement = selection.getFirstElement();
        if (selectedElement instanceof AcoreNavigatorItem)
        {
          selectedElement = ((AcoreNavigatorItem)selectedElement).getView();
        }
        else if (selectedElement instanceof IAdaptable)
        {
          selectedElement = ((IAdaptable)selectedElement).getAdapter(View.class);
        }
        if (selectedElement instanceof Diagram)
        {
          Diagram diagram = (Diagram)selectedElement;
          if (ACoreRootEditPart.MODEL_ID.equals(AcoreVisualIDRegistry.getModelID(diagram)))
          {
            myDiagram = diagram;
          }
        }
      }
      setEnabled(myDiagram != null);
    }

    /**
     * @generated
     */
    @Override
    public void run()
    {
      if (myDiagram == null || myDiagram.eResource() == null)
      {
        return;
      }

      IEditorInput editorInput = getEditorInput();
      IWorkbenchPage page = myViewerSite.getPage();
      try
      {
        page.openEditor(editorInput, AcoreDiagramEditor.ID);
      }
      catch (PartInitException e)
      {
        AcoreDiagramEditorPlugin.getInstance().logError("Exception while openning diagram", e); //$NON-NLS-1$
      }
    }

    /**
     * @generated
     */
    private IEditorInput getEditorInput()
    {
      for (Iterator it = myDiagram.eResource().getContents().iterator(); it.hasNext();)
      {
        EObject nextEObject = (EObject)it.next();
        if (nextEObject == myDiagram)
        {
          return new FileEditorInput(WorkspaceSynchronizer.getFile(myDiagram.eResource()));
        }
        if (nextEObject instanceof Diagram)
        {
          break;
        }
      }
      URI uri = EcoreUtil.getURI(myDiagram);
      String editorName = uri.lastSegment() + "#" + myDiagram.eResource().getContents().indexOf(myDiagram); //$NON-NLS-1$
      IEditorInput editorInput = new URIEditorInput(uri, editorName);
      return editorInput;
    }

  }

}
