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

public class JavaVier extends Applet
                      implements AdjustmentListener, ActionListener
{
    private Scrollbar aantalCirkelsScroll;
    private Button    resetButton,
                      plus20Button;
    private TextField percentageEdit;
    private Image     plaatje;
    private Color     lightBlue = new Color(173, 216, 230);

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

        aantalCirkelsScroll = new Scrollbar(Scrollbar.HORIZONTAL, 0, 1, 0, 201);
        percentageEdit      = new TextField("0%");
        resetButton         = new Button("0");
        plus20Button        = new Button("+20");

        this.add(aantalCirkelsScroll);
        this.add(percentageEdit);
        this.add(resetButton);
        this.add(plus20Button);

        aantalCirkelsScroll.addAdjustmentListener(this);
        resetButton        .addActionListener(this);
        plus20Button       .addActionListener(this);

        aantalCirkelsScroll.setBounds(10,   10, 440, 17);
        percentageEdit     .setBounds(440, 470,  50, 25);
        resetButton        .setBounds(460,  10,  30, 17);
        plus20Button       .setBounds(460,  40,  30, 17);

        percentageEdit.setBackground(Color.yellow);
        percentageEdit.setForeground(Color.red);
        percentageEdit.setFont(new Font("SansSerif", Font.BOLD, 16));
        percentageEdit.setEditable(false);

        plaatje = getImage(getDocumentBase(), "bclogo.gif");
    }

    public void paint(Graphics pen)
    {
        pen.setColor(lightblue);
        pen.fill3DRect(0, 0, 500, 500, true);

        int aantal = aantalCirkelsScroll.getValue();
        double deel = aantal / 200.0;

        pen.setColor(Color.black);
        pen.drawString("aantal cirkels=" + aantal, 10, 40);

        percentageEdit.setText((int) (deel * 100.0) + "%");

        if (aantal > 0)
        {
            tekenCirkels(pen, aantal);

            int xCenter = 455;
            int yCenter = 425;
            double hoek = deel * 360.0;

            // binnenste taartpunt
            pen.setColor(Color.orange);
            pen.fillArc(xCenter - 40, yCenter - 40, 80, 80, 90, (int) hoek);

            // buitenste (overlappende) taartpunt
            pen.setColor(Color.red);
            pen.drawArc(xCenter - 40, yCenter - 40, 80, 80, 90, (int) hoek);

            if (aantal < 200)
            {
                pen.drawLine(xCenter, yCenter, xCenter, yCenter - 40); // verticaal lijntje
                this.tekenHoekLijn(pen, xCenter, yCenter, 40, hoek);
            }
        }
        int verschil = (int) (aantal * 1.6);
        pen.drawImage(plaatje, 10, 100 + verschil, 390 - verschil, 390 - verschil, this);
    }

    private void tekenCirkels(Graphics pen, int aantal)
    {
        if (aantal != 0) // deze regel is in dit geval overbodig, maar maakt de methode wel universeler
            for (int i = 0; i < aantal; i++)
                pen.drawOval(50, 50, 20 + i * 2, 20 + i * 2);
    }
    
    private void tekenHoekLijn(Graphics pen, int x, int y, int lengte, double hoek)
    {
        /* Het volgende tekent het diagonale lijntje.
         * Het zou niet eerlijk zijn om niet te vermelden dat ik deze berekeningen
         * heb afgekeken van het "Clock" voorbeeld applet (Clock2.class).
         * Zelf zou ik waarschijnlijk nooit de berekeningen bedacht kunnen hebben
         * (hoewel ik dat wel eerst geprobeerd heb), maar het gaat hier ook om
         * Java, en niet om wiskunde.
         */
        double tussenUitkomst = -hoek * Math.PI / 180.0 - Math.PI / 2.0;
        pen.drawLine
        (
             x, y,
            (int) (Math.cos(tussenUitkomst) * (double) lengte + (double) x),
            (int) (Math.sin(tussenUitkomst) * (double) lengte + (double) y)
        );        
    }

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

    public void actionPerformed(ActionEvent e)
    {
        Object sender = e.getSource();
        if (sender == resetButton)
            this.resetButtonAction();
        else if (sender == plus20Button)
            this.plus20ButtonAction();
        repaint();
    }

    private void resetButtonAction()
    {
        aantalCirkelsScroll.setValue(0);
    }

    private void plus20ButtonAction()
    {
        int waarde = aantalCirkelsScroll.getValue();
        waarde += 20;
        if (waarde > 200)
          waarde -= 200;
        aantalCirkelsScroll.setValue(waarde);
    }
}