import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
import java.awt.Event;

/**
  メッセージが点滅する BeatingMessage クラス
*/
public class BeatingMessage extends Applet implements Runnable {

     /**
       メッセージの内容
     */  
       public String message=null;

     /**
       メッセージのフォント
     */  
       public Font   textFont=null;

     /**
       フォントのサイズ
     */
       public int fontSize=18;

     /**
       点滅させるかどうかのフラグ 
     */
       public boolean modeFlag=true;

     /**
       オン・オフの状態を示すフラグ 
     */
       protected boolean stateFlag=true;

     /**
       点滅を実行するスレッド
     */
       public Thread beatingThread=null;

     /** 
      初期設定の関数（生成時に自動的に呼ばれる）
     */ 
       public void init() {

          // パラメータの値を得る
 
             String size = getParameter("size");
             String style = getParameter("style");
             String family = getParameter("family");
             String mode = getParameter("mode");

          // フォントのサイズの設定

             if ( size != null ) {
                  if ( size.equals("large")
                       || size.equals("LARGE") || size.equals("Large") )
                     fontSize=36;
                  else if ( size.equals("small")
                       || size.equals("SMALL") || size.equals("Small") )
                     fontSize=14;
                  else
                     fontSize=18;
              }  
             else
                     fontSize=18;

           // フォントのファミリーの設定

             if ( family == null ) family = "TimesRoman";

           // フォントのスタイルの設定

             if ( style != null ) {
                  if ( style.equals("italic")
                       || style.equals("ITALIC") || style.equals("Italic") )
                     textFont = new java.awt.Font(family, Font.ITALIC, fontSize);
                  else if ( style.equals("bold")
                       || style.equals("BOLD") || style.equals("Bold") )
                     textFont = new java.awt.Font(family, Font.BOLD, fontSize);
                  else
                     textFont = new java.awt.Font(family, Font.PLAIN, fontSize);
              }  
              else
                     textFont = new java.awt.Font(family, Font.PLAIN, fontSize);

           // 初期のモードを設定

             if( mode != null && 
                ( mode.equals("pause") ||
                  mode.equals("Pause") || mode.equals("PAUSE") ) ) {

                 modeFlag = false;
             }
             else {
                 modeFlag = true;
             }

           // メッセージの内容を設定

             message = getParameter("message");
             if ( message == null )
                  message = "Welcome to Wakkanai!";

           // サイズの調整

             resize( getFontMetrics( textFont ).stringWidth( message ) + 8,
                     fontSize*3/2 );
       }

    /**
     画面を描く関数
    */
       public void paint( Graphics g ) {

             g.setFont( textFont );

             if( stateFlag == true ) {

                  g.setColor( Color.darkGray );
                  g.drawString( message, 3, fontSize );

                  g.setColor( Color.white );
                  g.drawString( message, 5, fontSize + 2 );

                  g.setColor( Color.lightGray );
                  g.drawString( message, 4, fontSize +1 );
             }
             else {
                  g.clearRect( 0, 0, 
                     getFontMetrics( getFont() ).stringWidth(message) + 8,
                     fontSize*3/2 );
             }
       }

     /**
       画面に現れた時に呼ばれる処理
     */
       public void start() {

             if( modeFlag == true && beatingThread == null ) {
                   beatingThread = new Thread(this);
                   beatingThread.start();
             }
       }

     /**
       画面から消えた時に呼ばれる処理
     */
       public void stop() {

             if( beatingThread != null ) {
                   beatingThread.stop();
                   beatingThread = null;
             }
       }

     /**
       スレッドによって行われる処理の内容
     */
       public void run() {

             while( beatingThread.isAlive() ) {

                  repaint();

                  if( stateFlag == true )
                     {
                      try {
                           Thread.sleep(1600);
                     }
                      catch (InterruptedException e){}
                      stateFlag = false;
                     }
                  else
                     {
                      try {
                           Thread.sleep(400);
                      }
                      catch (InterruptedException e){}
                      stateFlag = true;
                     }
              }
       }

    /**
      マウスがクリックされた時呼ばれる処理。
     */
       public boolean mouseDown( Event evt, int x, int y ) {

             if( beatingThread == null ) {
                   beatingThread = new Thread(this);
                   beatingThread.start();
                   modeFlag = true;
             }
             else {
                   beatingThread.stop();
                   beatingThread = null;
                   modeFlag = false;
             }
             return true;
       }
}

