mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-137320 GTK: debugger/eval inspection nodes do not show the expand triangle until selected
This commit is contained in:
@@ -37,7 +37,6 @@ import com.intellij.util.containers.Convertor;
|
||||
import com.intellij.util.containers.TransferToEDTQueue;
|
||||
import com.intellij.util.ui.TextTransferable;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import com.intellij.util.ui.tree.WideSelectionTreeUI;
|
||||
import com.intellij.xdebugger.XSourcePosition;
|
||||
import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider;
|
||||
import com.intellij.xdebugger.frame.XDebuggerTreeNodeHyperlink;
|
||||
@@ -50,7 +49,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.TreeUI;
|
||||
import javax.swing.tree.DefaultTreeModel;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
@@ -65,6 +63,13 @@ import java.util.List;
|
||||
public class XDebuggerTree extends DnDAwareTree implements DataProvider, Disposable {
|
||||
private final TransferToEDTQueue<Runnable> myLaterInvocator = TransferToEDTQueue.createRunnableMerger("XDebuggerTree later invocator", 100);
|
||||
|
||||
private final ComponentListener myMoveListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
repaint(); // needed to repaint links in cell renderer on horizontal scrolling
|
||||
}
|
||||
};
|
||||
|
||||
private static final DataKey<XDebuggerTree> XDEBUGGER_TREE_KEY = DataKey.create("xdebugger.tree");
|
||||
private final SingleAlarm myAlarm = new SingleAlarm(new Runnable() {
|
||||
@Override
|
||||
@@ -207,37 +212,8 @@ public class XDebuggerTree extends DnDAwareTree implements DataProvider, Disposa
|
||||
registerShortcuts();
|
||||
|
||||
setTransferHandler(DEFAULT_TRANSFER_HANDLER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUI(TreeUI ui) {
|
||||
super.setUI(ui instanceof LinkTreeUI ? ui : new LinkTreeUI());
|
||||
}
|
||||
|
||||
static class LinkTreeUI extends WideSelectionTreeUI {
|
||||
private final ComponentListener myListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentMoved(ComponentEvent e) {
|
||||
tree.repaint(); // needed to repaint links in cell renderer on horizontal scrolling
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void installListeners() {
|
||||
super.installListeners();
|
||||
tree.addComponentListener(myListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void uninstallListeners() {
|
||||
tree.removeComponentListener(myListener);
|
||||
super.uninstallListeners();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRowX(int row, int depth) {
|
||||
return super.getRowX(row, depth);
|
||||
}
|
||||
addComponentListener(myMoveListener);
|
||||
}
|
||||
|
||||
public void updateEditor() {
|
||||
@@ -373,6 +349,7 @@ public class XDebuggerTree extends DnDAwareTree implements DataProvider, Disposa
|
||||
UIUtil.dispose(this);
|
||||
setLeadSelectionPath(null);
|
||||
setAnchorSelectionPath(null);
|
||||
removeComponentListener(myMoveListener);
|
||||
}
|
||||
|
||||
private void registerShortcuts() {
|
||||
|
||||
+29
-1
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.intellij.xdebugger.impl.ui.tree;
|
||||
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.ui.AbstractExpandableItemsHandler;
|
||||
@@ -30,14 +31,18 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.plaf.basic.BasicTreeUI;
|
||||
import javax.swing.tree.TreePath;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* @author nik
|
||||
*/
|
||||
class XDebuggerTreeRenderer extends ColoredTreeCellRenderer {
|
||||
private static final Logger LOG = Logger.getInstance(XDebuggerTreeRenderer.class);
|
||||
|
||||
private final MyColoredTreeCellRenderer myLink = new MyColoredTreeCellRenderer();
|
||||
private boolean myHaveLink;
|
||||
private int myLinkOffset;
|
||||
@@ -66,7 +71,7 @@ class XDebuggerTreeRenderer extends ColoredTreeCellRenderer {
|
||||
|
||||
Rectangle treeVisibleRect = tree.getVisibleRect();
|
||||
TreePath path = tree.getPathForRow(row);
|
||||
int rowX = path != null ? ((XDebuggerTree.LinkTreeUI)tree.getUI()).getRowX(row, path.getPathCount() - 1) : 0;
|
||||
int rowX = path != null ? getRowX((BasicTreeUI)tree.getUI(), row, path.getPathCount() - 1) : 0;
|
||||
|
||||
if (myHaveLink) {
|
||||
setupLinkDimensions(treeVisibleRect, rowX);
|
||||
@@ -88,6 +93,29 @@ class XDebuggerTreeRenderer extends ColoredTreeCellRenderer {
|
||||
putClientProperty(AbstractExpandableItemsHandler.DISABLE_EXPANDABLE_HANDLER, myHaveLink ? true : null);
|
||||
}
|
||||
|
||||
private static Method ourGetRowXMethod = null;
|
||||
|
||||
private static int getRowX(BasicTreeUI ui, int row, int depth) {
|
||||
if (ourGetRowXMethod == null) {
|
||||
try {
|
||||
ourGetRowXMethod = BasicTreeUI.class.getDeclaredMethod("getRowX", int.class, int.class);
|
||||
ourGetRowXMethod.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchMethodException e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
if (ourGetRowXMethod != null) {
|
||||
try {
|
||||
return (Integer)ourGetRowXMethod.invoke(ui, row, depth);
|
||||
}
|
||||
catch (Exception e) {
|
||||
LOG.error(e);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private void setupLinkDimensions(Rectangle treeVisibleRect, int rowX) {
|
||||
Dimension linkSize = myLink.getPreferredSize();
|
||||
myLinkWidth = linkSize.width;
|
||||
|
||||
Reference in New Issue
Block a user