diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesHandler.java deleted file mode 100644 index f8520402ae25..000000000000 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.refactoring.move.moveClassesOrPackages; - -import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.source.jsp.jspJava.JspClass; -import org.jetbrains.annotations.Nullable; - -public class MoveClassesHandler extends MoveClassesOrPackagesHandlerBase { - public boolean canMove(final PsiElement[] elements, @Nullable final PsiElement targetContainer) { - for(PsiElement element: elements) { - PsiFile parentFile; - if (element instanceof PsiJavaFile) { - final PsiClass[] classes = ((PsiJavaFile)element).getClasses(); - if (classes.length == 0) return false; - for (PsiClass aClass : classes) { - if (aClass instanceof JspClass) return false; - } - parentFile = (PsiFile)element; - } else { - if (element instanceof JspClass) return false; - if (!(element instanceof PsiClass)) return false; - if (!(element.getParent() instanceof PsiFile)) return false; - parentFile = (PsiFile)element.getParent(); - } - if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(parentFile)) return false; - } - return super.canMove(elements, targetContainer); - } - - public boolean isValidTarget(final PsiElement psiElement) { - return psiElement instanceof PsiClass || - MovePackagesHandler.isPackageOrDirectory(psiElement); - } - - public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference, - final Editor editor) { - if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(element.getContainingFile())) return false; - if (isReferenceInAnonymousClass(reference)) return false; - - if (element instanceof PsiClass && !(element instanceof PsiAnonymousClass) && element.getParent() instanceof PsiFile) { - MoveClassesOrPackagesImpl.doMove(project, new PsiElement[]{element}, - LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext), null); - return true; - } - return false; - } - - public static boolean isReferenceInAnonymousClass(@Nullable final PsiReference reference) { - if (reference instanceof PsiJavaCodeReferenceElement && - ((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiAnonymousClass) { - return true; - } - return false; - } -} 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 fce85569fe92..59505843c02c 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,28 +15,127 @@ */ package com.intellij.refactoring.move.moveClassesOrPackages; +import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.jsp.jspJava.JspClass; +import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveHandlerDelegate; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.util.CommonRefactoringUtil; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiPackage; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.JavaDirectoryService; import com.intellij.openapi.project.Project; +import com.intellij.refactoring.util.RadioUpDownListener; +import com.intellij.refactoring.util.RefactoringUtil; +import com.intellij.util.containers.HashSet; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; +import java.awt.*; import java.util.Arrays; -public abstract class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { +public class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelegate { + private static final Logger LOG = Logger.getInstance("#" + MoveClassesOrPackagesHandlerBase.class.getName()); protected static boolean isPackageOrDirectory(final PsiElement element) { if (element instanceof PsiPackage) return true; return element instanceof PsiDirectory && JavaDirectoryService.getInstance().getPackage((PsiDirectory)element) != null; } + public static boolean isReferenceInAnonymousClass(@Nullable final PsiReference reference) { + if (reference instanceof PsiJavaCodeReferenceElement && + ((PsiJavaCodeReferenceElement)reference).getParent() instanceof PsiAnonymousClass) { + return true; + } + return false; + } + + @Override + public boolean canMove(PsiElement[] elements, @Nullable PsiElement targetContainer) { + for (PsiElement element : elements) { + if (!isPackageOrDirectory(element)) { + PsiFile parentFile; + if (element instanceof PsiJavaFile) { + final PsiClass[] classes = ((PsiJavaFile)element).getClasses(); + if (classes.length == 0) return false; + for (PsiClass aClass : classes) { + if (aClass instanceof JspClass) return false; + } + parentFile = (PsiFile)element; + } + else { + if (element instanceof JspClass) return false; + if (!(element instanceof PsiClass)) return false; + if (!(element.getParent() instanceof PsiFile)) return false; + parentFile = (PsiFile)element.getParent(); + } + if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(parentFile)) return false; + } + } + return super.canMove(elements, targetContainer); + } + + @Override + public boolean isValidTarget(PsiElement psiElement, PsiElement[] sources) { + if (isPackageOrDirectory(psiElement)) return true; + boolean hasPackageOrDir = false; + for (PsiElement source : sources) { + hasPackageOrDir |= isPackageOrDirectory(source); + } + return !hasPackageOrDir && psiElement instanceof PsiClass; + } + public PsiElement[] adjustForMove(final Project project, final PsiElement[] sourceElements, final PsiElement targetElement) { return MoveClassesOrPackagesImpl.adjustForMove(project,sourceElements, targetElement); } public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) { + 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; + + if (dialog.isPackageRearrageSelected()) { + MoveClassesOrPackagesImpl.doRearrangePackage(project, directories); + return; + } + + 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.run(); + } + else { + 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; + } + } if (tryDirectoryMove ( project, elements, targetContainer, callback)) { return; } @@ -55,4 +154,144 @@ public abstract class MoveClassesOrPackagesHandlerBase extends MoveHandlerDelega } return false; } + + private static boolean canMoveOrRearrangePackages(PsiElement[] elements) { + if (elements.length == 0) return false; + final Project project = elements[0].getProject(); + if (ProjectRootManager.getInstance(project).getContentSourceRoots().length == 1) { + return false; + } + for (PsiElement element : elements) { + if (!(element instanceof PsiDirectory)) return false; + final PsiDirectory directory = ((PsiDirectory)element); + if (RefactoringUtil.isSourceRoot(directory)) { + return false; + } + final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory); + if (aPackage == null) return false; + if ("".equals(aPackage.getQualifiedName())) return false; + final VirtualFile sourceRootForFile = ProjectRootManager.getInstance(element.getProject()).getFileIndex() + .getSourceRootForFile(directory.getVirtualFile()); + if (sourceRootForFile == null) return false; + } + return true; + } + + private static class SelectMoveOrRearrangePackageDialog extends DialogWrapper { + private JRadioButton myRbMovePackage; + private JRadioButton myRbRearrangePackage; + private JRadioButton myRbMoveDirectory; + + private final PsiDirectory[] myDirectories; + private final boolean myRearrangePackagesEnabled; + + public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories) { + this(project, directories, true); + } + + public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories, boolean rearrangePackagesEnabled) { + super(project, true); + myDirectories = directories; + myRearrangePackagesEnabled = rearrangePackagesEnabled; + setTitle(RefactoringBundle.message("select.refactoring.title")); + init(); + } + + protected JComponent createNorthPanel() { + return new JLabel(RefactoringBundle.message("what.would.you.like.to.do")); + } + + public JComponent getPreferredFocusedComponent() { + return myRbMovePackage; + } + + protected String getDimensionServiceKey() { + return "#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog"; + } + + + protected JComponent createCenterPanel() { + JPanel panel = new JPanel(new BorderLayout()); + + + final HashSet packages = new HashSet(); + for (PsiDirectory directory : myDirectories) { + packages.add(JavaDirectoryService.getInstance().getPackage(directory).getQualifiedName()); + } + final String moveDescription; + LOG.assertTrue(myDirectories.length > 0); + LOG.assertTrue(packages.size() > 0); + if (packages.size() > 1) { + moveDescription = RefactoringBundle.message("move.packages.to.another.package", packages.size()); + } + else { + final String qName = packages.iterator().next(); + moveDescription = RefactoringBundle.message("move.package.to.another.package", qName); + } + + myRbMovePackage = new JRadioButton(); + myRbMovePackage.setText(moveDescription); + myRbMovePackage.setSelected(true); + + final String rearrangeDescription; + if (myDirectories.length > 1) { + rearrangeDescription = RefactoringBundle.message("move.directories.to.another.source.root", myDirectories.length); + } + else { + rearrangeDescription = RefactoringBundle.message("move.directory.to.another.source.root", myDirectories[0].getVirtualFile().getPresentableUrl()); + } + myRbRearrangePackage = new JRadioButton(); + myRbRearrangePackage.setText(rearrangeDescription); + myRbRearrangePackage.setVisible(myRearrangePackagesEnabled); + + final String moveDirectoryDescription; + if (myDirectories.length > 1) { + moveDirectoryDescription = "Move everything from " + myDirectories.length + " directories to another directory"; + } + else { + moveDirectoryDescription = "Move everything from " + myDirectories[0].getVirtualFile().getPresentableUrl() + " to another directory"; + } + myRbMoveDirectory = new JRadioButton(); + myRbMoveDirectory.setMnemonic('d'); + myRbMoveDirectory.setText(moveDirectoryDescription); + + ButtonGroup gr = new ButtonGroup(); + gr.add(myRbMovePackage); + gr.add(myRbRearrangePackage); + gr.add(myRbMoveDirectory); + + new RadioUpDownListener(myRbMovePackage, myRbRearrangePackage, myRbMoveDirectory); + + Box box = Box.createVerticalBox(); + box.add(Box.createVerticalStrut(5)); + box.add(myRbMovePackage); + box.add(myRbRearrangePackage); + box.add(myRbMoveDirectory); + panel.add(box, BorderLayout.CENTER); + return panel; + } + + public boolean isPackageRearrageSelected() { + return myRbRearrangePackage.isSelected(); + } + + public boolean isMoveDirectory() { + return myRbMoveDirectory.isSelected(); + } + } + + + public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference, + final Editor editor) { + if (isPackageOrDirectory(element)) return false; + if (CollectHighlightsUtil.isOutsideSourceRootJavaFile(element.getContainingFile())) return false; + if (isReferenceInAnonymousClass(reference)) return false; + + if (element instanceof PsiClass && !(element instanceof PsiAnonymousClass) && element.getParent() instanceof PsiFile) { + MoveClassesOrPackagesImpl.doMove(project, new PsiElement[]{element}, + LangDataKeys.TARGET_PSI_ELEMENT.getData(dataContext), null); + return true; + } + return false; + } } 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 deleted file mode 100644 index 388ba520fda2..000000000000 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MovePackagesHandler.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.refactoring.move.moveClassesOrPackages; - -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.JavaDirectoryService; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiPackage; -import com.intellij.refactoring.JavaRefactoringSettings; -import com.intellij.refactoring.RefactoringBundle; -import com.intellij.refactoring.move.MoveCallback; -import com.intellij.refactoring.util.RadioUpDownListener; -import com.intellij.refactoring.util.RefactoringUtil; -import com.intellij.util.containers.HashSet; - -import javax.swing.*; -import java.awt.*; - -public class MovePackagesHandler extends MoveClassesOrPackagesHandlerBase { - private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.move.moveClassesOrPackages.MovePackagesHandler"); - - public boolean canMove(final PsiElement[] elements, final PsiElement targetContainer) { - for(PsiElement element: elements) { - if (!isPackageOrDirectory(element)) return false; - } - return super.canMove(elements, targetContainer); - } - - public boolean isValidTarget(final PsiElement psiElement) { - return isPackageOrDirectory(psiElement); - } - - public void doMove(final Project project, final PsiElement[] elements, final PsiElement targetContainer, final MoveCallback callback) { - 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; - - if (dialog.isPackageRearrageSelected()) { - MoveClassesOrPackagesImpl.doRearrangePackage(project, directories); - return; - } - - 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.run(); - } - else { - 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; - } - } - super.doMove(project, elements, targetContainer, callback); - } - - private static boolean canMoveOrRearrangePackages(PsiElement[] elements) { - if (elements.length == 0) return false; - final Project project = elements[0].getProject(); - if (ProjectRootManager.getInstance(project).getContentSourceRoots().length == 1) { - return false; - } - for (PsiElement element : elements) { - if (!(element instanceof PsiDirectory)) return false; - final PsiDirectory directory = ((PsiDirectory)element); - if (RefactoringUtil.isSourceRoot(directory)) { - return false; - } - final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory); - if (aPackage == null) return false; - if ("".equals(aPackage.getQualifiedName())) return false; - final VirtualFile sourceRootForFile = ProjectRootManager.getInstance(element.getProject()).getFileIndex() - .getSourceRootForFile(directory.getVirtualFile()); - if (sourceRootForFile == null) return false; - } - return true; - } - - private static class SelectMoveOrRearrangePackageDialog extends DialogWrapper { - private JRadioButton myRbMovePackage; - private JRadioButton myRbRearrangePackage; - private JRadioButton myRbMoveDirectory; - - private final PsiDirectory[] myDirectories; - private final boolean myRearrangePackagesEnabled; - - public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories) { - this(project, directories, true); - } - - public SelectMoveOrRearrangePackageDialog(Project project, PsiDirectory[] directories, boolean rearrangePackagesEnabled) { - super(project, true); - myDirectories = directories; - myRearrangePackagesEnabled = rearrangePackagesEnabled; - setTitle(RefactoringBundle.message("select.refactoring.title")); - init(); - } - - protected JComponent createNorthPanel() { - return new JLabel(RefactoringBundle.message("what.would.you.like.to.do")); - } - - public JComponent getPreferredFocusedComponent() { - return myRbMovePackage; - } - - protected String getDimensionServiceKey() { - return "#com.intellij.refactoring.move.MoveHandler.SelectRefactoringDialog"; - } - - - protected JComponent createCenterPanel() { - JPanel panel = new JPanel(new BorderLayout()); - - - final HashSet packages = new HashSet(); - for (PsiDirectory directory : myDirectories) { - packages.add(JavaDirectoryService.getInstance().getPackage(directory).getQualifiedName()); - } - final String moveDescription; - LOG.assertTrue(myDirectories.length > 0); - LOG.assertTrue(packages.size() > 0); - if (packages.size() > 1) { - moveDescription = RefactoringBundle.message("move.packages.to.another.package", packages.size()); - } - else { - final String qName = packages.iterator().next(); - moveDescription = RefactoringBundle.message("move.package.to.another.package", qName); - } - - myRbMovePackage = new JRadioButton(); - myRbMovePackage.setText(moveDescription); - myRbMovePackage.setSelected(true); - - final String rearrangeDescription; - if (myDirectories.length > 1) { - rearrangeDescription = RefactoringBundle.message("move.directories.to.another.source.root", myDirectories.length); - } - else { - rearrangeDescription = RefactoringBundle.message("move.directory.to.another.source.root", myDirectories[0].getVirtualFile().getPresentableUrl()); - } - myRbRearrangePackage = new JRadioButton(); - myRbRearrangePackage.setText(rearrangeDescription); - myRbRearrangePackage.setVisible(myRearrangePackagesEnabled); - - final String moveDirectoryDescription; - if (myDirectories.length > 1) { - moveDirectoryDescription = "Move everything from " + myDirectories.length + " directories to another directory"; - } - else { - moveDirectoryDescription = "Move everything from " + myDirectories[0].getVirtualFile().getPresentableUrl() + " to another directory"; - } - myRbMoveDirectory = new JRadioButton(); - myRbMoveDirectory.setMnemonic('d'); - myRbMoveDirectory.setText(moveDirectoryDescription); - - ButtonGroup gr = new ButtonGroup(); - gr.add(myRbMovePackage); - gr.add(myRbRearrangePackage); - gr.add(myRbMoveDirectory); - - new RadioUpDownListener(myRbMovePackage, myRbRearrangePackage, myRbMoveDirectory); - - Box box = Box.createVerticalBox(); - box.add(Box.createVerticalStrut(5)); - box.add(myRbMovePackage); - box.add(myRbRearrangePackage); - box.add(myRbMoveDirectory); - panel.add(box, BorderLayout.CENTER); - return panel; - } - - public boolean isPackageRearrageSelected() { - return myRbRearrangePackage.isSelected(); - } - - public boolean isMoveDirectory() { - return myRbMoveDirectory.isSelected(); - } - } -} diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperHandler.java index 01a35e0b7a7a..60ecb96b7087 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperHandler.java @@ -15,20 +15,20 @@ */ package com.intellij.refactoring.move.moveInner; +import com.intellij.featureStatistics.FeatureUsageTracker; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; import com.intellij.psi.PsiReference; import com.intellij.psi.impl.source.jsp.jspJava.JspClass; -import com.intellij.refactoring.move.MoveHandlerDelegate; -import com.intellij.refactoring.move.MoveCallback; -import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesHandler; -import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.RefactoringBundle; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.editor.Editor; -import com.intellij.featureStatistics.FeatureUsageTracker; +import com.intellij.refactoring.move.MoveCallback; +import com.intellij.refactoring.move.MoveHandlerDelegate; +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase; +import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.annotations.Nullable; public class MoveInnerToUpperHandler extends MoveHandlerDelegate { @@ -51,7 +51,7 @@ public class MoveInnerToUpperHandler extends MoveHandlerDelegate { public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference, final Editor editor) { - if (isNonStaticInnerClass(element) && !MoveClassesHandler.isReferenceInAnonymousClass(reference)) { + if (isNonStaticInnerClass(element) && !MoveClassesOrPackagesHandlerBase.isReferenceInAnonymousClass(reference)) { PsiClass aClass = (PsiClass) element; FeatureUsageTracker.getInstance().triggerFeatureUsed("refactoring.move.moveInner"); final PsiClass containingClass = aClass.getContainingClass(); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperOrMembersHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperOrMembersHandler.java index 17ced69240b0..1eac058c11cd 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperOrMembersHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerToUpperOrMembersHandler.java @@ -15,10 +15,11 @@ */ package com.intellij.refactoring.move.moveInner; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifier; @@ -26,10 +27,9 @@ import com.intellij.psi.PsiReference; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.move.MoveCallback; import com.intellij.refactoring.move.MoveHandlerDelegate; -import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesHandler; +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesHandlerBase; import com.intellij.refactoring.move.moveMembers.MoveMembersHandler; import com.intellij.refactoring.util.RadioUpDownListener; -import com.intellij.featureStatistics.FeatureUsageTracker; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -62,7 +62,7 @@ public class MoveInnerToUpperOrMembersHandler extends MoveHandlerDelegate { public boolean tryToMove(final PsiElement element, final Project project, final DataContext dataContext, final PsiReference reference, final Editor editor) { - if (isStaticInnerClass(element) && !MoveClassesHandler.isReferenceInAnonymousClass(reference)) { + if (isStaticInnerClass(element) && !MoveClassesOrPackagesHandlerBase.isReferenceInAnonymousClass(reference)) { FeatureUsageTracker.getInstance().triggerFeatureUsed("refactoring.move.moveInner"); PsiClass aClass = (PsiClass) element; SelectInnerOrMembersRefactoringDialog dialog = new SelectInnerOrMembersRefactoringDialog(aClass, project); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodHandlerDelegate.java b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodHandlerDelegate.java index bdfb83429f51..cc59c77209ee 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodHandlerDelegate.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInstanceMethod/MoveInstanceMethodHandlerDelegate.java @@ -35,7 +35,7 @@ public class MoveInstanceMethodHandlerDelegate extends MoveHandlerDelegate { return super.canMove(elements, targetContainer); } - public boolean isValidTarget(final PsiElement psiElement) { + public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) { return psiElement instanceof PsiClass && !(psiElement instanceof PsiAnonymousClass); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersHandler.java index 70751c3988d2..138055ef8dbb 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersHandler.java @@ -32,7 +32,7 @@ public class MoveMembersHandler extends MoveHandlerDelegate { return super.canMove(elements, targetContainer); } - public boolean isValidTarget(final PsiElement psiElement) { + public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) { return psiElement instanceof PsiClass && !(psiElement instanceof PsiAnonymousClass); } diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java index dda8641229a5..5d7cdacbe814 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/MoveDropTargetListener.java @@ -188,7 +188,7 @@ class MoveDropTargetListener implements DropTargetListener { if (dropHandler.isValidTarget(sourceNodes, currentNode)) { return currentNode; } - if (!dropHandler.shouldDelegateToParent(currentNode)) return null; + if (!dropHandler.shouldDelegateToParent(sourceNodes, currentNode)) return null; currentNode = currentNode.getParent(); if (currentNode == null) return null; } @@ -214,7 +214,7 @@ class MoveDropTargetListener implements DropTargetListener { boolean isValidTarget(@NotNull TreeNode[] sourceNodes, @NotNull TreeNode targetNode); - boolean shouldDelegateToParent(@NotNull TreeNode targetNode); + boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull TreeNode targetNode); boolean isDropRedundant(@NotNull TreeNode sourceNode, @NotNull TreeNode targetNode); @@ -335,9 +335,9 @@ class MoveDropTargetListener implements DropTargetListener { return sourceNode.getParent() == targetNode; } - public boolean shouldDelegateToParent(@NotNull final TreeNode targetNode) { + public boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) { final PsiElement psiElement = getPsiElement(targetNode); - return !MoveHandler.isValidTarget(psiElement); + return !MoveHandler.isValidTarget(psiElement, getPsiElements(sourceNodes)); } public void doDropFiles(List fileList, TreeNode targetNode) { @@ -377,7 +377,7 @@ class MoveDropTargetListener implements DropTargetListener { return false; } - public boolean shouldDelegateToParent(@NotNull final TreeNode targetNode) { + public boolean shouldDelegateToParent(TreeNode[] sourceNodes, @NotNull final TreeNode targetNode) { final PsiElement psiElement = getPsiElement(targetNode); return psiElement == null || (!(psiElement instanceof PsiDirectoryContainer) && !(psiElement instanceof PsiDirectory)); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java index d78608c0d5ba..17c82469ca5d 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandler.java @@ -128,10 +128,10 @@ public class MoveHandler implements RefactoringActionHandler { return false; } - public static boolean isValidTarget(final PsiElement psiElement) { + public static boolean isValidTarget(final PsiElement psiElement, PsiElement[] elements) { if (psiElement != null) { for(MoveHandlerDelegate delegate: Extensions.getExtensions(MoveHandlerDelegate.EP_NAME)) { - if (delegate.isValidTarget(psiElement)) return true; + if (delegate.isValidTarget(psiElement, elements)) return true; } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java index 09f60a7acf2b..4ff2fbfe7d20 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/MoveHandlerDelegate.java @@ -31,10 +31,10 @@ public abstract class MoveHandlerDelegate { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.refactoring.moveHandler"); public boolean canMove(PsiElement[] elements, @Nullable final PsiElement targetContainer) { - return targetContainer == null || isValidTarget(targetContainer); + return targetContainer == null || isValidTarget(targetContainer, elements); } - public boolean isValidTarget(final PsiElement psiElement) { + public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) { return false; } diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java index b15a75bdd130..64bcf2a661d8 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesHandler.java @@ -55,7 +55,7 @@ public class MoveFilesOrDirectoriesHandler extends MoveHandlerDelegate { return super.canMove(elements, targetContainer); } - public boolean isValidTarget(final PsiElement psiElement) { + public boolean isValidTarget(final PsiElement psiElement, PsiElement[] sources) { return psiElement instanceof PsiDirectory || psiElement instanceof PsiDirectoryContainer; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptHandler.java index 021866bfd065..0ae540a5596e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/move/MoveGroovyScriptHandler.java @@ -72,7 +72,7 @@ public class MoveGroovyScriptHandler extends MoveClassesOrPackagesHandlerBase { } @Override - public boolean isValidTarget(PsiElement psiElement) { + public boolean isValidTarget(PsiElement psiElement, PsiElement[] sources) { return isPackageOrDirectory(psiElement); } diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 7e04947e4239..6bef89755ffa 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -970,8 +970,7 @@ - - +