IDEA-87369 Right-click on a breakpoint: "edit" action is disabled if the cursor is not on the corresponding line

This commit is contained in:
andrey.zaytsev
2012-06-13 23:57:54 +04:00
parent b364bf9b32
commit 14b8e71d2e
5 changed files with 108 additions and 64 deletions
@@ -25,6 +25,7 @@ import com.intellij.debugger.engine.events.DebuggerCommandImpl;
import com.intellij.debugger.engine.requests.RequestManagerImpl;
import com.intellij.debugger.impl.DebuggerContextImpl;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.debugger.ui.JavaDebuggerSupport;
import com.intellij.idea.ActionsBundle;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
@@ -49,6 +50,7 @@ import com.intellij.psi.PsiManager;
import com.intellij.psi.jsp.JspFile;
import com.intellij.ui.classFilter.ClassFilter;
import com.intellij.util.StringBuilderSpinAllocator;
import com.intellij.xdebugger.impl.DebuggerSupport;
import com.intellij.xdebugger.impl.actions.EditBreakpointAction;
import com.intellij.xdebugger.impl.actions.ViewBreakpointsAction;
import com.intellij.xdebugger.impl.actions.XDebuggerActions;
@@ -594,67 +596,6 @@ public abstract class BreakpointWithHighlighter extends Breakpoint {
}
}
@NotNull
private ActionGroup createMenuActions() {
final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager();
/**
* Used from Popup Menu
*/
class RemoveAction extends AnAction {
@Nullable private Breakpoint myBreakpoint;
public RemoveAction(Breakpoint breakpoint) {
super(DebuggerBundle.message("action.remove.text"));
myBreakpoint = breakpoint;
}
@Override
public void actionPerformed(AnActionEvent e) {
if (myBreakpoint != null) {
breakpointManager.removeBreakpoint(myBreakpoint);
myBreakpoint = null;
}
}
}
/**
* Used from Popup Menu
*/
class SetEnabledAction extends AnAction {
private final boolean myNewValue;
private final Breakpoint myBreakpoint;
public SetEnabledAction(Breakpoint breakpoint, boolean newValue) {
super(newValue ? DebuggerBundle.message("action.enable.text") : DebuggerBundle.message("action.disable.text"));
myBreakpoint = breakpoint;
myNewValue = newValue;
}
@Override
public void actionPerformed(AnActionEvent e) {
myBreakpoint.ENABLED = myNewValue;
breakpointManager.fireBreakpointChanged(myBreakpoint);
myBreakpoint.updateUI();
}
}
AnAction viewBreakpointsAction =
new ViewBreakpointsAction(ActionsBundle.actionText(XDebuggerActions.VIEW_BREAKPOINTS), this);
DefaultActionGroup group = new DefaultActionGroup();
RangeHighlighter highlighter = getHighlighter();
if (highlighter != null) {
group.add(new EditBreakpointAction());
group.addSeparator();
}
group.add(new SetEnabledAction(this, !ENABLED));
group.add(new RemoveAction(this));
group.addSeparator();
group.add(viewBreakpointsAction);
return group;
}
private class MyGutterIconRenderer extends GutterIconRenderer {
private final Icon myIcon;
private final String myDescription;
@@ -699,7 +640,63 @@ public abstract class BreakpointWithHighlighter extends Breakpoint {
@Override
public ActionGroup getPopupMenuActions() {
return createMenuActions();
final BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(myProject).getBreakpointManager();
/**
* Used from Popup Menu
*/
class RemoveAction extends AnAction {
@Nullable private Breakpoint myBreakpoint;
public RemoveAction(Breakpoint breakpoint) {
super(DebuggerBundle.message("action.remove.text"));
myBreakpoint = breakpoint;
}
@Override
public void actionPerformed(AnActionEvent e) {
if (myBreakpoint != null) {
breakpointManager.removeBreakpoint(myBreakpoint);
myBreakpoint = null;
}
}
}
/**
* Used from Popup Menu
*/
class SetEnabledAction extends AnAction {
private final boolean myNewValue;
private final Breakpoint myBreakpoint;
public SetEnabledAction(Breakpoint breakpoint, boolean newValue) {
super(newValue ? DebuggerBundle.message("action.enable.text") : DebuggerBundle.message("action.disable.text"));
myBreakpoint = breakpoint;
myNewValue = newValue;
}
@Override
public void actionPerformed(AnActionEvent e) {
myBreakpoint.ENABLED = myNewValue;
breakpointManager.fireBreakpointChanged(myBreakpoint);
myBreakpoint.updateUI();
}
}
AnAction viewBreakpointsAction =
new ViewBreakpointsAction(ActionsBundle.actionText(XDebuggerActions.VIEW_BREAKPOINTS), BreakpointWithHighlighter.this);
DefaultActionGroup group = new DefaultActionGroup();
RangeHighlighter highlighter = getHighlighter();
if (highlighter != null) {
group.add(new EditBreakpointAction.ContextAction(this, BreakpointWithHighlighter.this, DebuggerSupport.getDebuggerSupport(JavaDebuggerSupport.class)));
group.addSeparator();
}
group.add(new SetEnabledAction(BreakpointWithHighlighter.this, !ENABLED));
group.add(new RemoveAction(BreakpointWithHighlighter.this));
group.addSeparator();
group.add(viewBreakpointsAction);
return group;
}
@Override
@@ -104,4 +104,15 @@ public abstract class DebuggerSupport {
@NotNull
public abstract EditBreakpointActionHandler getEditBreakpointAction();
@Nullable
public static <T extends DebuggerSupport> DebuggerSupport getDebuggerSupport(Class<T> aClass) {
for (DebuggerSupport support : getDebuggerSupports()) {
if (support.getClass() == aClass) {
return support;
}
}
return null;
}
}
@@ -16,13 +16,42 @@
package com.intellij.xdebugger.impl.actions;
import com.intellij.idea.ActionsBundle;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.markup.GutterIconRenderer;
import com.intellij.xdebugger.impl.DebuggerSupport;
import org.jetbrains.annotations.NotNull;
public class EditBreakpointAction extends XDebuggerActionBase {
public static class ContextAction extends AnAction {
private final GutterIconRenderer myRenderer;
private final Object myBreakpoint;
private DebuggerSupport myDebuggerSupport;
public ContextAction(GutterIconRenderer breakpointRenderer, Object breakpoint, DebuggerSupport debuggerSupport) {
myRenderer = breakpointRenderer;
myBreakpoint = breakpoint;
myDebuggerSupport = debuggerSupport;
initPresentation(this);
}
@Override
public void actionPerformed(AnActionEvent e) {
final Editor editor = PlatformDataKeys.EDITOR.getData(e.getDataContext());
if (editor == null) return;
myDebuggerSupport.getEditBreakpointAction().editBreakpoint(getEventProject(e), editor, myBreakpoint, myRenderer);
}
}
public EditBreakpointAction() {
getTemplatePresentation().setText(ActionsBundle.actionText("EditBreakpoint"));
initPresentation(this);
}
private static void initPresentation(AnAction action) {
action.getTemplatePresentation().setText(ActionsBundle.actionText("EditBreakpoint"));
}
@NotNull
@@ -53,6 +53,10 @@ public abstract class EditBreakpointActionHandler extends DebuggerActionHandler
GutterIconRenderer breakpointGutterRenderer = pair.first;
if (breakpointGutterRenderer == null) return;
editBreakpoint(project, editor, breakpoint, breakpointGutterRenderer);
}
public void editBreakpoint(@NotNull Project project, @NotNull Editor editor, @NotNull Object breakpoint, @NotNull GutterIconRenderer breakpointGutterRenderer) {
EditorGutterComponentEx gutterComponent = ((EditorEx)editor).getGutterComponentEx();
Point point = gutterComponent.getPoint(breakpointGutterRenderer);
if (point == null) return;
@@ -37,7 +37,9 @@ import com.intellij.xdebugger.breakpoints.SuspendPolicy;
import com.intellij.xdebugger.breakpoints.XBreakpoint;
import com.intellij.xdebugger.breakpoints.XBreakpointProperties;
import com.intellij.xdebugger.breakpoints.XBreakpointType;
import com.intellij.xdebugger.impl.DebuggerSupport;
import com.intellij.xdebugger.impl.XDebugSessionImpl;
import com.intellij.xdebugger.impl.XDebuggerSupport;
import com.intellij.xdebugger.impl.XDebuggerUtilImpl;
import com.intellij.xdebugger.impl.actions.EditBreakpointAction;
import com.intellij.xdebugger.impl.actions.ViewBreakpointsAction;
@@ -366,7 +368,8 @@ public class XBreakpointBase<Self extends XBreakpoint<P>, P extends XBreakpointP
DefaultActionGroup group = new DefaultActionGroup();
final XDebuggerManager debuggerManager = XDebuggerManager.getInstance(getProject());
group.add(new EditBreakpointAction());
group.add(new EditBreakpointAction.ContextAction(this, XBreakpointBase.this, DebuggerSupport.getDebuggerSupport(XDebuggerSupport.class)));
group.add(new Separator());