diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java index 6d26841c94f8..35902ab3a850 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java @@ -34,7 +34,6 @@ import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.newvfs.impl.FakeVirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.util.IncorrectOperationException; @@ -235,8 +234,7 @@ public class CreateFileAction extends CreateElementActionBase implements DumbAwa DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_BACKGROUND, new Runnable() { @Override public void run() { - final FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(new FakeVirtualFile(psiDirectory.getVirtualFile(), getFileName(inputString)), - project); + final FileType type = FileTypeChooser.getKnownFileTypeOrAssociate(psiDirectory.getVirtualFile(), getFileName(inputString), project); result[0] = type != null && MyValidator.super.canClose(getFileName(inputString)); } }); diff --git a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java index 76bb9f495b44..046371409be3 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/copy/CopyFilesOrDirectoriesDialog.java @@ -26,6 +26,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.fileTypes.ex.FileTypeChooser; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.Project; @@ -51,6 +52,7 @@ import com.intellij.util.PathUtilRt; import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -91,7 +93,7 @@ public class CopyFilesOrDirectoriesDialog extends DialogWrapper { private PsiDirectory myTargetDirectory; private boolean myFileCopy = false; - public CopyFilesOrDirectoriesDialog(PsiElement[] elements, PsiDirectory defaultTargetDirectory, Project project, boolean doClone) { + public CopyFilesOrDirectoriesDialog(PsiElement[] elements, @Nullable PsiDirectory defaultTargetDirectory, Project project, boolean doClone) { super(project, true); myElements = elements; myProject = project; @@ -122,6 +124,7 @@ public class CopyFilesOrDirectoriesDialog extends DialogWrapper { myNewNameField.select(0, dotIdx); myNewNameField.putClientProperty(DialogWrapperPeer.HAVE_INITIAL_SELECTION, true); } + myTargetDirectory = file.getContainingDirectory(); myFileCopy = true; } else { @@ -265,6 +268,10 @@ public class CopyFilesOrDirectoriesDialog extends DialogWrapper { Messages.showErrorDialog(myNewNameField, "Name is not a valid file name"); return; } + + if (myFileCopy && FileTypeChooser.getKnownFileTypeOrAssociate(myTargetDirectory.getVirtualFile(), newName, myProject) == null) { + return; + } } saveOpenInEditorState(myOpenFilesInEditor.isSelected()); diff --git a/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java b/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java index 91d50d80b69a..ba49434fa5f8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileTypes/ex/FileTypeChooser.java @@ -149,6 +149,14 @@ public class FileTypeChooser extends DialogWrapper { return type; } + /** + * Speculates if file with newName would have known file type + */ + @Nullable + public static FileType getKnownFileTypeOrAssociate(@NotNull VirtualFile parent, @NotNull String newName, @Nullable Project project) { + return getKnownFileTypeOrAssociate(new FakeVirtualFile(parent, newName), project); + } + @Nullable public static FileType getKnownFileTypeOrAssociate(@NotNull String fileName) { FileTypeManager fileTypeManager = FileTypeManager.getInstance();