    001/*
    002 * Forge Mod Loader
    003 * Copyright (c) 2012-2013 cpw.
    004 * All rights reserved. This program and the accompanying materials
    005 * are made available under the terms of the GNU Lesser Public License v2.1
    006 * which accompanies this distribution, and is available at
    007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
    008 *
    009 * Contributors:
    010 *     cpw - implementation
    011 */
    012
    013package cpw.mods.fml.relauncher;
    014
    015import java.awt.Dialog.ModalityType;
    016import java.awt.Dimension;
    017import java.awt.event.WindowAdapter;
    018import java.awt.event.WindowEvent;
    019import java.beans.PropertyChangeEvent;
    020import java.beans.PropertyChangeListener;
    021
    022import javax.swing.Box;
    023import javax.swing.JDialog;
    024import javax.swing.JFrame;
    025import javax.swing.JLabel;
    026import javax.swing.JOptionPane;
    027import javax.swing.JProgressBar;
    028
    029import cpw.mods.fml.common.FMLLog;
    030
    031public class Downloader extends JOptionPane implements IDownloadDisplay
    032{
    033    private JDialog container;
    034    private JLabel currentActivity;
    035    private JProgressBar progress;
    036    boolean stopIt;
    037    Thread pokeThread;
    038
    039    private Box makeProgressPanel()
    040    {
    041        Box box = Box.createVerticalBox();
    042        box.add(Box.createRigidArea(new Dimension(0,10)));
    043        JLabel welcomeLabel = new JLabel("<html><b><font size='+1'>FML is setting up your minecraft environment</font></b></html>");
    044        box.add(welcomeLabel);
    045        welcomeLabel.setAlignmentY(LEFT_ALIGNMENT);
    046        welcomeLabel = new JLabel("<html>Please wait, FML has some tasks to do before you can play</html>");
    047        welcomeLabel.setAlignmentY(LEFT_ALIGNMENT);
    048        box.add(welcomeLabel);
    049        box.add(Box.createRigidArea(new Dimension(0,10)));
    050        currentActivity = new JLabel("Currently doing ...");
    051        box.add(currentActivity);
    052        box.add(Box.createRigidArea(new Dimension(0,10)));
    053        progress = new JProgressBar(0, 100);
    054        progress.setStringPainted(true);
    055        box.add(progress);
    056        box.add(Box.createRigidArea(new Dimension(0,30)));
    057        return box;
    058    }
    059
    060    public JDialog makeDialog()
    061    {
    062        setMessageType(JOptionPane.INFORMATION_MESSAGE);
    063        setMessage(makeProgressPanel());
    064        setOptions(new Object[] { "Stop" });
    065        addPropertyChangeListener(new PropertyChangeListener()
    066        {
    067            @Override
    068            public void propertyChange(PropertyChangeEvent evt)
    069            {
    070                if (evt.getSource() == Downloader.this && evt.getPropertyName()==VALUE_PROPERTY)
    071                {
    072                    requestClose("This will stop minecraft from launching\nAre you sure you want to do this?");
    073                }
    074            }
    075        });
    076        container = new JDialog(null, "Hello", ModalityType.MODELESS);
    077        container.setResizable(false);
    078        container.setLocationRelativeTo(null);
    079        container.add(this);
    080        this.updateUI();
    081        container.pack();
    082        container.setMinimumSize(container.getPreferredSize());
    083        container.setVisible(true);
    084        container.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    085        container.addWindowListener(new WindowAdapter()
    086        {
    087            @Override
    088            public void windowClosing(WindowEvent e)
    089            {
    090                requestClose("Closing this window will stop minecraft from launching\nAre you sure you wish to do this?");
    091            }
    092        });
    093        return container;
    094    }
    095    protected void requestClose(String message)
    096    {
    097        int shouldClose = JOptionPane.showConfirmDialog(container, message, "Are you sure you want to stop?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
    098        if (shouldClose == JOptionPane.YES_OPTION)
    099        {
    100            container.dispose();
    101        }
    102        stopIt = true;
    103        if (pokeThread != null)
    104        {
    105            pokeThread.interrupt();
    106        }
    107    }
    108
    109    public void updateProgressString(String progressUpdate, Object... data)
    110    {
    111        FMLLog.finest(progressUpdate, data);
    112        if (currentActivity!=null)
    113        {
    114            currentActivity.setText(String.format(progressUpdate,data));
    115        }
    116    }
    117
    118    public void resetProgress(int sizeGuess)
    119    {
    120        if (progress!=null)
    121        {
    122            progress.getModel().setRangeProperties(0, 0, 0, sizeGuess, false);
    123        }
    124    }
    125
    126    public void updateProgress(int fullLength)
    127    {
    128        if (progress!=null)
    129        {
    130            progress.getModel().setValue(fullLength);
    131        }
    132    }
    133
    134    public void makeHeadless()
    135    {
    136        container = null;
    137        progress = null;
    138        currentActivity = null;
    139    }
    140
    141    @Override
    142    public void setPokeThread(Thread currentThread)
    143    {
    144        this.pokeThread = currentThread;
    145    }
    146
    147    @Override
    148    public boolean shouldStopIt()
    149    {
    150        return stopIt;
    151    }
    152}