package fr.adrienbrault.idea.symfony2plugin.action.generator; import com.intellij.codeInsight.CodeInsightActionHandler; import com.intellij.codeInsight.actions.CodeInsightAction; import com.intellij.codeInsight.hint.HintManager; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil; import fr.adrienbrault.idea.symfony2plugin.intentions.php.XmlServiceArgumentIntention; import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class ServiceArgumentGenerateAction extends CodeInsightAction { @Override public void update(AnActionEvent event) { super.update(event); boolean enabled = Symfony2ProjectComponent.isEnabled(event.getProject()); event.getPresentation().setVisible(enabled); event.getPresentation().setEnabled(enabled); } @Nullable private static XmlTag getMatchXmlTag(@NotNull Editor editor, @NotNull PsiFile file) { if(!(file instanceof XmlFile)) { return null; } int offset = editor.getCaretModel().getOffset(); if(offset <= 0) { return null; } PsiElement psiElement = file.findElementAt(offset); if(psiElement == null) { return null; } return XmlServiceArgumentIntention.getServiceTagValid(psiElement); } @Override protected boolean isValidForFile(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) { if(file.getFileType() != XmlFileType.INSTANCE || !Symfony2ProjectComponent.isEnabled(project)) { return false; } return getMatchXmlTag(editor, file) != null; } @NotNull @Override protected CodeInsightActionHandler getHandler() { return new CodeInsightActionHandler() { @Override public void invoke(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile psiFile) { XmlTag serviceTag = getMatchXmlTag(editor, psiFile); if(serviceTag == null) { return; } if(!ServiceActionUtil.isValidXmlParameterInspectionService(serviceTag)) { HintManager.getInstance().showErrorHint(editor, "Sry, not supported service definition"); return; } List<String> args = ServiceActionUtil.getXmlMissingArgumentTypes(serviceTag, true, new ContainerCollectionResolver.LazyServiceCollector(project)); if (args == null) { return; } ServiceActionUtil.fixServiceArgument(args, serviceTag); } @Override public boolean startInWriteAction() { return true; } }; } }