diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java index 205672917fef..b0334effa0ce 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessEvents.java @@ -27,6 +27,7 @@ import com.intellij.debugger.jdi.VirtualMachineProxyImpl; import com.intellij.debugger.requests.Requestor; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.breakpoints.Breakpoint; +import com.intellij.debugger.ui.breakpoints.RunToCursorBreakpoint; import com.intellij.debugger.ui.breakpoints.StackCapturingLineBreakpoint; import com.intellij.debugger.ui.overhead.OverheadProducer; import com.intellij.debugger.ui.overhead.OverheadTimings; @@ -499,8 +500,10 @@ public class DebugProcessEvents extends DebugProcessImpl { resumePreferred = !requestHit; } finally { - if (requestor instanceof OverheadProducer) { - OverheadTimings.add(DebugProcessEvents.this, (OverheadProducer)requestor, requestHit ? 1 : 0, System.currentTimeMillis() - start); + if (requestor instanceof OverheadProducer && !(requestor instanceof RunToCursorBreakpoint)) { + OverheadTimings.add(DebugProcessEvents.this, (OverheadProducer)requestor, + requestHit || requestor instanceof StackCapturingLineBreakpoint ? 1 : 0, + System.currentTimeMillis() - start); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/requests/MethodReturnValueWatcher.java b/java/debugger/impl/src/com/intellij/debugger/engine/requests/MethodReturnValueWatcher.java index 55809801435d..3c9137f8c0de 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/requests/MethodReturnValueWatcher.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/requests/MethodReturnValueWatcher.java @@ -21,9 +21,11 @@ import com.intellij.debugger.engine.DebuggerManagerThreadImpl; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.overhead.OverheadProducer; import com.intellij.debugger.ui.overhead.OverheadTimings; +import com.intellij.icons.AllIcons; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.registry.Registry; +import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.util.ArrayUtil; import com.sun.jdi.*; import com.sun.jdi.event.Event; @@ -244,7 +246,8 @@ public class MethodReturnValueWatcher implements OverheadProducer { } @Override - public String getDisplayName() { - return DebuggerBundle.message("action.watches.method.return.value.enable"); + public void customizeRenderer(ColoredTableCellRenderer renderer) { + renderer.setIcon(AllIcons.Debugger.WatchLastReturnValue); + renderer.append(DebuggerBundle.message("action.watches.method.return.value.enable")); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index 423a8f537672..3b30dd629bc7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -35,6 +35,7 @@ import com.intellij.debugger.requests.Requestor; import com.intellij.debugger.settings.DebuggerSettings; import com.intellij.debugger.ui.impl.watch.CompilingEvaluatorImpl; import com.intellij.debugger.ui.overhead.OverheadProducer; +import com.intellij.icons.AllIcons; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.project.Project; @@ -45,6 +46,7 @@ import com.intellij.psi.PsiClass; import com.intellij.psi.PsiCodeFragment; import com.intellij.psi.PsiElement; import com.intellij.ui.AppUIUtil; +import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.ui.classFilter.ClassFilter; import com.intellij.util.ObjectUtils; import com.intellij.util.StringBuilderSpinAllocator; @@ -135,6 +137,17 @@ public abstract class Breakpoint

implements @Override public abstract void processClassPrepare(DebugProcess debuggerProcess, final ReferenceType referenceType); + @Override + public void customizeRenderer(ColoredTableCellRenderer renderer) { + if (myXBreakpoint != null) { + renderer.setIcon(myXBreakpoint.getType().getEnabledIcon()); + } + else { + renderer.setIcon(AllIcons.Debugger.Db_set_breakpoint); + } + renderer.append(getDisplayName()); + } + public abstract String getDisplayName (); public String getShortName() { diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java index a23a7ac6fbe9..f8263b7322b1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/StackCapturingLineBreakpoint.java @@ -39,6 +39,7 @@ import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; +import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.util.containers.ContainerUtil; import com.sun.jdi.*; import com.sun.jdi.event.LocatableEvent; @@ -181,8 +182,8 @@ public class StackCapturingLineBreakpoint extends WildcardMethodBreakpoint { } @Override - public String getDisplayName() { - return "Capture point at " + myCapturePoint.myClassName + "." + myCapturePoint.myMethodName; + public void customizeRenderer(ColoredTableCellRenderer renderer) { + renderer.append("Capture point at " + myCapturePoint.myClassName + "." + myCapturePoint.myMethodName); } @Override diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java index a79ad0f31475..31aa01892591 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadProducer.java @@ -15,11 +15,13 @@ */ package com.intellij.debugger.ui.overhead; +import com.intellij.ui.ColoredTableCellRenderer; + /** * @author egor */ public interface OverheadProducer { boolean isEnabled(); void setEnabled(boolean enabled); - String getDisplayName(); + void customizeRenderer(ColoredTableCellRenderer renderer); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadView.java b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadView.java index 40171f2e86c2..ba18be8da122 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadView.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/overhead/OverheadView.java @@ -19,19 +19,19 @@ import com.intellij.debugger.engine.DebugProcessImpl; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CustomShortcutSet; import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.ui.ColoredTableCellRenderer; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.TableUtil; -import com.intellij.ui.table.JBTable; +import com.intellij.ui.table.TableView; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; import com.intellij.util.ui.components.BorderLayoutPanel; import com.intellij.xdebugger.impl.ui.DebuggerUIUtil; -import one.util.streamex.IntStreamEx; -import one.util.streamex.StreamEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.table.TableCellRenderer; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Comparator; @@ -46,7 +46,7 @@ public class OverheadView extends BorderLayoutPanel { static final EnabledColumnInfo ENABLED_COLUMN = new EnabledColumnInfo(); static final NameColumnInfo NAME_COLUMN = new NameColumnInfo(); - final JBTable myTable; + final TableView myTable; final ListTableModel myModel; public OverheadView(@NotNull DebugProcessImpl process) { @@ -60,7 +60,7 @@ public class OverheadView extends BorderLayoutPanel { new ArrayList<>(OverheadTimings.getProducers(process)), 3, SortOrder.DESCENDING); myModel.setSortable(true); - myTable = new JBTable(myModel); + myTable = new TableView<>(myModel); addToCenter(ScrollPaneFactory.createScrollPane(myTable)); TableUtil.setupCheckboxColumn(myTable.getColumnModel().getColumn(0)); OverheadTimings.addListener(o -> DebuggerUIUtil.invokeLater(() -> { @@ -80,16 +80,12 @@ public class OverheadView extends BorderLayoutPanel { @Override public void actionPerformed(@NotNull final AnActionEvent e) { - getSelected().forEach(c -> c.setEnabled(!c.isEnabled())); + myTable.getSelection().forEach(c -> c.setEnabled(!c.isEnabled())); myTable.repaint(); } }.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0)), myTable); } - private StreamEx getSelected() { - return IntStreamEx.of(myTable.getSelectedRows()).map(myTable::convertRowIndexToModel).mapToObj(myModel::getItem); - } - private static class EnabledColumnInfo extends ColumnInfo { public EnabledColumnInfo() { super(""); @@ -117,21 +113,34 @@ public class OverheadView extends BorderLayoutPanel { } } - private static class NameColumnInfo extends ColumnInfo { + private static class NameColumnInfo extends ColumnInfo { public NameColumnInfo() { super("name"); } @Nullable @Override - public String valueOf(OverheadProducer aspects) { - return aspects.getDisplayName(); + public OverheadProducer valueOf(OverheadProducer aspects) { + return aspects; + } + + @Override + public Class getColumnClass() { + return OverheadProducer.class; } @Nullable @Override - public Comparator getComparator() { - return Comparator.comparing(i -> valueOf(i)); + public TableCellRenderer getRenderer(OverheadProducer producer) { + return new ColoredTableCellRenderer() { + @Override + protected void customizeCellRenderer(JTable table, @Nullable Object value, boolean selected, boolean hasFocus, int row, int column) { + if (value instanceof OverheadProducer) { + ((OverheadProducer)value).customizeRenderer(this); + } + setTransparentIconBackground(true); + } + }; } }