From 09e56b98c65dc8fd227471af0af1b1c4db4d9715 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 7 Jan 2010 21:21:57 +0300 Subject: [PATCH] move packages/classes to the 'drop' directory prserving src folders --- ...ClassesOrPackagesToNewDirectoryDialog.java | 32 ++++++++++++++++++- ...veClassesOrPackagesToNewDirectoryForm.form | 31 +++++++++++------- .../MovePackagesHandler.java | 28 ++++++++-------- 3 files changed, 66 insertions(+), 25 deletions(-) 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 a9e8bab3bfc1..542201bbb395 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 @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; @@ -45,6 +46,8 @@ import javax.swing.*; import javax.swing.event.DocumentEvent; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.HashSet; +import java.util.Set; /** * @author ven @@ -58,6 +61,12 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper { public MoveClassesOrPackagesToNewDirectoryDialog(@NotNull final PsiDirectory directory, PsiElement[] elementsToMove, final MoveCallback moveCallback) { + this(directory, elementsToMove, true, moveCallback); + } + + public MoveClassesOrPackagesToNewDirectoryDialog(@NotNull final PsiDirectory directory, PsiElement[] elementsToMove, + boolean canShowPreserveSourceRoots, + final MoveCallback moveCallback) { super(false); setTitle(MoveHandler.REFACTORING_NAME); myDirectory = directory; @@ -93,6 +102,24 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper { } }); + if (canShowPreserveSourceRoots) { + final Set sourceRoots = new HashSet(); + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(directory.getProject()).getFileIndex(); + for (PsiElement element : elementsToMove) { + if (element instanceof PsiPackage) { + for (PsiDirectory psiDirectory : ((PsiPackage)element).getDirectories()) { + sourceRoots.add(fileIndex.getSourceRootForFile(psiDirectory.getVirtualFile())); + } + } else if (element instanceof PsiClass) { + final PsiDirectory psiDirectory = element.getContainingFile().getContainingDirectory(); + LOG.assertTrue(psiDirectory != null); + if (psiDirectory != null) { + sourceRoots.add(psiDirectory.getVirtualFile()); + } + } + } + myPreserveSourceRoot.setVisible(sourceRoots.size() > 1); + } init(); } @@ -101,6 +128,7 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper { private JCheckBox mySearchInCommentsAndStringsCheckBox; private JPanel myRootPanel; private JLabel myNameLabel; + private JCheckBox myPreserveSourceRoot; private boolean isSearchInNonJavaFiles() { return mySearchForTextOccurrencesCheckBox.isSelected(); @@ -168,7 +196,9 @@ public class MoveClassesOrPackagesToNewDirectoryDialog extends DialogWrapper { return; } final JavaRefactoringFactory factory = JavaRefactoringFactory.getInstance(project); - final MoveDestination destination = factory.createSourceRootMoveDestination(aPackage.getQualifiedName(), sourceRoot); + final MoveDestination destination = myPreserveSourceRoot.isSelected() && myPreserveSourceRoot.isVisible() + ? factory.createSourceFolderPreservingMoveDestination(aPackage.getQualifiedName()) + : factory.createSourceRootMoveDestination(aPackage.getQualifiedName(), sourceRoot); MoveClassesOrPackagesProcessor processor = new MoveClassesOrPackagesProcessor(myDirectory.getProject(), myElementsToMove, destination, searchInComments, searchForTextOccurences, diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryForm.form b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryForm.form index 3f5fec5d3902..77610b90cba1 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryForm.form +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesToNewDirectoryForm.form @@ -1,9 +1,9 @@
- + - + @@ -16,14 +16,6 @@ - - - - - - - - @@ -35,7 +27,7 @@ - + @@ -58,6 +50,23 @@ + + + + + + + + + + + + + + + + + diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MovePackagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MovePackagesHandler.java index 136d2f94b3f0..388ba520fda2 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MovePackagesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MovePackagesHandler.java @@ -71,19 +71,21 @@ public class MovePackagesHandler extends MoveClassesOrPackagesHandlerBase { processor.run(); } else { - new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], callback) { - @Override - protected void performRefactoring(Project project, - final PsiDirectory targetDirectory, - PsiPackage aPackage, - boolean searchInComments, - boolean searchForTextOccurences) { - final MoveDirectoryWithClassesProcessor processor = - new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences, - true, callback); - processor.run(); - } - }.show(); + final MoveClassesOrPackagesToNewDirectoryDialog dlg = + new MoveClassesOrPackagesToNewDirectoryDialog(directories[0], new PsiElement[2], false, callback) { + @Override + protected void performRefactoring(Project project, + final PsiDirectory targetDirectory, + PsiPackage aPackage, + boolean searchInComments, + boolean searchForTextOccurences) { + final MoveDirectoryWithClassesProcessor processor = + new MoveDirectoryWithClassesProcessor(project, directories, targetDirectory, searchInComments, searchForTextOccurences, + true, callback); + processor.run(); + } + }; + dlg.show(); } return; }