/*********************************************
 * Resident.java                             *
 * Copyright(c) 2002 Connect Corporation     *
 * All rights reserved.                      *
 * Target : MIDP(JSCL1.0)                    *
 *===========================================*
 *       待ち受けアプリセカンドサンプル      *
 * Desc. :                                   *
 *   待ち受けアプリのサンプルコード          *
 *   豪華バージョン                          *
 *********************************************
 *  Version    Date      Author              *
 *  Ver. 1.00  02/03/18  K.Iguchi            *
 *********************************************/

//===========================================================//
//=====  インポート  ========================================//
//===========================================================//
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;
import com.j_phone.midlet.*;


//===========================================================//
//=====  メインクラス  ======================================//
//===========================================================//
public class ResidentS extends ResidentMIDlet
{
    private EC ec = null;
    private String sys_msg = "-----";
    private String sys_msg2 = "";
    private String msg = "NULL";
    private Timer tt = new Timer();
    private Runner rn = new Runner();
    private int period = 50;

    //=====  エントリ =====//
    public void startApp()
    {
        if (ec==null) {
           ec = new EC();
           tt.schedule( rn, 0 );
        }
        Display.getDisplay( this ).setCurrent( ec );

        ec.repaint();
    }
    
    public void pauseApp() {}

    public void destroyApp( boolean u ) {}

    //===========================================================//
    //=====  音声着信イベント処理  ==============================//
    //===========================================================//
    public void ring( String name, String tel_num )
    {
        sys_msg = "音声着信";
        if( name == null ) msg = tel_num+"から着信です。";
        else               msg = name+"からお電話です!";
        rn.reset( 0, -1 );
        rn.notify();
    }
    
    public void ignored()
    {
        sys_msg = "音声着信終了";
        try {Thread.sleep(1000);} catch (Exception e){}
        rn.finish = true;
        ec.repaint();
    }


    //===========================================================//
    //=====  メール着信イベント処理   ===========================//
    //===========================================================//
    public void received( String name, String address, int type )
    {
        sys_msg = "メール受信";
        if( name == null ) msg = address+"からメールがきています。";
        else               msg = name+"からメールだよー";
        rn.reset( 1, 1000/period*5 );
        rn.notify();
    }


    //===========================================================//
    //=====  アラームイベント処理  ==============================//
    //===========================================================//
    public void notice( String comment )
    {
        sys_msg = "アラーム発生";
        rn.reset( 2, 1000/period*5 );
        msg = comment;
        rn.notify();
    }


    //===========================================================//
    //=====  常駐時割り込みイベント処理  ========================//
    //===========================================================//
    /* 着信通知開始 */
    public void ringStarted()
    {
      sys_msg2="(呼出)";
    }

    /* 着信通知終了 */
    public void ringStopped()
    {
      sys_msg2="(呼出終)";
    }


    //===========================================================//
    //=====  拡張描画クラス  ====================================//
    //===========================================================//
    private class EC extends Canvas
    {
        private int WI = getWidth(), HE = getHeight();

        public EC()
        {
        }

        //=====  描画  =====//
        public void paint(Graphics g)
        {
            int i, j, v;
            
            //-----  画面を消去  -----//
            g.setColor( 0x00ffffff );
            g.fillRect( 0, 0, WI, HE );

            //------  イベントに応じた描画  -----//
            switch( rn.mode ){
                case 0://音声着信
                    for( i=0; i<HE-24; i+=12 ){
                        v = rn.getVal( i/12 + rn.f ) & 0xf0 + 0x0f;
                        g.setColor( v, v, v );
                        g.drawString( msg, WI>>1, i, g.HCENTER|g.TOP );
                    }
                    drawConsole( g );
                    break;
                case 1://メール着信
                    for( i=0; i<HE-24; i+=12 ){
                        int size = msg.length() * 12;
                        v = rn.getVal( rn.f );
                        for( j=0; j<WI+size; j+=size ){
                            if( (i/12)%2 == 0 ){
                                g.setColor( v, v, v );
                                g.drawString(msg, j-(rn.f%size), i, 4|16 );
                            } else {
                                g.setColor( 0xff-v, 0xff-v, 0xff-v );
                                g.drawString(msg, (rn.f%size)-j, i, 4|16 );
                            }
                        }
                    }
                    drawConsole( g );
                    break;
                case 2://アラーム着信
                    v = rn.getVal( rn.f );
                    g.setColor( v, v, v );
                    g.fillRect( 0, 0, WI, HE );
                    g.setColor( 0xff-v, 0xff-v, 0xff-v );
                    g.drawString( msg, WI>>1, HE>>1, g.HCENTER | g.TOP );
                    drawConsole( g );
                    break;
                case 99://待機時
                    g.setColor( 0x00000000 );
                    g.drawString( "ヒマだなー", WI>>1, HE>>1,
                        g.HCENTER | g.VCENTER );
                    break;
            }
        }

        //=====  システムメッセージ表示  =====//
        private void drawConsole( Graphics g )
        {
            g.setColor( 0x00ffffff );
            g.fillRect( 0, HE-13, WI, 13 );
            g.setColor( 0x00000000 );
            g.drawString( sys_msg+sys_msg2, WI>>1, HE-12, g.HCENTER|g.TOP );
        }

    }//=====  End of ExtendCampas


    //===========================================================//
    //=====  経時変化処理クラス  ================================//
    //===========================================================//
    private class Runner extends TimerTask
    {
        public int f = 0, limit = 0;
        public int mode = 99;
        public boolean finish;
        private final int[] CTable = {
            0x00, 0x20, 0x40, 0x60, 0x80, 0xa0, 0xc0, 0xe0,
            0xff, 0xe0, 0xc0, 0xa0, 0x80, 0x60, 0x40, 0x20
        };

        //=====  内部パラメータ初期化  =====//
        //-----  m:モード番号（99が待機状態 あとはpaint()内コードを参照）
        //-----  l:リミット（fがこの値に一致した場合、実行を休止する）
        public void reset(int m, int l)
        {
            f = 0;
            finish = false;
            mode = m;
            //l を負にすれば事実上無限実行となる
            limit = l;
        }

        //=====  フレームメイン  =====//
        public void run()
        {
            while( true ){
                //-----  一回目  -----//
                try{
                    wait();
                } catch( Exception e ){}

                //-----  メインループ  -----//
                while( (f != limit) && (finish == false) )
                {
                    f++;
                    ec.repaint();
                    try{
                        Thread.sleep( period );
                    } catch( Exception e ) {}
                }

                //-----  終了処理  -----//
                mode = 99;
                ec.repaint();
            }
        }


        //=====  周期関数  =====//
        public int getVal( int x )
        {//テーブルは偶関数として処理する
            if( x < 0 ) x = x * -1;
            x = x % CTable.length;
            return CTable[x];
        }
        
    }//===== End of Runner
}
