From 41b3ea788d70f25286e235a754283a2db6532afc Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 15 Jul 2011 13:13:10 +0400 Subject: [PATCH] move package: check if it contains dirs in libs and suggest to move dirs in project only (IDEA-63657) --- .../MoveClassesOrPackagesHandlerBase.java | 153 +++++++++++++----- .../src/messages/RefactoringBundle.properties | 2 + 2 files changed, 113 insertions(+), 42 deletions(-) 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 9457fad65513..383ca3989612 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 @@ -15,6 +15,7 @@ */ package com.intellij.refactoring.move.moveClassesOrPackages; +import com.intellij.CommonBundle; import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; @@ -23,8 +24,10 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; 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; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.file.JavaDirectoryServiceImpl; @@ -105,9 +108,14 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { } public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) { + final PsiDirectory[] directories = new PsiDirectory[elements.length]; + System.arraycopy(elements, 0, directories, 0, directories.length); + final String prompt = getPromptToMoveDirectoryLibrariesSafe(elements); + if (prompt != null) { + moveDirectoriesLibrariesSafe(project, targetContainer, callback, directories, prompt); + return; + } if (canMoveOrRearrangePackages(elements) ) { - final PsiDirectory[] directories = new PsiDirectory[elements.length]; - System.arraycopy(elements, 0, directories, 0, directories.length); SelectMoveOrRearrangePackageDialog dialog = new SelectMoveOrRearrangePackageDialog(project, directories, targetContainer == null); dialog.show(); if (!dialog.isOK()) return; @@ -118,46 +126,7 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { } if (dialog.isMoveDirectory()) { - if (targetContainer instanceof PsiDirectory) { - final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance(); - final MoveDirectoryWithClassesProcessor processor = - new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer, - refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, - refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback); - processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() { - @Override - public void run() { - } - }); - 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[0], 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.setPrepareSuccessfulSwingThreadCallback(new Runnable() { - @Override - public void run() { - } - }); - processor.run(); - } - }; - dlg.show(); - } + moveAsDirectory(project, targetContainer, callback, directories); return; } } @@ -167,6 +136,81 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { MoveClassesOrPackagesImpl.doMove(project, elements, targetContainer, callback); } + private static void moveDirectoriesLibrariesSafe(Project project, + PsiElement targetContainer, + MoveCallback callback, + PsiDirectory[] directories, + String prompt) { + final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directories[0]); + LOG.assertTrue(aPackage != null); + final PsiDirectory[] projectDirectories = aPackage.getDirectories(GlobalSearchScope.projectScope(project)); + if (projectDirectories.length > 1) { + int ret = Messages + .showDialog(project, prompt + " or all directories in project?", RefactoringBundle.message("warning.title"), + new String[]{ + RefactoringBundle.message("move.current.directory"), + RefactoringBundle.message("move.directories"), + CommonBundle.getCancelButtonText()}, 0, Messages.getWarningIcon()); + if (ret == 0) { + moveAsDirectory(project, targetContainer, callback, directories); + } + else if (ret == 1) { + moveAsDirectory(project, targetContainer, callback, projectDirectories); + } + } + else if (Messages.showDialog(project, prompt + "?", RefactoringBundle.message("warning.title"), + new String[]{CommonBundle.getOkButtonText(), CommonBundle.getCancelButtonText()}, 0, + Messages.getWarningIcon()) == DialogWrapper.OK_EXIT_CODE) { + moveAsDirectory(project, targetContainer, callback, directories); + } + } + + private static void moveAsDirectory(Project project, + PsiElement targetContainer, + final MoveCallback callback, + final PsiDirectory[] directories) { + if (targetContainer instanceof PsiDirectory) { + final JavaRefactoringSettings refactoringSettings = JavaRefactoringSettings.getInstance(); + final MoveDirectoryWithClassesProcessor processor = + new MoveDirectoryWithClassesProcessor(project, directories, (PsiDirectory)targetContainer, + refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, + refactoringSettings.RENAME_SEARCH_IN_COMMENTS_FOR_PACKAGE, true, callback); + processor.setPrepareSuccessfulSwingThreadCallback(new Runnable() { + @Override + public void run() { + } + }); + 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[0], 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.setPrepareSuccessfulSwingThreadCallback(new Runnable() { + @Override + public void run() { + } + }); + processor.run(); + } + }; + dlg.show(); + } + } + public static boolean hasJavaFiles(PsiDirectory directory) { final boolean [] containsJava = new boolean[]{false}; directory.accept(new JavaRecursiveElementWalkingVisitor() { @@ -220,6 +264,31 @@ public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { return false; } + @Nullable + private static String getPromptToMoveDirectoryLibrariesSafe(PsiElement[] elements) { + if (elements.length == 0 || elements.length > 1) return null; + final Project project = elements[0].getProject(); + final ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + if (!(elements[0] instanceof PsiDirectory)) return null; + final PsiDirectory directory = ((PsiDirectory)elements[0]); + if (RefactoringUtil.isSourceRoot(directory)) { + return null; + } + final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory); + if (aPackage == null) return null; + if ("".equals(aPackage.getQualifiedName())) return null; + final PsiDirectory[] directories = aPackage.getDirectories(); + + boolean inLib = false; + for (PsiDirectory psiDirectory : directories) { + inLib |= !fileIndex.isInContent(psiDirectory.getVirtualFile()); + } + + return inLib ? "Package \'" + + aPackage.getName() + + "\' contains directories in libraries which cannot be moved. Do you want to move current directory" : null; + } + private static boolean canMoveOrRearrangePackages(PsiElement[] elements) { if (elements.length == 0) return false; final Project project = elements[0].getProject(); diff --git a/platform/platform-resources-en/src/messages/RefactoringBundle.properties b/platform/platform-resources-en/src/messages/RefactoringBundle.properties index d0d3c628e720..01364cd6bbf7 100644 --- a/platform/platform-resources-en/src/messages/RefactoringBundle.properties +++ b/platform/platform-resources-en/src/messages/RefactoringBundle.properties @@ -225,6 +225,8 @@ rename.package.button.text=Rename &package rename.directory.button.text=Rename &directory rename.directories= Rename &all rename.current.directory= Rename ¤t +move.current.directory= Move ¤t +move.directories= Move &all warning.title=Warning replace.constructor.with.factory.method.title=Replace Constructor With Factory Method class.does.not.have.implicit.default.consructor=Class {0} does not have implicit default consructor.