| package org.jetbrains.android.inspections; |
| |
| import com.android.resources.ResourceFolderType; |
| import com.android.resources.ResourceType; |
| import com.intellij.codeInsight.intention.HighPriorityAction; |
| import com.intellij.codeInsight.intention.IntentionAction; |
| import com.intellij.codeInspection.LocalQuickFix; |
| import com.intellij.codeInspection.ProblemDescriptor; |
| import com.intellij.openapi.application.ApplicationManager; |
| import com.intellij.openapi.command.undo.UndoUtil; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.editor.Editor; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.Computable; |
| import com.intellij.openapi.vfs.VirtualFile; |
| import com.intellij.psi.PsiDirectory; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.PsiManager; |
| import com.intellij.psi.xml.XmlFile; |
| import com.intellij.util.IncorrectOperationException; |
| import org.jetbrains.android.actions.CreateResourceFileAction; |
| import org.jetbrains.android.actions.CreateTypedResourceFileAction; |
| import org.jetbrains.android.facet.AndroidFacet; |
| import org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager; |
| import org.jetbrains.android.util.AndroidBundle; |
| import org.jetbrains.android.util.AndroidResourceUtil; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| public class CreateFileResourceQuickFix implements LocalQuickFix, IntentionAction, HighPriorityAction { |
| private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.inspections.CreateFileResourceQuickFix"); |
| |
| private final AndroidFacet myFacet; |
| private final ResourceType myResourceType; |
| private final String myResourceName; |
| private final PsiFile myFile; |
| private final boolean myChooseResName; |
| |
| public CreateFileResourceQuickFix(@NotNull AndroidFacet facet, |
| @NotNull ResourceType resourceType, |
| @NotNull String resourceName, |
| @NotNull PsiFile file, |
| boolean chooseResName) { |
| myFacet = facet; |
| myResourceType = resourceType; |
| myResourceName = resourceName; |
| myFile = file; |
| myChooseResName = chooseResName; |
| } |
| |
| @Override |
| @NotNull |
| public String getName() { |
| return AndroidBundle.message("create.file.resource.quickfix.name", myResourceName, |
| '\'' + myResourceType.getName() + "' directory"); |
| } |
| |
| @NotNull |
| @Override |
| public String getText() { |
| return AndroidBundle.message("create.file.resource.intention.name", myResourceType, myResourceName + ".xml"); |
| } |
| |
| @Override |
| @NotNull |
| public String getFamilyName() { |
| return AndroidBundle.message("quick.fixes.family"); |
| } |
| |
| @Override |
| public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { |
| return true; |
| } |
| |
| @Override |
| public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { |
| final XmlFile newFile = |
| CreateResourceFileAction.createFileResource(myFacet, myResourceType, myResourceName + ".xml", null, null, myChooseResName, null); |
| if (newFile != null) { |
| UndoUtil.markPsiFileForUndo(myFile); |
| } |
| } |
| |
| @Override |
| public boolean startInWriteAction() { |
| return false; |
| } |
| |
| @Override |
| public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { |
| final VirtualFile resourceDir = myFacet.getPrimaryResourceDir(); |
| if (resourceDir == null) { |
| return; |
| } |
| final PsiDirectory psiResDir = PsiManager.getInstance(project).findDirectory(resourceDir); |
| if (psiResDir == null) { |
| return; |
| } |
| final String resDirName = myResourceType.getName(); |
| PsiDirectory resSubdir = psiResDir.findSubdirectory(resDirName); |
| |
| if (resSubdir == null) { |
| resSubdir = ApplicationManager.getApplication().runWriteAction(new Computable<PsiDirectory>() { |
| @Override |
| public PsiDirectory compute() { |
| return psiResDir.createSubdirectory(resDirName); |
| } |
| }); |
| } |
| |
| try { |
| AndroidResourceUtil.createFileResource(myResourceName, resSubdir, CreateTypedResourceFileAction.getDefaultRootTagByResourceType( |
| ResourceFolderType.getFolderType(resDirName)), resDirName, false); |
| UndoUtil.markPsiFileForUndo(myFile); |
| AndroidLayoutPreviewToolWindowManager.renderIfApplicable(project); |
| } |
| catch (Exception e) { |
| LOG.error(e); |
| } |
| } |
| } |