package org.jetbrains.android.actions; import com.android.resources.ResourceFolderType; import com.intellij.CommonBundle; import com.intellij.ide.actions.CreateElementActionBase; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.InputValidator; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.util.PlatformIcons; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; /** * @author Eugene.Kudelevsky */ public class CreateResourceDirectoryAction extends CreateElementActionBase { private final ResourceFolderType myResourceFolderType; @SuppressWarnings("UnusedDeclaration") public CreateResourceDirectoryAction() { this(null); } public CreateResourceDirectoryAction(@Nullable ResourceFolderType resourceFolderType) { super(AndroidBundle.message("new.resource.dir.action.title"), AndroidBundle.message("new.resource.action.description"), PlatformIcons.DIRECTORY_CLOSED_ICON); myResourceFolderType = resourceFolderType; } @NotNull @Override public PsiElement[] invokeDialog(final Project project, final PsiDirectory directory) { final CreateResourceDirectoryDialog dialog = new CreateResourceDirectoryDialog(project, myResourceFolderType) { @Override protected InputValidator createValidator() { return CreateResourceDirectoryAction.this.createValidator(project, directory); } }; dialog.setTitle(AndroidBundle.message("new.resource.dir.dialog.title")); dialog.show(); final InputValidator validator = dialog.getValidator(); if (validator == null) { return PsiElement.EMPTY_ARRAY; } return ((MyInputValidator)validator).getCreatedElements(); } @NotNull private MyInputValidator createValidator(Project project, final PsiDirectory resDir) { return new MyInputValidator(project, resDir); } @NotNull @Override protected PsiElement[] create(String newName, PsiDirectory directory) throws Exception { return new PsiElement[]{directory.createSubdirectory(newName)}; } @Override protected String getErrorTitle() { return CommonBundle.getErrorTitle(); } @Override protected String getCommandName() { return AndroidBundle.message("new.resource.dir.command.name"); } @Nullable @Override protected String getActionName(PsiDirectory directory, String newName) { return AndroidBundle.message("new.resource.dir.action.name", directory.getName() + File.separator + newName); } @Override protected boolean isAvailable(DataContext context) { if (!super.isAvailable(context)) return false; final PsiElement element = (PsiElement)context.getData(CommonDataKeys.PSI_ELEMENT.getName()); if (!(element instanceof PsiDirectory) || AndroidFacet.getInstance(element) == null) { return false; } return ApplicationManager.getApplication().runReadAction(new Computable<Boolean>() { @Override public Boolean compute() { return AndroidResourceUtil.isResourceDirectory((PsiDirectory)element); } }); } }