8016665: [macosx] JComponent behaviour doesn't comply API documentation (setComponentOrientation method), Aqua LAF
Reviewed-by: serb, alexsch
--- 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;
+ }
+}