package junit.awtui;

import java.awt.* ;

public class ProgressBar extends Canvas {
        public boolean fError = false;

        public int fTotal = 0;

        public int fProgress = 0;

        public int fProgressX = 0;

        public ProgressBar() {
                super();
                setSize(20, 30);
        }

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

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

        public void paintBackground(Graphics g) {
                g.setColor(SystemColor.control);
                Rectangle r = getBounds();
                g.fillRect(0, 0, r.width, r.height);
                g.setColor(Color.darkGray);
                g.drawLine(0, 0, r.width - 1, 0);
                g.drawLine(0, 0, 0, r.height - 1);
                g.setColor(Color.white);
                g.drawLine(r.width - 1, 0, r.width - 1, r.height - 1);
                g.drawLine(0, r.height - 1, r.width - 1, r.height - 1);
        }

        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;
                paint(getGraphics());
        }

        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);
        }
}