//
//    CHAPTER 21
//    Class Source Name [AnimatorApplet.java]     
//                                          
//    Package name      [userClass]         
//                                    1996.3
//                 Author [ Junzo hagimoto ]

package  userClass;

import java.applet.*;
import java.awt.*;
import java.net.URL;

//---------------------------------------------------------------------
//  アニメーションアプレットの基本動作クラス
//---------------------------------------------------------------------
abstract  public class  AnimatorApplet   extends Applet implements Runnable {
    Thread          kicker = null;
    MediaTracker    mt = null;
    Image           offs; 
    Graphics        grf;
    int             sleepTimer = 20;

//
//  サブクラスから継承を禁止するメソッド
//
    public final void init() {
        mt = new MediaTracker(this); 
        initAnimator();
        Dimension       d  = size();
        offs = createImage( d.width, d.height); 
        grf  = offs.getGraphics();
   }

    public final void run() {
        Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
        try{
              mt.waitForID(0);
        } catch( InterruptedException e){ 
              System.out.println("Wait Error");
              return;
        }
        runLoop();
        kicker=null;
    }

    public final void update(Graphics g) { 
        paint(g);
    }
    public final void paint(Graphics g) { 
        if(mt.isErrorID(0) ){  
              loadErrorMessage(g,"Image Load Error.......",50,20);
              return; 
        } 
        if(! mt.checkID(0) ){ 
              Dimension       d  = size();
              loadingMessage(g,"Loading.......",d.width/2 - 30,20);
             return; 
        } 
        paintAnimator(grf);
        g.drawImage(offs, 0, 0, this);
    }

    public final void start() {
        if (kicker == null) {
           startAnimator();
            kicker = new Thread(this);
            kicker.start();
        }
    }

    public final void stop() {
       if (kicker != null) {
            stopAnimator();
            kicker.stop();
            kicker = null;
        }
    }
    public final Image getImage(URL  url,String name){
        Image image;
        image = super.getImage( url, name);
        mt.addImage(image,0);
        return image;
   }
//
//  サブクラスから継承可能なメソッド
//
    
    protected void loadErrorMessage(Graphics g,String message,int x,int y){
           g.drawString(message,x, y);
    }
    protected void loadingMessage(Graphics g,String message,int x,int y){
           g.drawString(message,x, y);
    }
    protected void setSleepTimer(int timer){
           sleepTimer = timer;
    }
    protected void runLoop(){
        while (kicker != null) {
            repaint();
            try {
                Thread.sleep( sleepTimer );                         
            } catch (InterruptedException e) {}
        }
    }
    protected void  startAnimator(){}
    protected void  stopAnimator() {}
//
//  サブクラスで継承して実装すべきメソッド
//
    protected abstract void  initAnimator() ;
    protected abstract void  paintAnimator(Graphics g) ;
}
              //