/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- QueueStatusCanvas
- paint
- update
- drawAll
- drawBack
- drawMail
- start
- run
- stop
- suspendThread
- resumeThread
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 QueueStatusCanvas extends Canvas implements Runnable
{
private Component m_Parent; //親コンポーネント
private MailSim m_Applet; //メインアプレットクラス
private MailServItem m_Item; //呼び出し元サーバーオブジェクト
private Thread m_Thread; //スレッド
private Vector m_vcMail; //キュー格納メールオブジェクト
private Image m_imOff; //オフスクリーンイメージ
private Image m_imMail; //メール画像
private int m_nOffset=0; //表示位置オフセット
private boolean m_bStop=false; //スレッドの停止フラグ
/**
* クラスコンストラクタ
* @param parent 親コンポーネント
* @param applet メインアプレットクラス
* @param item 呼び出し元サーバーオブジェクト
* @param imMail メール画像
*/
public QueueStatusCanvas(Component parent,MailSim applet,MailServItem item,Image imMail)
{
this.m_Parent=parent;
this.m_Applet=applet;
this.m_Item=item;
this.m_imMail=imMail;
this.start();
}
/**
* グラフィックの描画(オフスクリーンからメインスクリーンへの画像コピー)
* @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);
this.m_imOff.flush();
}
/**
* グラフィック再描画
* @param g 描画グラフィック領域
*/
public void update(Graphics g)
{
this.paint(g);
}
/**
* オフスクリーンイメージへの各グラフィックの描画
*/
public void drawAll()
{
Graphics g=this.m_imOff.getGraphics();
this.drawBack(g);
this.drawMail(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);
g.drawRect(100,(this.getSize().height-60)/2,280,60);
}
/**
* 移動するメール画像の描画
* @param g 描画グラフィック領域
*/
private void drawMail(Graphics g)
{
Vector vcMail=this.m_Item.getQueue();
for(int i=0;i<vcMail.size();i++)
{
try
{
MailDataObject objMail=(MailDataObject)vcMail.elementAt(i);
Image icon=objMail.getIcon();
int nProcess=objMail.getProcess();
g.drawImage(icon,this.getSize().width-(int)((float)(this.getSize().width*objMail.getProcess())/200),80+10,this);
}
catch(Exception e)
{
System.out.println(e.toString());
this.stop();
return;
}
}
}
/**
* スレッドの開始、生成
*/
public void start()
{
if(this.m_Thread==null)
{
this.m_Thread=new Thread(this);
}
this.m_Thread.start();
}
/**
* スレッドの実行
*/
public void run()
{
while(!this.m_bStop&&this.m_Thread!=null)
{
Vector vcMail=this.m_Item.getQueue();
for(int i=0;i<vcMail.size();i++)
{
try
{
MailDataObject objMail=(MailDataObject)vcMail.elementAt(i);
Image icon=objMail.getIcon();
int nProcess=objMail.getProcess();
int nStatus =objMail.getStatus();
if(nStatus!=MailDataObject.MAIL_STATUS_FOR_QUEUE)
{
continue;
}
if(nProcess>=200)
{
//送信先の検出
String sTo=objMail.getTo();
int index=sTo.indexOf("@");
boolean bError=true;
if(index!=-1)
{
String sHost=sTo.substring(index+1);
for(int j=0;j<this.m_Item.getTargetSize();j++)
{
MachineItem item=this.m_Item.getTarget(j);
if(sHost.compareTo(item.getHost())==0)
{
objMail.setMoveObject(this.m_Item,item);
bError=false;
}
}
}
if(bError==true)
{
objMail.setStatus(MailDataObject.MAIL_STATUS_REACH_SPOOL);
objMail.setProcess(1);
this.m_Item.addSpool(objMail);
}
else
{
objMail.setStatus(nStatus+1);
objMail.setProcess(1);
this.m_Applet.addPacket(objMail);
}
this.m_Item.deQueue(i);
continue;
}
}
catch(Exception e)
{
System.out.println(e.toString());
this.stop();
return;
}
}
try
{
this.m_Thread.sleep(100);
}
catch(InterruptedException e)
{
this.m_bStop=true;
this.m_Thread=null;
}
repaint();
}
}
/**
* スレッドの停止
*/
public void stop()
{
//this.m_Thread.stop();
this.m_bStop=true;
this.m_Thread=null;
}
/**
* スレッドの一時停止
*/
public void suspendThread()
{
this.m_Thread.suspend();
Vector vcMail=this.m_Item.getQueue();
for(int i=0;i<vcMail.size();i++)
{
MailDataObject objMail=(MailDataObject)vcMail.elementAt(i);
objMail.suspend();
}
}
/**
* スレッドの再開
*/
public void resumeThread()
{
this.m_Thread.resume();
Vector vcMail=this.m_Item.getQueue();
for(int i=0;i<vcMail.size();i++)
{
MailDataObject objMail=(MailDataObject)vcMail.elementAt(i);
objMail.resume();
}
}
}