/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * 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:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.sdk.ui.action;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.scout.commons.CompareUtility;
import org.eclipse.scout.sdk.Texts;
import org.eclipse.scout.sdk.ui.internal.ScoutSdkUi;
import org.eclipse.scout.sdk.ui.internal.view.outline.ScoutExplorerPart;
import org.eclipse.scout.sdk.ui.internal.view.outline.pages.EditorSelectionVisitor;
import org.eclipse.scout.sdk.ui.view.outline.pages.IPage;
import org.eclipse.scout.sdk.util.jdt.JdtUtility;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.progress.UIJob;

/**
 * <h3>LinkWithEditorAction</h3> This action is used for enable or disable the selection in the compilation unit
 * editor to the scout explorer.
 */
public class LinkWithEditorAction extends Action {
  private static final long BRIEF_DELAY = 100;
  private P_PropertyListener m_propertyListener;
  private P_JavaEditorSelectionListener m_javaEditorSelectionListener;
  private final ScoutExplorerPart m_viewPart;
  private IJavaElement m_currentSelection;
  private P_UpdateSelectionJob m_updateSelectionJob;

  public LinkWithEditorAction(ScoutExplorerPart viewPart) {
    super(Texts.get("LinkWithEditor"), AS_CHECK_BOX);
    m_viewPart = viewPart;
    setImageDescriptor(ScoutSdkUi.getImageDescriptor(ScoutSdkUi.ToolSynchronize));
    setToolTipText(Texts.get("LinkWithEditor"));
    m_updateSelectionJob = new P_UpdateSelectionJob();
    init();
  }

  protected void init() {
    if (m_propertyListener == null) {
      m_propertyListener = new P_PropertyListener();
    }
    m_viewPart.addPropertyListener(m_propertyListener);
    // java file selection listener
    if (m_javaEditorSelectionListener == null) {
      m_javaEditorSelectionListener = new P_JavaEditorSelectionListener();
    }
    m_viewPart.getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(m_javaEditorSelectionListener);
  }

  public void dispose() {
    m_viewPart.removePropertyListener(m_propertyListener);
    m_propertyListener = null;
  }

  @Override
  public void run() {
    m_viewPart.setLinkingEnabled(isChecked());
  }

  public IJavaElement getCurrentSelection() {
    return m_currentSelection;
  }

  public void setCurrentSelection(IJavaElement currentSelection) {
    IJavaElement oldSelection = m_currentSelection;
    m_currentSelection = currentSelection;
    if (isChecked() && CompareUtility.notEquals(oldSelection, m_currentSelection)) {
      m_updateSelectionJob.schedule(BRIEF_DELAY);
    }
  }

  public void updateLinkingEnabled(boolean linkingEnabled) {
    setChecked(linkingEnabled);
    if (linkingEnabled) {
      m_updateSelectionJob.schedule(BRIEF_DELAY);
    }
  }

  private class P_PropertyListener implements IPropertyListener {
    @Override
    public void propertyChanged(Object aSource, int propId) {
      switch (propId) {
        case ScoutExplorerPart.IS_LINKING_ENABLED_PROPERTY:
          updateLinkingEnabled(((ScoutExplorerPart) aSource).isLinkingEnabled());
      }

    }
  } // end class P_PropertyListener

  private class P_JavaEditorSelectionListener implements ISelectionListener {

    @SuppressWarnings("restriction")
    @Override
    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
      if (part instanceof IEditorPart) {
        IEditorInput editorInput = ((IEditorPart) part).getEditorInput();
        if (selection instanceof ITextSelection) {
          if (editorInput instanceof IFileEditorInput) {
            IFileEditorInput fileInput = (IFileEditorInput) editorInput;
            try {
              IJavaElement element = JdtUtility.findJavaElement(fileInput.getFile(), (ITextSelection) selection);
              if (TypeUtility.exists(element)) {
                setCurrentSelection(element);
              }
            }
            catch (JavaModelException e) {
              ScoutSdkUi.logWarning("Unable to calculate the selected java element.", e);
            }
          }
          else if (editorInput instanceof org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput) {
            org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput binaryInput = (org.eclipse.jdt.internal.ui.javaeditor.IClassFileEditorInput) editorInput;
            IType type = binaryInput.getClassFile().getType();
            if (TypeUtility.exists(type)) {
              setCurrentSelection(type);
            }
          }
        }
      }
    }
  }// end class P_JavaEditorSelectionListener

  private class P_UpdateSelectionJob extends UIJob {

    public P_UpdateSelectionJob() {
      super("Link with outline...");
    }

    @Override
    public IStatus runInUIThread(IProgressMonitor monitor) {
      if (!m_viewPart.getTreeViewer().getTree().isDisposed() && TypeUtility.exists(getCurrentSelection())) {
        SafeRunner.run(new ISafeRunnable() {
          @Override
          public void run() throws Exception {
            IPage startPage = (IPage) m_viewPart.getTreeViewer().getInput();
            IStructuredSelection selection = (IStructuredSelection) m_viewPart.getTreeViewer().getSelection();
            if (selection != null && selection.size() > 0) {
              startPage = (IPage) selection.getFirstElement();
            }

            EditorSelectionVisitor visitor = new EditorSelectionVisitor(getCurrentSelection());
            IPage nodeToSelect = null;
            nodeToSelect = visitor.findPageToSelect(startPage);
            if (nodeToSelect != null) {
              StructuredSelection outlineSelection = new StructuredSelection(nodeToSelect);
              m_viewPart.getSite().getSelectionProvider().setSelection(outlineSelection);
            }
          }

          @Override
          public void handleException(Throwable e) {
            ScoutSdkUi.logError(e);
          }
        });
      }
      return Status.OK_STATUS;
    }
  }
}
