root/www.mail/JavaPopWeb/src/jp/ac/nime/computer/mailsim/RingBufCanvas.java

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. RingBufCanvas
  2. paint
  3. update
  4. drawAll
  5. drawBack
  6. drawQueue
  7. start
  8. run
  9. stop
  10. enQueue
  11. deQueue

package jp.ac.nime.computer.mailsim;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import jp.ac.nime.computer.*;

/**
 * MAILシミュレータ リングバッファ状態表示描画クラス
 * 
 * @version 1.00 2003/03/31
 * @author Toshikazu Matsumoto Avion Corp.
 */
public class RingBufCanvas extends Canvas implements Runnable
{
        public final static int RING_BUF_MODE_ENQUEUE=0;
        public final static int RING_BUF_MODE_DEQUEUE=1;
        
        private Component       m_Parent;               //親コンポーネント
        private RingBufDialog m_Dialog;         //親ダイアログクラス
        private Image           m_imMail;               //メール画像
        private Image           m_imOff=null;   //オフスクリーンイメージ
        private Vector          m_vcRingBuf;    //リングバッファに貯まっているオブジェクト列
        private Thread          m_Thread;               //スレッド
        private int                     m_nOffset=0;    //描画位置オフセット
        private int                     m_nFront=0;             //リングバッファ、前方位置
        private int                     m_nRear=0;              //リングバッファ、後方位置
        private int                     m_nMode=RING_BUF_MODE_ENQUEUE;
        private MailDataObject  m_Target;       //一時保持用メールデータオブジェクト
        
        /**
         * クラスコンストラクタ
         * @param parent 親コンポーネント
         * @param dialog 親ダイアログ
         * @param imMail メール画像
         */
        public RingBufCanvas(Component parent,RingBufDialog dialog,Image imMail)
        {
                this.m_Parent=parent;
                this.m_Dialog=dialog;
                this.m_imMail=imMail;
                this.m_vcRingBuf=new Vector();
        }
        /**
         * グラフィック描画(オフスクリーンからメインスクリーンへの画像コピー)
         * @param g 描画グラフィック領域
         */
        public void paint(Graphics g)
        {
                if(this.m_imOff==null)
                {
                        Dimension d=this.getSize();
                        this.m_imOff=this.m_Parent.createImage(d.width,d.height);
                }
                this.drawAll();
                g.drawImage(this.m_imOff,0,0,this.m_Parent);
                this.m_imOff.flush();
        }
        /**
         * グラフィック再描画
         * @param g 描画グラフィック領域
         */
        public void update(Graphics g)
        {
                this.drawAll();
                this.paint(g);
        }
        /**
         * オフスクリーンへの描画。オフスクリーンイメージのGraphicsを取得。
         */
        private void drawAll()
        {
                Graphics g=this.m_imOff.getGraphics();
                this.drawBack(g);
                this.drawQueue(g);
        }
        /**
         * 背景などの描画
         * @param g 描画グラフィック領域
         */
        private void drawBack(Graphics g)
        {
                g.setColor(new Color(57,109,165));
                g.fillRect(0,0,this.getSize().width,this.getSize().height);
                g.setColor(Color.black);
                for(int i=0;i<5;i++)
                {
                        g.drawRect(100,20+(i*63),130,63);
                }
                
                for(int i=0;i<this.m_vcRingBuf.size();i++)
                {
                        MailDataObject objMail=(MailDataObject)this.m_vcRingBuf.elementAt(i);
                        int nPos=this.m_nFront+i;
                        if(nPos>=5)
                        {
                                nPos=0;
                        }
                        g.drawImage(objMail.getIcon(),120,30+nPos*63,this.m_Parent);
                }
        }
        /**
         * アニメーションするメール画像の描画
         * @param g 描画グラフィック領域
         */
        private void drawQueue(Graphics g)
        {
                switch(this.m_nMode)
                {
                case RING_BUF_MODE_ENQUEUE:
                        if(this.m_Target!=null)
                        {
                                g.drawImage(this.m_Target.getIcon(),this.m_nOffset,this.m_nRear*63+30,this.m_Parent);
                        }
                        break;
                case RING_BUF_MODE_DEQUEUE:
                        if(this.m_Target!=null)
                        {
                                int nPos=this.m_nFront-1;
                                if(nPos<0)this.m_nFront=4;
                                g.drawImage(this.m_Target.getIcon(),this.m_nOffset,nPos*63+30,this.m_Parent);
                        }
                        break;
                }
        }
        /**
         * スレッドの開始、生成
         */
        public void start()
        {
                if(this.m_Thread==null)
                {
                        this.m_Thread=new Thread(this);
                }
                this.m_Thread.start();
        }
        /**
         * スレッドの実行
         */
        public void run()
        {
                while(this.m_Thread!=null)
                {
                        switch(this.m_nMode)
                        {
                        case RING_BUF_MODE_ENQUEUE:
                                if(this.m_nOffset==120)
                                {
                                        this.m_Thread=null;
                                        this.m_nOffset=0;
                                        this.m_vcRingBuf.addElement(this.m_Target);
                                        this.m_Target=null;
                                        this.m_nRear++;
                                        
                                        if(this.m_nRear>=5)
                                        {
                                                this.m_nRear=0;
                                        }
                                        
                                        if(this.m_vcRingBuf.size()>=5)
                                        {
                                                this.m_Dialog.setOver();
                                        }
                                        if(this.m_vcRingBuf.size()>0)
                                        {
                                                this.m_Dialog.canDequeue();
                                        }
                                        break;
                                }
                                this.m_nOffset+=2;
                                break;
                        case RING_BUF_MODE_DEQUEUE:
                                if(this.m_nOffset==-90)
                                {
                                        this.m_Thread=null;
                                        this.m_nOffset=0;
                                        //this.m_nFront++;
                                        this.m_Target=null;
                                        if(this.m_nFront>=5)
                                        {
                                                this.m_nFront=0;
                                        }
                                        break;
                                }
                                this.m_nOffset-=2;
                                break;
                        }
                        try
                        {
                                this.m_Thread.sleep(10);
                        }
                        catch(InterruptedException e)
                        {
                                this.m_Thread=null;
                                break;
                        }
                        this.repaint();
                }
        }
        /**
         * スレッドの停止
         */
        public void stop()
        {
                this.m_Thread=null;
        }
        /**
         * リングバッファへデータの格納
         */
        public void enQueue()
        {
                this.m_Target=new MailDataObject(this.m_Parent,this.m_imMail,"foo"+this.m_vcRingBuf.size()+"@foo.co.jp");
                //this.m_vcRingBuf.addElement(objMail);
                this.m_nMode=RING_BUF_MODE_ENQUEUE;
                this.start();
        }
        /**
         * リングバッファからデータの取り出し
         */
        public void deQueue()
        {
                this.m_Target=(MailDataObject)this.m_vcRingBuf.elementAt(0);
                this.m_vcRingBuf.removeElementAt(0);
                this.m_nFront++;
                this.m_nMode=RING_BUF_MODE_DEQUEUE;
                this.m_nOffset=120;
                
                if(this.m_vcRingBuf.size()<=0)
                {
                        this.m_Dialog.setEmpty();
                }
                if(this.m_vcRingBuf.size()<5)
                {
                        this.m_Dialog.canEnqueue();
                }
                this.start();
        }
}

/* [<][>][^][v][top][bottom][index][help] */