/*
 * ******************************************************************************
 * Copyright (C) 2007, International Business Machines Corporation and others.
 * All Rights Reserved.
 * ******************************************************************************
 */
package com.ibm.icu.dev.tool.tzu;

import java.awt.Component;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.net.URL;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;

/**
 * The path list GUI component.
 */
public class ResultComponent extends JComponent {
    /**
     * The serializable UID.
     */
    public static final long serialVersionUID = 1341;

    /**
     * A cancel search button to cancel a search if one is currently occuring.
     */
    private JButton resultCancelSearchButton = new JButton("Stop Search");

    /**
     * A cancel update button to cancel an update if one is currently occuring.
     */
    private JButton resultCancelUpdateButton = new JButton("Stop Update");

    /**
     * The dialog that comes up when the browse button is clicked.
     */
    private JFileChooser resultChooser = new JFileChooser();

    /**
     * A menu item for copying a filename to the clipboard.
     */
    private JMenuItem resultCopyItem = new JMenuItem("Copy Selected");

    /**
     * The model for all the results from a search.
     */
    private ResultModel resultModel;

    /**
     * The panel where option components are shown.
     */
    private JPanel resultOptionPanel = new JPanel();

    /**
     * The context menu that pops up with more options.
     */
    private JPopupMenu resultPopup = new JPopupMenu();

    /**
     * A menu item for <code>pathPopup</code> to remove all files from the
     * result model.
     */
    private JMenuItem resultRemoveAllItem = new JMenuItem("Remove All");

    /**
     * A menu item for <code>pathPopup</code> to remove the selected files
     * from the result model.
     */
    private JMenuItem resultRemoveSelectedItem = new JMenuItem(
            "Remove Selected Items");

    /**
     * The label for the result source list.
     */
    private JLabel resultSourceLabel = new JLabel("New Time Zone Version: ");

    /**
     * The combobox for choosing which timezone resource on the web to use in an
     * update.
     */
    private JComboBox resultSourceList = new JComboBox();

    /**
     * The panel where status components are shown.
     */
    private JPanel resultStatusPanel = new JPanel();

    /**
     * The label for the path list.
     */
    private JLabel resultTableLabel = new JLabel("ICU4J Jar Files found:");

    /**
     * The table where the result model is shown.
     */
    private JTable resultTable = new JTable();

    /**
     * A menu item for <code>pathPopup</code> to update all files in the
     * result model.
     */
    private JMenuItem resultUpdateAllItem = new JMenuItem("Update All");

    /**
     * An update button to update the selected files, or all files if none are
     * selected.
     */
    private JButton resultUpdateButton = new JButton("Update");

    /**
     * The panel where update components are shown.
     */
    private JPanel resultUpdatePanel = new JPanel();

    /**
     * A menu item for <code>pathPopup</code> to update the selected files in
     * the result model.
     */
    private JMenuItem resultUpdateSelectedItem = new JMenuItem(
            "Update Selected Items");

    /**
     * The model for all the timezone resources on the web.
     */
    private SourceModel sourceModel;

    /**
     * The status bar for status messages.
     */
    private JLabel statusBar = new JLabel();

    /**
     * @param owner
     *            The GUILoader object that ownes this component.
     */
    public ResultComponent(final GUILoader owner) {
        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        add(resultTableLabel);
        add(new JScrollPane(resultTable));
        add(resultStatusPanel);
        add(resultOptionPanel);
        add(resultUpdatePanel);

        resultStatusPanel.add(statusBar);
        resultOptionPanel.add(resultSourceLabel);
        resultOptionPanel.add(resultSourceList);
        resultUpdatePanel.add(resultCancelSearchButton);
        resultUpdatePanel.add(resultUpdateButton);
        resultUpdatePanel.add(resultCancelUpdateButton);

        resultChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);

        resultPopup.add(resultCopyItem);
        resultPopup.add(new JSeparator());
        resultPopup.add(resultRemoveSelectedItem);
        resultPopup.add(resultRemoveAllItem);
        resultPopup.add(new JSeparator());
        resultPopup.add(resultUpdateSelectedItem);
        resultPopup.add(resultUpdateAllItem);

        resultTable.addMouseListener(new MouseListener() {
            public void mouseClicked(MouseEvent event) {
                checkPopup(event);
            }

            public void mouseEntered(MouseEvent event) {
                checkPopup(event);
            }

            public void mouseExited(MouseEvent event) {
                checkPopup(event);
            }

            public void mousePressed(MouseEvent event) {
                checkPopup(event);
            }

            public void mouseReleased(MouseEvent event) {
                checkPopup(event);
            }

            private void checkPopup(MouseEvent event) {
                if (event.isPopupTrigger())
                    resultPopup.show((Component) event.getSource(), event
                            .getX(), event.getY());
            }
        });

        resultTable.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {
                if (event.getKeyCode() == KeyEvent.VK_DELETE)
                    resultModel.remove(resultTable.getSelectedRows());
            }
        });

        resultCopyItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                String selection = "";
                int[] rows = resultTable.getSelectedRows();
                for (int i = 0; i < rows.length; i++)
                    selection += resultModel.getValueAt(rows[i],
                            ResultModel.COLUMN_FILE_PATH)
                            + File.separator
                            + resultModel.getValueAt(rows[i],
                                    ResultModel.COLUMN_FILE_NAME) + "\n";
                getToolkit().getSystemClipboard().setContents(
                        new StringSelection(selection), null);
            }
        });

        resultRemoveSelectedItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                resultModel.remove(resultTable.getSelectedRows());
            }
        });

        resultRemoveAllItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                resultModel.removeAll();
            }
        });

        resultUpdateSelectedItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                owner
                        .update(resultTable.getSelectedRows(),
                                getSelectedSource());
            }
        });

        resultUpdateAllItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                owner.updateAll(getSelectedSource());
            }
        });

        resultUpdateButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                int[] indices = resultTable.getSelectedRows();
                if (indices.length > 0)
                    owner.update(indices, getSelectedSource());
                else
                    owner.updateAll(getSelectedSource());
            }
        });

        resultCancelSearchButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                owner.cancelSearch();
            }
        });

        resultCancelUpdateButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                owner.cancelUpdate();
            }
        });
    }

    /**
     * Returns the status bar.
     * 
     * @return The status bar.
     */
    public JLabel getStatusBar() {
        return statusBar;
    }

    /**
     * Sets whether the cancel search button should be enabled.
     * 
     * @param value
     *            Whether the cancel search button should be enabled.
     */
    public void setCancelSearchEnabled(boolean value) {
        resultCancelSearchButton.setEnabled(value);
    }

    /**
     * Sets whether the cancel update button should be enabled.
     * 
     * @param value
     *            Whether the cancel update button should be enabled.
     */
    public void setCancelUpdateEnabled(boolean value) {
        resultCancelUpdateButton.setEnabled(value);
    }

    /**
     * Sets the result model.
     * 
     * @param resultModel
     *            The result model.
     */
    public void setResultModel(ResultModel resultModel) {
        this.resultModel = resultModel;
        resultTable.setModel(resultModel);
    }

    /**
     * Sets the source model.
     * 
     * @param sourceModel
     *            The source model.
     */
    public void setSourceModel(SourceModel sourceModel) {
        this.sourceModel = sourceModel;
        resultSourceList.setModel(sourceModel);
    }

    /**
     * Sets whether the update button should be enabled.
     * 
     * @param value
     *            Whether the update button should be enabled.
     */
    public void setUpdateEnabled(boolean value) {
        resultUpdateButton.setEnabled(value);
    }

    /**
     * Returns the URL of the currently selected item in the result source list.
     * 
     * @return The URL of the currently selected item in the result source list.
     */
    private URL getSelectedSource() {
        return sourceModel.getURL(resultSourceList.getSelectedItem());
    }
}
