// JRobo    Example 9
//          Demonstrates polymorphism!
// Author:  David 5/9/99

import java.awt.*;
import java.applet.*;
import java.util.ArrayList;

public class JRoboTest extends Applet
{

    ArrayList theTeam;     // this holds a collection of JRobos

    public void paint( Graphics g )
    {
        JRobo aRobo = new JRobo( g );
        move( aRobo, -400, 0 );

        ScaledJRobo robby = new ScaledJRobo( g );
        move( robby, -100, 0 );
        robby.setScale( 2 );

        ColouredJRobo friendly = new ColouredJRobo( g );
        move( friendly, 300, 0 );
        
        // add each JRobo to the team
        theTeam = new ArrayList();
        theTeam.add( aRobo );
        theTeam.add( robby );
        theTeam.add( friendly );
        
        // tell each member of the team to draw same rect
        // Polymorphism means the each do it their way!
        for (int i = 0; i < theTeam.size(); i++)
        {
            JRobo someJRobo = (JRobo) theTeam.get( i );
            someJRobo.rect( 150, 50 );
        }


        for (int i = 0; i < theTeam.size(); i++)
        {
            JRobo someJRobo = (JRobo) theTeam.get( i );
            move( someJRobo, 0, -100 );
            someJRobo.r( 45 );
            someJRobo.f( 100 );
        }

        robby.setScale(4);
        robby.circle( 25);

    }

    // move - reposition JRobo x, +dx, +dy from current location
    void move( JRobo x, int dx, int dy )
    {
        x.p();
        x.f( dy );
        x.r( 90 );
        x.f( dx );
        x.l( 90 );
        x.p();
    }
    
} // end JRoboTest class


/*
        // version 5 for syntax withoout generics
        for ( Object robo : theTeam )
        {
           ( (JRobo) robo).rect( 25, 25 );
        }

        // version 5 syntax with generics
        ArrayList<JRobo> myTeam;
        myTeam = new ArrayList<JRobo>();
        
        myTeam.add( aRobo );
        myTeam.add( robby );
        myTeam.add( friendly );        
        
        for ( JRobo robo : myTeam )
        {
           robo.r(45);
           robo.rect( 25, 25 );
           robo.f(100);
        }
*/