/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.intellij.refactoring.move;

import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import org.jetbrains.annotations.Nullable;

import java.util.Set;

/**
 * @author yole
 */
public abstract class MoveHandlerDelegate {
  public static final ExtensionPointName<MoveHandlerDelegate> EP_NAME = ExtensionPointName.create("com.intellij.refactoring.moveHandler");

  public boolean canMove(PsiElement[] elements, @Nullable final PsiElement targetContainer) {
    return targetContainer == null || isValidTarget(targetContainer, elements);
  }

  public boolean canMove(DataContext dataContext){
    return false;
  }

  public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) {
    return false;
  }

  public void doMove(final Project project, final PsiElement[] elements,
                     @Nullable final PsiElement targetContainer, @Nullable final MoveCallback callback) {
  }

  public PsiElement adjustTargetForMove(DataContext dataContext, PsiElement targetContainer) {
    return targetContainer;
  }

  @Nullable
  public PsiElement[] adjustForMove(Project project, PsiElement[] sourceElements, PsiElement targetElement) {
    return sourceElements;
  }

  /**
   * @return true if the delegate is able to move an element
   */
  public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext,
                           @Nullable final PsiReference reference, final Editor editor) {
    return false;
  }

  public void collectFilesOrDirsFromContext(DataContext dataContext, Set<PsiElement> filesOrDirs){
  }

  public boolean isMoveRedundant(PsiElement source, PsiElement target) {
    return false;
  }
}
