diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java index 6f12e608c62c..bb7324006261 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java @@ -28,6 +28,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.refactoring.HelpID; @@ -119,13 +120,7 @@ class CopyClassDialog extends DialogWrapper{ gbConstraints.gridx = 1; gbConstraints.weightx = 1; - String qualifiedName = ""; - if (myDefaultTargetDirectory != null) { - final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(myDefaultTargetDirectory); - if (aPackage != null) { - qualifiedName = aPackage.getQualifiedName(); - } - } + String qualifiedName = getQualifiedName(); myTfPackage = new PackageNameReferenceEditorCombo(qualifiedName, myProject, RECENTS_KEY, RefactoringBundle.message("choose.destination.package")); if (qualifiedName.length() > 0) { @@ -157,6 +152,17 @@ class CopyClassDialog extends DialogWrapper{ return panel; } + protected String getQualifiedName() { + String qualifiedName = ""; + if (myDefaultTargetDirectory != null) { + final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(myDefaultTargetDirectory); + if (aPackage != null) { + qualifiedName = aPackage.getQualifiedName(); + } + } + return qualifiedName; + } + public PsiDirectory getTargetDirectory() { return myTargetDirectory; } diff --git a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java index 0dff8adf5943..52b10badd94e 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassesHandler.java @@ -24,6 +24,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; @@ -79,6 +80,27 @@ public class CopyClassesHandler implements CopyHandlerDelegate { return result.isEmpty() ? null : result; } + @Nullable + private static String normalizeRelativeMap(Map relativeMap) { + String vector = null; + for (String relativePath : relativeMap.values()) { + if (vector == null) { + vector = relativePath; + } else if (vector.startsWith(relativePath + "/")) { + vector = relativePath; + } else if (!relativePath.startsWith(vector + "/") && !relativePath.equals(vector)) { + return null; + } + } + if (vector != null) { + for (PsiFile psiFile : relativeMap.keySet()) { + final String path = relativeMap.get(psiFile); + relativeMap.put(psiFile, path.equals(vector) ? "" : path.substring(vector.length() + 1)); + } + } + return vector; + } + private static void fillResultsMap(Map result, PsiFile containingFile, PsiClass[] topLevelClasses) { PsiClass[] classes = result.get(containingFile); if (classes != null) { @@ -99,7 +121,16 @@ public class CopyClassesHandler implements CopyHandlerDelegate { PsiDirectory targetDirectory = null; String className = null; if (classes.size() == 1 && classes.values().iterator().next().length == 1) { - CopyClassDialog dialog = new CopyClassDialog(classes.values().iterator().next()[0], defaultTargetDirectory, project, false); + final String commonPath = ArrayUtil.find(elements, classes.values().iterator().next()) == -1 ? normalizeRelativeMap(relativePathsMap) : null; + CopyClassDialog dialog = new CopyClassDialog(classes.values().iterator().next()[0], defaultTargetDirectory, project, false){ + @Override + protected String getQualifiedName() { + if (commonPath != null) { + return StringUtil.getQualifiedName(super.getQualifiedName(), commonPath.replaceAll("/", ".")); + } + return super.getQualifiedName(); + } + }; dialog.setTitle(RefactoringBundle.message("copy.handler.copy.class")); dialog.show(); if (dialog.isOK()) {