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