import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class JavaDrie extends Applet
                      implements ActionListener, AdjustmentListener
{
    private Button    startButton;
    private Scrollbar roodScroll,
                      groenScroll,
                      blauwScroll,
                      autoXScroll,
                      autoYScroll,
                      autoBreedteScroll,
                      autoHoogteScroll;
    private Color     lightBlue = new Color(173, 216, 230);

    public void init()
    {
        this.setBackground(lightBlue);
        setLayout(null);

        startButton       = new Button("start");
        roodScroll        = new Scrollbar(Scrollbar.HORIZONTAL, 127, 1,  0, 256);
        groenScroll       = new Scrollbar(Scrollbar.HORIZONTAL, 127, 1,  0, 256);
        blauwScroll       = new Scrollbar(Scrollbar.HORIZONTAL, 127, 1,  0, 256);
        autoXScroll       = new Scrollbar(Scrollbar.HORIZONTAL,  80, 1, 23, 500 - 348 - 23);
        autoYScroll       = new Scrollbar(Scrollbar.VERTICAL  , 110, 1, 59, 470 - 290 - 18);
        autoBreedteScroll = new Scrollbar(Scrollbar.HORIZONTAL, 348, 1,  1, 500 - 23);
        autoHoogteScroll  = new Scrollbar(Scrollbar.VERTICAL  , 290, 1,  1, 470 - 18);

        this.add(startButton);
        this.add(roodScroll);
        this.add(groenScroll);
        this.add(blauwScroll);
        this.add(autoXScroll);
        this.add(autoYScroll);
        this.add(autoBreedteScroll);
        this.add(autoHoogteScroll);

        startButton      .addActionListener(this);
        roodScroll       .addAdjustmentListener(this);
        groenScroll      .addAdjustmentListener(this);
        blauwScroll      .addAdjustmentListener(this);
        autoXScroll      .addAdjustmentListener(this);
        autoYScroll      .addAdjustmentListener(this);
        autoBreedteScroll.addAdjustmentListener(this);
        autoHoogteScroll .addAdjustmentListener(this);

        startButton      .setBounds( 24,  42,  36, 18);
        autoXScroll      .setBounds( 23,   5, 453, 18);
        autoYScroll      .setBounds(  5,  41,  18, 436);
        autoBreedteScroll.setBounds( 23, 476, 453, 18);
        autoHoogteScroll .setBounds(476,  41,  18, 436);
        roodScroll       .setBounds( 23,  23, 149, 18);
        groenScroll      .setBounds(176,  23, 149, 18);
        blauwScroll      .setBounds(327,  23, 149, 18);
    }

    public void paint(Graphics pen)
    {
        int rw      = roodScroll       .getValue();
        int gw      = groenScroll      .getValue();
        int bw      = blauwScroll      .getValue();
        int x       = autoXScroll      .getValue();
        int y       = autoYScroll      .getValue();
        int breedte = autoBreedteScroll.getValue();
        int hoogte  = autoHoogteScroll .getValue();

        pen.setColor(lightBlue);
        // fill3DRect LIJKT beter te werken dan draw3DRect...
        pen.fill3DRect(0, 0, 500, 500, true);

        autoXScroll      .setMaximum(500 - breedte - 23);
        autoYScroll      .setMaximum(470 - hoogte - 18);
        autoBreedteScroll.setMaximum(500 - x - 23);
        autoHoogteScroll .setMaximum(470 - y - 18);

        pen.setColor(new Color(rw, gw, bw));
        this.tekenAuto(pen, x, y, breedte, hoogte);

        pen.setColor(Color.black);
        pen.drawString("rood="    + rw,       70, 55);
        pen.drawString("groen="   + gw,      220, 55);
        pen.drawString("blauw="   + bw,      370, 55);
        pen.drawString("x="       + x,        50, 470);
        pen.drawString("y="       + y,       160, 470);
        pen.drawString("breedte=" + breedte, 270, 470);
        pen.drawString("hoogte="  + hoogte,  390, 470);
    }

    private void tekenAuto(Graphics pen, int x, int y, int breedte, int hoogte)
    {
        /* multiBreedte en multiHoogte zijn de kleinste hoogte en breedte die
         * gebruikt gaan worden en als basis gaan dienen voor alle andere hoogtes
         * en breedten (de "multipliers").
         * De originele en aanbevolen verhouding (anders zijn de wielen niet meer
         * rond maar ovaal) is:
         * breedte : hoogte
         *       6 : 5
         * In dit geval was het niet meer mogelijk om de auto's een opschrift te
         * geven, omdat alleen de hoogte en niet de breedte aangegeven kan worden.
         */
        double multiBreedte = (double) breedte / 12.0;
        double multiHoogte  = (double) hoogte  / 10.0;

        // teken het bovenstuk
        pen.drawLine((int) ((double) x + multiBreedte * 5.0), y, (int) ((double) x + multiBreedte * 3.0) , (int) ((double) y + multiHoogte * 4.0));
        pen.drawLine((int) ((double) x + multiBreedte * 9.0), y, (int) ((double) x + multiBreedte * 11.0), (int) ((double) y + multiHoogte * 4.0));
        pen.drawRect((int) ((double) x + multiBreedte * 5.0), y, (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
        pen.fillRoundRect(x, (int) ((double) y + multiHoogte * 4.0), (int) (multiBreedte * 12.0), (int) (multiHoogte * 4.0), (int) multiBreedte, (int) multiHoogte);

        // teken de wielen
        this.tekenWiel(pen, (int) ((double) x + multiBreedte),       (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
        this.tekenWiel(pen, (int) ((double) x + multiBreedte * 7.0), (int) ((double) y + multiHoogte * 6.0), (int) (multiBreedte * 4.0), (int) (multiHoogte * 4.0));
    }

    private void tekenWiel(Graphics pen, int x, int y, int breedte, int hoogte)
    {
        // bewaar de oude kleur om die later te kunnen herstellen
        Color oudeKleur = pen.getColor();

        // buitenste cirkel
        pen.setColor(Color.black);
        pen.fillOval(x, y, breedte, hoogte);

        // binnenste cirkel
        pen.setColor(Color.white);
        pen.fillOval(x + breedte / 4, y + hoogte / 4, breedte / 2, hoogte / 2);

        pen.setColor(oudeKleur);
    }

    public void actionPerformed(ActionEvent e)
    {
        // de maxima dienen eerst te worden aangepast
        autoXScroll      .setMaximum(500 - 348 - 23);
        autoYScroll      .setMaximum(470 - 290 - 18);
        autoBreedteScroll.setMaximum(500 - 80  - 23);
        autoHoogteScroll .setMaximum(470 - 110 - 18);
        
        roodScroll       .setValue(127);
        groenScroll      .setValue(127);
        blauwScroll      .setValue(127);
        autoXScroll      .setValue(80);
        autoYScroll      .setValue(110);
        autoBreedteScroll.setValue(348);
        autoHoogteScroll .setValue(290);

        repaint();
    }

    public void adjustmentValueChanged(AdjustmentEvent e)
    {
        repaint();
    }
}