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);
}
}
}
}