package com.intellij.refactoring.changeSignature;

import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;

/**
 * User: anna
 * Date: Sep 10, 2010
 */
public abstract class MoveParameterAction extends AnAction{
  private final boolean myLeft;
  private static final Logger LOG = Logger.getInstance("#" + MoveParameterAction.class.getName());

  public MoveParameterAction(boolean left) {
    super();
    myLeft = left;
  }

  @Override
  public void actionPerformed(AnActionEvent e) {
    final DataContext dataContext = e.getDataContext();
    final PsiElement psiElement = CommonDataKeys.PSI_ELEMENT.getData(dataContext);
    LOG.assertTrue(psiElement != null);
    final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
    LanguageChangeSignatureDetectors.INSTANCE.forLanguage(psiElement.getLanguage()).moveParameter(psiElement, editor, myLeft);
  }


  @Override
  public void update(AnActionEvent e) {
    final Presentation presentation = e.getPresentation();
    presentation.setEnabled(false);
    final DataContext dataContext = e.getDataContext();
    final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
    if (editor != null) {
      final PsiElement psiElement = CommonDataKeys.PSI_ELEMENT.getData(dataContext);
      if (psiElement != null) {
        final LanguageChangeSignatureDetector detector = LanguageChangeSignatureDetectors.INSTANCE.forLanguage(psiElement.getLanguage());
        if (detector != null) {
          final boolean available = detector.isMoveParameterAvailable(psiElement, myLeft);
          presentation.setEnabled(available);
          presentation.setVisible(available);
        }
      }
    }
  }
}
