From fea38a8b79b6d9d0291e41ca82d41eb407c320c8 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Thu, 18 Jun 2015 14:21:22 +0300 Subject: [PATCH] IDEA-141515 On right-clicking on test method gutter marker the wrong methods to run are suggested --- .../lineMarker/RunLineMarkerInfo.java | 98 ++++++++++--------- .../NavigateToTestDataAction.java | 15 +-- 2 files changed, 62 insertions(+), 51 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java index 0dfb9c96c261..1e9edc3ba5b1 100644 --- a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java +++ b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java @@ -21,22 +21,18 @@ import com.intellij.execution.Executor; import com.intellij.execution.ExecutorRegistry; import com.intellij.execution.Location; import com.intellij.execution.PsiLocation; -import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl; import com.intellij.openapi.editor.markup.GutterIconRenderer; -import com.intellij.openapi.util.Getter; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.psi.PsiElement; import com.intellij.util.Function; import com.intellij.util.NullableFunction; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; @@ -60,51 +56,65 @@ public class RunLineMarkerInfo extends LineMarkerInfo { return true; } + @NotNull + @Override + public ActionGroup getPopupMenuActions() { + List actions = new ArrayList(); + Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); + actions.addAll(ContainerUtil.mapNotNull(executors, + new Function() { + @Override + public AnAction fun(Executor executor) { + return new ActionWrapper(ActionManager.getInstance().getAction(executor.getContextActionId())); + } + })); + actions.add(Separator.getInstance()); + actions.addAll(ContainerUtil.mapNotNull(RunLineMarkerContributor.EXTENSION.allForLanguage(myElement.getLanguage()), + new NullableFunction() { + @Nullable + @Override + public AnAction fun(RunLineMarkerContributor contributor) { + AnAction action = contributor.getAdditionalAction(myElement); + return action != null ? new ActionWrapper(action) : null; + } + })); + + return new DefaultActionGroup(actions); + } + @Override public AnAction getClickAction() { - return new AnAction() { - @Override - public void actionPerformed(AnActionEvent e) { - List actions = new ArrayList(); - Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); - actions.addAll(ContainerUtil.mapNotNull(executors, - new Function() { - @Override - public AnAction fun(Executor executor) { - return ActionManager.getInstance().getAction(executor.getContextActionId()); - } - })); - actions.add(Separator.getInstance()); - actions.addAll(ContainerUtil.mapNotNull(RunLineMarkerContributor.EXTENSION.allForLanguage(myElement.getLanguage()), - new NullableFunction() { - @Nullable - @Override - public AnAction fun(RunLineMarkerContributor contributor) { - return contributor.getAdditionalAction(myElement); - } - })); - ActionPopupMenuImpl - popupMenu = (ActionPopupMenuImpl)ActionManager.getInstance().createActionPopupMenu(ActionPlaces.EDITOR_POPUP, - new DefaultActionGroup(actions)); - final MouseEvent me = (MouseEvent)e.getInputEvent(); - final Component c = me.getComponent(); - if (c != null && c.isShowing()) { - final DataContext delegate = DataManager.getInstance().getDataContext(c, me.getX(), me.getY()); - final DataContext dataContext = new MyDataContext(delegate); - popupMenu.setDataContextProvider(new Getter() { - @Override - public DataContext get() { - return dataContext; - } - }); - popupMenu.getComponent().show(c, me.getX(), me.getY()); - } - } - }; + return null; } }; } + private class ActionWrapper extends AnAction { + + private final AnAction myOrigin; + + public ActionWrapper(@NotNull AnAction origin) { + myOrigin = origin; + copyFrom(origin); + } + + @Override + public void update(AnActionEvent e) { + myOrigin.update(createEvent(e)); + } + + @NotNull + private AnActionEvent createEvent(AnActionEvent e) { + return new AnActionEvent( + e.getInputEvent(), new MyDataContext(e.getDataContext()), e.getPlace(), e.getPresentation(), e.getActionManager(), e.getModifiers()); + } + + @Override + public void actionPerformed(AnActionEvent e) { + myOrigin.actionPerformed(createEvent(e)); + } + } + private class MyDataContext extends UserDataHolderBase implements DataContext { private final DataContext myDelegate; diff --git a/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java b/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java index 985fc3f81732..55878f01ce39 100644 --- a/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java +++ b/plugins/devkit/src/testAssistant/NavigateToTestDataAction.java @@ -115,6 +115,14 @@ public class NavigateToTestDataAction extends AnAction implements TestTreeViewAc @Nullable private static PsiMethod findTargetMethod(@NotNull DataContext context) { + final Location location = Location.DATA_KEY.getData(context); + if (location != null) { + final PsiElement element = location.getPsiElement(); + PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class, false); + if (method != null) { + return method; + } + } final Editor editor = CommonDataKeys.EDITOR.getData(context); final PsiFile file = CommonDataKeys.PSI_FILE.getData(context); if (file != null && editor != null) { @@ -122,13 +130,6 @@ public class NavigateToTestDataAction extends AnAction implements TestTreeViewAc return PsiTreeUtil.getParentOfType(element, PsiMethod.class); } - final Location location = Location.DATA_KEY.getData(context); - if (location != null) { - final PsiElement element = location.getPsiElement(); - if (element instanceof PsiMethod) { - return (PsiMethod)element; - } - } return null; }