001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Apr 16, 2003
005     * Time: 11:31:25 PM
006     */
007    
008    package EVolve.util;
009    
010    import java.awt.Dimension;
011    import java.awt.GridLayout;
012    import java.awt.event.ActionEvent;
013    import java.awt.event.ActionListener;
014    import java.text.NumberFormat;
015    import javax.swing.*;
016    import EVolve.ProcessingThread;
017    import EVolve.Scene;
018    import EVolve.data.Worker;
019    
020    public class ProgressIndicator extends JDialog implements Runnable{
021        private JProgressBar progressBar;
022        private JButton buttonPause, buttonResume, buttonStop;
023        private Thread self = null;
024        private Worker worker;
025        private boolean mustStop;
026        private ProcessingThread workerTd;
027    
028        public ProgressIndicator(JFrame owner, Worker worker, ProcessingThread workerTd) {
029            super(owner,"Process progress");
030    
031            mustStop = false;
032            this.worker = worker;
033            this.workerTd = workerTd;
034            createUI();
035            repaint();
036            self = new Thread(this);
037            self.start();
038        }
039    
040        private void createUI() {
041            setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
042    
043            progressBar = new JProgressBar();
044            JPanel panelButton = new JPanel(new GridLayout(1,3));
045    
046            buttonResume = new JButton(new ImageIcon(Scene.getGifURL("play.gif")));
047            buttonResume.setToolTipText("Resume Processing");
048            buttonResume.addActionListener(new ActionListener() {
049                public void actionPerformed(ActionEvent e) {
050                    resume();
051                }
052            });
053            buttonResume.setPreferredSize(new java.awt.Dimension(30,25));
054            buttonResume.setEnabled(false);
055    
056            buttonPause = new JButton(new ImageIcon(Scene.getGifURL("pause.gif")));
057            buttonPause.setToolTipText("Pause Processing");
058            buttonPause.addActionListener(new ActionListener() {
059                public void actionPerformed(ActionEvent e) {
060                    pause();
061                }
062            });
063            buttonPause.setPreferredSize(new java.awt.Dimension(30,28));
064    
065            buttonStop = new JButton(new ImageIcon(Scene.getGifURL("stop.gif")));
066            buttonStop.setToolTipText("Stop Processing");
067            buttonStop.addActionListener(new ActionListener() {
068                public void actionPerformed(ActionEvent e) {
069                    stop();
070                }
071            });
072            buttonStop.setPreferredSize(new java.awt.Dimension(30,28));
073    
074            panelButton.add(buttonResume);
075            panelButton.add(buttonPause);
076            panelButton.add(buttonStop);
077    
078            Box box = new Box(BoxLayout.Y_AXIS);
079            progressBar.setPreferredSize(new Dimension(290,25));
080    
081            box.add(Box.createVerticalStrut(8));
082            box.add(progressBar);
083            box.add(Box.createVerticalStrut(5));
084            box.add(panelButton);
085            getContentPane().add(box);
086            progressBar.setStringPainted(true);
087            progressBar.setValue(0);
088            progressBar.setBorderPainted(true);
089            pack();
090            Scene.getUIManager().showDialog(this,300,100);
091            //Scene.getUIManager().showDialog(this,300,60);
092        }
093    
094        public void run() {
095            Scene.getUIManager().updateFunctionControl(false);
096    
097            long totalEvents = worker.getMaxProgress();
098            while (worker.getCurrentState() == Worker.STATE_NOT_STARTED) {
099                self.yield();
100            }
101    
102            while (worker.getCurrentState() != Worker.STATE_FINISHED) {
103                try {
104                    long current = worker.getCurrentProgress();
105                    double percent = (double)current/(double)totalEvents;
106                    if (totalEvents > 0L) {
107                        progressBar.setValue((int)(percent*100));
108                        progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(percent));
109                    }
110                    self.sleep(100);
111                } catch (InterruptedException e) {
112                    if (mustStop || worker.getCurrentState() >= Worker.STATE_STOPPING) {
113                        break;
114                    }
115                }
116            }
117            progressBar.setValue(100);
118            progressBar.setString("Data processed: " + NumberFormat.getPercentInstance().format(1));
119            try {
120                workerTd.join();
121            } catch (InterruptedException e1) {
122            }
123            setVisible(false);
124            dispose();
125            worker.resetState();
126            Scene.getUIManager().updateFunctionControl(true);
127        }
128    
129        public void stop(){
130            worker.stop();
131            if (self != null) {
132                mustStop = true;
133                self.interrupt();
134            }
135            Scene.getUIManager().updateFunctionControl(true);
136            self = null;
137            setVisible(false);
138            dispose();
139        }
140    
141        public void resume() {
142            buttonResume.setEnabled(false);
143            buttonPause.setEnabled(true);
144            worker.resume();
145        }
146    
147        public void pause() {
148            buttonResume.setEnabled(true);
149            buttonPause.setEnabled(false);
150            worker.pause();
151        }
152    }