From 3901fa4ea282d491ec81f08bbbe104f432cccd57 Mon Sep 17 00:00:00 2001 From: Eugene Vigdorchik Date: Mon, 7 Feb 2005 16:56:05 +0300 Subject: [PATCH] (no message) --- .../com/intellij/ide/CopyPasteManagerEx.java | 5 +- .../com/intellij/ide/util/DeleteHandler.java | 11 +-- source/com/intellij/ide/util/DeleteUtil.java | 16 ++-- .../MoveFilesOrDirectoriesUtil.java | 4 +- .../safeDelete/SafeDeleteHandler.java | 4 +- .../util/RefactoringMessageUtil.java | 73 +++++++++++++++---- 6 files changed, 72 insertions(+), 41 deletions(-) diff --git a/source/com/intellij/ide/CopyPasteManagerEx.java b/source/com/intellij/ide/CopyPasteManagerEx.java index 264a95c15072..84fd9646dd44 100644 --- a/source/com/intellij/ide/CopyPasteManagerEx.java +++ b/source/com/intellij/ide/CopyPasteManagerEx.java @@ -194,10 +194,7 @@ public class CopyPasteManagerEx extends CopyPasteManager implements ClipboardOwn return; } for (int i = 0; i < elements.length; i++) { - PsiElement element = elements[i]; - if (!element.isWritable()) { - if (RefactoringMessageUtil.checkReadOnlyStatus(myProject, element)) return; - } + if (RefactoringMessageUtil.checkReadOnlyStatusRecursively(myProject, elements[i])) return; } ((CopyPasteManagerEx)CopyPasteManager.getInstance()).setElements(elements, false); updateView(); diff --git a/source/com/intellij/ide/util/DeleteHandler.java b/source/com/intellij/ide/util/DeleteHandler.java index f48118383783..2acb0414413d 100644 --- a/source/com/intellij/ide/util/DeleteHandler.java +++ b/source/com/intellij/ide/util/DeleteHandler.java @@ -83,10 +83,7 @@ public class DeleteHandler { DeleteDialog dialog = new DeleteDialog(project, elements, new DeleteDialog.Callback() { public void run(final DeleteDialog dialog) { for (int i = 0; i < elements.length; i++) { - PsiElement element = elements[i]; - if (!element.isWritable()) { - if (!RefactoringMessageUtil.checkReadOnlyStatus(project, element)) return; - } + if (!RefactoringMessageUtil.checkReadOnlyStatusRecursively(project, elements[i])) return; } SafeDeleteProcessor.createInstance(project, new Runnable() { public void run() { @@ -144,7 +141,7 @@ public class DeleteHandler { VirtualFile virtualFile = ((PsiDirectory)elementToDelete).getVirtualFile(); if (virtualFile.getFileSystem() instanceof LocalFileSystem) { - ArrayList readOnlyFiles = new ArrayList(); + ArrayList readOnlyFiles = new ArrayList(); getReadOnlyVirtualFiles(virtualFile, readOnlyFiles); if (readOnlyFiles.size() > 0) { @@ -158,7 +155,7 @@ public class DeleteHandler { boolean success = true; for (int j = 0; j < readOnlyFiles.size(); j++) { - VirtualFile file = (VirtualFile)readOnlyFiles.get(j); + VirtualFile file = readOnlyFiles.get(j); success = clearReadOnlyFlag(file, project); if (!success) break; } @@ -243,7 +240,7 @@ public class DeleteHandler { /** * Fills readOnlyFiles with VirtualFiles */ - private static void getReadOnlyVirtualFiles(VirtualFile file, ArrayList readOnlyFiles) { + private static void getReadOnlyVirtualFiles(VirtualFile file, ArrayList readOnlyFiles) { if (!file.isWritable()) { readOnlyFiles.add(file); } diff --git a/source/com/intellij/ide/util/DeleteUtil.java b/source/com/intellij/ide/util/DeleteUtil.java index 3aa26e0fda5d..b7b9304861d4 100644 --- a/source/com/intellij/ide/util/DeleteUtil.java +++ b/source/com/intellij/ide/util/DeleteUtil.java @@ -36,7 +36,7 @@ public class DeleteUtil { } } - ArrayList filteredElements = new ArrayList(); + ArrayList filteredElements = new ArrayList(); for (int i = 0; i < elements.length; i++) { PsiElement element = elements[i]; filteredElements.add(element); @@ -45,10 +45,10 @@ public class DeleteUtil { int previousSize; do { previousSize = filteredElements.size(); - outer: for (Iterator iterator1 = filteredElements.iterator(); iterator1.hasNext();) { - PsiElement element1 = (PsiElement)iterator1.next(); - for (Iterator iterator2 = filteredElements.iterator(); iterator2.hasNext();) { - PsiElement element2 = (PsiElement)iterator2.next(); + outer: for (Iterator iterator1 = filteredElements.iterator(); iterator1.hasNext();) { + PsiElement element1 = iterator1.next(); + for (Iterator iterator2 = filteredElements.iterator(); iterator2.hasNext();) { + PsiElement element2 = iterator2.next(); if (element1 == element2) continue; if (PsiTreeUtil.isAncestor(element1, element2, false)) { if (LOG.isDebugEnabled()) { @@ -62,13 +62,13 @@ public class DeleteUtil { } while (filteredElements.size() != previousSize); if (LOG.isDebugEnabled()) { - for (Iterator iterator = filteredElements.iterator(); iterator.hasNext();) { - PsiElement element = (PsiElement)iterator.next(); + for (Iterator iterator = filteredElements.iterator(); iterator.hasNext();) { + PsiElement element = iterator.next(); LOG.debug("filtered element = "+element); } } - return (PsiElement[])filteredElements.toArray(new PsiElement[filteredElements.size()]); + return filteredElements.toArray(new PsiElement[filteredElements.size()]); } public static String generateWarningMessage(String actionName, final PsiElement[] elements) { diff --git a/source/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java b/source/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java index 5ec4c3e7fa2a..ed1ecfc842e4 100644 --- a/source/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java +++ b/source/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java @@ -47,9 +47,7 @@ public class MoveFilesOrDirectoriesUtil { if (element instanceof PsiDirectory) { PsiPackage aPackage = ((PsiDirectory)element).getPackage(); LOG.assertTrue(aPackage == null); - if (!element.isWritable()) { - if (!RefactoringMessageUtil.checkReadOnlyStatus(project, element)) return; - } + if (!RefactoringMessageUtil.checkReadOnlyStatusRecursively(project, element)) return; } else if (element instanceof PsiFile) { PsiFile aFile = (PsiFile)element; diff --git a/source/com/intellij/refactoring/safeDelete/SafeDeleteHandler.java b/source/com/intellij/refactoring/safeDelete/SafeDeleteHandler.java index 9fc8a9506943..caf659033ff9 100644 --- a/source/com/intellij/refactoring/safeDelete/SafeDeleteHandler.java +++ b/source/com/intellij/refactoring/safeDelete/SafeDeleteHandler.java @@ -68,9 +68,7 @@ public class SafeDeleteHandler implements RefactoringActionHandler { for (int i = 0; i < elementsToDelete.length; i++) { PsiElement psiElement = elementsToDelete[i]; - if (!psiElement.isWritable()) { - if (!RefactoringMessageUtil.checkReadOnlyStatus(project, psiElement)) return; - } + if (!RefactoringMessageUtil.checkReadOnlyStatusRecursively(project, psiElement)) return; } SafeDeleteDialog dialog = new SafeDeleteDialog(project, elementsToDelete, new SafeDeleteDialog.Callback() { diff --git a/source/com/intellij/refactoring/util/RefactoringMessageUtil.java b/source/com/intellij/refactoring/util/RefactoringMessageUtil.java index ec529c1d7a42..92e792d248b6 100644 --- a/source/com/intellij/refactoring/util/RefactoringMessageUtil.java +++ b/source/com/intellij/refactoring/util/RefactoringMessageUtil.java @@ -28,9 +28,19 @@ public class RefactoringMessageUtil { return checkReadOnlyStatus(element, project, "Refactoring cannot be performed"); } - public static boolean checkReadOnlyStatus(PsiElement element, - Project project, - final String messagePrefix) { + public static boolean checkReadOnlyStatus(PsiElement element, Project project, String messagePrefix) { + return checkReadOnlyStatus(element, project, messagePrefix, false); + } + + public static boolean checkReadOnlyStatusRecursively (Project project, PsiElement element) { + return checkReadOnlyStatus(element, project, "Refactoring cannot be performed", true); + } + + private static boolean checkReadOnlyStatus(PsiElement element, + Project project, + final String messagePrefix, + boolean recursively + ) { if (element instanceof PsiDirectory) { PsiDirectory dir = (PsiDirectory)element; final VirtualFile vFile = dir.getVirtualFile(); @@ -40,10 +50,18 @@ public class RefactoringMessageUtil { return false; } else { - final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(new VirtualFile[]{vFile}); - if (status.hasReadonlyFiles()) { - String message1 = messagePrefix + ".\n Directory " + vFile.getPresentableUrl() + " is read-only."; - showErrorMessage("Read-only Directory", message1, null, project); + VirtualFile[] vFiles; + if (recursively) { + List list = new ArrayList(); + addVirtualFiles(vFile, list); + vFiles = list.toArray(new VirtualFile[list.size()]); + } else vFiles = new VirtualFile[]{vFile}; + final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(vFiles); + final VirtualFile[] readonlyFiles = status.getReadonlyFiles(); + if (readonlyFiles.length > 0) { + String subj = readonlyFiles[0].isDirectory() ? "Directory" : "File"; + String message1 = messagePrefix + ".\n " + subj + " " + readonlyFiles[0].getPresentableUrl() + " is read-only."; + showErrorMessage("Read-only " + subj, message1, null, project); return false; } return true; @@ -51,20 +69,31 @@ public class RefactoringMessageUtil { } else if (element instanceof PsiPackage) { final PsiDirectory[] directories = ((PsiPackage) element).getDirectories(); - final List readOnlyDirs = new ArrayList(); + final List readonlyList = new ArrayList(); final List failedDirs = new ArrayList(); for (int i = 0; i < directories.length; i++) { PsiDirectory directory = directories[i]; - if (!directory.isWritable()) { - final VirtualFile virtualFile = directory.getVirtualFile(); + VirtualFile virtualFile = directory.getVirtualFile(); + if (recursively) { if (virtualFile.getFileSystem() instanceof JarFileSystem) { failedDirs.add(virtualFile); - } else { - readOnlyDirs.add(virtualFile); + } + else { + addVirtualFiles(virtualFile, readonlyList); + } + } + else { + if (!directory.isWritable()) { + if (virtualFile.getFileSystem() instanceof JarFileSystem) { + failedDirs.add(virtualFile); + } + else { + readonlyList.add(virtualFile); + } } } } - final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(readOnlyDirs.toArray(new VirtualFile[readOnlyDirs.size()])); + final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(readonlyList.toArray(new VirtualFile[readonlyList.size()])); failedDirs.addAll(Arrays.asList(status.getReadonlyFiles())); if (failedDirs.size() > 0) { StringBuffer message = new StringBuffer(messagePrefix); @@ -72,12 +101,12 @@ public class RefactoringMessageUtil { for (Iterator iterator = failedDirs.iterator(); iterator.hasNext();) { VirtualFile virtualFile = iterator.next(); final String presentableUrl = virtualFile.getPresentableUrl(); + final String subj = virtualFile.isDirectory() ? "Directory " : "File "; if (virtualFile.getFileSystem() instanceof JarFileSystem) { - message.append("Directory " + presentableUrl + " is located in a jar file.\n"); + message.append(subj + presentableUrl + " is located in a jar file.\n"); } else { - message.append("Directory " + presentableUrl + " is read-only.\n"); - readOnlyDirs.add(virtualFile); + message.append(subj + presentableUrl + " is read-only.\n"); } } return false; @@ -123,6 +152,18 @@ public class RefactoringMessageUtil { } } + private static void addVirtualFiles(final VirtualFile vFile, final List list) { + if (!vFile.isWritable()) { + list.add(vFile); + } + final VirtualFile[] children = vFile.getChildren(); + if (children != null) { + for (int i = 0; i < children.length; i++) { + addVirtualFiles(children[i], list); + } + } + } + public static String getIncorrectIdentifierMessage(String identifierName) { return "'" + identifierName + "' is not a legal java identifier"; }