/*
 * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * This source code is provided to illustrate the usage of a given feature
 * or technique and has been deliberately simplified. Additional steps
 * required for a production-quality application, such as security checks,
 * input validation and proper error handling, might not be present in
 * this sample code.
 */



import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;


/**
 * This is dialog which allows users to choose preferences
 *
 * @author Steve Wilson
 * @author Alexander Kouznetsov
 */
@SuppressWarnings("serial")
public final class MetalworksPrefs extends JDialog {

    public MetalworksPrefs(JFrame f) {
        super(f, "Preferences", true);
        JPanel container = new JPanel();
        container.setLayout(new BorderLayout());

        JTabbedPane tabs = new JTabbedPane();
        JPanel filters = buildFilterPanel();
        JPanel conn = buildConnectingPanel();
        tabs.addTab("Filters", null, filters);
        tabs.addTab("Connecting", null, conn);


        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
        JButton cancel = new JButton("Cancel");
        cancel.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                CancelPressed();
            }
        });
        buttonPanel.add(cancel);
        JButton ok = new JButton("OK");
        ok.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                OKPressed();
            }
        });
        buttonPanel.add(ok);
        getRootPane().setDefaultButton(ok);

        container.add(tabs, BorderLayout.CENTER);
        container.add(buttonPanel, BorderLayout.SOUTH);
        getContentPane().add(container);
        pack();
        centerDialog();
        UIManager.addPropertyChangeListener(new UISwitchListener(container));
    }

    public JPanel buildFilterPanel() {
        JPanel filters = new JPanel();
        filters.setLayout(new GridLayout(1, 0));

        JPanel spamPanel = new JPanel();

        spamPanel.setLayout(new ColumnLayout());
        spamPanel.setBorder(new TitledBorder("Spam"));
        ButtonGroup spamGroup = new ButtonGroup();
        JRadioButton file = new JRadioButton("File in Spam Folder");
        JRadioButton delete = new JRadioButton("Auto Delete");
        JRadioButton bomb = new JRadioButton("Reverse Mail-Bomb");
        spamGroup.add(file);
        spamGroup.add(delete);
        spamGroup.add(bomb);
        spamPanel.add(file);
        spamPanel.add(delete);
        spamPanel.add(bomb);
        file.setSelected(true);
        filters.add(spamPanel);

        JPanel autoRespond = new JPanel();
        autoRespond.setLayout(new ColumnLayout());
        autoRespond.setBorder(new TitledBorder("Auto Response"));

        ButtonGroup respondGroup = new ButtonGroup();
        JRadioButton none = new JRadioButton("None");
        JRadioButton vaca = new JRadioButton("Send Vacation Message");
        JRadioButton thx = new JRadioButton("Send Thank You Message");

        respondGroup.add(none);
        respondGroup.add(vaca);
        respondGroup.add(thx);

        autoRespond.add(none);
        autoRespond.add(vaca);
        autoRespond.add(thx);

        none.setSelected(true);
        filters.add(autoRespond);

        return filters;
    }

    public JPanel buildConnectingPanel() {
        JPanel connectPanel = new JPanel();
        connectPanel.setLayout(new ColumnLayout());

        JPanel protoPanel = new JPanel();
        JLabel protoLabel = new JLabel("Protocol");
        JComboBox protocol = new JComboBox();
        protocol.addItem("SMTP");
        protocol.addItem("IMAP");
        protocol.addItem("Other...");
        protoPanel.add(protoLabel);
        protoPanel.add(protocol);

        JPanel attachmentPanel = new JPanel();
        JLabel attachmentLabel = new JLabel("Attachments");
        JComboBox attach = new JComboBox();
        attach.addItem("Download Always");
        attach.addItem("Ask size > 1 Meg");
        attach.addItem("Ask size > 5 Meg");
        attach.addItem("Ask Always");
        attachmentPanel.add(attachmentLabel);
        attachmentPanel.add(attach);

        JCheckBox autoConn = new JCheckBox("Auto Connect");
        JCheckBox compress = new JCheckBox("Use Compression");
        autoConn.setSelected(true);

        connectPanel.add(protoPanel);
        connectPanel.add(attachmentPanel);
        connectPanel.add(autoConn);
        connectPanel.add(compress);
        return connectPanel;
    }

    protected void centerDialog() {
        Dimension screenSize = this.getToolkit().getScreenSize();
        Dimension size = this.getSize();
        screenSize.height = screenSize.height / 2;
        screenSize.width = screenSize.width / 2;
        size.height = size.height / 2;
        size.width = size.width / 2;
        int y = screenSize.height - size.height;
        int x = screenSize.width - size.width;
        this.setLocation(x, y);
    }

    public void CancelPressed() {
        this.setVisible(false);
    }

    public void OKPressed() {
        this.setVisible(false);
    }
}


class ColumnLayout implements LayoutManager {

    int xInset = 5;
    int yInset = 5;
    int yGap = 2;

    public void addLayoutComponent(String s, Component c) {
    }

    public void layoutContainer(Container c) {
        Insets insets = c.getInsets();
        int height = yInset + insets.top;

        Component[] children = c.getComponents();
        Dimension compSize = null;
        for (Component child : children) {
            compSize = child.getPreferredSize();
            child.setSize(compSize.width, compSize.height);
            child.setLocation(xInset + insets.left, height);
            height += compSize.height + yGap;
        }

    }

    public Dimension minimumLayoutSize(Container c) {
        Insets insets = c.getInsets();
        int height = yInset + insets.top;
        int width = 0 + insets.left + insets.right;

        Component[] children = c.getComponents();
        Dimension compSize = null;
        for (Component child : children) {
            compSize = child.getPreferredSize();
            height += compSize.height + yGap;
            width = Math.max(width, compSize.width + insets.left + insets.right + xInset
                    * 2);
        }
        height += insets.bottom;
        return new Dimension(width, height);
    }

    public Dimension preferredLayoutSize(Container c) {
        return minimumLayoutSize(c);
    }

    public void removeLayoutComponent(Component c) {
    }
}
