package fr.adrienbrault.idea.symfony2plugin.action.bundle; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Conditions; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.jetbrains.php.lang.psi.PhpFile; import com.jetbrains.php.lang.psi.PhpPsiUtil; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.action.AbstractProjectDumbAwareAction; import fr.adrienbrault.idea.symfony2plugin.util.psi.PhpBundleFileFactory; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.HashMap; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class WebTestCaseGeneratorAction extends AbstractProjectDumbAwareAction { public WebTestCaseGeneratorAction() { super("Create WebTestCase", "Create WebTestCase class", Symfony2Icons.SYMFONY); } public void update(AnActionEvent event) { Project project = getEventProject(event); if(project == null || !Symfony2ProjectComponent.isEnabled(project)) { this.setStatus(event, false); return; } this.setStatus(event, BundleClassGeneratorUtil.getBundleDirContext(event) != null); } @Override public void actionPerformed(AnActionEvent event) { Project project = getEventProject(event); if(project == null) { return; } PsiDirectory bundleDirContext = BundleClassGeneratorUtil.getBundleDirContext(event); if(bundleDirContext == null) { return; } PsiFile data = CommonDataKeys.PSI_FILE.getData(event.getDataContext()); if(!(data instanceof PhpFile)) { return; } String relativePath = VfsUtil.getRelativePath(data.getVirtualFile(), bundleDirContext.getVirtualFile()); if(relativePath == null) { return; } PhpClass aClass = PhpPsiUtil.findClass((PhpFile) data, Conditions.alwaysTrue()); if(aClass == null) { return; } int i = relativePath.lastIndexOf("."); final String className = "Tests\\" + relativePath.substring(0, i).replace("/", "\\") + "Test"; final PhpClass phpClass = BundleClassGeneratorUtil.getBundleClassInDirectory(bundleDirContext); if(phpClass == null) { return; } new WriteCommandAction(project) { @Override protected void run(@NotNull Result result) throws Throwable { PsiElement file = null; try { file = PhpBundleFileFactory.createBundleFile(phpClass, "web_test_case", className, new HashMap<>()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Error:" + e.getMessage()); } if(file != null) { new OpenFileDescriptor(getProject(), file.getContainingFile().getVirtualFile(), 0).navigate(true); } } @Override public String getGroupID() { return "Create Symfony WebTestFile"; } }.execute(); } }