/**********************************************************************************
 *                                                                                *
 *                             輝く文字のアプレット                               *
 *                            Shining Letters Applet                              *
 *                             ( ShinLetter.java )                                *
 *                                                         Author : Seiichi Inoue *
 **********************************************************************************/

/******************** << インポートパッケージクラス定義 >> ******************/
import java.applet.Applet;            /*Appletパッケージ                          */
import java.awt.*;                    /*Abstract Windowing Toolkitパッケージの全て*/
import java.lang.*;                   /*langパッケージ              */

/**************************** << 自分のクラス定義 >> ************************/
//       クラス名称   : ShinLetter
//       アクセス制御  : public(どのクラスからもアクセス可能)
//       継承クラス   : Applet
//       引継クラス   : Runnable(Threadを使用可能にする)
public class ShinLetter extends Applet implements Runnable {

/************************** << クラス変数属性の宣言 >> **********************/
    Thread      kicker=null;                  /* スレッド制御(初期値:停止)   */
    Dimension   d;                            /* 表示領域             */
    Image       offs;                         /* オフスクリーンエリア       */
    Graphics    grf;                          /* 描画領域             */
    String      msg;                          /* 表示文字格納           */
    int         no;                           /* 文字の数             */
    int         width;                        /* 輝く文字の表示位置        */
    String      cen;                          /* 輝く文字(1字)         */
    String      bef;                          /* 輝く文字までの文字        */
    int         speed;                        /* 表示速度             */
    String      param;                        /* パラメータ引き取り        */
    int         backred,backgreen,backblue;   /* 背景色パラメータ情報       */
    Color       backcolor;                    /* 背景色              */
    int         mojired,mojigreen,mojiblue;   /* 文字色パラメータ情報       */
    Color       mojicolor;                    /* 文字色              */
    int         shinred,shingreen,shinblue;   /* 輝き色パラメータ情報       */
    Color       shincolor;                    /* 輝き色              */
    Font        font;                         /* 文字フォント           */
    String      fontname;                     /* 文字フォントパラメータ情報    */
    int         fontsize;                     /* 文字サイズパラメータ情報     */
    int         strHeight;                    /* 文字高さ             */
    int         y_Point;                      /* 表示位置(高さ)         */

/******************** << クラスのメッソード指定(実行手順) >> **************/

/*********** 初期化(init)メッソード ***********/
    public void init() {
        d = size();                             /* 表示画面サイズ情報を設定    */
        offs = createImage(d.width,d.height);   /* オフスクリーン用表示エリア作成 */
        grf = offs.getGraphics();               /* グラヒックオブジェクト取得   */

        param = getParameter("message");        /* 文字列パラメータ取込      */
        msg = (param != null)?                  /* 入力判定            */
            param: "TEXT ERORR";                /* 指定なし→TEXT ERORR      */
        msg = "  " + msg + "  ";                /* 空白付加(表示効果のため)   */
        no = msg.length();                      /* 文字の数            */
        param = getParameter("speed");          /* 表示速度パラメータ取込     */
        speed = (param != null)?                /* 入力判定(無指定時:50mSEC)  */
            Integer.parseInt(param): 50;
        param = getParameter("font");           /* フォント種類パラメータ取込   */
        fontname = (param != null)?             /* 入力判定(無指定時:Dialog)   */
            param: "Dialog";
        param = getParameter("fontsize");       /* フォントサイズパラメータ取込  */
        fontsize = (param != null)?             /* 入力判定(無指定時:35ポイント)*/
            Integer.parseInt(param): 35;

        param = getParameter("fonttype");       /* フォントタイプパラメータ取込  */
        if ( "BOLD".equals (param) )                            /* BOLD ?     */
            font = new Font(fontname,Font.BOLD,fontsize);       /* BOLD設定    */
        else {
            if ( "ITALIC".equals (param) )                      /* ITALIC ?    */
                font = new Font(fontname,Font.ITALIC,fontsize); /* ITALIC設定   */
            else
                font = new Font(fontname,Font.PLAIN,fontsize);  /* PLAIN その他  */
        }
        strHeight  = (getFontMetrics(font)).getLeading(); /* 文字の縦位置計算   */
        strHeight -= (getFontMetrics(font)).getDescent();
        strHeight += (getFontMetrics(font)).getAscent();
        y_Point    = (d.height + strHeight                /* 文字の縦位置セット  */
            - (getFontMetrics(font)).getDescent())/2;

        param = getParameter("backred");        /* 背景赤色パラメータ取込     */
        backred = (param != null)?              /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        param = getParameter("backgreen");      /* 背景緑色パラメータ取込     */
        backgreen = (param != null)?            /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        param = getParameter("backblue");       /* 背景青色パラメータ取込     */
        backblue = (param != null)?             /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        backcolor = new Color                   /* 背景色組立           */
            (backred,backgreen,backblue);

        param = getParameter("mojired");        /* 文字赤色パラメータ取込     */
        mojired = (param != null)?              /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;
        param = getParameter("mojigreen");      /* 文字緑色パラメータ取込     */
        mojigreen = (param != null)?            /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;
        param = getParameter("mojiblue");       /* 文字青色パラメータ取込     */
        mojiblue = (param != null)?             /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        mojicolor = new Color                   /* 文字色組立           */
            (mojired,mojigreen,mojiblue);

        param = getParameter("shinred");        /* 輝き赤色パラメータ取込     */
        shinred = (param != null)?              /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        param = getParameter("shingreen");      /* 輝き緑色パラメータ取込     */
        shingreen = (param != null)?            /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        param = getParameter("shinblue");       /* 輝き青色パラメータ取込     */
        shinblue = (param != null)?             /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;
        shincolor = new Color                   /* 輝き色組立           */
            (shinred,shingreen,shinblue);

    }                                           /* 初期化メソッド終了       */

/********** スタート(start)メソッド **********/
    public void start() {
        if ( kicker == null ) {                 /* kickerがnull?(停止中?)   */
            kicker = new Thread(this);          /* YES:kickerを動作中に設定   */
            kicker.start();                     /* startを設定          */
        }
    }                                           /* スタートメソッド終了      */

/*********** 繰り返し(run)メソッド ***********/
    public void run() {
        int i;                                  /* カウンタ・クラス変数宣言(正数)*/
        while (true) {                          /* 繰り返し            */
            try {                               /* 割り込み確認          */
                for(i=0; i<no-1; i++) {         /* 文字の数だけ繰り返す      */
                    bef = msg.substring(0, i);  /* 先頭からカウンタまでの文字切出 */
                    cen = msg.substring(i, i+1);/* カウンタの示す文字を切出    */
                    kicker.sleep(speed);        /* 速度指定分待ち合わせ(mSEC)   */
                    repaint();                  /* 描画メソッド呼び出し      */
                }
                kicker.sleep(speed);            /* 次のサイクルの待ち合わせ(mSEC) */
            } catch(InterruptedException e) {}  /* 割り込み処理          */
        }
    }                                           /* 繰り返しメソッド終了      */

/************ 更新(update)メソッド ***********/
    public void update(Graphics g) {            /* 画面のちらつきを無くす     */
        paint(g);                               /* 描画              */
    }                                           /* 更新メソッド終了        */

/************ 描画(paint)メソッド ************/
    public void paint(Graphics g) {
        grf.setColor(backcolor);                /* 背景色設定           */
        grf.fillRect(0,0,d.width,d.height);     /* 背景色で背景を塗りつぶす    */
        FontMetrics fm = getFontMetrics(font);  /* フォント情報取得        */
        grf.setFont(font);                      /* フォント設定          */
        width = fm.stringWidth(bef);            /* 輝く文字を表示する位置を取得  */
        grf.setColor(mojicolor);                /* 文字色設定           */
        grf.drawString(msg,0,y_Point);          /* 文字情報設定          */
        grf.setColor(shincolor);                /* 輝き色設定           */
        grf.drawString(cen,width,y_Point);      /* 輝く文字情報設定        */
        g.drawImage(offs,0,0,this);             /* 描画設定            */
    }                                           /* 描画メソッド終了        */

/********** ストップ(stop)メソッド *********/
    public void stop() {
        if( kicker != null ) {                  /* kickerがnullでない?(動作中?) */
            kicker.stop();                      /* kickerを停止に設定       */
            kicker = null;                      /* kickerに停止状態を設定     */
        }
    }                                           /* ストップメソッド終了      */

}                                               /* クラス設定終了         */

/**********************************************************************************
 *                 輝く文字アプレット終了                *
 **********************************************************************************/