/*
 * 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
 * @key headful
 * @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;
    }
}