diff --git a/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java b/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java index 225f75dc19fb..113d97abb924 100644 --- a/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java +++ b/platform/platform-api/src/com/intellij/ui/components/DefaultScrollBarUI.java @@ -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; diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java index 457c387249df..e57fdefc308a 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java @@ -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; } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java index f6459e2b2efc..265b5fefb915 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -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())); + } } } }; diff --git a/platform/platform-impl/src/com/intellij/ui/AbstractExpandableItemsHandler.java b/platform/platform-impl/src/com/intellij/ui/AbstractExpandableItemsHandler.java index 456e4ccb7c01..d98d6774ee9d 100644 --- a/platform/platform-impl/src/com/intellij/ui/AbstractExpandableItemsHandler.java +++ b/platform/platform-impl/src/com/intellij/ui/AbstractExpandableItemsHandler.java @@ -86,7 +86,7 @@ public abstract class AbstractExpandableItemsHandler extends MouseAdapter implements MouseInputList event.isPopupTrigger(), event.getScrollType(), event.getScrollAmount(), - event.getWheelRotation()); + event.getWheelRotation(), + event.getPreciseWheelRotation()); } @NotNull @@ -139,4 +140,17 @@ public class MouseEventAdapter 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(); + } }