/* * Copyright 2003-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 jetbrains.mps.idea.java.debugger.breakpoints; import com.intellij.debugger.ui.breakpoints.BreakpointWithHighlighter; import com.intellij.icons.AllIcons.Debugger; import com.intellij.openapi.actionSystem.ActionGroup; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Constraints; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.xdebugger.impl.actions.EditBreakpointAction.ContextAction; import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointImpl; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; import jetbrains.mps.debugger.core.breakpoints.BreakpointIconRenderrerEx; import jetbrains.mps.idea.java.MpsJavaBundle; import jetbrains.mps.nodeEditor.EditorComponent; import org.jetbrains.mps.openapi.model.SNode; import javax.swing.Icon; import javax.swing.JPopupMenu; import java.awt.Point; /*package private*/ class BreakpointIconRenderrer extends BreakpointIconRenderrerEx<BreakpointWithHighlighter> { public BreakpointIconRenderrer(BreakpointWithHighlighter breakpoint, EditorComponent component) { super(breakpoint, component); } @Override public String getTooltipText() { return myBreakpoint.toString(); } @Override public Icon getIcon() { Icon icon = myBreakpoint.getIcon(); // fixme idea seems to update the icon (which is initialy null) under a series of Swing.invokeLaters // our control flow is such that even if schedule breakpoint.updateUI() it will happen later // Let's be simplistic for now and just return the default icon. return icon != null ? icon : Debugger.Db_set_breakpoint; } @Override public SNode getNode() { return BreakpointPainter.getNodeForBreakpoint(myBreakpoint); } @Override public JPopupMenu getPopupMenu() { DefaultActionGroup actions = new DefaultActionGroup(); ActionGroup actionGroup = ((XLineBreakpointImpl) myBreakpoint.getXBreakpoint()).getHighlighter().getGutterIconRenderer().getPopupMenuActions(); if (actionGroup != null) { if (myBreakpoint.getXBreakpoint() instanceof XLineBreakpointImpl) { actions.addAll(actionGroup); } for (AnAction action : actions.getChildActionsOrStubs()) { if (action instanceof ContextAction) { actions.remove(action); break; } } } actions.add(new EditBreakpointAction(), Constraints.FIRST); return ActionManager.getInstance().createActionPopupMenu(ActionPlaces.UNKNOWN, actions).getComponent(); } private EditorComponent getComponent() { return (EditorComponent) myComponent; } /*@Nullable private static BreakpointFactory findFactory(BreakpointWithHighlighter breakpoint) { for (BreakpointFactory factory : ApplicationManager.getApplication().getExtensions(BreakpointFactory.EXTENSION_POINT_NAME)) { if (factory.getBreakpointCategory().equals(breakpoint.getCategory())) { return factory; } } return null; }*/ private class EditBreakpointAction extends AnAction { public EditBreakpointAction() { super(MpsJavaBundle.message("debugger.edit.breakpoint.action")); } @Override public void actionPerformed(AnActionEvent e) { int y = getComponent().getLeftEditorHighlighter().getIconCoordinate(BreakpointIconRenderrer.this); int x = getComponent().getLeftEditorHighlighter().getIconRenderersOffset(); Point whereToShow = new Point(x + getIcon().getIconWidth() / 2, y + getIcon().getIconHeight() / 2); DebuggerUIUtil.showXBreakpointEditorBalloon(myBreakpoint.getProject(), whereToShow, getComponent().getLeftEditorHighlighter(), false, myBreakpoint.getXBreakpoint()); } } }