package junit.swingui;

import javax.swing.* ;
import javax.swing.border.* ;
import java.awt.* ;

/**
 * A simple progress bar showing the green/red status
 */
class ProgressBar extends JPanel {
        boolean fError = false;

        int fTotal = 0;

        int fProgress = 0;

        int fProgressX = 0;

        public ProgressBar() {
                super();
                setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        }

        private Color getStatusColor() {
                if (fError)
                        return Color.red;
                return Color.green;
        }

        public void paintBackground(Graphics g) {
                g.setColor(getBackground());
                g.fillRect(0, 0, getWidth(), getHeight());
        }

        public void paintComponent(Graphics g) {
                paintBackground(g);
                paintStatus(g);
        }

        public void paintStatus(Graphics g) {
                g.setColor(getStatusColor());
                Rectangle r = new Rectangle(0, 0, fProgressX, getBounds().height);
                g.fillRect(1, 1, r.width - 1, r.height - 2);
        }

        private void paintStep(int startX, int endX) {
                repaint(startX, 1, endX - startX, getBounds().height - 2);
        }

        public void reset() {
                fProgressX = 1;
                fProgress = 0;
                fError = false;
                repaint();
        }

        public int scale(int value) {
                if (fTotal > 0)
                        return Math.max(1, value * (getBounds().width - 1) / fTotal);
                return value;
        }

        public void setBounds(int x, int y, int w, int h) {
                super.setBounds(x, y, w, h);
                fProgressX = scale(fProgress);
        }

        public void start(int total) {
                fTotal = total;
                reset();
        }

        public void step(boolean successful) {
                fProgress++;
                int x = fProgressX;

                fProgressX = scale(fProgress);

                if ( !fError && !successful) {
                        fError = true;
                        x = 1;
                }
                paintStep(x, fProgressX);
        }
}