/**********************************************************************************
 *                                                                                *
 *                        リアルタイム時計 Javaアプレット                        *
 *                              ( RealClock.java )                                *
 *                                                         Author : Seiichi Inoue *
 **********************************************************************************/

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

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

/************************** << クラス変数属性の宣言 >> **********************/
    Thread    kicker=null;                    /* スレッド制御(初期値:停止)   */
    Dimension d;                              /* 表示領域             */
    Image     offs;                           /* オフスクリーンエリア       */
    Graphics  grf;                            /* 描画領域             */
    String    param;                          /* パラメータ引き取り        */
    int       red,green,blue;                 /* 時計文字色パラメータ情報     */
    Color     color;                          /* 時計文字色            */
    int       backred,backgreen,backblue;     /* 背景色パラメータ情報       */
    Color     backcolor;                      /* 背景色              */
    String    fontname;                       /* 時計文字フォントパラメータ情報  */
    int       fontsize;                       /* 時計文字サイズパラメータ情報   */
    Font      font;                           /* 時計文字フォント         */
    int       strHeight;                      /* 時計文字高さ           */
    int       x;                              /* 表示開始位置(横)        */
    int       y_Point;                        /* 表示位置(高さ)         */

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

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

        param = getParameter("font");           /* フォント種類パラメータ取込   */
        fontname = (param != null)?             /* 入力判定(無指定時:Dialog)   */
            param: "Dialog";
        param = getParameter("fontsize");       /* フォントサイズパラメータ取込  */
        fontsize = (param != null)?             /* 入力判定(無指定時:35)    */
            Integer.parseInt(param): 35;

        font = new Font(fontname,Font.BOLD,fontsize);     /* フォント設定     */
        strHeight  = (getFontMetrics(font)).getLeading(); /* 文字の縦位置計算   */
        strHeight -= (getFontMetrics(font)).getDescent();
        strHeight += (getFontMetrics(font)).getAscent();
        y_Point    = (d.height + strHeight                /* 文字の縦位置セット  */
            - (getFontMetrics(font)).getDescent())/2;

        param = getParameter("x");              /* 表示開始位置パラメータ取込   */
        x = (param != null)?                    /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;

        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("red");            /* 文字赤色パラメータ取込     */
        red = (param != null)?                  /* 入力判定(無指定時:MAX)   */
            Integer.parseInt(param): 255;
        param = getParameter("green");          /* 文字緑色パラメータ取込     */
        green = (param != null)?                /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;
        param = getParameter("blue");           /* 文字青色パラメータ取込     */
        blue = (param != null)?                 /* 入力判定(無指定時:0)     */
            Integer.parseInt(param): 0;
        color = new Color(red,green,blue);      /* 文字色組立           */
    }                                           /* 初期化メソッド終了       */


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


/*********** 繰り返し(run)メソッド ***********/
    public void run() {
        Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
        while( kicker != null) {                /* kickerがnullになるまで繰り返し */
            repaint();                          /* 描画              */
            try {                               /* 割り込み確認          */
                kicker.sleep(1000);             /* 待ち時間:1秒         */
            } catch(InterruptedException e) {}  /* 割り込み処理          */
        }
        kicker = null;                          /* 繰り返し処理終了設定      */
    }                                           /* 繰り返しメソッド終了      */


/************ 更新(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);     /* 背景色で背景を塗りつぶす    */

        Date d = new Date();                    /* 時計情報を取込         */

        grf.setColor(color);                    /* 文字色設定           */
        grf.setFont(font);                      /* フォント情報設定        */
        grf.drawString(d.toString(),x,y_Point); /* 表示情報設定          */
        g.drawImage(offs,0,0,this);             /* 描画設定            */
    }                                           /* 描画メソッド終了        */


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

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

/**********************************************************************************
 *            リアルタイム時計アプレット終了             *
 **********************************************************************************/