8015748: [macosx] JProgressbar with Aqua LaF ignores JProgressbar#applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT) call.
authoraniyogi
Wed, 20 Jan 2016 16:57:53 +0530
changeset 35681 9041be6531c4
parent 35680 6996d5f48225
child 35682 5861cf47d8c4
8015748: [macosx] JProgressbar with Aqua LaF ignores JProgressbar#applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT) call. Reviewed-by: rchamyal, alexsch
jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java
jdk/test/javax/swing/JProgressBar/8015748/JProgressBarOrientationRobotTest.java
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java	Tue Jan 19 15:23:49 2016 +0530
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaProgressBarUI.java	Wed Jan 20 16:57:53 2016 +0530
@@ -180,10 +180,19 @@
         final int width = progressBar.getWidth() - (i.right + i.left);
         final int height = progressBar.getHeight() - (i.bottom + i.top);
 
+        Graphics2D g2 = (Graphics2D) g;
+        final AffineTransform savedAT = g2.getTransform();
+        if (!progressBar.getComponentOrientation().isLeftToRight()) {
+            //Scale operation: Flips component about pivot
+            //Translate operation: Moves component back into original position
+            g2.scale(-1, 1);
+            g2.translate(-progressBar.getWidth(), 0);
+        }
         painter.paint(g, progressBar, i.left, i.top, width, height);
 
+        g2.setTransform(savedAT);
         if (progressBar.isStringPainted() && !progressBar.isIndeterminate()) {
-            paintString(g, i.left, i.top, width, height);
+                paintString(g, i.left, i.top, width, height);
         }
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JProgressBar/8015748/JProgressBarOrientationRobotTest.java	Wed Jan 20 16:57:53 2016 +0530
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2015, 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 8015748
+ * @summary verifies ProgressBar RightToLeft orientations for all Look and Feels
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main JProgressBarOrientationRobotTest
+ */
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.Point;
+import java.awt.Robot;
+import javax.swing.JFrame;
+import javax.swing.JProgressBar;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class JProgressBarOrientationRobotTest {
+
+    private static JFrame frame;
+    private static JProgressBar progressBar;
+    private static Robot robot;
+    private static Color colorCenter;
+    private static Color colorLeft;
+    private static Color colorRight;
+    private static final int widthBuffer = 20;
+    private static volatile String errorString = "";
+
+    public static void main(String[] args) throws Exception {
+        robot = new Robot();
+        robot.waitForIdle();
+        UIManager.LookAndFeelInfo[] lookAndFeelArray
+                = UIManager.getInstalledLookAndFeels();
+        for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+            executeCase(lookAndFeelItem.getClassName(),
+                    lookAndFeelItem.getName());
+
+        }
+        if (!"".equals(errorString)) {
+            System.err.println(errorString);
+        }
+    }
+
+    private static void executeCase(String lookAndFeelString,
+            String shortenedLandFeelString) throws Exception {
+        if (tryLookAndFeel(lookAndFeelString)) {
+            createUI(shortenedLandFeelString);
+            robot.waitForIdle();
+
+            createLTR();
+            robot.delay(1000);
+            runTestCase();
+            robot.delay(1000);
+            testCaseLTR(shortenedLandFeelString);
+            robot.delay(1000);
+
+            createRTL();
+            robot.delay(1000);
+            runTestCase();
+            robot.delay(1000);
+            testCaseRTL(shortenedLandFeelString);
+            robot.delay(1000);
+
+            cleanUp();
+        }
+
+    }
+
+    private static void createUI(final String shortenedLookAndFeelString)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                progressBar = new JProgressBar();
+                progressBar.setValue(30);
+                frame = new JFrame(shortenedLookAndFeelString);
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.getContentPane().add(progressBar);
+                frame.pack();
+                frame.setSize(500, frame.getSize().height);
+                frame.setLocationRelativeTo(null);
+                frame.setVisible(true);
+                frame.toFront();
+            }
+        });
+    }
+
+    private static void createLTR()
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                progressBar.applyComponentOrientation(
+                        ComponentOrientation.LEFT_TO_RIGHT);
+                progressBar.repaint();
+            }
+        });
+    }
+
+    private static void createRTL()
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                progressBar.applyComponentOrientation(
+                        ComponentOrientation.RIGHT_TO_LEFT);
+                progressBar.repaint();
+            }
+        });
+    }
+
+    private static void runTestCase() throws Exception {
+        Point centerPoint = Util.getCenterPoint(progressBar);
+        colorCenter = robot.getPixelColor(centerPoint.x, centerPoint.y);
+        colorRight = robot.getPixelColor(
+                (centerPoint.x + progressBar.getWidth() / 2 - widthBuffer),
+                centerPoint.y);
+        colorLeft = robot.getPixelColor(
+                (centerPoint.x - progressBar.getWidth() / 2 + widthBuffer),
+                centerPoint.y);
+        robot.waitForIdle();
+    }
+
+    private static void testCaseLTR(String shortenedLookAndFeelString)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+
+                if (colorCenter.equals(colorRight)) {
+                    if (!colorCenter.equals(colorLeft)) {
+                        System.out.println("[" + shortenedLookAndFeelString
+                                + "]: LTR orientation test passed");
+                    }
+                } else {
+                    frame.dispose();
+                    String error = "[" + shortenedLookAndFeelString
+                            + "]: [Error]: LTR orientation test failed";
+                    errorString += error;
+                    System.err.println(error);
+                }
+            }
+        });
+
+    }
+
+    private static void testCaseRTL(String shortenedLookAndFeelString)
+            throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                if (colorCenter.equals(colorLeft)) {
+                    if (!colorCenter.equals(colorRight)) {
+                        System.out.println("[" + shortenedLookAndFeelString
+                                + "]: RTL orientation test passed");
+                    }
+                } else {
+                    frame.dispose();
+                    String error = "[" + shortenedLookAndFeelString
+                            + "]: [Error]: LTR orientation test failed";
+                    errorString += error;
+                    System.err.println(error);
+                }
+            }
+        });
+    }
+
+    private static void cleanUp() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                frame.dispose();
+            }
+        });
+    }
+
+    private static boolean tryLookAndFeel(String lookAndFeelString)
+            throws Exception {
+        try {
+            UIManager.setLookAndFeel(
+                    lookAndFeelString);
+
+        } catch (UnsupportedLookAndFeelException
+                | ClassNotFoundException
+                | InstantiationException
+                | IllegalAccessException e) {
+            errorString += e.getMessage() + "\n";
+            System.err.println("[Exception]: " + e.getMessage());
+            return false;
+        }
+        return true;
+    }
+}