in PluginsAndFeatures/azure-toolkit-for-intellij/azure-intellij-plugin-lib/src/main/java/com/microsoft/azure/toolkit/intellij/common/component/TreeUtils.java [115:181]
public static void installMouseListener(@Nonnull JTree tree) {
tree.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
final Tree.TreeNode<?> node = getTreeNodeAtMouse(tree, e);
final boolean isMouseAtActionIcon = getHoverInlineActionIndex(tree, e, Optional.ofNullable(node)
.map(Tree.TreeNode::getInlineActionViews).map(List::size).orElse(0)) > -1;
final Cursor cursor = isMouseAtActionIcon ? Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) : Cursor.getDefaultCursor();
tree.setCursor(cursor);
}
});
final MouseAdapter popupHandler = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
final Object n = tree.getLastSelectedPathComponent();
if (n instanceof Tree.TreeNode) {
final Tree.TreeNode<?> node = (Tree.TreeNode<?>) n;
clickNode(e, node);
} else if (n instanceof Tree.LoadMoreNode && SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
((Tree.LoadMoreNode) n).load();
}
super.mouseClicked(e);
}
@AzureOperation(name = "user/$resource.click_node.resource", params = {"node.inner.getValue()"}, source = "node.inner.getValue()")
private static void clickNode(final MouseEvent e, final Tree.TreeNode<?> node) {
final JTree tree = node.tree;
String place = TreeUtils.getPlace(tree) + "." + (TreeUtils.underAppGroups(node) ? "app" : "type");
if (SwingUtilities.isRightMouseButton(e) || e.isPopupTrigger()) {
final IActionGroup actions = node.inner.getActions();
if (Objects.nonNull(actions)) {
final ActionManager am = ActionManager.getInstance();
final IntellijAzureActionManager.ActionGroupWrapper group = toIntellijActionGroup(actions);
place += ".menu";
final ActionPopupMenu menu = am.createActionPopupMenu(place, group);
menu.setTargetComponent(tree);
final JPopupMenu popupMenu = menu.getComponent();
popupMenu.show(tree, e.getX(), e.getY());
}
} else {
final DataContext context = DataManager.getInstance().getDataContext(tree);
place += ".node";
final AnActionEvent event = AnActionEvent.createFromAnAction(new EmptyAction(), e, place, context);
if (e.getClickCount() == 1) {
node.inner.click(event);
} else if (e.getClickCount() == 2) {
node.inner.doubleClick(event);
}
}
}
@Override
public void mousePressed(MouseEvent e) {
final Tree.TreeNode<?> node = getTreeNodeAtMouse(tree, e);
final List<IView.Label> inlineActionViews = Optional.ofNullable(node)
.map(Tree.TreeNode::getInlineActionViews).orElse(new ArrayList<>());
final int inlineActionIndex = getHoverInlineActionIndex(tree, e, inlineActionViews.size());
if (Objects.nonNull(node) && e.getClickCount() == 1 && inlineActionIndex > -1) {
final String place = TreeUtils.getPlace(tree) + "." + (TreeUtils.underAppGroups(node) ? "app" : "type") + ".inline";
final DataContext context = DataManager.getInstance().getDataContext(tree);
final AnActionEvent event = AnActionEvent.createFromAnAction(new EmptyAction(), e, place, context);
node.inner.triggerInlineAction(event, inlineActionIndex, TreeUtils.getPlace(tree));
}
}
};
tree.addMouseListener(popupHandler);
}