/*
 * Copyright (c) 2015 Ed Merks (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:
 *    Ed Merks - initial API and implementation
 */
package org.eclipse.oomph.internal.ui;

import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.edit.ui.action.DeleteAction;
import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.IFindReplaceTarget;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.part.IPage;
import org.eclipse.ui.texteditor.FindReplaceAction;

import java.util.ResourceBundle;

/**
 * @author Ed Merks
 */
public class OomphEditingDomainActionBarContributor extends EditingDomainActionBarContributor
{
  protected FindAction findAction;

  protected CollapseAllAction collapseAllAction;

  public OomphEditingDomainActionBarContributor()
  {
    super();
  }

  public OomphEditingDomainActionBarContributor(int style)
  {
    super(style);
  }

  @Override
  public void init(IActionBars actionBars)
  {
    findAction = createFindAction();
    actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(), findAction);

    collapseAllAction = createCollapseAllAction();

    super.init(actionBars);
  }

  protected FindAction createFindAction()
  {
    return new FindAction();
  }

  private CollapseAllAction createCollapseAllAction()
  {
    return new CollapseAllAction();
  }

  @Override
  protected DeleteAction createDeleteAction()
  {
    // Specialize this so we can add the find action relative to the delete action.
    DeleteAction deleteAction = super.createDeleteAction();
    deleteAction.setId("delete");
    return deleteAction;
  }

  @Override
  public void contributeToToolBar(IToolBarManager toolBarManager)
  {
    super.contributeToToolBar(toolBarManager);

    if (collapseAllAction != null)
    {
      toolBarManager.add(collapseAllAction);
    }
  }

  @Override
  public void shareGlobalActions(IPage page, IActionBars actionBars)
  {
    super.shareGlobalActions(page, actionBars);

    actionBars.setGlobalActionHandler(ActionFactory.FIND.getId(), findAction);
  }

  @Override
  public void deactivate()
  {
    super.deactivate();

    findAction.setActiveWorkbenchPart(null);

    if (collapseAllAction != null)
    {
      collapseAllAction.setActiveWorkbenchPart(null);
    }
  }

  @Override
  public void activate()
  {
    super.activate();

    findAction.setActiveWorkbenchPart(activeEditor);

    if (collapseAllAction != null)
    {
      collapseAllAction.setActiveWorkbenchPart(activeEditor);
    }
  }

  @Override
  public void menuAboutToShow(IMenuManager menuManager)
  {
    super.menuAboutToShow(menuManager);

    menuManager.insertAfter("delete", new ActionContributionItem(findAction));
    menuManager.insertAfter("delete", new Separator());
  }

  public static class FindAction extends Action
  {
    private IWorkbenchPart workbenchPart;

    public FindAction()
    {
      super("Find/Replace...");
    }

    @Override
    public void run()
    {
      IFindReplaceTarget adapter = workbenchPart.getAdapter(IFindReplaceTarget.class);
      if (adapter instanceof FindAndReplaceTarget)
      {
        FindAndReplaceTarget findAndReplaceTarget = (FindAndReplaceTarget)adapter;
        findAndReplaceTarget.initialize(workbenchPart);
      }

      // Reuse the platform's text editor's find and replace action.
      new FindReplaceAction(null, null, workbenchPart)
      {
        @Override
        protected void initialize(ResourceBundle bundle, String prefix)
        {
        }
      }.run();
    }

    public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
    {
      this.workbenchPart = workbenchPart;
      if (workbenchPart != null)
      {
        setEnabled(workbenchPart.getAdapter(IFindReplaceTarget.class) != null);
      }
    }
  }

  public static final class CollapseAllAction extends Action
  {
    private IViewerProvider viewerProvider;

    public CollapseAllAction()
    {
      super("Collapse All", IAction.AS_PUSH_BUTTON);
      setImageDescriptor(UIPlugin.INSTANCE.getImageDescriptor("collapse-all"));
      setToolTipText("Collapse all expanded elements");
    }

    @Override
    public void run()
    {
      Viewer viewer = viewerProvider.getViewer();
      if (viewer instanceof TreeViewer)
      {
        TreeViewer treeViewer = (TreeViewer)viewer;
        treeViewer.collapseAll();
      }
    }

    public void setActiveWorkbenchPart(IWorkbenchPart workbenchPart)
    {
      if (workbenchPart instanceof IViewerProvider)
      {
        viewerProvider = (IViewerProvider)workbenchPart;
        setEnabled(true);
      }
      else
      {
        setEnabled(false);
        viewerProvider = null;
      }
    }
  }
}
