From 5ed32f3472ae107b875f8db91cb2c670d70e5bf0 Mon Sep 17 00:00:00 2001 From: Vassiliy Kudryashov Date: Mon, 6 May 2013 23:44:28 +0400 Subject: [PATCH] Fast expand/collapse with mouse is being recognized as double-click and trigger some selection-based actions wrongly. --- .../com/intellij/ui/DoubleClickListener.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ui/DoubleClickListener.java b/platform/platform-api/src/com/intellij/ui/DoubleClickListener.java index 048ab41ac5a4..54d66c334b94 100644 --- a/platform/platform-api/src/com/intellij/ui/DoubleClickListener.java +++ b/platform/platform-api/src/com/intellij/ui/DoubleClickListener.java @@ -19,13 +19,40 @@ */ package com.intellij.ui; +import javax.swing.*; +import javax.swing.plaf.basic.BasicTreeUI; +import javax.swing.tree.TreePath; import java.awt.event.MouseEvent; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; public abstract class DoubleClickListener extends ClickListener { @Override public final boolean onClick(MouseEvent event, int clickCount) { if (clickCount == 2 && event.getButton() == MouseEvent.BUTTON1) { - return onDoubleClick(event); + return isExpandIconClick(event) ? false : onDoubleClick(event); + } + return false; + } + + private static boolean isExpandIconClick(MouseEvent event) { + if (event.getComponent() instanceof JTree) { + JTree tree = (JTree)event.getComponent(); + TreePath treePath = tree.getClosestPathForLocation(event.getX(), event.getY()); + if (treePath == null || !(tree.getUI() instanceof BasicTreeUI)) return false; + BasicTreeUI ui = (BasicTreeUI)tree.getUI(); + try { + Method method = BasicTreeUI.class.getDeclaredMethod("isLocationInExpandControl", TreePath.class, Integer.TYPE, Integer.TYPE); + method.setAccessible(true); + Object result = method.invoke(ui, treePath, event.getX(), event.getY()); + if (result instanceof Boolean && result.equals(Boolean.TRUE)) return true; + } + catch (NoSuchMethodException e) { + } + catch (InvocationTargetException e) { + } + catch (IllegalAccessException e) { + } } return false; }