RunDashboard: support node links

- Store aimed object as component client property.
This commit is contained in:
Konstantin Aleev
2017-09-12 18:00:49 +03:00
parent 8e5371cd83
commit 212f5ddc86
3 changed files with 39 additions and 3 deletions
@@ -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<Object> AIMED_OBJECT = Key.create("RunDashboardAimedObject") ;
void onClick(@NotNull MouseEvent event);
void setAimed(boolean aimed);
@@ -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
@@ -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);
}