From e357d25feb5e8f6d46737f9a2d2537b101ceb822 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Tue, 13 Mar 2018 12:03:31 +0300 Subject: [PATCH] IDEA-185543 calculate preferred viewport size without scrollbars --- .../intellij/ui/components/JBScrollPane.java | 4 +-- .../intellij/ui/components/JBViewport.java | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 8 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 bfe0ad0d1b78..9a5b8a74fcad 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -691,9 +691,7 @@ public class JBScrollPane extends JScrollPane { Dimension viewPreferredSize = view.getPreferredSize(); if (viewPreferredSize == null) viewPreferredSize = new Dimension(); if (view instanceof JComponent && !view.isPreferredSizeSet()) { - Insets insets = JBViewport.getViewInsets((JComponent)view); - JBInsets.removeFrom(viewportExtentSize, insets); - JBInsets.removeFrom(viewPreferredSize, insets); + JBInsets.removeFrom(viewPreferredSize, JBViewport.getViewInsets((JComponent)view)); } result.width += viewportExtentSize.width; result.height += viewportExtentSize.height; diff --git a/platform/platform-api/src/com/intellij/ui/components/JBViewport.java b/platform/platform-api/src/com/intellij/ui/components/JBViewport.java index 1182ee35dce5..99dd9575ec78 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBViewport.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBViewport.java @@ -317,8 +317,16 @@ public class JBViewport extends JViewport implements ZoomableViewport { (view instanceof JList || view instanceof JTree || (!SystemInfo.isMac && ScrollSettings.isGapNeededForAnyComponent())); } - static Insets getViewInsets(JComponent view) { + private static Insets getInnerInsets(JComponent view) { + Border border = view.getBorder(); + if (border instanceof ViewBorder) { + ViewBorder vb = (ViewBorder)border; + border = vb.myBorder; + } + return border == null ? null : border.getBorderInsets(view); + } + static Insets getViewInsets(JComponent view) { Border border = view.getBorder(); if (border instanceof ViewBorder) { ViewBorder vb = (ViewBorder)border; @@ -515,9 +523,17 @@ public class JBViewport extends JViewport implements ZoomableViewport { if (view instanceof JList) return getPreferredScrollableViewportSize((JList)view); if (view instanceof JTree) return getPreferredScrollableViewportSize((JTree)view); if (view instanceof Scrollable) return ((Scrollable)view).getPreferredScrollableViewportSize(); + if (view instanceof JComponent) return getPreferredSizeWithoutScrollBars((JComponent)view); return view == null ? null : view.getPreferredSize(); } + private static Dimension getPreferredSizeWithoutScrollBars(@NotNull JComponent view) { + Dimension size = view.getPreferredSize(); + if (size == null) return new Dimension(); + JBInsets.removeFrom(size, getViewInsets(view)); + return size; + } + private static Class getPreferredScrollableViewportSizeDeclaringClass(@NotNull Scrollable scrollable) { try { return scrollable.getClass().getMethod("getPreferredScrollableViewportSize").getDeclaringClass(); @@ -531,7 +547,7 @@ public class JBViewport extends JViewport implements ZoomableViewport { if (JList.class != getPreferredScrollableViewportSizeDeclaringClass(list)) { return list.getPreferredScrollableViewportSize(); // may be null } - Dimension size = list.getPreferredSize(); + Dimension size = getPreferredSizeWithoutScrollBars(list); if (size == null) return new Dimension(); if (JList.VERTICAL != list.getLayoutOrientation()) return size; @@ -550,7 +566,7 @@ public class JBViewport extends JViewport implements ZoomableViewport { if (visibleRows <= 0) visibleRows = Registry.intValue("ide.preferred.scrollable.viewport.visible.rows"); boolean addExtraSpace = 0 < visibleRows && visibleRows < modelRows && Registry.is("ide.preferred.scrollable.viewport.extra.space"); - Insets insets = list.getInsets(); + Insets insets = getInnerInsets(list); size.height = insets != null ? insets.top + insets.bottom : 0; if (0 < fixedWidth && 0 < fixedHeight) { size.width = insets != null ? insets.left + insets.right + fixedWidth : fixedWidth; @@ -576,7 +592,7 @@ public class JBViewport extends JViewport implements ZoomableViewport { if (JTree.class != getPreferredScrollableViewportSizeDeclaringClass(tree)) { return tree.getPreferredScrollableViewportSize(); // may be null } - Dimension size = tree.getPreferredSize(); + Dimension size = getPreferredSizeWithoutScrollBars(tree); if (size == null) return new Dimension(); int fixedHeight = tree.getRowHeight(); @@ -590,7 +606,7 @@ public class JBViewport extends JViewport implements ZoomableViewport { if (visibleRows <= 0) visibleRows = Registry.intValue("ide.preferred.scrollable.viewport.visible.rows"); boolean addExtraSpace = Registry.is("ide.preferred.scrollable.viewport.extra.space"); - Insets insets = tree.getInsets(); + Insets insets = getInnerInsets(tree); size.height = insets != null ? insets.top + insets.bottom : 0; if (0 < fixedHeight) { size.height += fixedHeight * visibleRows;