/*
 * This file is part of muCommander, http://www.mucommander.com
 *
 * muCommander is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * muCommander 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.mucommander.ui.dialog.about;

import com.mucommander.RuntimeConstants;
import com.mucommander.commons.util.ui.dialog.FocusDialog;
import com.mucommander.text.Translator;
import com.mucommander.ui.theme.Theme;
import com.mucommander.ui.theme.ThemeManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStreamReader;

/**
 * Dialog used to display muCommander's license file.
 * @author Nicolas Rinaudo
 */
public class LicenseDialog extends FocusDialog implements ActionListener {
	private static final Logger LOGGER = LoggerFactory.getLogger(LicenseDialog.class);
	
    // - UI components ----------------------------------------------------------
    // --------------------------------------------------------------------------
    /** Button used to close the dialog. */
    private JButton     okButton;
    /** Panel in which to display the license. */
    private JScrollPane licensePanel;



    // - Initialisation ---------------------------------------------------------
    // --------------------------------------------------------------------------
    /**
     * Creates a new license dialog centered on the specified window.
     * @param dialog window on which to center the new dialog.
     */
    public LicenseDialog(Dialog dialog) {
        super(dialog, Translator.get("license"), dialog);
        initUI();
    }

    /**
     * Creates a new license dialog centered on the specified window.
     * @param frame window on which to center the new dialog.
     */
    public LicenseDialog(Frame frame) {
        super(frame, Translator.get("license"), frame);
        initUI();
    }


    // - UI initialisation ------------------------------------------------------
    // --------------------------------------------------------------------------
    /**
     * Creates the 'ok' button panel.
     * @return the 'ok' button panel.
     */
    private JPanel createButtonPanel() {
        JPanel panel;

        panel = new JPanel();
        panel.setLayout(new FlowLayout(FlowLayout.RIGHT));

        okButton = new JButton(Translator.get("ok"));
        okButton.addActionListener(this);
        panel.add(okButton);

        return panel;
    }

    /**
     * Creates the panel in which the license text is displayed.
     * @return the panel in which the license text is displayed.
     */
    private JScrollPane createLicensePanel() {
        JTextArea license;

        license = new JTextArea();
        license.setEditable(false);

        // Applies the file editor's theme to the license text.
        license.setForeground(ThemeManager.getCurrentColor(Theme.EDITOR_FOREGROUND_COLOR));
        license.setBackground(ThemeManager.getCurrentColor(Theme.EDITOR_BACKGROUND_COLOR));
        license.setSelectedTextColor(ThemeManager.getCurrentColor(Theme.EDITOR_SELECTED_FOREGROUND_COLOR));
        license.setSelectionColor(ThemeManager.getCurrentColor(Theme.EDITOR_SELECTED_BACKGROUND_COLOR));
        license.setFont(ThemeManager.getCurrentFont(Theme.EDITOR_FONT));

        license.setText(getLicenseText());

        // Sets the scroll policy and preferred dimensions.
        licensePanel = new JScrollPane(license, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        licensePanel.getViewport().setPreferredSize(new Dimension((int)license.getPreferredSize().getWidth(), 400));

        return licensePanel;
    }

    /**
     * Initialises the dialog's UI.
     */
    private void initUI() {
        Container   contentPane;

        contentPane = getContentPane();

        // Adds the UI components.
        contentPane.add(createLicensePanel(), BorderLayout.CENTER);
        contentPane.add(createButtonPanel(), BorderLayout.SOUTH);

        // Makes OK the default action.
        setInitialFocusComponent(okButton);
        getRootPane().setDefaultButton(okButton);

        // Makes sure the scroll pane is initialises on its first line.
        SwingUtilities.invokeLater(() -> licensePanel.getViewport().setViewPosition(new Point(0,0)));
        pack();
    }



    // - IO code ----------------------------------------------------------------
    // --------------------------------------------------------------------------
    /**
     * Loads the license text.
     * @return the license text.
     */
    private String getLicenseText() {
        StringBuilder     text;   // Stores the license text.
        char[]            buffer; // Buffer for each chunk of data read from the license file.
        int               count;  // Number of characters read from the last read operation.
        InputStreamReader in;     // Stream on the license file.

        in   = null;
        text = new StringBuilder();
        try {
            in     = new InputStreamReader(LicenseDialog.class.getResourceAsStream(RuntimeConstants.LICENSE));
            buffer = new char[2048];

            while((count = in.read(buffer)) != -1)
                text.append(buffer, 0, count);
        }
        catch(Exception e) {
            LOGGER.warn("Failed to read license file", e);
        }
        finally {
            if(in != null) {
                try {in.close();}
                catch(Exception e) {}
            }
        }
        return text.toString();
    }



    // - Listener code ----------------------------------------------------------
    // --------------------------------------------------------------------------
    /**
     * If the event originates from the OK button, closes the window.
     */
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == okButton)
            dispose();
    }
}
