package org.freehep.application; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.BoundedRangeModel; import javax.swing.DefaultBoundedRangeModel; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.freehep.util.images.ImageHandler; /** * A progress meter designed to slot into a StatusBar. * @see StatusBar * @author tonyj * @version $Id: ProgressMeter.java 8584 2006-08-10 23:06:37Z duns $ */ public class ProgressMeter extends JPanel { public ProgressMeter() { this(true); } public ProgressMeter(boolean showStopButton) { super(new FlowLayout(FlowLayout.RIGHT,5,0)); setBorder(BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)); Icon icon = ImageHandler.getIcon("/toolbarButtonGraphics/general/Stop16.gif",getClass()); m_stopButton = new JLabel(icon); // Note: We use a label since it takes much less space than a button m_stopButton.setEnabled(false); m_stopButton.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { Stoppable stop = m_stop; // Thread safe if (stop != null) stop.stop(); } }); m_meter.setBorderPainted(false); add(m_meter); add(m_stopButton); m_stopButton.setVisible(showStopButton); setAlignmentX(0.9f); } public void setShowStopButton(boolean showStopButton) { m_stopButton.setVisible(showStopButton); } /** * Set the model for the progress bar * @param model The model, or null to clear the progress bar */ public void setModel(BoundedRangeModel model) { if (m_model != null) m_model.removeChangeListener(listener); m_model = model; if (m_model != null) { m_model.addChangeListener(listener); setProgress(m_model); } else m_realModel.setRangeProperties(0,0,0,0,false); } /** * Set a stoppable, which will be stopped if the user presses the stop button * @param stop The stoppable, or null to clear */ public void setStoppable(Stoppable stop) { if (stop == null) { setModel(null); m_stopButton.setEnabled(false); m_stopButton.repaint(); m_stop = stop; } else { m_stop = stop; setModel(stop.getModel()); m_stopButton.setEnabled(true); m_stopButton.repaint(); } } /** * Get the model attached to the progress bar */ public BoundedRangeModel getModel() { return m_model; } public void setIndeterminate(boolean ind) { m_meter.setIndeterminate(ind); } public boolean isIndeterminate() { return m_meter.isIndeterminate(); } public void setStopEnabled(boolean enabled) { m_stopButton.setEnabled(enabled); } public boolean getStopEnabled() { return m_stopButton.isEnabled(); } private void setProgress(BoundedRangeModel model) { m_realModel.setRangeProperties(model.getValue(),model.getExtent(),model.getMinimum(),model.getMaximum(),model.getValueIsAdjusting()); } private AsnycListener listener = new AsnycListener(); private JLabel m_stopButton; private Stoppable m_stop; private BoundedRangeModel m_model; private DefaultBoundedRangeModel m_realModel = new DefaultBoundedRangeModel(); private JProgressBar m_meter = new JProgressBar(m_realModel); private class AsnycListener implements ChangeListener { public void stateChanged(ChangeEvent e) { final BoundedRangeModel model = (BoundedRangeModel) e.getSource(); if (SwingUtilities.isEventDispatchThread()) { setProgress(model); } else { Runnable run = new Runnable() { public void run() { setProgress(model); } }; SwingUtilities.invokeLater(run); } } } }