package fr.adrienbrault.idea.symfony2plugin.action;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.jetbrains.php.lang.psi.PhpFile;
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.ui.SymfonyCreateService;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.jetbrains.yaml.psi.YAMLFile;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class SymfonyContainerServiceBuilder extends DumbAwareAction {
public SymfonyContainerServiceBuilder() {
super("Create Service", "Generate a new Service definition from class name", Symfony2Icons.SYMFONY);
}
public void update(AnActionEvent event) {
Project project = event.getData(PlatformDataKeys.PROJECT);
if (project == null || !Symfony2ProjectComponent.isEnabled(project)) {
this.setStatus(event, false);
return;
}
PsiFile psiFile = event.getData(PlatformDataKeys.PSI_FILE);
if(psiFile instanceof PhpFile) {
if("ProjectViewPopup".equals(event.getPlace())) {
if(PhpElementsUtil.getFirstClassFromFile((PhpFile) psiFile) == null) {
this.setStatus(event, false);
}
} else {
PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);
if(!(psiElement instanceof PhpClass)) {
this.setStatus(event, false);
}
}
return;
}
if(!(psiFile instanceof YAMLFile) && !(psiFile instanceof XmlFile)) {
this.setStatus(event, false);
}
}
private void setStatus(AnActionEvent event, boolean status) {
event.getPresentation().setVisible(status);
event.getPresentation().setEnabled(status);
}
public void actionPerformed(AnActionEvent event) {
Project project = event.getProject();
if(project == null) {
return;
}
Editor editor = event.getData(PlatformDataKeys.EDITOR);
if(editor == null) {
return;
}
PsiFile psiFile = event.getData(PlatformDataKeys.PSI_FILE);
if(!(psiFile instanceof YAMLFile) && !(psiFile instanceof XmlFile) && !(psiFile instanceof PhpFile)) {
return;
}
PhpClass phpClass = null;
if(psiFile instanceof PhpFile) {
if("ProjectViewPopup".equals(event.getPlace())) {
phpClass = PhpElementsUtil.getFirstClassFromFile((PhpFile) psiFile);
} else {
PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);
if(psiElement instanceof PhpClass) {
phpClass = (PhpClass) psiElement;
}
}
}
if(phpClass == null) {
SymfonyCreateService.create(editor.getComponent(), project, psiFile, editor);
return;
}
SymfonyCreateService.create(editor.getComponent(), project, psiFile, phpClass, editor);
}
}