From dcc0d15e1972098e7d307cba05c6a1f8f51de0de Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 23 Apr 2015 15:58:32 +0200 Subject: [PATCH] IDEA-117245 (New file allow creating in parent folder) --- .../CreateDirectoryOrPackageHandler.java | 39 ++++++++++----- .../ide/actions/CreateFileAction.java | 49 +++++++++++++------ .../com/intellij/ide/util/DirectoryUtil.java | 16 ++++-- 3 files changed, 74 insertions(+), 30 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateDirectoryOrPackageHandler.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateDirectoryOrPackageHandler.java index 968a9387de44..f49a53be13a1 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateDirectoryOrPackageHandler.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateDirectoryOrPackageHandler.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.io.File; +import java.util.StringTokenizer; public class CreateDirectoryOrPackageHandler implements InputValidatorEx { @Nullable private final Project myProject; @@ -72,22 +73,38 @@ public class CreateDirectoryOrPackageHandler implements InputValidatorEx { @Override public boolean checkInput(String inputString) { - boolean firstToken = true; - for (String token : StringUtil.tokenize(inputString, myDelimiters)) { - if (token.equals(".") || token.equals("..")) { + final StringTokenizer tokenizer = new StringTokenizer(inputString, myDelimiters); + VirtualFile vFile = myDirectory.getVirtualFile(); + + while (tokenizer.hasMoreTokens()) { + final String token = tokenizer.nextToken(); + if (!tokenizer.hasMoreTokens() && (token.equals(".") || token.equals(".."))) { myErrorText = "Can't create a directory with name '" + token + "'"; return false; } - if (firstToken) { - final VirtualFile vFile = myDirectory.getVirtualFile(); - final VirtualFile child = vFile.findChild(token); - if (child != null) { - myErrorText = "A " + (child.isDirectory() ? "directory" : "file") + - " with name '" + token + "' already exists"; - return false; + if (vFile != null) { + if ("..".equals(token)) { + vFile = vFile.getParent(); + if (vFile == null) { + myErrorText = "Not a valid directory"; + return false; + } + } + else if (!".".equals(token)){ + final VirtualFile child = vFile.findChild(token); + if (child != null) { + if (!child.isDirectory()) { + myErrorText = "A file with name '" + token + "' already exists"; + return false; + } + else if (!tokenizer.hasMoreTokens()) { + myErrorText = "A directory with name '" + token + "' already exists"; + return false; + } + } + vFile = child; } } - firstToken = false; if (FileTypeManager.getInstance().isFileIgnored(token)) { myErrorText = "Trying to create a " + (myIsDirectory ? "directory" : "package") + " with an ignored name, the result will not be visible"; 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 acdc481409f2..cfeb1057d630 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileAction.java @@ -34,6 +34,7 @@ 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; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -95,8 +96,15 @@ public class CreateFileAction extends CreateElementActionBase implements DumbAwa final List subDirs = StringUtil.split(newName, "/"); newName = subDirs.remove(subDirs.size() - 1); for (String dir : subDirs) { - final PsiDirectory sub = directory.findSubdirectory(dir); - directory = sub == null ? directory.createSubdirectory(dir) : sub; + if ("..".equals(dir)) { + final PsiDirectory parentDirectory = directory.getParentDirectory(); + if (parentDirectory == null) throw new IncorrectOperationException("Not a valid directory"); + directory = parentDirectory; + } + else if (!".".equals(dir)){ + final PsiDirectory sub = directory.findSubdirectory(dir); + directory = sub == null ? directory.createSubdirectory(dir) : sub; + } } } @@ -142,25 +150,36 @@ public class CreateFileAction extends CreateElementActionBase implements DumbAwa @Override public boolean checkInput(String inputString) { final StringTokenizer tokenizer = new StringTokenizer(inputString, "\\/"); - boolean firstToken = true; + VirtualFile vFile = getDirectory().getVirtualFile(); while (tokenizer.hasMoreTokens()) { final String token = tokenizer.nextToken(); - if (token.equals(".") || token.equals("..")) { - myErrorText = tokenizer.hasMoreTokens() - ? "Can't create directory with name '" + token + "'" - : "Can't create file with name '" + token + "'"; + if ((token.equals(".") || token.equals("..")) && !tokenizer.hasMoreTokens()) { + myErrorText = "Can't create file with name '" + token + "'"; return false; } - if (firstToken) { - final VirtualFile vFile = getDirectory().getVirtualFile(); - final VirtualFile child = vFile.findChild(token); - if (child != null) { - myErrorText = "A " + (child.isDirectory() ? "directory" : "file") + - " with name '" + token + "' already exists"; - return false; + if (vFile != null) { + if ("..".equals(token)) { + vFile = vFile.getParent(); + if (vFile == null) { + myErrorText = "Not a valid directory"; + return false; + } + } + else if (!".".equals(token)){ + final VirtualFile child = vFile.findChild(token); + if (child != null) { + if (!child.isDirectory()) { + myErrorText = "A file with name '" + token + "' already exists"; + return false; + } + else if (!tokenizer.hasMoreTokens()) { + myErrorText = "A directory with name '" + token + "' already exists"; + return false; + } + } + vFile = child; } } - firstToken = false; if (FileTypeManager.getInstance().isFileIgnored(getFileName(token))) { myErrorText = "'" + token + "' is an ignored name (Settings | Editor | File Types | Ignore files and folders)"; return true; diff --git a/platform/lang-impl/src/com/intellij/ide/util/DirectoryUtil.java b/platform/lang-impl/src/com/intellij/ide/util/DirectoryUtil.java index d72f14805293..883cf7e68842 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/DirectoryUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/util/DirectoryUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -97,15 +97,23 @@ public class DirectoryUtil { StringTokenizer tokenizer = new StringTokenizer(subDirName, delim); PsiDirectory dir = baseDirectory; while (tokenizer.hasMoreTokens()) { - String packName = tokenizer.nextToken(); + String dirName = tokenizer.nextToken(); if (tokenizer.hasMoreTokens()) { - PsiDirectory existingDir = dir.findSubdirectory(packName); + if ("..".equals(dirName)) { + dir = dir.getParentDirectory(); + if (dir == null) throw new IncorrectOperationException("Not a valid directory"); + continue; + } + else if (".".equals(dirName)) { + continue; + } + PsiDirectory existingDir = dir.findSubdirectory(dirName); if (existingDir != null) { dir = existingDir; continue; } } - dir = dir.createSubdirectory(packName); + dir = dir.createSubdirectory(dirName); } return dir; }