package nl.nikhef.safaripark;

import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class StatusBar extends JPanel {

	private JLabel _status;
	private JProgressBar _pb;
	private int _prgs;
	private int _max;
	private volatile boolean _prgsUdPending = false;
	
	public StatusBar() {
		setLayout(new BorderLayout());
		setBorder(BorderFactory.createEtchedBorder());
		_status = new JLabel(" ");
		add(_status, BorderLayout.CENTER);
		_pb = new JProgressBar();
		add(_pb, BorderLayout.LINE_END);
		_pb.setEnabled(false);
	}
	
	
	private synchronized void updateProgress() {
		if (!_prgsUdPending) return;
		if (_max == -1) {
			if (!_pb.isEnabled()) _pb.setEnabled(true);
			if (!_pb.isIndeterminate()) _pb.setIndeterminate(true);
		} else {
			if (_pb.isIndeterminate()) _pb.setIndeterminate(false);	
			if (_pb.getMaximum() != _max) _pb.setMaximum(_max);
			if (_pb.getValue() != _prgs) _pb.setValue(_prgs);
			if (_prgs == _max) {
				// TODO clear it later
			}
		}
		_prgsUdPending = false;
	}
	
	private void triggerUpdate() {
		if (_prgsUdPending) return;
		_prgsUdPending = true;
		SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {
				updateProgress();
			}
			
		});
	}
	
	public synchronized void setProgress(int current, int max)
	{
		_max = max;
		_prgs = current;
		triggerUpdate();
	}
	
	public synchronized void setIndeterminte()
	{
		_max = -1;
		triggerUpdate();
	}
	
	public synchronized void setDone()
	{
		_max = 1;
		_prgs = 1;
		triggerUpdate();
	}

	public void setStatus(String text) 
	{
		_status.setText(text);
	}

	
}
