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 extends PsiElement> 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;
}