/* Copyright (C) 2001, 2007 United States Government as represented by
the Administrator of the National Aeronautics and Space Administration.
All Rights Reserved.
*/
package gov.nasa.worldwind.layers.rpf.wizard;

import gov.nasa.worldwind.util.Logging;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;

/**
 * @author dcollins
 * @version $Id: FileChooserPanel.java 4565 2008-02-28 17:53:41Z dcollins $
 */
public class FileChooserPanel extends JPanel
{
    private JLabel title;
    private JLabel description;
    private JFormattedTextField fileField;
    private JButton chooseButton;
    private JFileChooser fileChooser;
    
    public FileChooserPanel()
    {
        makeComponents();
        layoutComponents();
    }

    public String getTitle()
    {
        return this.title.getText();
    }

    public void setTitle(String title)
    {
        this.title.setText(title);
    }

    public String getDescription()
    {
        return this.description.getText();
    }

    public void setDescription(String description)
    {
        this.description.setText(description);
    }

    public JFileChooser getFileChooser()
    {
        return this.fileChooser;
    }

    public void setFileChooser(JFileChooser fileChooser)
    {
        if (fileChooser == null)
        {
            String message = "JFileChooser is null";
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }
        
        this.fileChooser = fileChooser;
    }

    public File getSelectedFile()
    {
        return getValueAsFile(this.fileField.getValue());
    }

    private File getValueAsFile(Object value)
    {
        if (value != null)
        {
            if (value instanceof File)
                return (File) value;
            else
                return new File(value.toString());
        }
        return null;
    }

    public void promptForNewSelection()
    {
        onChooseClicked();
    }

    private void onChooseClicked()
    {
        int returnCode = this.fileChooser.showDialog(this, "Choose");
        if (returnCode == JFileChooser.APPROVE_OPTION && this.fileChooser.getSelectedFile() != null)
        {
            this.fileField.setValue(this.fileChooser.getSelectedFile());
        }
    }

    private void onFileFieldChanged(Object newValue)
    {
        File newFile = getValueAsFile(newValue);
        firePropertyChange("selectedFile", null, newFile);
    }

    private void makeComponents()
    {
        this.title = new JLabel(" ");
        this.title.setBackground(Color.gray);
        this.title.setOpaque(true);        
        this.description = new JLabel();
        this.fileField = new JFormattedTextField("Click 'Choose...'");
        Font font = this.fileField.getFont();
        if (!font.isBold())
            font = new Font(font.getName(), Font.BOLD | font.getStyle(), font.getSize());
        this.fileField.setFont(font);
        // Override input-path maximum size to avoid any vertical stretching by the layout manager.
        Dimension preferred = this.fileField.getPreferredSize();
        Dimension max = this.fileField.getMaximumSize();
        this.fileField.setMaximumSize(new Dimension(max.width, preferred.height));
        this.fileField.addPropertyChangeListener("value", new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent event) {
                if (event != null) {
                    onFileFieldChanged(event.getNewValue());
                }
            }
        });
        this.chooseButton = new JButton("Choose...");
        this.chooseButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                onChooseClicked();
            }
        });
        this.fileChooser = new JFileChooser();
        this.fileChooser.setDialogTitle("Choose Folder to Search");
        this.fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        this.fileChooser.setMultiSelectionEnabled(false);
    }

    private void layoutComponents()
    {
        setLayout(new BorderLayout());

        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.setBackground(this.title.getBackground());
        this.title.setBorder(new EmptyBorder(10, 10, 10, 10));
        p.add(this.title, BorderLayout.WEST);
        JSeparator separator = new JSeparator();
        p.add(separator, BorderLayout.SOUTH);
        add(p, BorderLayout.NORTH);

        Box b = Box.createVerticalBox();
        b.setBorder(new EmptyBorder(10, 10, 10, 10));
        this.description.setAlignmentX(Component.LEFT_ALIGNMENT);
        b.add(this.description);
        b.add(Box.createVerticalStrut(10));
        Box b2 = Box.createHorizontalBox();
        b2.setAlignmentX(Component.LEFT_ALIGNMENT);
        b2.add(this.fileField);
        b2.add(Box.createHorizontalStrut(10));
        b2.add(this.chooseButton);
        b.add(b2);
        b.add(Box.createVerticalStrut(Short.MAX_VALUE));
        add(b, BorderLayout.CENTER);
    }
}
