From eb03dd7ef20a9c68ba98f6487f99d6be91c94e33 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Mon, 8 Oct 2012 22:27:04 +0400 Subject: [PATCH] IDEA-90358 ask for delete alternative file resources --- plugins/android/src/META-INF/plugin.xml | 7 +- ... AndroidComponentSafeDeleteProcessor.java} | 2 +- ...ndroidResourceFileSafeDeleteProcessor.java | 134 ++++++++++++++++++ .../resourceManagers/ResourceManager.java | 23 ++- 4 files changed, 160 insertions(+), 6 deletions(-) rename plugins/android/src/org/jetbrains/android/{AndroidSafeDeleteProcessorDelegate.java => AndroidComponentSafeDeleteProcessor.java} (98%) create mode 100644 plugins/android/src/org/jetbrains/android/AndroidResourceFileSafeDeleteProcessor.java diff --git a/plugins/android/src/META-INF/plugin.xml b/plugins/android/src/META-INF/plugin.xml index dcb74c102da0..30bf466b07b9 100644 --- a/plugins/android/src/META-INF/plugin.xml +++ b/plugins/android/src/META-INF/plugin.xml @@ -306,8 +306,9 @@ - + + @@ -331,6 +332,8 @@ + + diff --git a/plugins/android/src/org/jetbrains/android/AndroidSafeDeleteProcessorDelegate.java b/plugins/android/src/org/jetbrains/android/AndroidComponentSafeDeleteProcessor.java similarity index 98% rename from plugins/android/src/org/jetbrains/android/AndroidSafeDeleteProcessorDelegate.java rename to plugins/android/src/org/jetbrains/android/AndroidComponentSafeDeleteProcessor.java index 84284d43e194..3101fd895f77 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidSafeDeleteProcessorDelegate.java +++ b/plugins/android/src/org/jetbrains/android/AndroidComponentSafeDeleteProcessor.java @@ -29,7 +29,7 @@ import java.util.List; /** * @author Eugene.Kudelevsky */ -public class AndroidSafeDeleteProcessorDelegate extends SafeDeleteProcessorDelegateBase { +public class AndroidComponentSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { private final JavaSafeDeleteProcessor myBaseHandler = new JavaSafeDeleteProcessor(); diff --git a/plugins/android/src/org/jetbrains/android/AndroidResourceFileSafeDeleteProcessor.java b/plugins/android/src/org/jetbrains/android/AndroidResourceFileSafeDeleteProcessor.java new file mode 100644 index 000000000000..2d09251218ee --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/AndroidResourceFileSafeDeleteProcessor.java @@ -0,0 +1,134 @@ +package org.jetbrains.android; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.refactoring.RefactoringSettings; +import com.intellij.refactoring.safeDelete.NonCodeUsageSearchInfo; +import com.intellij.refactoring.safeDelete.SafeDeleteProcessor; +import com.intellij.refactoring.safeDelete.SafeDeleteProcessorDelegateBase; +import com.intellij.usageView.UsageInfo; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.util.AndroidCommonUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * @author Eugene.Kudelevsky + */ +public class AndroidResourceFileSafeDeleteProcessor extends SafeDeleteProcessorDelegateBase { + @Nullable + @Override + public Collection getElementsToSearch(PsiElement element, + @Nullable Module module, + Collection allElementsToDelete) { + return Collections.emptyList(); + } + + @Override + public boolean handlesElement(PsiElement element) { + if (!(element instanceof PsiFile)) { + return false; + } + final AndroidFacet facet = AndroidFacet.getInstance(element); + + if (facet == null) { + return false; + } + final VirtualFile vFile = ((PsiFile)element).getVirtualFile(); + final VirtualFile parent = vFile != null ? vFile.getParent() : null; + final VirtualFile resDir = parent != null ? parent.getParent() : null; + return resDir != null && facet.getLocalResourceManager().isResourceDir(resDir); + } + + @Nullable + @Override + public NonCodeUsageSearchInfo findUsages(PsiElement element, PsiElement[] allElementsToDelete, List result) { + SafeDeleteProcessor.findGenericElementUsages(element, result, allElementsToDelete); + return new NonCodeUsageSearchInfo(SafeDeleteProcessor.getDefaultInsideDeletedCondition(allElementsToDelete), element); + } + + @Nullable + @Override + public Collection getAdditionalElementsToDelete(PsiElement element, + Collection allElementsToDelete, + boolean askUser) { + if (askUser) { + final int r = Messages + .showYesNoDialog(element.getProject(), "Delete alternative resource files for other configurations?", + "Delete", Messages.getQuestionIcon()); + if (r != Messages.YES) { + return Collections.emptyList(); + } + } + final AndroidFacet facet = AndroidFacet.getInstance(element); + assert facet != null; + + final PsiFile file = (PsiFile)element; + final VirtualFile vFile = file.getVirtualFile(); + assert vFile != null; + final VirtualFile dir = vFile.getParent(); + assert dir != null; + final String type = AndroidCommonUtils.getResourceTypeByDirName(dir.getName()); + + if (type == null) { + return Collections.emptyList(); + } + final String name = vFile.getName(); + final List resourceFiles = facet.getLocalResourceManager().findResourceFiles( + type, AndroidCommonUtils.getResourceName(type, name), true, false); + final List result = new ArrayList(); + + for (PsiFile resourceFile : resourceFiles) { + if (!resourceFile.getManager().areElementsEquivalent(file, resourceFile) && + resourceFile.getName().equals(name)) { + result.add(resourceFile); + } + } + return result; + } + + @Nullable + @Override + public Collection findConflicts(PsiElement element, PsiElement[] allElementsToDelete) { + return null; + } + + @Nullable + @Override + public UsageInfo[] preprocessUsages(Project project, UsageInfo[] usages) { + return usages; + } + + @Override + public void prepareForDeletion(PsiElement element) throws IncorrectOperationException { + } + + @Override + public boolean isToSearchInComments(PsiElement element) { + return RefactoringSettings.getInstance().SAFE_DELETE_SEARCH_IN_COMMENTS; + } + + @Override + public boolean isToSearchForTextOccurrences(PsiElement element) { + return RefactoringSettings.getInstance().SAFE_DELETE_SEARCH_IN_NON_JAVA; + } + + @Override + public void setToSearchInComments(PsiElement element, boolean enabled) { + RefactoringSettings.getInstance().SAFE_DELETE_SEARCH_IN_COMMENTS = enabled; + } + + @Override + public void setToSearchForTextOccurrences(PsiElement element, boolean enabled) { + RefactoringSettings.getInstance().SAFE_DELETE_SEARCH_IN_NON_JAVA = enabled; + } +} diff --git a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java index e4b664af7cfa..553de86bdcc3 100644 --- a/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java +++ b/plugins/android/src/org/jetbrains/android/resourceManagers/ResourceManager.java @@ -79,8 +79,16 @@ public abstract class ResourceManager { return processFileResources(resourceType, processor, true); } - public boolean processFileResources(@Nullable String resourceType, @NotNull FileResourceProcessor processor, boolean publicOnly) { - for (VirtualFile resSubdir : getResourceSubdirs(resourceType)) { + public boolean processFileResources(@Nullable String resourceType, @NotNull FileResourceProcessor processor, + boolean withDependencies) { + return processFileResources(resourceType, processor, withDependencies, true); + } + + public boolean processFileResources(@Nullable String resourceType, @NotNull FileResourceProcessor processor, + boolean withDependencies, boolean publicOnly) { + final VirtualFile[] resDirs = withDependencies ? getAllResourceDirs() : new VirtualFile[]{getResourceDir()}; + + for (VirtualFile resSubdir : AndroidResourceUtil.getResourceSubdirs(resourceType, resDirs)) { final String resType = AndroidCommonUtils.getResourceTypeByDirName(resSubdir.getName()); if (resType != null) { @@ -117,10 +125,19 @@ public abstract class ResourceManager { return AndroidResourceUtil.getResourceSubdirs(resourceType, getAllResourceDirs()); } + @NotNull + public List findResourceFiles(@NotNull final String resType, + @Nullable final String resName, + final boolean distinguishDelimetersInName, + @NotNull String... extensions) { + return findResourceFiles(resType, resName, distinguishDelimetersInName, true, extensions); + } + @NotNull public List findResourceFiles(@NotNull final String resType1, @Nullable final String resName1, final boolean distinguishDelimetersInName, + final boolean withDependencies, @NotNull final String... extensions) { final List result = new ArrayList(); final Set extensionSet = new HashSet(); @@ -145,7 +162,7 @@ public abstract class ResourceManager { } return true; } - }); + }, withDependencies); return result; }