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 }