package jetbrains.mps.debugger.java.runtime.breakpoints; /*Generated by MPS */ import jetbrains.mps.debug.api.breakpoints.IBreakpointsProvider; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Arrays; import com.intellij.openapi.project.Project; import jetbrains.mps.debugger.java.runtime.ui.breakpoints.ExceptionChooserDialog; import jetbrains.mps.debug.api.breakpoints.ILocationBreakpoint; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.debug.api.breakpoints.IBreakpointPropertiesUi; import org.jetbrains.annotations.Nullable; import org.jdom.Element; import com.intellij.util.xmlb.XmlSerializer; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.debug.api.breakpoints.BreakpointLocation; import javax.swing.Icon; import jetbrains.mps.debug.api.AbstractDebugSession; import javax.swing.JPanel; import javax.swing.JCheckBox; import javax.swing.JRadioButton; import java.awt.FlowLayout; import javax.swing.border.TitledBorder; import javax.swing.ButtonGroup; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JComponent; import com.sun.jdi.request.EventRequest; public class JavaBreakpointsProvider implements IBreakpointsProvider<JavaBreakpoint, JavaBreakpointKind> { public JavaBreakpointsProvider() { } @NotNull @Override public List<JavaBreakpointKind> getAllKinds() { return Arrays.asList(JavaBreakpointKind.values()); } @Override public boolean canCreateFromUi(@NotNull JavaBreakpointKind kind) { return kind.equals(JavaBreakpointKind.EXCEPTION_BREAKPOINT); } @Override public boolean canCreateFromNode(@NotNull JavaBreakpointKind kind) { return kind.equals(JavaBreakpointKind.LINE_BREAKPOINT) || kind.equals(JavaBreakpointKind.FIELD_BREAKPOINT); } @Override public JavaBreakpoint createFromUi(@NotNull JavaBreakpointKind kind, Project project) { switch (kind) { case EXCEPTION_BREAKPOINT: ExceptionChooserDialog dialog = new ExceptionChooserDialog(project, "Choose Exception Class"); dialog.show(); String chosenException = dialog.getSelected(); if (chosenException == null) { return null; } return new ExceptionBreakpoint(chosenException, project); default: throw new IllegalArgumentException("Cannot create breakpoint for " + kind); } } @Override public ILocationBreakpoint createFromNode(@NotNull SNode node, @NotNull JavaBreakpointKind kind, Project project) { switch (kind) { case LINE_BREAKPOINT: return new LineBreakpoint(node, project); case FIELD_BREAKPOINT: return new FieldBreakpoint(node, project); default: throw new IllegalArgumentException("Cannot create breakpoint for " + kind); } } @Override public IBreakpointPropertiesUi<JavaBreakpoint> createPropertiesEditor(@NotNull final JavaBreakpointKind kind) { return new JavaBreakpointsProvider.MyIBreakpointPropertiesUi(); } @Override @Nullable public JavaBreakpoint loadFromState(Element state, JavaBreakpointKind kind, final Project project) { final JavaBreakpoint javaBreakpoint = loadFromStateInternal(state, kind, project); javaBreakpoint.addBreakpointListener(BreakpointsIconCache.getInstance(project).getBreakpointListener()); return javaBreakpoint; } private JavaBreakpoint loadFromStateInternal(Element state, JavaBreakpointKind kind, Project project) { switch (kind) { case LINE_BREAKPOINT: { final JavaBreakpointInfo breakpointInfo = XmlSerializer.deserialize(state, JavaBreakpointInfo.class); if (!(breakpointInfo.isInitialized())) { return null; } LineBreakpoint breakpoint = new LineBreakpoint(breakpointInfo.location(), project); breakpointInfo.initBreakpoint(breakpoint); return breakpoint; } case EXCEPTION_BREAKPOINT: { ExceptionBreakpoint.ExceptionBreakpointInfo exceptionBreakpointInfo = XmlSerializer.deserialize(state, ExceptionBreakpoint.ExceptionBreakpointInfo.class); ExceptionBreakpoint exceptionBreakpoint = new ExceptionBreakpoint(exceptionBreakpointInfo.myExceptionName, project); exceptionBreakpointInfo.initBreakpoint(exceptionBreakpoint); return exceptionBreakpoint; } case METHOD_BREAKPOINT: { // I am going to replace method breakpoints with a new ones, so I temporary read old method breakpoints into line breakpoints // todo new method breakpoints final JavaBreakpointInfo lineBreakpointInfo = XmlSerializer.deserialize(state, JavaBreakpointInfo.class); if (!(lineBreakpointInfo.isInitialized())) { return null; } LineBreakpoint lineBreakpoint = new LineBreakpoint(lineBreakpointInfo.location(), project); lineBreakpointInfo.initBreakpoint(lineBreakpoint); return lineBreakpoint; } case FIELD_BREAKPOINT: { final JavaBreakpointInfo fieldBreakpointInfo = XmlSerializer.deserialize(state, JavaBreakpointInfo.class); if (!(fieldBreakpointInfo.isInitialized())) { return null; } SNodeReference pointer = fieldBreakpointInfo.location(); FieldBreakpoint fieldBreakpoint = new FieldBreakpoint(pointer, project); fieldBreakpointInfo.initBreakpoint(fieldBreakpoint); return fieldBreakpoint; } default: } return null; } @Override @Nullable public Element saveToState(@NotNull JavaBreakpoint breakpoint) { // MPS-11065 exception while saving breakpoints if (breakpoint instanceof ILocationBreakpoint) { ILocationBreakpoint locationBreakpoint = (ILocationBreakpoint) breakpoint; BreakpointLocation location = locationBreakpoint.getLocation(); } switch (breakpoint.getKind()) { case EXCEPTION_BREAKPOINT: return XmlSerializer.serialize(new ExceptionBreakpoint.ExceptionBreakpointInfo((ExceptionBreakpoint) breakpoint)); case LINE_BREAKPOINT: return XmlSerializer.serialize(new JavaBreakpointInfo(breakpoint, ((ILocationBreakpoint) breakpoint).getLocation())); case METHOD_BREAKPOINT: return XmlSerializer.serialize(new JavaBreakpointInfo(breakpoint, ((ILocationBreakpoint) breakpoint).getLocation())); case FIELD_BREAKPOINT: return XmlSerializer.serialize(new JavaBreakpointInfo(breakpoint, ((ILocationBreakpoint) breakpoint).getLocation())); default: } return null; } @Override public Icon getIcon(@NotNull JavaBreakpoint breakpoint, @Nullable AbstractDebugSession session) { return BreakpointsIconCache.getInstance(breakpoint.getProject()).getIcon(breakpoint, session); } public void init() { } public void dispose() { } private static class MyIBreakpointPropertiesUi implements IBreakpointPropertiesUi<JavaBreakpoint> { private JavaBreakpoint myBreakpoint; private final JPanel myMainPanel; private final JCheckBox myLogMessageButton; private final JRadioButton[] myButtons = new JRadioButton[JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy.values().length]; public MyIBreakpointPropertiesUi() { JPanel suspendPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); suspendPanel.setBorder(new TitledBorder("Suspend policy")); ButtonGroup group = new ButtonGroup(); for (JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy policy : JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy.values()) { JRadioButton button = new JRadioButton(policy.getName()); myButtons[policy.ordinal()] = button; button.setActionCommand(policy.name()); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy suspendPolicy = JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy.valueOf(e.getActionCommand()); if (suspendPolicy != null) { myBreakpoint.setSuspendPolicy(suspendPolicy.myValue); } } }); group.add(button); suspendPanel.add(button); } JPanel actionPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); actionPanel.setBorder(new TitledBorder("Actions")); myLogMessageButton = new JCheckBox("Log message to console"); myLogMessageButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { myBreakpoint.setLogMessage(myLogMessageButton.isSelected()); } }); actionPanel.add(myLogMessageButton); myMainPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); myMainPanel.add(suspendPanel); myMainPanel.add(actionPanel); } @Override public void setBreakpoint(JavaBreakpoint breakpoint) { myBreakpoint = breakpoint; int suspendPolicy = breakpoint.getSuspendPolicy(); for (JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy policy : JavaBreakpointsProvider.MyIBreakpointPropertiesUi.SuspendPolicy.values()) { if (policy.myValue == suspendPolicy) { myButtons[policy.ordinal()].setSelected(true); } } myLogMessageButton.setSelected(myBreakpoint.isLogMessage()); } @Override public JComponent getMainComponent() { return myMainPanel; } private enum SuspendPolicy { ALL(EventRequest.SUSPEND_ALL), NONE(EventRequest.SUSPEND_NONE), THREAD(EventRequest.SUSPEND_EVENT_THREAD); private final int myValue; private SuspendPolicy(int value) { myValue = value; } public String getName() { return this.name().substring(0, 1) + this.name().toLowerCase().substring(1); } } } }