// Charles A. Loomis, Jr., and University of California, Santa Cruz,
// Copyright (c) 2000
package org.freehep.swing.graphics;

import javax.swing.JComponent;

/**
 * This interface allows the implementing component to interact with a
 * StackedPanel.  The StackedPanel handles all of the details of
 * layering, repainting, etc.; however, it cannot provide the actual
 * content to display.  This is the responsibility of the
 * PanelArtist. 
 * 
 * If the content changes then the PanelArtist is expected to signal
 * to the StackedPanel that a redraw is needed (redrawNeeded method of
 * StackedPanel).  The StackedPanel will then callback the PanelArtist
 * via the drawPanel method.  The PanelArtist is then responsible for
 * deciding what needs to be drawn.  The actual drawing can be done in
 * a background thread if desired. 
 *
 * This interface allows only one StackedPanel to be controlled by a
 * given PanelArtist.  Consequently, when the setPanelArtist method is
 * called the component should save the value. 
 *
 * @author Charles Loomis
 * @version $Id: PanelArtist.java,v 1.1.1.1 2004/05/31 05:08:49 kuromaru Exp $ */
public interface PanelArtist {

    /**
     * This returns a descriptive string for this PanelArtist.
     *
     * @return a String describing this PanelArtist */
    public String getDescription();

    /**
     * This method draws the graphics onto the StackedPanel.  Usually
     * this is called only when the content has changed, simple
     * repaints are handled by the StackedPanel's buffering.
     * 
     * The class which implements this interface has the option of
     * doing the drawing in a background thread.  In such a case, the
     * method should return immediately after starting the thread and
     * return false indicating that the drawing has not completed.
     * After the drawing has completed, this method should call the
     * drawComplete() method of the StackedPanel.
     *
     * @return boolean indicating whether the drawing has completed */ 
    public boolean drawPanel();

    /**
     * This method sets which data sample should be used.
     *
     * @param data data sample to use */
    public void setEventData(Object data);

    /**
     * This method returns the data sample which is currently being
     * used. 
     *
     * @return the event data currently being used. */
    public Object getEventData();

    /**
     * Set the StackedPanel that this PanelArtist will control. 
     *
     * @param panel StackedPanel to control */
    public void setStackedPanel(StackedPanel panel);

    /**
     * Return the StackedPanel which is being controlled. 
     *
     * @return the StackedPanel which is being controlled */
    public StackedPanel getStackedPanel();

    /**
     * This method aborts any drawing which is being done in another
     * thread.  This method should NOT return until the drawing has
     * been stopped. 
     *
     * @param panel the StackedPanel in which this object is drawing
     * */
    public void abortDraw();

    /**
     * This method is called when the size of the StackedPanel has
     * changed.  This gives the implementing class the opportunity to
     * change transformation matricies, flag that a redraw is needed,
     * etc. 
     *
     * @param oldWidth the previous width of the StackedPanel
     * @param oldHeight the previous height of the StackedPanel */
    public void panelResized();

    /**
     * This method returns a JComponent which contains controls for
     * the given PanelArtist.  The implementing class may return null
     * if no controls are relevant. 
     *
     * @return JComponent containing controls for the Panel Artist */ 
    public JComponent getControlPanel();

}
