/*
 *
 * Klasse:          Lightweightdemo
 *
 * Autor:           Reiner Rosin
 *                  reiner_rosin@wiesbaden-online.de
 *                  http://home.wiesbaden-online.de/~rrosin
 *
 * Angefangen am:   21.07.1997
 *
 * Aufgabe:         Demonstration für den Einsatz von
 *                  Lightweigt-Komponenten
 *
 * 21.07.1997:      Erstimplementierung;
 */

package lightweight;

import javis.instrumente.*;
import javis.awt.*;

import java.applet.*;
import java.awt.*;
import java.beans.*;

public class Lightweightdemo extends Applet implements PropertyChangeListener, Runnable
{
    // Die Komponenten fuer das Layout
    protected LCDAnzeige anzeige;
    protected DrehRegler regler;
    protected Bild bild;
    protected SchiebeSchalter schalterLCD;
    protected SchiebeSchalter schalterDubbleBuffering;
    protected Form kreis;

    // Geschwindigkeit der Kugel
    protected int vx=10;
    protected int vy=5;

    // Thread, der die Kugel bewegt
    protected Thread meinThread=null;

    public Lightweightdemo()
    {
        System.out.println("Applet wurde gestartet!");
        this.setLayout(null);

        // Komponenten erzeugen und in den Container einfuegen
        regler=new DrehRegler();
        this.add(regler);
        regler.setBounds(35,95,110,110);
        regler.addPropertyChangeListener(this);

        anzeige=new LCDAnzeige();
        this.add(anzeige);
        anzeige.setForeground(Color.red);
        anzeige.setSegmentfarbe(new Color(150,150,255));
        anzeige.setVorkommastellen(4);
        anzeige.setNachkommastellen(1);
        anzeige.setDurchsichtig(true);
        anzeige.setZeichneAlleSegmente(false);
        anzeige.setWert(0.0);
        anzeige.setBounds(30,16,130,70);

        schalterLCD=new SchiebeSchalter();
        this.add(schalterLCD);
        schalterLCD.setBounds(190,35,20,40);
        schalterLCD.addPropertyChangeListener(this);

        schalterDubbleBuffering=new SchiebeSchalter();
        this.add(schalterDubbleBuffering);
        schalterDubbleBuffering.setBounds(50,235,20,40);

        LightLabel label;
        label=new LightLabel("Segmente");
        this.add(label);
        label.setBounds(190,15,100,20);

        label=new LightLabel("An");
        this.add(label);
        label.setBounds(220,35,50,20);

        label=new LightLabel("Aus");
        this.add(label);
        label.setBounds(220,55,50,20);

        label=new LightLabel("Double-Buffering");
        this.add(label);
        label.setBounds(35,215,200,20);

        label=new LightLabel("An");
        this.add(label);
        label.setBounds(110,235,50,20);

        label=new LightLabel("Aus");
        this.add(label);
        label.setBounds(110,255,50,20);

        label=new LightLabel("Lightweight-Demo");
        this.add(label);
        label.setBounds(160,255,150,20);

        label=new LightLabel("by Reiner Rosin");
        this.add(label);
        label.setBounds(160,275,150,20);

        kreis=new Form(Form.KREIS);
        this.add(kreis);
        kreis.setForeground(Color.blue);
        kreis.setBackground(Color.blue);
        kreis.setBounds(0,0,40,40);

        bild=new Bild("/testbild/clouds.gif");
        this.add(bild);
        bild.setWiederholen(true);

        // Thread erzeugen und starten
        meinThread=new Thread(this);
        meinThread.start();


    }

	public void propertyChange(PropertyChangeEvent event)
	{
	    String propertyName=event.getPropertyName();
	    if (propertyName==null) return;

//        System.out.println("Property: "+propertyName);
	    if (propertyName.equals("wert")==true)
	    {
	        anzeige.setWert(((Double)event.getNewValue()).doubleValue());
	    }
	    else if (propertyName.equals("an")==true)
	    {
	        anzeige.setZeichneAlleSegmente(((Boolean)event.getNewValue()).booleanValue());
	    }
	}

    public void setBounds(int x,int y,int width, int height)
    {
        super.setBounds(x,y,width,height);
        bild.setBounds(x,y,width,height);
    }

    public void run()
    {
        while(true)
        {
            try
            {
                meinThread.sleep(100);
            }
            catch (Exception e)
            {
                System.out.println("Exception: "+e);
            }

            Rectangle rectKreis=kreis.getBounds();
            Rectangle rectThis=this.getBounds();

            Rectangle altKreis=kreis.getBounds();

            rectKreis.x+=vx;
            rectKreis.y+=vy;
            if (rectKreis.x<0)
            {
                rectKreis.x=0;
                vx=10;
            }
            if (rectKreis.y<0)
            {
                rectKreis.y=0;
                vy=5;
            }
            if (rectKreis.x+rectKreis.width>rectThis.width)
            {
                rectKreis.x=rectThis.width-rectKreis.width;
                vx=-10;
            }
            if (rectKreis.y+rectKreis.height>rectThis.height)
            {
                rectKreis.y=rectThis.height-rectKreis.height;
                vy=-5;
            }

            kreis.setBounds(rectKreis.x,rectKreis.y,rectKreis.width,rectKreis.height);

            // Die folgende Zeile ist noetig wegen eines Fehlers im JDK1.1.3
            // kreis.setBounds() loest zwar ein Neuzeichnen für den neuen Bereiches des
            // Kreises aus, nicht aber für den alten Bereich. Folge: es flackert jetz
            // doch ein wenig
            this.repaint(altKreis.x,altKreis.y,altKreis.width,altKreis.height);
        }
    }

    public void update(Graphics g)
    {
        paint(g);
    }

    public void invalidate()
    {
        super.invalidate();
        offscreen = null;
    }

    protected Image offscreen;

    public void paint(Graphics g)
    {
        if (schalterDubbleBuffering.getAn()==false)
        {
            super.paint(g);
        }
        else
        {
            Dimension dim=this.getSize();
            if (offscreen==null) offscreen=createImage(dim.width,dim.height);
            Graphics og=offscreen.getGraphics();
            og.setClip(g.getClip());
            og.clearRect(0,0,dim.width,dim.height);
            super.paint(og);
            g.drawImage(offscreen,0,0,null);
            og.dispose();
        }
    }
}
