blob: e58715679960565a875f87f802d838c70801930c [file] [log] [blame]
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.PsiField;
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.android.util.AndroidResourceUtil;
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<PsiElement> allElementsToDelete) {
return Collections.singletonList(element);
}
@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<UsageInfo> result) {
SafeDeleteProcessor.findGenericElementUsages(element, result, allElementsToDelete);
if (element instanceof PsiFile) {
final PsiField[] fields = AndroidResourceUtil.findResourceFieldsForFileResource((PsiFile)element, true);
for (PsiField field : fields) {
SafeDeleteProcessor.findGenericElementUsages(field, result, allElementsToDelete);
}
}
return new NonCodeUsageSearchInfo(SafeDeleteProcessor.getDefaultInsideDeletedCondition(allElementsToDelete), element);
}
@Nullable
@Override
public Collection<PsiElement> getAdditionalElementsToDelete(PsiElement element,
Collection<PsiElement> allElementsToDelete,
boolean askUser) {
if (allElementsToDelete.size() > 1) {
// todo: support this case (we should ask once)
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<PsiFile> resourceFiles = facet.getLocalResourceManager().findResourceFiles(
type, AndroidCommonUtils.getResourceName(type, name), true, false);
final List<PsiElement> result = new ArrayList<PsiElement>();
for (PsiFile resourceFile : resourceFiles) {
if (!resourceFile.getManager().areElementsEquivalent(file, resourceFile) &&
resourceFile.getName().equals(name)) {
result.add(resourceFile);
}
}
if (result.size() > 0 && askUser) {
final int r = Messages.showDialog(element.getProject(), "Delete alternative resource files for other configurations?", "Delete",
new String[]{Messages.YES_BUTTON, Messages.NO_BUTTON}, 1, Messages.getQuestionIcon());
if (r != Messages.YES) {
return Collections.emptyList();
}
}
return result;
}
@Nullable
@Override
public Collection<String> 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;
}
}