From 99880d3fe72087e7f67a06678e88095033c80bc7 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Wed, 20 Jun 2012 19:11:41 +0200 Subject: [PATCH] IDEA-28120 Ctrl-Shift-F10 in ant build file should run target --- plugins/ant/src/META-INF/plugin.xml | 5 + .../lang/ant/config/AntConfigurationBase.java | 2 +- .../ant/config/actions/RunTargetAction.java | 110 ++++++++++++++++++ .../ant/config/impl/AntConfigurationImpl.java | 2 +- .../ant/resources/AntActionsBundle.properties | 2 + 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 plugins/ant/src/com/intellij/lang/ant/config/actions/RunTargetAction.java diff --git a/plugins/ant/src/META-INF/plugin.xml b/plugins/ant/src/META-INF/plugin.xml index d86c7f03df0c..3b0ba93c082f 100644 --- a/plugins/ant/src/META-INF/plugin.xml +++ b/plugins/ant/src/META-INF/plugin.xml @@ -103,5 +103,10 @@ + + + + + diff --git a/plugins/ant/src/com/intellij/lang/ant/config/AntConfigurationBase.java b/plugins/ant/src/com/intellij/lang/ant/config/AntConfigurationBase.java index 993fe4daafe1..b2e45120ecd7 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/AntConfigurationBase.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/AntConfigurationBase.java @@ -81,7 +81,7 @@ public abstract class AntConfigurationBase extends AntConfiguration { public abstract XmlFile getEffectiveContextFile(@Nullable XmlFile file); @Nullable - public abstract AntBuildFile getAntBuildFile(@NotNull PsiFile file); + public abstract AntBuildFileBase getAntBuildFile(@NotNull PsiFile file); public abstract AntBuildFileBase[] getBuildFiles(); } diff --git a/plugins/ant/src/com/intellij/lang/ant/config/actions/RunTargetAction.java b/plugins/ant/src/com/intellij/lang/ant/config/actions/RunTargetAction.java new file mode 100644 index 000000000000..6e1478f7095a --- /dev/null +++ b/plugins/ant/src/com/intellij/lang/ant/config/actions/RunTargetAction.java @@ -0,0 +1,110 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.lang.ant.config.actions; + +import com.intellij.lang.ant.AntSupport; +import com.intellij.lang.ant.config.AntBuildFileBase; +import com.intellij.lang.ant.config.AntBuildListener; +import com.intellij.lang.ant.config.AntConfigurationBase; +import com.intellij.lang.ant.config.execution.ExecutionHandler; +import com.intellij.lang.ant.config.impl.BuildFileProperty; +import com.intellij.lang.ant.dom.AntDomTarget; +import com.intellij.lang.ant.resources.AntActionsBundle; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.xml.DomElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; + +/** + * Created by Eugene Petrenko (eugene.petrenko@gmail.com) + * Date: 28.05.12 16:07 + */ +public class RunTargetAction extends AnAction { + public RunTargetAction() { + super(); + } + + @Override + public void actionPerformed(AnActionEvent e) { + Pair antTarget = findAntTarget(e); + if (antTarget == null) return; + + ExecutionHandler.runBuild( + antTarget.first, new String[] {antTarget.second.getName().getValue() }, + null, + e.getDataContext(), + Collections.emptyList(), + AntBuildListener.NULL); + } + + + @Override + public void update(AnActionEvent e) { + super.update(e); + + final Presentation presentation = e.getPresentation(); + + Pair antTarget = findAntTarget(e); + if (antTarget == null) { + presentation.setEnabled(false); + presentation.setText(AntActionsBundle.message("action.RunTargetAction.text", "")); + } else { + presentation.setEnabled(true); + presentation.setText(AntActionsBundle.message("action.RunTargetAction.text", "'" + antTarget.second.getName().getValue() + "'")); + } + } + + @Nullable + private static Pair findAntTarget(@NotNull AnActionEvent e) { + final DataContext dataContext = e.getDataContext(); + + final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext); + final Project project = PlatformDataKeys.PROJECT.getData(dataContext); + + if (project == null || editor == null) return null; + final VirtualFile file = PlatformDataKeys.VIRTUAL_FILE.getData(dataContext); + if (file == null) return null; + + final PsiFile psiFile = PsiManager.getInstance(project).findFile(file); + if (!(psiFile instanceof XmlFile)) return null; + + final AntBuildFileBase antFile = AntConfigurationBase.getInstance(project).getAntBuildFile(psiFile); + if (antFile == null) return null; + + final XmlFile xmlFile = (XmlFile)psiFile; + PsiElement at = xmlFile.findElementAt(editor.getCaretModel().getOffset()); + while (at != null && !(at instanceof XmlTag)) at = at.getParent(); + if (at == null) return null; + + DomElement dom = AntSupport.getAntDomElement((XmlTag)at); + while (dom != null && !(dom instanceof AntDomTarget)) dom = dom.getParent(); + + final AntDomTarget tar = (AntDomTarget)dom; + if (tar == null) return null; + return Pair.create(antFile, tar); + } +} diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java index 88110a5db586..7841c39e4cf5 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java @@ -896,7 +896,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis } @Nullable - public AntBuildFile getAntBuildFile(@NotNull PsiFile file) { + public AntBuildFileBase getAntBuildFile(@NotNull PsiFile file) { final VirtualFile vFile = file.getVirtualFile(); if (vFile != null) { for (AntBuildFileBase bFile : getBuildFiles()) { diff --git a/plugins/ant/src/com/intellij/lang/ant/resources/AntActionsBundle.properties b/plugins/ant/src/com/intellij/lang/ant/resources/AntActionsBundle.properties index e6d4006c787f..17876e4a8486 100644 --- a/plugins/ant/src/com/intellij/lang/ant/resources/AntActionsBundle.properties +++ b/plugins/ant/src/com/intellij/lang/ant/resources/AntActionsBundle.properties @@ -1,2 +1,4 @@ action.AddAntBuildFile.text=Add as A_nt Build File action.AddAntBuildFile.description=Add current XML file to the list of project's Ant build files +action.RunTargetAction.text=Run Ant Target {0} +action.RunTargetAction.description=Runs currently selected Ant target \ No newline at end of file