blob: c9f573506579a4d9b4ad220400e974ad2e6a900c [file] [log] [blame]
package org.jetbrains.java.debugger.breakpoints;
import com.intellij.debugger.engine.evaluation.CodeFragmentKind;
import com.intellij.debugger.engine.evaluation.TextWithImportsImpl;
import com.intellij.debugger.engine.requests.RequestManagerImpl;
import com.intellij.debugger.settings.DebuggerSettings;
import com.intellij.debugger.ui.breakpoints.LineBreakpoint;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.markup.RangeHighlighter;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.xdebugger.breakpoints.XBreakpointProperties;
import com.intellij.xdebugger.breakpoints.XLineBreakpoint;
import com.intellij.xdebugger.impl.breakpoints.XLineBreakpointImpl;
import org.jetbrains.annotations.NotNull;
public class JavaBreakpointAdapter extends JavaBreakpointAdapterBase {
private static final Key<LineBreakpoint> OLD_JAVA_BREAKPOINT_KEY = Key.create("oldJavaBreakpoint");
public JavaBreakpointAdapter(Project project) {
super(project);
}
@Override
protected void configureCreatedBreakpoint(LineBreakpoint oldBreakpoint, XLineBreakpoint<XBreakpointProperties> breakpoint) {
oldBreakpoint.SUSPEND_POLICY = transformSuspendPolicy(breakpoint);
applyCondition(oldBreakpoint, breakpoint);
}
private static void applyCondition(LineBreakpoint oldBreakpoint, XLineBreakpoint<XBreakpointProperties> breakpoint) {
if (breakpoint.getCondition() != null) {
oldBreakpoint.CONDITION_ENABLED = true;
oldBreakpoint.setCondition(new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, breakpoint.getCondition()));
}
else {
oldBreakpoint.CONDITION_ENABLED = false;
if (!StringUtil.isEmptyOrSpaces(oldBreakpoint.getCondition().getText())) {
oldBreakpoint.setCondition(new TextWithImportsImpl(CodeFragmentKind.EXPRESSION, ""));
}
}
}
@Override
protected void updateBreakpoint(LineBreakpoint jBreakpoint, XLineBreakpoint<XBreakpointProperties> breakpoint) {
boolean changed = false;
if (jBreakpoint.ENABLED != breakpoint.isEnabled()) {
jBreakpoint.ENABLED = breakpoint.isEnabled();
changed = true;
}
String suspendPolicy = transformSuspendPolicy(breakpoint);
if (jBreakpoint.SUSPEND_POLICY != suspendPolicy) {
jBreakpoint.SUSPEND_POLICY = suspendPolicy;
changed = true;
}
if (StringUtil.compare(breakpoint.getCondition(), jBreakpoint.getCondition().getText(), false) != 0) {
applyCondition(jBreakpoint, breakpoint);
changed = true;
}
if (jBreakpoint.getSourcePosition().getLine() != breakpoint.getLine()) {
jBreakpoint.reload();
changed = true;
}
if (changed) {
RequestManagerImpl.updateRequests(jBreakpoint);
jBreakpoint.updateUI();
}
}
@Override
protected LineBreakpoint findBreakpoint(XLineBreakpoint<XBreakpointProperties> breakpoint) {
return OLD_JAVA_BREAKPOINT_KEY.get(breakpoint);
}
public LineBreakpoint getOrCreate(XLineBreakpoint<XBreakpointProperties> breakpoint) {
LineBreakpoint oldBreakpoint = findBreakpoint(breakpoint);
if (oldBreakpoint == null) {
oldBreakpoint = createBreakpoint(breakpoint);
OLD_JAVA_BREAKPOINT_KEY.set(breakpoint, oldBreakpoint);
}
return oldBreakpoint;
}
@Override
public void breakpointRemoved(@NotNull XLineBreakpoint<XBreakpointProperties> breakpoint) {
LineBreakpoint jBreakpoint = findBreakpoint(breakpoint);
if (jBreakpoint != null) {
jBreakpoint.delete();
}
}
@Override
protected LineBreakpoint doCreateInstance(Project project, Document document, XLineBreakpoint<XBreakpointProperties> breakpoint) {
LineBreakpoint lineBreakpoint = new LineBreakpoint(project, ((XLineBreakpointImpl)breakpoint).getHighlighter()) {
@Override
protected void setEditorFilter(RangeHighlighter highlighter) {
}
};
lineBreakpoint.init();
return lineBreakpoint;
}
private static String transformSuspendPolicy(XLineBreakpoint<XBreakpointProperties> breakpoint) {
switch (breakpoint.getSuspendPolicy()) {
case ALL:
return DebuggerSettings.SUSPEND_ALL;
case THREAD:
return DebuggerSettings.SUSPEND_THREAD;
case NONE:
return DebuggerSettings.SUSPEND_NONE;
default:
throw new IllegalArgumentException("unknown suspend policy");
}
}
}