/**********************************************************************************
 *                                                                                *
 *                         チェックボックスのアプレット                           *
 *                              ( CheckBox.java )                                 *
 *                                                         Author : Seiichi Inoue *
 **********************************************************************************/

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

/************************ << 自分のクラス定義 >> ****************************/
//  クラス名称  : CheckBox
//  アクセス制御 : public(どのクラスからもアクセス可能)
//  継承クラス  : Applet
//  引継クラス  : Runnable
//    入力パラメータ: NANE="r"     (半径)
//           NAME="node"       (ノード数)
public class  CheckBox  extends Applet implements Runnable {

/************************** << クラス変数属性の宣言 >> **********************/
    Thread      kicker=null;                  /* スレッド制御(初期値:停止)   */
    Dimension   d;                            /* 表示領域             */
    Image       offs;                         /* オフスクリーンエリア       */
    Graphics    grf;                          /* 描画領域             */
    String      param;                        /* パラメータ引き取り        */
    int         r;                            /* 描画半径             */
    int         n;                            /* ノード数             */
    int         x;                            /* 描画オフセット(横軸)      */
    int         y;                            /* 描画オフセット(縦軸)      */
    int         k;                            /* 線の引き始め位置カウンタ     */
    int         x1;                           /* 線の引き始め横軸(x)座標     */
    int         y1;                           /* 線の引き始め縦軸(y)座標     */
    int         j;                            /* 線の引き終わり位置カウンタ    */
    int         x2;                           /* 線の引き終わり横軸(x)座標    */
    int         y2;                           /* 線の引き終わり縦軸(y)座標    */

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

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

        param = getParameter("r");              /* 半径パラメータ取込       */
        r = (param != null)?                    /* 入力判定(無指定時:100ピクセル)*/
            Integer.parseInt(param): 100;
        param = getParameter("node");           /* ノード数パラメータ取込     */
        n = (param != null)?                    /* 入力判定(無指定時:16ノード)  */
            Integer.parseInt(param): 16;

        setLayout(new BorderLayout());          /* ボーダーレイアウト設定     */
        Panel p = new Panel();                  /* パネルインスタンス設定     */
        p.setBackground(Color.yellow);          /* パネルの背景色を設定      */
        p.setLayout(new GridLayout(1,8));       /* チェックボタンをグリッドに配置 */
        CheckboxGroup cg = new CheckboxGroup(); /* チェックボックスグループ設定  */
        p.add(new Checkbox("red",cg,true));     /* 赤色チェックボタン(初期値)  */
        p.add(new Checkbox("pink",cg,false));   /* ピンク色チェックボタン     */
        p.add(new Checkbox("orange",cg,false)); /* オレンジ色チェックボタン    */
        p.add(new Checkbox("yellow",cg,false)); /* 黄色チェックボタン       */
        p.add(new Checkbox("green",cg,false));  /* 緑色チェックボタン       */
        p.add(new Checkbox("cyan",cg,false));   /* 水色チェックボタン       */
        p.add(new Checkbox("blue",cg,false));   /* 青色チェックボタン       */
        p.add(new Checkbox("gray",cg,false));   /* 灰色チェックボタン       */
        add("South",p);                         /* パネルを下部に設定       */
        grf.setColor( Color.red );              /* 初期色(赤)設定        */

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

/******** アクション(action)メソッド *********/
    public boolean action(Event e,Object o) {
        Checkbox c = (Checkbox)e.target;        /* クリックされたオブジェクト取得 */
        if ("red".equals(c.getLabel()))         /* 赤色ボックス?         */
            grf.setColor( Color.red );          /* 赤色設定            */
        else if ("pink".equals(c.getLabel()))   /* ピンク色ボックス?       */
            grf.setColor( Color.pink );         /* ピンク色設定          */
        else if ("orange".equals(c.getLabel())) /* オレンジ色ボックス?      */
            grf.setColor( Color.orange );       /* オレンジ色設定         */
        else if ("yellow".equals(c.getLabel())) /* 黄色ボックス?         */
            grf.setColor( Color.yellow );       /* 黄色設定            */
        else if ("green".equals(c.getLabel()))  /* 緑色ボックス?         */
            grf.setColor( Color.green );        /* 緑色設定            */
        else if ("cyan".equals(c.getLabel()))   /* 水色ボックス?         */
            grf.setColor( Color.cyan );         /* 水色設定            */
        else if ("blue".equals(c.getLabel()))   /* 青色ボックス?         */
            grf.setColor( Color.blue );         /* 青色設定            */
        else if ("gray".equals(c.getLabel()))   /* 灰色ボックス?         */
            grf.setColor( Color.gray );         /* 灰色設定            */
        else                                    /* どの色でもない?        */
            grf.setColor( Color.black );        /* 黒色設定            */
        return true;

    }                                           /* アクションメソッド終了     */

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

/*********** 繰り返し(run)メソッド ***********/
    public void run() {
        Thread.currentThread().setPriority(Thread.NORM_PRIORITY-3);
        while( kicker != null) {                /* kickerがnullになるまで繰り返し */
            try {                               /* 割り込み確認          */
                double rd=3.14159/180;          /* 角度値を64ビット値とする    */
                for ( k=0; k<=n-2; k++ ) {      /* 線の描画開始座標計算      */
                    x1 = (int) ( r*Math.cos( k*360/n*rd ) + r ); /* 開始 x 座標  */
                    y1 = (int) ( r*Math.sin( k*360/n*rd ) + r ); /* 開始 y 座標  */
                    x = ( d.width - r*2 )/2;    /* 描画オフセット(横)計算     */
                    if ( x <= 0 )               /* オフセット判定(負?)      */
                        x = 0;                  /* YES:ゼロ設定         */
                    x1 += x;                    /* 開始座標オフセット(横)加算   */
                    y = ( d.height - r*2 )/2;   /* 描画オフセット(縦)計算     */
                    if ( y <= 0 )               /* オフセット判定(負?)      */
                        y = 0;                  /* YES:ゼロ設定         */
                    y1 += y;                    /* 開始座標オフセット(縦)加算   */
                    for ( j=k+1; j<=n-1; j++ ) {/* 線の描画終了座標計算      */
                        x2 = (int) ( r*Math.cos( j*360/n*rd ) + r );/* 終了 x 座標*/
                        y2 = (int) ( r*Math.sin( j*360/n*rd ) + r );/* 終了 y 座標*/
                        x2 += x;                /* 終了点オフセット(横)加算    */
                        y2 += y;                /* 終了点オフセット(縦)加算    */

                        kicker.sleep(20);       /* 線描画待ち合わせ(20mSEC)    */
                        repaint();              /* 描画メソッド呼び出し      */
                    }
                }
            } catch(InterruptedException e) {}  /* 割り込み処理          */
        }
        kicker = null;                          /* 繰り返し処理終了設定      */
    }                                           /* 繰り返しメソッド終了      */

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

/************ 描画(paint)メソッド ************/
    public void paint(Graphics g) {
        grf.drawLine( x1,y1,x2,y2 );            /* 線の描画            */
        g.drawImage(offs,0,0,this);             /* 描画設定            */
    }

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

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

/**********************************************************************************
 *           チェックボックスのアプレット終了             *
 **********************************************************************************/