/*
 * Copyright (c) 2002-2007 TeamDev Ltd. All rights reserved.
 *
 * Use is subject to license terms.
 *
 * The complete licence text can be found at
 * http://www.teamdev.com/winpack/license.jsf
 */
package com.jniwrapper.win32.samples.demo;

import com.jniwrapper.win32.ui.controls.SelectFileField;
import com.jniwrapper.win32.ui.dialogs.OpenSaveFileDialog;
import com.jniwrapper.samples.shell.components.LazyPanel;
import com.jniwrapper.samples.shell.components.HTMLText;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Vector;

/**
 @author Serge Piletsky
 */
public class OpenSaveFileSample extends LazyPanel implements PropertyChangeListener
{
    private Vector _files;
    private JLabel lblAdvisoryText;
    private JLabel lblFileNameCaption;
    private SelectFileField _selectFileField;
    private JLabel lblSelectedFiles;
    private JLabel lblNote;
    private JList lstSelectedFiles;
    private JCheckBox cbAllowMultipleSelection;
    private JCheckBox cbShowExplorer;
    private JCheckBox cbShowHelp;
    private JCheckBox cbShowHiddenFiles;
    private JCheckBox cbEnableSizing;
    private JCheckBox cbHideReadOnly;
    JPanel _optionsPanel;
    OpenSaveFileDialog.OpenSaveFileDialogOptions _options;


    public OpenSaveFileSample(Window parent)
    {
        super(parent);
    }

    public void initialize() throws Exception
    {
        _files = new Vector();
        lblAdvisoryText = new HTMLText("This page demonstrates a standard Open/Save File dialog which is invoked " +
                "using a special SelectFileField control. Use the options below to modify the behavior of the dialog.");
        lblFileNameCaption = new JLabel("Select File:");
        _selectFileField = new SelectFileField();
        _selectFileField.getDialog().setOwner(this.getParentWindow());
        lblSelectedFiles = new JLabel("Selected Files:");
        lblNote = new HTMLText("<b>NOTE:</b> Multiple files selected in the dialog are shown in the text box above.");
        lstSelectedFiles = new JList(_files);
        _selectFileField.addPropertyChangeListener(SelectFileField.PROPERTY_FILE, this);
        _selectFileField.getDialog().getOptions().setMultiselectionAllowed(true);
        _selectFileField.getDialog().setFilter("All Files (*.*)|*.*|Pictures|*.bmp;*.gif;*.jpeg");

        _options = _selectFileField.getDialog().getOptions();

        cbAllowMultipleSelection = new JCheckBox("Allow multiple selection", _options.isMultiselectionAllowed());
        cbAllowMultipleSelection.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setMultiselectionAllowed(checkBox.isSelected());
            }
        });
        cbEnableSizing = new JCheckBox("Enable sizing", _options.isSizingEnabled());
        cbEnableSizing.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setSizingEnabled(checkBox.isSelected());
            }
        });
        cbHideReadOnly = new JCheckBox("Hide read-only files", _options.isHideReadOnly());
        cbHideReadOnly.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setHideReadOnly(checkBox.isSelected());
            }
        });
        cbShowExplorer = new JCheckBox("Use Explorer style", _options.isShowExplorer());
        cbShowExplorer.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setShowExplorer(checkBox.isSelected());
                if(!checkBox.isSelected())
                {
                    cbEnableSizing.setSelected(checkBox.isSelected());
                    _options.setSizingEnabled(cbEnableSizing.isSelected());
                }
                cbEnableSizing.setEnabled(checkBox.isSelected());
            }
        });
        cbShowHelp = new JCheckBox("Show Help button", _options.isShowHelp());
        cbShowHelp.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setShowHelp(checkBox.isSelected());
            }
        });
        cbShowHiddenFiles = new JCheckBox("Show hidden files", _options.isShowHiddenFiles());
        cbShowHiddenFiles.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JCheckBox checkBox = (JCheckBox)e.getSource();
                _options.setShowHiddenFiles(checkBox.isSelected());
            }
        });

        _optionsPanel = new JPanel(new GridLayout(32));

        _optionsPanel.add(cbAllowMultipleSelection);
        _optionsPanel.add(cbShowHelp);
        _optionsPanel.add(cbHideReadOnly);
        _optionsPanel.add(cbShowExplorer);
        _optionsPanel.add(cbEnableSizing);
        _optionsPanel.add(cbShowHiddenFiles);

        JScrollPane files = new JScrollPane(lstSelectedFiles);
        files.setPreferredSize(new Dimension(10100));

        setLayout(new GridBagLayout());

        add(lblAdvisoryText, new GridBagConstraints(00210.00.0
                , GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(10101010)00));

        add(_optionsPanel, new GridBagConstraints(01210.00.0
                , GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0101010)00));

        add(lblFileNameCaption, new GridBagConstraints(02110.00.0
                , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(101000)00));

        add(_selectFileField, new GridBagConstraints(12110.00.0
                , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(101000)00));

        add(lblSelectedFiles, new GridBagConstraints(03110.00.0
                , GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(101000)00));

        add(files, new GridBagConstraints(04210.00.5
                , GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(010010)00));

        add(lblNote, new GridBagConstraints(05210.00.0
                , GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(101000)00));

        add(new JPanel()new GridBagConstraints(06211.01.0
                , GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0000)00));

        super.initialize();
    }

    public void propertyChange(PropertyChangeEvent evt)
    {
        _files.clear();
        _files.addAll(_selectFileField.getDialog().getFiles());
        lstSelectedFiles.updateUI();
    }
}