diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesHandlerBase.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesHandlerBase.java index 15dded63dda6..bec9ae48471c 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesHandlerBase.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesHandlerBase.java @@ -24,6 +24,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.impl.file.JavaDirectoryServiceImpl; import com.intellij.psi.impl.source.jsp.jspJava.JspClass; import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.RefactoringBundle; @@ -33,6 +34,7 @@ import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.openapi.project.Project; import com.intellij.refactoring.util.RadioUpDownListener; import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.Nullable; @@ -294,4 +296,17 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { } return false; } + + @Override + public boolean isMoveRedundant(PsiElement source, PsiElement target) { + if (target instanceof PsiDirectory && source instanceof PsiClass) { + try { + JavaDirectoryServiceImpl.checkCreateClassOrInterface((PsiDirectory)target, ((PsiClass)source).getName()); + } + catch (IncorrectOperationException e) { + return true; + } + } + return super.isMoveRedundant(source, target); + } } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java index 59067ae96c61..4fb424ff8a3b 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java @@ -27,7 +27,6 @@ import com.intellij.psi.*; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringActionHandlerFactory; import com.intellij.refactoring.actions.BaseRefactoringAction; -import com.intellij.refactoring.actions.MoveAction; import com.intellij.refactoring.copy.CopyHandler; import com.intellij.refactoring.move.MoveHandler; import org.jetbrains.annotations.NonNls; @@ -326,7 +325,7 @@ class MoveDropTargetListener implements DropTargetListener { } public boolean isDropRedundant(@NotNull TreeNode sourceNode, @NotNull TreeNode targetNode) { - return sourceNode.getParent() == targetNode; + return sourceNode.getParent() == targetNode || MoveHandler.isMoveRedundant(getPsiElement(sourceNode), getPsiElement(targetNode)); } public boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) { diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java index 25aa9cc90021..af154a3bc4b6 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java @@ -173,4 +173,11 @@ public class MoveHandler implements RefactoringActionHandler { return false; } + + public static boolean isMoveRedundant(PsiElement source, PsiElement target) { + for(MoveHandlerDelegate delegate: Extensions.getExtensions(MoveHandlerDelegate.EP_NAME)) { + if (delegate.isMoveRedundant(source, target)) return true; + } + return false; + } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java index bfa33fd98b3a..7181e2ae5863 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java @@ -60,4 +60,8 @@ public abstract class MoveHandlerDelegate { public void collectFilesOrDirsFromContext(DataContext dataContext, Set filesOrDirs){ } + + public boolean isMoveRedundant(PsiElement source, PsiElement target) { + return false; + } } diff --git a/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleMoveProvider.java b/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleMoveProvider.java index 2794cf0a7abe..15aee3cb1b17 100644 --- a/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleMoveProvider.java +++ b/plugins/properties/src/com/intellij/lang/properties/projectView/ResourceBundleMoveProvider.java @@ -16,9 +16,11 @@ package com.intellij.lang.properties.projectView; import com.intellij.lang.properties.ResourceBundle; +import com.intellij.lang.properties.psi.PropertiesFile; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.refactoring.move.MoveHandlerDelegate; import org.jetbrains.annotations.Nullable; @@ -50,4 +52,12 @@ public class ResourceBundleMoveProvider extends MoveHandlerDelegate { filesOrDirs.addAll(bundle.getPropertiesFiles(PlatformDataKeys.PROJECT.getData(dataContext))); } } + + @Override + public boolean isMoveRedundant(PsiElement source, PsiElement target) { + if (source instanceof PropertiesFile && target instanceof PsiDirectory) { + return source.getParent() == target; + } + return super.isMoveRedundant(source, target); + } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/projectView/FormMoveProvider.java b/plugins/ui-designer/src/com/intellij/uiDesigner/projectView/FormMoveProvider.java index 094a71385902..a94456da68d5 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/projectView/FormMoveProvider.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/projectView/FormMoveProvider.java @@ -18,10 +18,12 @@ package com.intellij.uiDesigner.projectView; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.refactoring.move.MoveHandlerDelegate; +import com.intellij.uiDesigner.GuiFormFileType; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -60,4 +62,15 @@ public class FormMoveProvider extends MoveHandlerDelegate { } } + + @Override + public boolean isMoveRedundant(PsiElement source, PsiElement target) { + if (source instanceof PsiFile && source.getParent() == target) { + final VirtualFile virtualFile = ((PsiFile)source).getVirtualFile(); + if (virtualFile != null && virtualFile.getFileType() instanceof GuiFormFileType) { + return true; + } + } + return super.isMoveRedundant(source, target); + } }