process mouse wheel event by parent scroll pane if it is not processed by a scroll pane

This commit is contained in:
Sergey Malenkov
2019-03-12 21:24:44 +03:00
parent 8e27e49c79
commit 20e10ee0d8
5 changed files with 25 additions and 3 deletions
@@ -406,7 +406,7 @@ class DefaultScrollBarUI extends ScrollBarUI {
Point point = event.getLocationOnScreen();
SwingUtilities.convertPointFromScreen(point, view);
Component target = SwingUtilities.getDeepestComponentAt(view, point.x, point.y);
if (target != null) target.dispatchEvent(MouseEventAdapter.convert(event, target));
MouseEventAdapter.redispatch(event, target);
}
}
return true;
@@ -243,6 +243,9 @@ public class JBScrollBar extends JScrollBar implements TopComponent, Interpolabl
setValue(value + valueAdjusted);
}
}
else if (delta != 0.0) {
return true; // do not consume event if it can be processed by parent component
}
event.consume();
return true;
}
@@ -9,6 +9,7 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.ReflectionUtil;
import com.intellij.util.ui.ButtonlessScrollBarUI;
import com.intellij.util.ui.JBInsets;
import com.intellij.util.ui.MouseEventAdapter;
import com.intellij.util.ui.RegionPainter;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
@@ -177,6 +178,10 @@ public class JBScrollPane extends JScrollPane {
}
}
}
if (!event.isConsumed()) {
// try to process a mouse wheel event by outer scroll pane
MouseEventAdapter.redispatch(event, UIUtil.getParentOfType(JScrollPane.class, pane.getParent()));
}
}
}
};
@@ -86,7 +86,7 @@ public abstract class AbstractExpandableItemsHandler<KeyType, ComponentType exte
MouseEventHandler dispatcher = new MouseEventHandler() {
@Override
protected void handle(MouseEvent event) {
myComponent.dispatchEvent(MouseEventAdapter.convert(event, myComponent));
MouseEventAdapter.redispatch(event, myComponent);
}
@Override
@@ -128,7 +128,8 @@ public class MouseEventAdapter<T> extends MouseAdapter implements MouseInputList
event.isPopupTrigger(),
event.getScrollType(),
event.getScrollAmount(),
event.getWheelRotation());
event.getWheelRotation(),
event.getPreciseWheelRotation());
}
@NotNull
@@ -139,4 +140,17 @@ public class MouseEventAdapter<T> extends MouseAdapter implements MouseInputList
event.getPath(),
event.getMenuSelectionManager());
}
private static boolean dispatch(Component component, @NotNull MouseEvent event) {
component.dispatchEvent(event);
return event.isConsumed();
}
public static void redispatch(@NotNull MouseEvent event, Component source) {
if (source != null && dispatch(source, convert(event, source))) event.consume();
}
public static void redispatch(@NotNull MouseEvent event, Component source, int x, int y) {
if (source != null && dispatch(source, convert(event, source, x, y))) event.consume();
}
}