/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- RingBufCanvas
- paint
- update
- drawAll
- drawBack
- drawQueue
- start
- run
- stop
- enQueue
- 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();
}
}