package tim.prune.gui; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import tim.prune.I18nManager; import tim.prune.function.Cancellable; /** * Class to show a progress dialog for various time-consuming functions */ public class GenericProgressDialog { private JDialog _progressDialog = null; private String _dialogTitleKey = null; private String _labelKey = null; private JProgressBar _progressBar = null; private JFrame _parentFrame = null; private Cancellable _function = null; /** * Constructor * @param inTitleKey key for dialog title text * @param inLabelKey key for label text * @param inParentFrame parent frame for creating dialog * @param inFunction function which can be cancelled */ public GenericProgressDialog(String inTitleKey, String inLabelKey, JFrame inParentFrame, Cancellable inFunction) { _dialogTitleKey = inTitleKey; _labelKey = inLabelKey; if (_labelKey == null) { _labelKey = "confirm.running"; } _parentFrame = inParentFrame; _function = inFunction; } /** * Create the dialog to show the progress */ private void createProgressDialog() { _progressDialog = new JDialog(_parentFrame, I18nManager.getText(_dialogTitleKey)); _progressDialog.setLocationRelativeTo(_parentFrame); _progressBar = new JProgressBar(0, 100); _progressBar.setValue(0); _progressBar.setStringPainted(true); _progressBar.setString(""); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); panel.add(new JLabel(I18nManager.getText(_labelKey))); panel.add(_progressBar); panel.add(Box.createVerticalStrut(6)); // spacer JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _function.cancel(); } }); panel.add(cancelButton); _progressDialog.getContentPane().add(panel); _progressDialog.pack(); _progressDialog.setVisible(true); } /** * Show the dialog in indeterminate mode, before limits are calculated */ public void show() { if (_progressDialog == null) { createProgressDialog(); _progressBar.setIndeterminate(true); } } /** * Update the progress bar * @param inCurrent current value * @param inMax maximum value */ public void showProgress(int inCurrent, int inMax) { if (_progressDialog == null) createProgressDialog(); if (_progressBar.isIndeterminate()) _progressBar.setIndeterminate(false); if (inMax > 0) _progressBar.setMaximum(inMax); _progressBar.setValue(inCurrent); _progressBar.setString("" + inCurrent + " / " + _progressBar.getMaximum()); } /** * Close the dialog */ public void close() { if (_progressDialog != null) _progressDialog.dispose(); } }