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 }