package lectures.animation.threads_commands;
import util.annotations.WebDocuments;

import lectures.composite.objects_shapes.PlottedShuttle;
/**
 * This is an example of a command-object.
 * A command object represents a method call or command. 
 * 
 * It provides a parameterless method, called execute or run,  
 * which can be used to make the call.
 * 
 * Thus, its execute method is called to make another call, which we will
 * call the target call.
 * 
 * In this class, the execute method is named run, and it calls animateFromOrigin
 * in an instance of ShuttleAnimator. 
 * 
 * The object on which a target call is made and the parameters of the call
 * are passed as arguments to the constructor of a command object.
 * 
 * In this example, the instance of ShuttleAnimator and the parameters of 
 * animateFromOrigin are passed as parameters to the constructor.
 * 
 * These parameters are then used by the run method to make the call.
 * 
 * The execute/run method of a command object is defined by some standard interface.
 *  
 * 
 * 
 * Study the constructor and instance method provided by this class.
 * 
 * Follow the instructions below. 
 * 
 *
 */
@WebDocuments({"Lectures/AnimationThreadsCommands.pptx", "Lectures/AnimationThreadsCommands.pdf", "Videos/AnimationThreadsCommands.avi"})
public class AShuttleAnimationCommand 
    implements Runnable { // A Java Interface
    
    ShuttleAnimator shuttleAnimator;
    PlottedShuttle shuttle;
    int animationStep;
    int animationPauseTime; 
    
    public AShuttleAnimationCommand (ShuttleAnimator aShuttleAnimator,
                                PlottedShuttle aShuttle, 
                                int anAnimationStep, 
                                int anAnimationPauseTime) {
        shuttleAnimator = aShuttleAnimator;
        shuttle = aShuttle;
        animationStep = anAnimationStep;
        animationPauseTime = anAnimationPauseTime;
    }
    
    
    public void run() {
            
        System.out.println (
                Thread.currentThread() +
                " about to call animateFromOrigin in:" +
                shuttleAnimator);
        /*
         * Put break point below
         */
        shuttleAnimator.animateFromOrigin(shuttle, animationStep, animationPauseTime);
        System.out.println (
                Thread.currentThread().getName() +
                " finished call to animateFromOrigin in:" +
                shuttleAnimator);
    }
    @Override
    public String toString() {
        return getClass().getSimpleName() + "@" + hashCode();
    }
/*
 * 
 * Put the break point in the  run() method of the class.
 * 
 * Switch to concurrentShuttleAnimation and debug-run the main class.
 * 
 * 
 * (T/F) The run() method of the command object takes parameters. 
 * 
 * (T/F) The constructor of the command object determines the instance on which
 * the run method makes the target call.
 * 
 * (T/F) The constructor of the command object determines the parameters of the
 * target call.
 * 
 * (T/F) The constructor of the command object determines which method is invoked
 * in the target call.
 * 
 * (T/F) The run() method of AShuttleAnimationCommand is called by the Thread constructor.
 * 
 * (T/F) The run() method of AShuttleAnimationCommand is called by the Thread.run().
 * 
 * (T/F) The run() method of AShuttleAnimationCommand is declared in the predefined
 * Java interface, Runnable.
 * 
 * 
 * Return to the main class (ConcurrentShuttleLaunchAnimation), to the THREAD AND
 * ANIMATION DESIGN PATTERN section.
 *
 *
 */
}