8016665: [macosx] JComponent behaviour doesn't comply API documentation (setComponentOrientation method), Aqua LAF
authoraniyogi
Mon, 18 Jan 2016 14:27:12 +0530
changeset 35675 1c5ad1244124
parent 35674 8ac51e1179da
child 35676 6833f789a32d
8016665: [macosx] JComponent behaviour doesn't comply API documentation (setComponentOrientation method), Aqua LAF Reviewed-by: serb, alexsch
jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java
jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java	Mon Jan 18 14:20:39 2016 +0530
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java	Mon Jan 18 14:27:12 2016 +0530
@@ -26,6 +26,7 @@
 package com.apple.laf;
 
 
+import java.awt.ComponentOrientation;
 import java.beans.*;
 import java.io.File;
 import java.util.*;
@@ -85,6 +86,15 @@
         } else if (prop == JFileChooser.FILE_SELECTION_MODE_CHANGED_PROPERTY) {
             invalidateFileCache();
             validateFileCache();
+        } else if (prop.equals("componentOrientation")) {
+            ComponentOrientation o = (ComponentOrientation) e.getNewValue();
+            JFileChooser cc = (JFileChooser) e.getSource();
+            if (o != e.getOldValue()) {
+                cc.applyComponentOrientation(o);
+            }
+            fFileList.setComponentOrientation(o);
+            fFileList.getParent().getParent().setComponentOrientation(o);
+
         }
         if (prop == SORT_BY_CHANGED) {// $ Ought to just resort
             fSortNames = (((Integer)e.getNewValue()).intValue() == 0);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java	Mon Jan 18 14:27:12 2016 +0530
@@ -0,0 +1,253 @@
+/*
+ * 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 8016665
+ * @summary verifies different behaviour of JFileChooser changing orientation
+ * @run main JFileChooserOrientation
+ */
+import java.awt.Color;
+import java.awt.ComponentOrientation;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+public class JFileChooserOrientation {
+
+    private static JFrame frame;
+    private static GridBagLayout layout;
+    private static JPanel panel;
+    private static JPanel lookAndFeelPanel;
+    private static JPanel orientationPanel;
+    private static JPanel passFailPanel;
+    private static JTextArea instructionsTextArea;
+    private static JLabel lookAndFeelLabel;
+    private static JLabel orientationLabel;
+    private static JComboBox lookAndFeelComboBox;
+    private static JComboBox orientationComboBox;
+
+    private static JButton fileChooserButton;
+    private static JButton passButton;
+    private static JButton failButton;
+    private static JFileChooser openChooser;
+    private static UIManager.LookAndFeelInfo[] lookAndFeelArray;
+
+    private static final String orientationLTR = " Left to Right";
+    private static final String orientationRTL = " Right to Left";
+    private static final String fileChooserString = "Show File Chooser";
+
+    public static void main(String[] args) throws Exception {
+        createManualTestUI();
+    }
+
+    private static void createManualTestUI() throws Exception {
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                layout = new GridBagLayout();
+                GridBagConstraints gbc = new GridBagConstraints();
+                panel = new JPanel(layout);
+                gbc.fill = GridBagConstraints.HORIZONTAL;
+                gbc.gridx = 0;
+                gbc.gridy = 0;
+                instructionsTextArea = new JTextArea();
+                String instructions
+                        = "1) Select Look and feel from combobox"
+                        + "\n2) Select component orientation"
+                        + "\n3) Click on \"Show File Chooser\""
+                        + "\n4) Check if orientation is as selected"
+                        + "\n5) Press \"Cancel\" on the File Chooser Dialog"
+                        + "\n\n Perform steps 1- 4 for all LAFs & orientations"
+                        + "\n If all are correct press Pass or else press Fail";
+                instructionsTextArea.setText(instructions);
+                instructionsTextArea.setBorder(
+                        BorderFactory.createLineBorder(Color.black));
+                panel.add(instructionsTextArea, gbc);
+
+                lookAndFeelPanel = new JPanel();
+                lookAndFeelPanel.setBorder(
+                        BorderFactory.createLineBorder(Color.black));
+                lookAndFeelLabel = new JLabel("Look And Feel: ");
+                gbc.gridx = 0;
+                gbc.gridy = 0;
+                lookAndFeelPanel.add(lookAndFeelLabel, gbc);
+
+                lookAndFeelComboBox = new JComboBox();
+                lookAndFeelArray = UIManager.getInstalledLookAndFeels();
+                for (UIManager.LookAndFeelInfo lookAndFeelItem
+                        : lookAndFeelArray) {
+                    lookAndFeelComboBox.addItem(lookAndFeelItem.getClassName());
+                }
+                gbc.gridx = 1;
+                gbc.gridy = 0;
+                lookAndFeelPanel.add(lookAndFeelComboBox, gbc);
+                gbc.gridx = 0;
+                gbc.gridy = 1;
+                panel.add(lookAndFeelPanel, gbc);
+
+                orientationPanel = new JPanel();
+                orientationPanel.setBorder(
+                        BorderFactory.createLineBorder(Color.black));
+                orientationLabel = new JLabel("Orientation: ");
+                gbc.gridx = 0;
+                gbc.gridy = 0;
+                orientationPanel.add(orientationLabel, gbc);
+
+                orientationComboBox = new JComboBox();
+                orientationComboBox.addItem(orientationLTR);
+                orientationComboBox.addItem(orientationRTL);
+                gbc.gridx = 1;
+                gbc.gridy = 0;
+                orientationPanel.add(orientationComboBox, gbc);
+                gbc.gridx = 0;
+                gbc.gridy = 2;
+                panel.add(orientationPanel, gbc);
+
+                fileChooserButton = new JButton(fileChooserString);
+                fileChooserButton.setActionCommand(fileChooserString);
+
+                fileChooserButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+
+                        try {
+                            showFileChooser();
+                        } catch (Exception ex) {
+                            Logger.getLogger(JFileChooserOrientation.class
+                                    .getName()).log(Level.SEVERE, null, ex);
+                        }
+
+                    }
+                });
+                gbc.gridx = 0;
+                gbc.gridy = 3;
+                panel.add(fileChooserButton, gbc);
+
+                passFailPanel = new JPanel();
+                passFailPanel.setBorder(BorderFactory.createLineBorder(Color.black));
+                passButton = new JButton(" Pass ");
+                passButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        try {
+                            pass();
+                        } catch (Exception ex) {
+                            Logger.getLogger(JFileChooserOrientation.class
+                                    .getName()).log(Level.SEVERE, null, ex);
+                        }
+                    }
+                });
+                gbc.gridx = 0;
+                gbc.gridy = 0;
+                passFailPanel.add(passButton, gbc);
+                failButton = new JButton(" Fail ");
+                failButton.addActionListener(new ActionListener() {
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        try {
+                            fail();
+                        } catch (Exception ex) {
+                            Logger.getLogger(JFileChooserOrientation.class
+                                    .getName()).log(Level.SEVERE, null, ex);
+                        }
+                    }
+                });
+                gbc.gridx = 1;
+                gbc.gridy = 0;
+                passFailPanel.add(failButton, gbc);
+                gbc.gridx = 0;
+                gbc.gridy = 4;
+                panel.add(passFailPanel, gbc);
+                frame = new JFrame();
+                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+                frame.setContentPane(panel);
+                frame.pack();
+                frame.setVisible(true);
+            }
+        });
+    }
+
+    private static void pass() throws Exception
+    {
+
+                frame.dispose();
+
+    }
+
+    private static void fail() throws Exception
+    {
+
+        frame.dispose();
+        System.err.println(lookAndFeelComboBox.getSelectedItem().toString()
+     + " : Incorrect Orientation");
+    }
+
+    private static void showFileChooser() throws Exception {
+        if (tryLookAndFeel(lookAndFeelComboBox.getSelectedItem().toString())) {
+
+            openChooser = new JFileChooser();
+
+            ComponentOrientation orientation
+                    = ComponentOrientation.UNKNOWN;
+
+            switch (orientationComboBox.getSelectedItem().toString()) {
+                case orientationLTR:
+                    orientation = ComponentOrientation.LEFT_TO_RIGHT;
+                    break;
+                case orientationRTL:
+                    orientation = ComponentOrientation.RIGHT_TO_LEFT;
+                    break;
+            }
+            openChooser.setComponentOrientation(orientation);
+            openChooser.showOpenDialog(frame);
+
+        }
+    }
+    private static boolean tryLookAndFeel(String lookAndFeelString)
+            throws Exception {
+        try {
+            UIManager.setLookAndFeel(
+                    lookAndFeelString);
+        } catch (UnsupportedLookAndFeelException
+                | ClassNotFoundException
+                | InstantiationException
+                | IllegalAccessException e) {
+            return false;
+        }
+        return true;
+    }
+}