/*
 * Forge Mod Loader
 * Copyright (c) 2012-2013 cpw.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v2.1
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * 
 * Contributors:
 *     cpw - implementation
 */

package cpw.mods.fml.relauncher;

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.Box;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

import cpw.mods.fml.common.FMLLog;

public class Downloader extends JOptionPane implements IDownloadDisplay
{
    private JDialog container;
    private JLabel currentActivity;
    private JProgressBar progress;
    boolean stopIt;
    Thread pokeThread;

    private Box makeProgressPanel()
    {
        Box box = Box.createVerticalBox();
        box.add(Box.createRigidArea(new Dimension(0,10)));
        JLabel welcomeLabel = new JLabel("<html><b><font size='+1'>FML is setting up your minecraft environment</font></b></html>");
        box.add(welcomeLabel);
        welcomeLabel.setAlignmentY(LEFT_ALIGNMENT);
        welcomeLabel = new JLabel("<html>Please wait, FML has some tasks to do before you can play</html>");
        welcomeLabel.setAlignmentY(LEFT_ALIGNMENT);
        box.add(welcomeLabel);
        box.add(Box.createRigidArea(new Dimension(0,10)));
        currentActivity = new JLabel("Currently doing ...");
        box.add(currentActivity);
        box.add(Box.createRigidArea(new Dimension(0,10)));
        progress = new JProgressBar(0, 100);
        progress.setStringPainted(true);
        box.add(progress);
        box.add(Box.createRigidArea(new Dimension(0,30)));
        return box;
    }

    public JDialog makeDialog()
    {
        setMessageType(JOptionPane.INFORMATION_MESSAGE);
        setMessage(makeProgressPanel());
        setOptions(new Object[] { "Stop" });
        addPropertyChangeListener(new PropertyChangeListener()
        {
            @Override
            public void propertyChange(PropertyChangeEvent evt)
            {
                if (evt.getSource() == Downloader.this && evt.getPropertyName()==VALUE_PROPERTY)
                {
                    requestClose("This will stop minecraft from launching\nAre you sure you want to do this?");
                }
            }
        });
        container = new JDialog(null, "Hello", ModalityType.MODELESS);
        container.setResizable(false);
        container.setLocationRelativeTo(null);
        container.add(this);
        this.updateUI();
        container.pack();
        container.setMinimumSize(container.getPreferredSize());
        container.setVisible(true);
        container.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        container.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e)
            {
                requestClose("Closing this window will stop minecraft from launching\nAre you sure you wish to do this?");
            }
        });
        return container;
    }
    protected void requestClose(String message)
    {
        int shouldClose = JOptionPane.showConfirmDialog(container, message, "Are you sure you want to stop?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
        if (shouldClose == JOptionPane.YES_OPTION)
        {
            container.dispose();
        }
        stopIt = true;
        if (pokeThread != null)
        {
            pokeThread.interrupt();
        }
    }

    public void updateProgressString(String progressUpdate, Object... data)
    {
        FMLLog.finest(progressUpdate, data);
        if (currentActivity!=null)
        {
            currentActivity.setText(String.format(progressUpdate,data));
        }
    }

    public void resetProgress(int sizeGuess)
    {
        if (progress!=null)
        {
            progress.getModel().setRangeProperties(0, 0, 0, sizeGuess, false);
        }
    }

    public void updateProgress(int fullLength)
    {
        if (progress!=null)
        {
            progress.getModel().setValue(fullLength);
        }
    }

    public void makeHeadless()
    {
        container = null;
        progress = null;
        currentActivity = null;
    }

    @Override
    public void setPokeThread(Thread currentThread)
    {
        this.pokeThread = currentThread;
    }

    @Override
    public boolean shouldStopIt()
    {
        return stopIt;
    }
}
