From 0d21845e37b3d78d1a85212d7d33eababc305b57 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 31 Mar 2011 20:39:16 +0200 Subject: [PATCH] allow to move packages without java files out of source roots (IDEA-66580 ) --- .../MoveClassesOrPackagesHandlerBase.java | 27 ++++++++++++++++++- .../JavaMoveFilesOrDirectoriesHandler.java | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) 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 7deacc03e155..ec86a76f7c96 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 @@ -34,6 +34,7 @@ import com.intellij.refactoring.JavaRefactoringSettings; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveHandlerDelegate; +import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesUtil; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RadioUpDownListener; import com.intellij.refactoring.util.RefactoringUtil; @@ -131,8 +132,13 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { processor.run(); } else { + final boolean containsJava = hasJavaFiles(directories[0]); + if (!containsJava) { + MoveFilesOrDirectoriesUtil.doMove(project, new PsiElement[] {directories[0]}, new PsiElement[]{targetContainer}, callback); + return; + } final MoveClassesOrPackagesToNewDirectoryDialog dlg = - new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], false, callback) { + new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[0], false, callback) { @Override protected void performRefactoring(Project project, final PsiDirectory targetDirectory, @@ -161,6 +167,25 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { MoveClassesOrPackagesImpl.doMove(project, elements, targetContainer, callback); } + public static boolean hasJavaFiles(PsiDirectory directory) { + final boolean [] containsJava = new boolean[]{false}; + directory.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitElement(PsiElement element) { + if (containsJava[0]) return; + if (element instanceof PsiFile || element instanceof PsiDirectory) { + super.visitElement(element); + } + } + + @Override + public void visitJavaFile(PsiJavaFile file) { + containsJava[0] = true; + } + }); + return containsJava[0]; + } + @Override public PsiElement adjustTargetForMove(DataContext dataContext, PsiElement targetContainer) { if (targetContainer instanceof PsiPackage) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java index 91c1f33c0c21..0412ec0d99d7 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/JavaMoveFilesOrDirectoriesHandler.java @@ -24,6 +24,7 @@ import com.intellij.psi.impl.file.JavaDirectoryServiceImpl; import com.intellij.psi.util.PsiUtilBase; import com.intellij.refactoring.copy.JavaCopyFilesOrDirectoriesHandler; import com.intellij.refactoring.move.MoveCallback; +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; @@ -41,6 +42,7 @@ public class JavaMoveFilesOrDirectoriesHandler extends MoveFilesOrDirectoriesHan for (PsiElement element : srcElements) { if (element instanceof PsiDirectory) { allJava &= JavaCopyFilesOrDirectoriesHandler.hasPackages((PsiDirectory)element); + allJava &= MoveClassesOrPackagesHandlerBase.hasJavaFiles((PsiDirectory)element); } else if (element instanceof PsiFile) { allJava &= element instanceof PsiJavaFile && !JspPsiUtil.isInJspFile(element) &&