//
//    CHAPTER 7
//    Applet Source Name [StringScroller.java]
//                                    1996.2
//                 Author [ Junzo hagimoto ]
import java.applet.*;
import java.awt.*;

public  class  StringScroller  extends Applet implements Runnable {
    Dimension d;
    String s[];                                                     
    Thread kicker = null;
    int    xScroll;                           
    int    y_Point;                                     
    Font   font;                                        
    int    strHeight,strWidth;                          
    int    maxText;                                                 
    int    curTextCount=0 ;                                         
    int    red,blue,green;                                          
    Color  color;                                 //  
    int    speed;                                 // ADD
    Image  offs;                                  // ADD
    Graphics grf;                                 // ADD

    public void init() {
        d = size();
        xScroll = d.width;                    

                                                  //  
        offs = createImage( d.width, d.height);   // ADD
        grf  = offs.getGraphics();                // ADD

        String param = getParameter( "speed" );               // ADD
        speed = (param != null) ? Integer.parseInt(param) : 1;// ADD
        if(speed < 1 || speed > 5 ){                          // ADD
           speed = 1;                                         // ADD
        }                                                     // ADD

        param = getParameter( "maxText" );                   
        maxText = (param != null) ? Integer.parseInt(param) : 1;    
        s = new String[maxText];                                    
        int i=0;                                                    
        do{                                                         
            param = getParameter( "text"+ (i+1) );                  
            if(param != null ){                                     
            s[i] = new String(param);                           
       }else{                                                  
                if( i==0 ){                                         
                   s[i] = "Java";                                    
                }                                                   
             maxText = i+1;                                      
            }                                                       
        }while( param != null && ++i != maxText );                  

        font  = new Font("TimesRoman",Font.BOLD,20);           
        strHeight  =(getFontMetrics(font)).getLeading() ;      
        strHeight -=(getFontMetrics(font)).getDescent() ;      
        strHeight +=(getFontMetrics(font)).getAscent() ;
        y_Point    =(d.height   + strHeight                    
                   -  (getFontMetrics(font)).getDescent()) /2; 
       
    }


    public void run() {
        Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
        while (kicker != null) {
            repaint();
            try {
                Thread.sleep( 20 );                         
            } catch (InterruptedException e) {}
        }
        kicker=null;
    }

    public void update(Graphics g) {                        
           paint(g);                                        
    }                                                       
    public void paint(Graphics g) {
        grf.setFont( font );                                  
        grf.setColor(Color.black);                          
        grf.fillRect(0, 0, d.width, d.height);
        if(xScroll == d.width){                                       
            red   = (int)(Math.random() * 256);                       
            blue  = (int)(Math.random() * 256);                       
            green = (int)(Math.random() * 256);                       
            color = new     Color( red, green, blue);                 
            curTextCount++;                                           
            if(curTextCount > maxText){                               
               curTextCount=1;                                     
            }                                                         
            strWidth = (getFontMetrics(font)).stringWidth(s[curTextCount-1]) ;
        }                                                             
        grf.setColor(color);
                                                    //  
        xScroll -= speed;                           // ADD 
                                              
        grf.drawString(s[curTextCount-1],xScroll, y_Point); 
       if(xScroll < -strWidth ){                           
          xScroll = d.width;                 
       }
                                                    //  
        g.drawImage(offs, 0, 0, this);              // ADD 
    }

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

    public void stop() {
       if (kicker != null) {
            kicker.stop();
            kicker = null;
        }
    }
}
              //