From 011101a31e0548f2162fcb540dfdada42be48709 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 14 Oct 2016 16:18:19 +0200 Subject: [PATCH] move everything preserving source root on multiselection (IDEA-160969) --- .../JavaMoveClassesOrPackagesHandler.java | 18 +++++++++++-- ...ClassesOrPackagesToNewDirectoryDialog.java | 26 ++++++++++++------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java index d27c1eacaca3..c5134f20653e 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java @@ -18,6 +18,7 @@ package com.intellij.refactoring.move.moveClassesOrPackages; import com.intellij.CommonBundle; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; @@ -34,6 +35,7 @@ import com.intellij.psi.impl.file.JavaDirectoryServiceImpl; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.BaseRefactoringProcessor; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.MoveDestination; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveHandlerDelegate; @@ -218,16 +220,28 @@ public class JavaMoveClassesOrPackagesHandler extends MoveHandlerDelegate { PsiPackage aPackage, boolean searchInComments, boolean searchForTextOccurences) { + final MoveDestination destination = createDestination(aPackage, targetDirectory); try { for (PsiDirectory dir: directories) { - MoveFilesOrDirectoriesUtil.checkIfMoveIntoSelf(dir, targetDirectory); + MoveFilesOrDirectoriesUtil.checkIfMoveIntoSelf(dir, WriteAction.compute(() -> destination.getTargetDirectory(dir))); } } catch (IncorrectOperationException e) { Messages.showErrorDialog(project, e.getMessage(), RefactoringBundle.message("cannot.move")); return null; } - return new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences, true, callback); + return new MoveDirectoryWithClassesProcessor(project, directories, null, searchInComments, searchForTextOccurences, true, callback) { + @Override + public TargetDirectoryWrapper getTargetDirectory(PsiDirectory dir) { + final PsiDirectory targetDirectory = destination.getTargetDirectory(dir); + return new TargetDirectoryWrapper(targetDirectory); + } + + @Override + protected String getTargetName() { + return targetDirectory.getName(); + } + }; } }; dlg.show(); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryDialog.java index ca714753ecfd..96b886fd77bc 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryDialog.java @@ -218,16 +218,7 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends MoveDialogBase { PsiPackage aPackage, boolean searchInComments, boolean searchForTextOccurences) { - final VirtualFile sourceRoot = ProjectRootManager.getInstance(project).getFileIndex().getSourceRootForFile(directory.getVirtualFile()); - if (sourceRoot == null) { - Messages.showErrorDialog(project, RefactoringBundle.message("destination.directory.does.not.correspond.to.any.package"), - RefactoringBundle.message("cannot.move")); - return null; - } - final JavaRefactoringFactory factory = JavaRefactoringFactory.getInstance(project); - final MoveDestination destination = myPreserveSourceRoot.isSelected() && myPreserveSourceRoot.isVisible() - ? factory.createSourceFolderPreservingMoveDestination(aPackage.getQualifiedName()) - : factory.createSourceRootMoveDestination(aPackage.getQualifiedName(), sourceRoot); + final MoveDestination destination = createDestination(aPackage, directory); MoveClassesOrPackagesProcessor processor = createMoveClassesOrPackagesProcessor(myDirectory.getProject(), myElementsToMove, destination, searchInComments, searchForTextOccurences, myMoveCallback); @@ -239,6 +230,21 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends MoveDialogBase { return null; } + protected MoveDestination createDestination(PsiPackage aPackage, PsiDirectory directory) { + final Project project = aPackage.getProject(); + final VirtualFile sourceRoot = ProjectRootManager.getInstance(project).getFileIndex().getSourceRootForFile(directory.getVirtualFile()); + if (sourceRoot == null) { + Messages.showErrorDialog(project, RefactoringBundle.message("destination.directory.does.not.correspond.to.any.package"), + RefactoringBundle.message("cannot.move")); + return null; + } + + final JavaRefactoringFactory factory = JavaRefactoringFactory.getInstance(project); + return myPreserveSourceRoot.isSelected() && myPreserveSourceRoot.isVisible() + ? factory.createSourceFolderPreservingMoveDestination(aPackage.getQualifiedName()) + : factory.createSourceRootMoveDestination(aPackage.getQualifiedName(), sourceRoot); + } + @Override protected String getMovePropertySuffix() { return "ClassWithTarget";