# HG changeset patch # User aniyogi # Date 1459850833 -19800 # Node ID 89696d7ce3345e6e3ab73a82c900437afaff5727 # Parent 522133edaec6c04d6e95e49d39353b4b75cfb309 8137169: [macosx] Incorrect minimal heigh of JTabbedPane with more tabs Reviewed-by: rchamyal, alexsch diff -r 522133edaec6 -r 89696d7ce334 jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Tue Apr 05 14:52:31 2016 +0530 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Tue Apr 05 15:37:13 2016 +0530 @@ -2183,50 +2183,21 @@ } protected int preferredTabAreaHeight(final int tabPlacement, final int width) { - final FontMetrics metrics = getFontMetrics(); final int tabCount = tabPane.getTabCount(); int total = 0; if (tabCount > 0) { - int rows = 1; - int x = 0; - final int maxTabHeight = calculateMaxTabHeight(tabPlacement); - - for (int i = 0; i < tabCount; i++) { - final int tabWidth = calculateTabWidth(tabPlacement, i, metrics); - - if (x != 0 && x + tabWidth > width) { - rows++; - x = 0; - } - x += tabWidth; - } - total = calculateTabAreaHeight(tabPlacement, rows, maxTabHeight); + total = calculateTabAreaHeight(tabPlacement, 1, maxTabHeight); } return total; } protected int preferredTabAreaWidth(final int tabPlacement, final int height) { - final FontMetrics metrics = getFontMetrics(); final int tabCount = tabPane.getTabCount(); int total = 0; if (tabCount > 0) { - int columns = 1; - int y = 0; - final int fontHeight = metrics.getHeight(); - maxTabWidth = calculateMaxTabWidth(tabPlacement); - - for (int i = 0; i < tabCount; i++) { - final int tabHeight = calculateTabHeight(tabPlacement, i, fontHeight); - - if (y != 0 && y + tabHeight > height) { - columns++; - y = 0; - } - y += tabHeight; - } - total = calculateTabAreaWidth(tabPlacement, columns, maxTabWidth); + total = calculateTabAreaWidth(tabPlacement, 1, maxTabWidth); } return total; } diff -r 522133edaec6 -r 89696d7ce334 jdk/test/javax/swing/JTabbedPane/8137169/ScrollableTabbedPaneTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTabbedPane/8137169/ScrollableTabbedPaneTest.java Tue Apr 05 15:37:13 2016 +0530 @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8137169 + * @summary verifies TabbedScrollPane minimum height for all Look and Feels + * @library ../../regtesthelpers + * @build Util + * @run main ScrollableTabbedPaneTest + */ + +import java.awt.Robot; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class ScrollableTabbedPaneTest { + + private static JFrame frame; + private static JTabbedPane pane; + private static Robot robot; + private static volatile String errorString = ""; + + public static void main(String[] args) throws Exception { + robot = new Robot(); + robot.delay(1000); + UIManager.LookAndFeelInfo[] lookAndFeelArray + = UIManager.getInstalledLookAndFeels(); + for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) { + executeCase(lookAndFeelItem.getClassName(), + lookAndFeelItem.getName()); + } + if (!"".equals(errorString)) { + throw new RuntimeException("Error Log:\n" + errorString); + } + } + + private static void executeCase(String lookAndFeelString, String shortLAF) + throws Exception { + if (tryLookAndFeel(lookAndFeelString)) { + createUI(shortLAF); + stepsToExecute(shortLAF); + + createLeftUI(shortLAF); + stepsToExecute(shortLAF); + + createRightUI(shortLAF); + stepsToExecute(shortLAF); + } + } + + private static void stepsToExecute(String shortLAF) throws Exception { + robot.delay(100); + runTestCase(shortLAF); + robot.delay(1000); + cleanUp(); + robot.delay(1000); + } + + private static boolean tryLookAndFeel(String lookAndFeelString) + throws Exception { + try { + UIManager.setLookAndFeel( + lookAndFeelString); + + } catch (UnsupportedLookAndFeelException + | ClassNotFoundException + | InstantiationException + | IllegalAccessException e) { + return false; + } + return true; + } + + private static void cleanUp() throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frame.dispose(); + } + }); + } + + private static void createUI(final String shortLAF) + throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frame = new JFrame(shortLAF); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + pane = new JTabbedPane(); + pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + frame.add(pane); + frame.setSize(500, 500); + } + }); + } + private static void createLeftUI(final String shortLAF) + throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frame = new JFrame(shortLAF); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + pane = new JTabbedPane(); + pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + pane.setTabPlacement(SwingConstants.LEFT); + frame.add(pane); + frame.setSize(500, 500); + } + }); + } + + private static void createRightUI(final String shortLAF) + throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + frame = new JFrame(shortLAF); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + pane = new JTabbedPane(); + pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + pane.setTabPlacement(SwingConstants.RIGHT); + frame.add(pane); + frame.setSize(500, 500); + } + }); + } + + private static void runTestCase(String shortLAF) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + int i = 0; + int value= 0; + do { + String title = "Tab" + (i + 1); + pane.addTab(title, new JPanel()); + int tempValue = pane.getMinimumSize().height; + if(value==0) { + value = tempValue; + } + if(value != tempValue) { + String error = "[" + shortLAF + + "]: [Error]: TabbedScrollPane fails"; + errorString += error; + } + + ++i; + } while (i < 10); + } + }); + } +} +