changeset 47528:9d50dded1d47

8004029: [macosx] The long Tab titles are not clipped with dots at the end. Reviewed-by: serb, psadhukhan Contributed-by: shashidhara.veerabhadraiah@oracle.com
author aghaisas
date Wed, 04 Oct 2017 15:10:08 +0530
parents 9d5b6fa13d83
children 10308d488b27
files src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.html test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java
diffstat 3 files changed, 202 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java	Thu Sep 28 11:27:56 2017 -0700
+++ b/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneUI.java	Wed Oct 04 15:10:08 2017 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2017, 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
@@ -330,7 +330,9 @@
 
         // not for the scrolling tabs
         if (component == null && tabIndex >= 0) {
-            paintTitle(g2d, font, metrics, textRect, tabIndex, title);
+            String clippedTitle = SwingUtilities2.clipStringIfNecessary(tabPane, metrics,
+                    title, textRect.width);
+            paintTitle(g2d, font, metrics, textRect, tabIndex, clippedTitle);
         }
 
         if (icon != null) {
--- a/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.html	Thu Sep 28 11:27:56 2017 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<!--
- Copyright (c) 2012, 2013, 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.
--->
-
-<html>
-<body>
-<applet  code="bug4310381.class" width=150 height=150></applet>
-Observe that long Tab titles are clipped with dots at the end
-</body>
-</html> 
--- a/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java	Thu Sep 28 11:27:56 2017 -0700
+++ b/test/jdk/javax/swing/JTabbedPane/4310381/bug4310381.java	Wed Oct 04 15:10:08 2017 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, 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
@@ -27,57 +27,224 @@
 
 /*
  * @test
- * @bug 4310381 8075918
+ * @bug 4310381 8075918 8004029
  * @summary Text in multi-row/col JTabbedPane tabs can be truncated/clipped
- * @author Charles Lee
-   @run applet/manual=yesno bug4310381.html
+   @run main/manual bug4310381
  */
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import java.awt.Insets;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.CountDownLatch;
+import javax.swing.JTabbedPane;
+import javax.swing.JLabel;
+import java.awt.Dimension;
 
+public class bug4310381 {
+    private static TestUI test = null;
+    private static JFrame frame = null;
+    private static JTabbedPane tab = null;
+    private static JPanel panel = null;
+    private static CountDownLatch testLatch = null;
 
-import javax.swing.*;
-import java.awt.*;
-import java.lang.reflect.InvocationTargetException;
+    private static void init() {
+        frame = new JFrame();
+        tab = new JTabbedPane();
+        panel = new JPanel();
+        createContentPane();
+        tab.setTabPlacement(JTabbedPane.TOP);
+        tab.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
+        frame.setMinimumSize(new Dimension(100, 200));
+    }
 
-public class bug4310381 extends JApplet {
     public static void main(String[] args) throws Exception {
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                JFrame frame = new JFrame();
+        testLatch = new CountDownLatch(1);
+        test = new TestUI(testLatch);
 
-                frame.setContentPane(createContentPane());
-                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
-                frame.setSize(150, 200);
-                frame.setLocationRelativeTo(null);
+        // initialize the test UI system
+        SwingUtilities.invokeAndWait(() -> {
+            try {
+                test.createUI();
+            } catch (Exception ex) {
+                throw new RuntimeException("Exception while creating UI");
+            }
+        });
 
-                frame.setVisible(true);
+        // update the laf
+        for(UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
+            // set laf and create the frame and its sub components
+            setLookAndFeel(laf);
 
+            // update and show UI
+            SwingUtilities.invokeAndWait(() -> {
+                init();
+                frame.setTitle(laf.getClassName());
+                showUI();
+            });
+
+            final CountDownLatch latch = new CountDownLatch(1);
+            if(!latch.await(10, TimeUnit.SECONDS)) {
+                frame.setVisible(false);
+            }
+
+            // disposing the frame
+            SwingUtilities.invokeAndWait(() -> {
+                frame.dispose();
+            });
+        }
+
+        boolean status = testLatch.await(1, TimeUnit.MINUTES);
+        if (!status) {
+            System.out.println("Test timed out.");
+        }
+
+        if (test.testResult == false) {
+            disposeUI();
+            throw new RuntimeException("Test Failed.");
+        }
+    }
+
+    public static void disposeUI() throws Exception {
+        SwingUtilities.invokeAndWait(() -> {
+            if(test != null) {
+                test.disposeUI();
             }
         });
     }
 
-    @Override
-    public void init() {
+    static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) throws Exception {
         try {
-            SwingUtilities.invokeAndWait(new Runnable() {
-                @Override
-                public void run() {
-                    setContentPane(createContentPane());
-                }
-            });
-        } catch (InterruptedException | InvocationTargetException e) {
+            UIManager.setLookAndFeel(laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException |
+                UnsupportedLookAndFeelException | IllegalAccessException e) {
+            disposeUI();
             throw new RuntimeException(e);
         }
     }
 
-    private static Container createContentPane() {
-        JTabbedPane tab = new JTabbedPane();
+    public static void showUI() {
+        frame.getContentPane().add(tab);
+        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        frame.setLocationRelativeTo(null);
+        frame.setPreferredSize(new Dimension(100, 200));
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+    private static void createContentPane() {
         String a2z = "abcdefghijklmnopqrstuvwxyz";
 
-        tab.addTab("0" + a2z + a2z, new JLabel("0"));
+        tab.addTab("0" + a2z + a2z, new JLabel((UIManager.getLookAndFeel())
+                        .getName() + " Look and Feel"));
         tab.addTab("1" + a2z, new JLabel("1" + a2z));
         tab.addTab("2" + a2z, new JLabel("2" + a2z));
-        tab.addTab("3", new JLabel("3" + a2z)); // The last tab in Metal isn't truncated, that's ok
-
-        return tab;
+        tab.addTab("3", new JPanel()); // The last tab in Metal isn't truncated, that's ok
     }
 }
+
+class TestUI {
+
+    private static JFrame mainFrame;
+    private static JPanel mainControlPanel;
+
+    private static JTextArea instructionTextArea;
+
+    private static JPanel resultButtonPanel;
+    private static JButton passButton;
+    private static JButton failButton;
+
+    private GridBagConstraints gbc;
+    private static GridBagLayout layout;
+    private final CountDownLatch latch;
+    public boolean testResult = false;
+
+    public TestUI(CountDownLatch latch) {
+        this.latch = latch;
+    }
+
+    public final void createUI() throws Exception {
+        mainFrame = new JFrame();
+
+        layout = new GridBagLayout();
+        mainControlPanel = new JPanel(layout);
+        resultButtonPanel = new JPanel(layout);
+
+        gbc = new GridBagConstraints();
+
+        // Create Test instructions
+        String instructions
+            = "See for different look and feel tabbed panes titles \n"
+            + "   contain three dots(...) at the end if the pane size \n"
+            + "   cannot accommadate the title completely.\n"
+            + "If yes, click on 'pass' else click on 'fail'\n";
+
+        instructionTextArea = new JTextArea();
+        instructionTextArea.setText(instructions);
+        instructionTextArea.setEditable(false);
+        instructionTextArea.setBorder(BorderFactory.
+                createTitledBorder("Test Instructions"));
+
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        mainControlPanel.add(instructionTextArea, gbc);
+
+        // Add customization to this test ui
+        customize();
+
+        // Create resultButtonPanel with Pass, Fail buttons
+        passButton = new JButton("Pass");
+        passButton.setActionCommand("Pass");
+        passButton.addActionListener((ActionEvent e) -> {
+            System.out.println("Pass Button pressed!");
+            testResult = true;
+            latch.countDown();
+            disposeUI();
+        });
+
+        failButton = new JButton("Fail");
+        failButton.setActionCommand("Fail");
+        failButton.addActionListener((ActionEvent e) -> {
+            System.out.println("Fail Button pressed!");
+            testResult = false;
+            latch.countDown();
+            disposeUI();
+        });
+
+        gbc.gridx = 0;
+        gbc.gridy = 0;
+        resultButtonPanel.add(passButton, gbc);
+
+        gbc.gridx = 1;
+        gbc.gridy = 0;
+        resultButtonPanel.add(failButton, gbc);
+
+        gbc.gridx = 0;
+        gbc.gridy = 2;
+        mainControlPanel.add(resultButtonPanel, gbc);
+
+        mainFrame.add(mainControlPanel);
+        mainFrame.pack();
+        mainFrame.setVisible(true);
+    }
+
+    public void disposeUI() {
+        mainFrame.dispose();
+    }
+
+    private void customize() throws Exception {
+        // Customize the test UI title
+        mainFrame.setTitle("Tabbed Pane Title Test");
+   }
+}
\ No newline at end of file