1 package net.sf.openrocket.gui.dialogs;
3 import java.awt.Window;
4 import java.beans.PropertyChangeEvent;
5 import java.beans.PropertyChangeListener;
7 import javax.swing.JButton;
8 import javax.swing.JDialog;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JProgressBar;
12 import javax.swing.SwingWorker;
14 import net.miginfocom.swing.MigLayout;
15 import net.sf.openrocket.util.Pair;
19 * A modal dialog that runs specific SwingWorkers and waits until they complete.
20 * A message and progress bar is provided and a cancel button. If the cancel button
21 * is pressed, the currently running worker is interrupted and the later workers are not
24 * @author Sampo Niskanen <sampo.niskanen@iki.fi>
26 public class SwingWorkerDialog extends JDialog implements PropertyChangeListener {
28 private final JLabel label;
29 private final JProgressBar progressBar;
32 private Pair<String, SwingWorker<?,?>>[] workers;
34 private boolean cancelled = false;
36 public SwingWorkerDialog(Window parent, String title) {
37 super(parent, title, ModalityType.APPLICATION_MODAL);
39 JPanel panel = new JPanel(new MigLayout("fill"));
41 label = new JLabel("");
42 panel.add(label, "wrap para");
44 progressBar = new JProgressBar();
45 panel.add(progressBar, "growx, wrap para");
47 JButton cancel = new JButton("Cancel");
48 // TODO: CRITICAL: Implement cancel
49 panel.add(cancel, "right");
53 this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
58 * Execute the provided workers one after another. When this call returns
59 * the workers will all have completed.
61 * @param workers pairs of description texts and workers to run.
63 public void runWorkers(Pair<String, SwingWorker<?,?>> ... workers) {
64 if (workers.length == 0) {
65 throw new IllegalArgumentException("No workers provided.");
68 this.workers = workers;
71 for (int i=0; i < workers.length; i++) {
72 workers[i].getV().addPropertyChangeListener(this);
76 this.setVisible(true); // Waits until all have ended
82 * Starts the execution of the next worker in the queue. If the last worker
83 * has completed or the operation has been cancelled, closes the dialog.
85 private void nextWorker() {
86 if ((position >= workers.length-1) || cancelled) {
93 label.setText(workers[position].getU());
94 workers[position].getV().execute();
100 public void propertyChange(PropertyChangeEvent evt) {
101 if (workers[position].getV().getState() == SwingWorker.StateValue.DONE) {
105 int value = workers[position].getV().getProgress();
106 value = (value + position*100 ) / workers.length;
107 progressBar.setValue(value);
112 private void close() {
113 for (int i=0; i < workers.length; i++) {
114 workers[i].getV().removePropertyChangeListener(this);
116 this.setVisible(false);