diff --git a/platform/lang-api/src/com/intellij/execution/dashboard/hyperlink/RunDashboardHyperlinkComponent.java b/platform/lang-api/src/com/intellij/execution/dashboard/hyperlink/RunDashboardHyperlinkComponent.java index 2faf4a1330ff..6319e50ae8c0 100644 --- a/platform/lang-api/src/com/intellij/execution/dashboard/hyperlink/RunDashboardHyperlinkComponent.java +++ b/platform/lang-api/src/com/intellij/execution/dashboard/hyperlink/RunDashboardHyperlinkComponent.java @@ -15,6 +15,7 @@ */ package com.intellij.execution.dashboard.hyperlink; +import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; import java.awt.event.MouseEvent; @@ -25,6 +26,8 @@ import java.awt.event.MouseEvent; * @author Konstantin Aleev */ public interface RunDashboardHyperlinkComponent { + Key AIMED_OBJECT = Key.create("RunDashboardAimedObject") ; + void onClick(@NotNull MouseEvent event); void setAimed(boolean aimed); diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardLinkMouseListenerBase.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardLinkMouseListenerBase.java index 813f3048a949..62960d987660 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardLinkMouseListenerBase.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardLinkMouseListenerBase.java @@ -16,11 +16,13 @@ package com.intellij.execution.dashboard.tree; import com.intellij.execution.dashboard.hyperlink.RunDashboardHyperlinkComponent; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vcs.changes.issueLinks.LinkMouseListenerBase; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -57,11 +59,24 @@ public abstract class RunDashboardLinkMouseListenerBase extends LinkMouseListene } } + if (component instanceof JComponent) { + Object oldValue = UIUtil.getClientProperty(component, RunDashboardHyperlinkComponent.AIMED_OBJECT); + Object newValue = getAimedObject(e); + if (!Comparing.equal(oldValue, newValue)) { + shouldRepaint = true; + UIUtil.putClientProperty((JComponent)component, RunDashboardHyperlinkComponent.AIMED_OBJECT, newValue); + } + } + if (shouldRepaint) { repaintComponent(e); } } + protected Object getAimedObject(MouseEvent e) { + return null; + } + protected abstract void repaintComponent(MouseEvent e); @Override diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeMouseListener.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeMouseListener.java index 1da49f8ce9e7..33ccddd12e69 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeMouseListener.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunDashboardTreeMouseListener.java @@ -18,10 +18,12 @@ package com.intellij.execution.dashboard.tree; import com.intellij.execution.dashboard.hyperlink.RunDashboardHyperlinkComponent; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.treeStructure.Tree; +import com.intellij.util.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; @@ -38,12 +40,28 @@ public class RunDashboardTreeMouseListener extends RunDashboardLinkMouseListener myTree = tree; } + @Override + protected Object getAimedObject(MouseEvent e) { + Object aimedObject = null; + final TreePath path = myTree.getPathForLocation(e.getX(), e.getY()); + if (path != null) { + DefaultMutableTreeNode treeNode = ObjectUtils.tryCast(path.getLastPathComponent(), DefaultMutableTreeNode.class); + if (treeNode != null) { + aimedObject = treeNode.getUserObject(); + } + } + return aimedObject; + } + protected void repaintComponent(MouseEvent e) { final TreePath path = myTree.getPathForLocation(e.getX(), e.getY()); if (path != null) { final TreeNode treeNode = (TreeNode)path.getLastPathComponent(); - // Invoke nodeChanged() in order to repaint ExpandableItemsHandler's tooltip component. - ((DefaultTreeModel)myTree.getModel()).nodeChanged(treeNode); + DefaultTreeModel treeModel = ObjectUtils.tryCast(myTree.getModel(), DefaultTreeModel.class); + if (treeModel != null) { + // Invoke nodeChanged() in order to repaint ExpandableItemsHandler's tooltip component. + treeModel.nodeChanged(treeNode); + } } // Repaint all tree since nodes which cursor just leaved should be repaint too. @@ -65,7 +83,7 @@ public class RunDashboardTreeMouseListener extends RunDashboardLinkMouseListener Object tag = null; - Component component = myTree.getCellRenderer().getTreeCellRendererComponent(myTree, treeNode, false, false, treeNode.isLeaf(), row, true); + Component component = myTree.getCellRenderer().getTreeCellRendererComponent(myTree, treeNode, true, false, treeNode.isLeaf(), row, true); if (component instanceof ColoredTreeCellRenderer) { tag = ((ColoredTreeCellRenderer)component).getFragmentTagAt(dx); }