diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java index c7b70a061318..c7a5167c10e3 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTree.java @@ -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 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 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() { diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeRenderer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeRenderer.java index 403eb58dbbd5..27635cfb0a0c 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeRenderer.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/ui/tree/XDebuggerTreeRenderer.java @@ -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;