IDEA-137320 GTK: debugger/eval inspection nodes do not show the expand triangle until selected

This commit is contained in:
Egor.Ushakov
2015-03-11 19:07:41 +03:00
parent 8be7c8c867
commit 13caa96334
2 changed files with 38 additions and 33 deletions
@@ -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() {
@@ -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;