From c3372a3de513fffd337dde7b8f34b283183f3a08 Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 13 Sep 2011 16:11:58 +0200 Subject: [PATCH] warn on 1. invoke create subclass in test root with selected destination - source 2. invoke create from usage in source root with selected destination - test 3. copy class from test root with selected destination - source --- .../impl/quickfix/CreateFromUsageUtils.java | 7 ++- .../intention/impl/CreateClassDialog.java | 26 ++++++++++- .../intention/impl/CreateSubclassAction.java | 5 ++ .../refactoring/copy/CopyClassDialog.java | 14 +++++- .../DestinationFolderComboBox.java | 46 +++++++++++++++++-- .../MoveClassesOrPackagesDialog.java | 9 +++- 6 files changed, 98 insertions(+), 9 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java index 35b416e21417..5c49e8d02c50 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageUtils.java @@ -296,7 +296,12 @@ public class CreateFromUsageUtils { Project project = manager.getProject(); String title = QuickFixBundle.message("create.class.title", StringUtil.capitalize(classKind.getDescription())); - CreateClassDialog dialog = new CreateClassDialog(project, title, name, aPackage.getQualifiedName(), classKind, false, module); + CreateClassDialog dialog = new CreateClassDialog(project, title, name, aPackage.getQualifiedName(), classKind, false, module){ + @Override + protected boolean reportBaseInSourceSelectionInTest() { + return true; + } + }; dialog.show(); if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) return null; diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java index 1e3226003f5d..bfe0fe3619af 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateClassDialog.java @@ -30,6 +30,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Pass; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiDirectory; @@ -72,6 +73,16 @@ public class CreateClassDialog extends DialogWrapper { public String getTargetPackage() { return myPackageComponent.getText().trim(); } + + @Override + protected boolean reportBaseInTestSelectionInSource() { + return CreateClassDialog.this.reportBaseInTestSelectionInSource(); + } + + @Override + protected boolean reportBaseInSourceSelectionInTest() { + return CreateClassDialog.this.reportBaseInSourceSelectionInTest(); + } }; @NonNls private static final String RECENTS_KEY = "CreateClassDialog.RecentsKey"; @@ -102,7 +113,20 @@ public class CreateClassDialog extends DialogWrapper { } myTfClassName.setText(myClassName); - myDestinationCB.setData(myProject, myPackageComponent, getBaseDir(normalizedPackageName), ProjectRootManager.getInstance(myProject).getContentSourceRoots()); + myDestinationCB.setData(myProject, myPackageComponent, getBaseDir(normalizedPackageName), ProjectRootManager.getInstance(myProject).getContentSourceRoots(), new Pass() { + @Override + public void pass(String s) { + setErrorText(s); + } + }); + } + + protected boolean reportBaseInTestSelectionInSource() { + return false; + } + + protected boolean reportBaseInSourceSelectionInTest() { + return false; } protected Action[] createActions() { diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java index 3dbfedd5b0cd..25ffb69714c6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java @@ -144,6 +144,11 @@ public class CreateSubclassAction extends BaseIntentionAction { protected PsiDirectory getBaseDir(String packageName) { return sourceDir; } + + @Override + protected boolean reportBaseInTestSelectionInSource() { + return true; + } }; dialog.show(); if (!dialog.isOK()) return null; 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 921daa5d2bb8..1460f63c9b65 100644 --- a/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/copy/CopyClassDialog.java @@ -23,6 +23,7 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.util.Pass; import com.intellij.psi.*; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.MoveDestination; @@ -58,6 +59,11 @@ class CopyClassDialog extends DialogWrapper{ public String getTargetPackage() { return myTfPackage.getText().trim(); } + + @Override + protected boolean reportBaseInTestSelectionInSource() { + return true; + } }; public CopyClassDialog(PsiClass aClass, PsiDirectory defaultTargetDirectory, Project project, boolean doClone) { @@ -69,7 +75,13 @@ class CopyClassDialog extends DialogWrapper{ RefactoringBundle.message("copy.class.copy.0.1", UsageViewUtil.getType(aClass), UsageViewUtil.getLongName(aClass)); myInformationLabel.setText(text); init(); - myDestinationCB.setData(myProject, myTfPackage, defaultTargetDirectory, ProjectRootManager.getInstance(myProject).getContentSourceRoots()); + myDestinationCB.setData(myProject, myTfPackage, defaultTargetDirectory, ProjectRootManager.getInstance(myProject).getContentSourceRoots(), + new Pass() { + @Override + public void pass(String s) { + setErrorText(s); + } + }); myNameField.setText(UsageViewUtil.getShortName(aClass)); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java index 1fc00c544cce..a5ae119af100 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/DestinationFolderComboBox.java @@ -26,6 +26,7 @@ import com.intellij.openapi.project.ProjectUtil; import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.ComboBoxWithWidePopup; +import com.intellij.openapi.util.Pass; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; @@ -58,10 +59,19 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton public abstract String getTargetPackage(); + protected boolean reportBaseInTestSelectionInSource() { + return false; + } + + protected boolean reportBaseInSourceSelectionInTest() { + return false; + } + public void setData(final Project project, final ReferenceEditorComboWithBrowseButton packageChooser, final PsiDirectory initialTargetDirectory, - final VirtualFile[] sourceRoots) { + final VirtualFile[] sourceRoots, + final Pass pass) { myInitialTargetDirectory = initialTargetDirectory; mySourceRoots = sourceRoots; new ComboboxSpeedSearch(getComboBox()) { @@ -115,17 +125,23 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton return; } } - setComboboxModel(getComboBox(), root, fileIndex, sourceRoots, project, true); + setComboboxModel(getComboBox(), root, fileIndex, sourceRoots, project, true, pass); } }); packageChooser.getChildComponent().addDocumentListener(new DocumentAdapter() { @Override public void documentChanged(DocumentEvent e) { - setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false); + setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false, pass); + } + }); + setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false, pass); + getComboBox().addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + updateErrorMessage(pass, fileIndex, getComboBox().getSelectedItem()); } }); - setComboboxModel(getComboBox(), initialSourceRoot, fileIndex, sourceRoots, project, false); } @Nullable @@ -143,11 +159,30 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton return new AutocreatingSingleSourceRootMoveDestination(targetPackage, selectedDestination); } + private void updateErrorMessage(Pass updateErrorMessage, ProjectFileIndex fileIndex, Object selectedItem) { + updateErrorMessage.pass(null); + if (myInitialTargetDirectory != null && selectedItem instanceof DirectoryChooser.ItemWrapper) { + final PsiDirectory directory = ((DirectoryChooser.ItemWrapper)selectedItem).getDirectory(); + final boolean isSelectionInTestSourceContent = fileIndex.isInTestSourceContent(directory.getVirtualFile()); + final boolean inTestSourceContent = fileIndex.isInTestSourceContent(myInitialTargetDirectory.getVirtualFile()); + if (isSelectionInTestSourceContent != inTestSourceContent) { + if (inTestSourceContent && reportBaseInTestSelectionInSource()) { + updateErrorMessage.pass("Source root is selected while the test root is expected"); + } + + if (isSelectionInTestSourceContent && reportBaseInSourceSelectionInTest()) { + updateErrorMessage.pass("Test root is selected while the source root is expected"); + } + } + } + } + private void setComboboxModel(JComboBox comboBox, VirtualFile initialTargetDirectorySourceRoot, ProjectFileIndex fileIndex, VirtualFile[] sourceRoots, Project project, - boolean forceIncludeAll) { + boolean forceIncludeAll, + Pass updateErrorMessage) { final LinkedHashSet targetDirectories = new LinkedHashSet(); final HashMap pathsToCreate = new HashMap(); MoveClassesOrPackagesUtil @@ -187,6 +222,7 @@ public abstract class DestinationFolderComboBox extends ComboboxWithBrowseButton } } } + updateErrorMessage(updateErrorMessage, fileIndex, selection); comboBox.setModel(new CollectionComboBoxModel(items, selection)); } diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java index d0543acc535c..dbbeeaf13531 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesDialog.java @@ -27,6 +27,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Pass; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.search.ProjectScope; @@ -258,7 +259,13 @@ public class MoveClassesOrPackagesDialog extends RefactoringDialog { myCbSearchInComments.setSelected(searchInComments); myCbSearchTextOccurences.setSelected(searchForTextOccurences); - ((DestinationFolderComboBox)myDestinationFolderCB).setData(myProject, myClassPackageChooser, myInitialTargetDirectory, getSourceRoots()); + ((DestinationFolderComboBox)myDestinationFolderCB).setData(myProject, myClassPackageChooser, myInitialTargetDirectory, getSourceRoots(), + new Pass() { + @Override + public void pass(String s) { + setErrorText(s); + } + }); UIUtil.setEnabled(myTargetPanel, getSourceRoots().length > 0 && isMoveToPackage() && !isTargetDirectoryFixed, true); validateButtons(); myHelpID = helpID;