001    package cpw.mods.fml.relauncher;
002    
003    import java.awt.Dialog.ModalityType;
004    import java.awt.Dimension;
005    import java.awt.event.WindowAdapter;
006    import java.awt.event.WindowEvent;
007    import java.beans.PropertyChangeEvent;
008    import java.beans.PropertyChangeListener;
009    
010    import javax.swing.Box;
011    import javax.swing.JDialog;
012    import javax.swing.JFrame;
013    import javax.swing.JLabel;
014    import javax.swing.JOptionPane;
015    import javax.swing.JProgressBar;
016    
017    import cpw.mods.fml.common.FMLLog;
018    
019    public 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    }