From e6db69be048714f38ec2ff04e5433b88b4d58eb6 Mon Sep 17 00:00:00 2001 From: Avik Niyogi Date: Mon, 18 Jan 2016 14:27:12 +0530 Subject: [PATCH] 8016665: [macosx] JComponent behaviour doesn't comply API documentation (setComponentOrientation method), Aqua LAF Reviewed-by: serb, alexsch --- .../com/apple/laf/AquaFileSystemModel.java | 10 + .../8016665/JFileChooserOrientation.java | 253 ++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java index 887ab5c8bd3..05eddcea4d8 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaFileSystemModel.java @@ -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 @@ class AquaFileSystemModel extends AbstractTableModel implements PropertyChangeLi } 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); diff --git a/jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java b/jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java new file mode 100644 index 00000000000..4296d48fd2d --- /dev/null +++ b/jdk/test/javax/swing/JFileChooser/8016665/JFileChooserOrientation.java @@ -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; + } +}