From 398eca609f3bf458e1b175e5de712c46cf672996 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 17 Feb 2016 16:22:24 +0300 Subject: [PATCH] IDEA-151753 Scroll bar doesn't work in 'Pull Members Up/Down' refactoring dialogs call setComponentZOrder after layoutComponent to prevent missing some addNotify calls --- .../com/intellij/ui/components/JBScrollPane.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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 50238a183fb5..8b8f5e43a4a2 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -570,7 +570,6 @@ public class JBScrollPane extends JScrollPane { // so that if we don't ask after resetting the bounds we may have gotten the wrong answer. if (viewport != null) { viewport.setBounds(bounds); - pane.setComponentZOrder(viewport, pane.getComponentCount() - 1); if (scrollable != null && hsbOpaque && vsbOpaque) { viewTracksViewportWidth = scrollable.getScrollableTracksViewportWidth(); viewTracksViewportHeight = scrollable.getScrollableTracksViewportHeight(); @@ -655,7 +654,6 @@ public class JBScrollPane extends JScrollPane { int overlapY = !hsbOnTop ? 0 : overlapHeight; vsb.setBounds(vsbBounds.x, vsbBounds.y + overlapY, vsbBounds.width, vsbBounds.height - overlapHeight); vsb.putClientProperty(Alignment.class, vsbOnLeft ? Alignment.LEFT : Alignment.RIGHT); - pane.setComponentZOrder(vsb, 0); } // Modify the bounds of the translucent scroll bar. if (!vsbOpaque) { @@ -714,6 +712,20 @@ public class JBScrollPane extends JScrollPane { vsbOnLeft ? rowHeadBounds.width : vsbBounds.width, hsbOnTop ? hsbBounds.height : colHeadBounds.height); } + if (!vsbOpaque && vsbNeeded || !hsbOpaque && hsbNeeded) { + fixComponentZOrder(vsb, 0); + fixComponentZOrder(viewport, -1); + } + } + + private static void fixComponentZOrder(Component component, int index) { + if (component != null) { + Container parent = component.getParent(); + synchronized (parent.getTreeLock()) { + if (index < 0) index += parent.getComponentCount(); + parent.setComponentZOrder(component, index); + } + } } private void adjustForVSB(Rectangle bounds, Insets insets, Rectangle vsbBounds, boolean vsbOpaque, boolean vsbOnLeft) {