package jetbrains.mps.debugger.java.runtime.breakpoints;
/*Generated by MPS */
import com.intellij.openapi.components.ProjectComponent;
import java.util.Map;
import jetbrains.mps.debug.api.breakpoints.IBreakpoint;
import javax.swing.Icon;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import com.intellij.openapi.project.Project;
import jetbrains.mps.debug.api.BreakpointManagerComponent;
import jetbrains.mps.debug.api.breakpoints.IBreakpointListener;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.debug.api.DebugSessionManagerComponent;
import jetbrains.mps.debug.api.AbstractDebugSession;
import jetbrains.mps.debugger.java.runtime.state.DebugSession;
import jetbrains.mps.debugger.api.ui.breakpoints.BreakpointsUiComponent;
import jetbrains.mps.cleanup.CleanupListener;
import jetbrains.mps.cleanup.CleanupManager;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.debugger.api.ui.icons.Icons;
import org.jetbrains.annotations.NonNls;
public class BreakpointsIconCache implements ProjectComponent {
private final Map<IBreakpoint, Icon> myCache = MapSequence.fromMap(new HashMap<IBreakpoint, Icon>());
private final Project myProject;
private final BreakpointManagerComponent myBreakpointManager;
private final IBreakpointListener myBreakpointListener = new IBreakpointListener() {
@Override
public void breakpointEnabledStateToggled(IBreakpoint breakpoint, boolean enabled) {
myUpdateFromCurrent.invoke();
}
};
private final BreakpointManagerComponent.IBreakpointManagerListener myBreakpointsManagerListener = new BreakpointManagerComponent.IBreakpointManagerListener() {
@Override
public void breakpointAdded(@NotNull IBreakpoint breakpoint) {
breakpoint.addBreakpointListener(myBreakpointListener);
myUpdateFromCurrent.invoke();
}
@Override
public void breakpointRemoved(@NotNull IBreakpoint breakpoint) {
myUpdateFromCurrent.invoke();
breakpoint.removeBreakpointListener(myBreakpointListener);
}
};
private final _FunctionTypes._void_P0_E0 myUpdateFromCurrent = new _FunctionTypes._void_P0_E0() {
public void invoke() {
updateIcons(currentSession());
}
};
private final DebugSessionManagerComponent.DebugSessionAdapter myDebugSessionAdapter = new DebugSessionManagerComponent.DebugSessionAdapter() {
@Override
public void currentSessionChanged(AbstractDebugSession session) {
if (session instanceof DebugSession) {
updateIcons((DebugSession) session);
} else {
updateIcons(null);
}
}
@Override
public void registered(AbstractDebugSession session) {
if (session instanceof DebugSession) {
((DebugSession) session).getEventsProcessor().getRequestManager().addWarningsListener(myUpdateFromCurrent);
}
}
@Override
public void detached(AbstractDebugSession session) {
if (session instanceof DebugSession) {
((DebugSession) session).getEventsProcessor().getRequestManager().removeWarningsListener(myUpdateFromCurrent);
}
myUpdateFromCurrent.invoke();
}
};
private final DebugSessionManagerComponent myDebugSessionManager;
private final BreakpointsUiComponent myBreakpointsUiComponent;
private final CleanupListener myCleanupListener = new CleanupListener() {
@Override
public void performCleanup() {
myUpdateFromCurrent.invoke();
}
};
public BreakpointsIconCache(Project project, BreakpointManagerComponent breakpointManager, DebugSessionManagerComponent debugSessionManager, BreakpointsUiComponent breakpointsUiComponent) {
myProject = project;
myBreakpointManager = breakpointManager;
myDebugSessionManager = debugSessionManager;
myBreakpointsUiComponent = breakpointsUiComponent;
}
@Override
public void projectOpened() {
myBreakpointManager.addChangeListener(myBreakpointsManagerListener);
myDebugSessionManager.addDebugSessionListener(myDebugSessionAdapter);
CleanupManager.getInstance().addCleanupListener(myCleanupListener);
}
@Override
public void projectClosed() {
CleanupManager.getInstance().removeCleanupListener(myCleanupListener);
myDebugSessionManager.removeDebugSessionListener(myDebugSessionAdapter);
myBreakpointManager.removeChangeListener(myBreakpointsManagerListener);
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@Nullable
private DebugSession currentSession() {
AbstractDebugSession session = myDebugSessionManager.getDebugSessionByCurrentTab();
if (session instanceof DebugSession) {
return (DebugSession) session;
}
return null;
}
public void updateIcons(@Nullable final DebugSession session) {
final _FunctionTypes._void_P0_E0 update = new _FunctionTypes._void_P0_E0() {
public void invoke() {
Map<IBreakpoint, Icon> icons = MapSequence.fromMap(new HashMap<IBreakpoint, Icon>());
for (IBreakpoint breakpoint : SetSequence.fromSet(myBreakpointManager.getAllIBreakpoints())) {
if (breakpoint instanceof JavaBreakpoint) {
JavaBreakpoint javaBreakpoint = (JavaBreakpoint) breakpoint;
Icon icon = getIconInternal(javaBreakpoint, session);
MapSequence.fromMap(icons).put(javaBreakpoint, icon);
}
}
synchronized (myCache) {
MapSequence.fromMap(myCache).clear();
MapSequence.fromMap(myCache).putAll(icons);
}
myBreakpointsUiComponent.repaintBreakpoints();
}
};
if (session != null) {
session.getEventsProcessor().schedule(new _FunctionTypes._void_P0_E0() {
public void invoke() {
update.invoke();
}
});
} else {
update.invoke();
}
}
public Icon getIcon(@NotNull JavaBreakpoint breakpoint, @Nullable AbstractDebugSession session) {
if (session != null && session.isMute()) {
return Icons.MUTED_BREAKPOINT;
}
synchronized (myCache) {
return MapSequence.fromMap(myCache).get(breakpoint);
}
}
private Icon getIconInternal(JavaBreakpoint breakpoint, @Nullable DebugSession session) {
String warning = (session == null ? null : session.getEventsProcessor().getRequestManager().getWarning(breakpoint));
switch (breakpoint.getKind()) {
case EXCEPTION_BREAKPOINT:
return (breakpoint.isEnabled() ? jetbrains.mps.debugger.java.runtime.ui.Icons.EXCEPTION_BREAKPOINT : jetbrains.mps.debugger.java.runtime.ui.Icons.DISABLED_EXCEPTION_BREAKPOINT);
case LINE_BREAKPOINT:
return (breakpoint.isValid() && (warning == null || warning.length() == 0) ? ((breakpoint.isEnabled() ? Icons.BREAKPOINT : Icons.DISABLED_BREAKPOINT)) : Icons.INV_BREAKPOINT);
case METHOD_BREAKPOINT:
return (breakpoint.isValid() && (warning == null || warning.length() == 0) ? ((breakpoint.isEnabled() ? jetbrains.mps.debugger.java.runtime.ui.Icons.METHOD_BREAKPOINT : jetbrains.mps.debugger.java.runtime.ui.Icons.DISABLED_METHOD_BREAKPOINT)) : jetbrains.mps.debugger.java.runtime.ui.Icons.INVALID_METHOD_BREAKPOINT);
case FIELD_BREAKPOINT:
return (breakpoint.isValid() && (warning == null || warning.length() == 0) ? ((breakpoint.isEnabled() ? jetbrains.mps.debugger.java.runtime.ui.Icons.FIELD_BREAKPOINT : jetbrains.mps.debugger.java.runtime.ui.Icons.DISABLED_FIELD_BREAKPOINT)) : jetbrains.mps.debugger.java.runtime.ui.Icons.INVALID_FIELD_BREAKPOINT);
default:
}
return null;
}
public IBreakpointListener getBreakpointListener() {
return myBreakpointListener;
}
@NonNls
@NotNull
@Override
public String getComponentName() {
return "Breakpoints Icon Cache";
}
public static BreakpointsIconCache getInstance(Project project) {
return project.getComponent(BreakpointsIconCache.class);
}
}