import java.awt.event.*;
import java.util.*;

/**
 * A Part (i.e., a sequence of Note or Lyric objects) in a Score
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class Part  implements MetronomeListener
{
    private AbstractLineElement      element;
    private AbstractLineElement[]    elements;
    private int                      currentIndex, duration;
    private int                      elapsed, lastIndex;    
    private Presenter                presenter;


    /**
     * Explicit Value Constructor
     *
     * @param size  The number of elements in this Part
     */
    public Part(int size)
    {
       elements     = new AbstractLineElement[size];
       currentIndex = 0;       
       lastIndex    = 0;       
       duration     = 0;       

    }




    /**
     * Get an AbstractLineElement
     */
    public AbstractLineElement getElement(int i)
    {
       AbstractLineElement      element;
       
       element = null;
       if ((i >= 0) && (i < elements.length))
       {
          element = elements[i];          
       }
       

       return element;       
    }



    /**
     * Handle a "tick" of the Metronome (required by MetronomeListener)
     *
     * @param metronome  The source of the "tick"
     */
    public void handleTick(Metronome metronome)
    {
       elapsed += metronome.DELAY_IN_MILLIS;
       
       if (elapsed >= duration)
       {
          presenter.turnOff();
          
          element = getElement(currentIndex);
          currentIndex++;          

          if (element != null)
          {
             duration = element.getDurationInMillis();

             presenter.setValue(element.getValue());
             presenter.turnOn();
          }
          
          elapsed = 0;          
       }
    }
    




    /**
     * Set an AbstractLineElement
     *
     * @param i        The index
     * @param element  The element
     */
    public void setElement(int i, AbstractLineElement element)
    {
       if ((i >= 0) && (i < elements.length))
       {
          elements[i] = element;
       }
    }



    /**
     * Set the Presenter to use when "presenting" this
     * Part
     *
     * @param presenter   The Presenter to use
     */
    public void setPresenter(Presenter presenter)
    {
       this.presenter = presenter;
       
    }
    
}
