package junit.swingui;

import java.awt.Color;

import javax.swing.JProgressBar;

/**
 * A progress bar showing the green/red status
 */
class ProgressBar extends JProgressBar {
	boolean fError= false;
	
	public ProgressBar() {
		super(); 
		setForeground(getStatusColor());
	}
	
	private Color getStatusColor() {
		if (fError)
			return Color.red;
		return Color.green;
	}
		
	public void reset() {
		fError= false;
		setForeground(getStatusColor());
		setValue(0);
	}
	
	public void start(int total) {
		setMaximum(total);
		reset();
	}
	
	public void step(int value, boolean successful) {
		setValue(value);
		if (!fError && !successful) {
			fError= true;
			setForeground(getStatusColor());
		}
	}
}