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

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

DEFINITIONS

This source file includes following definitions.
  1. QueueStatusCanvas
  2. paint
  3. update
  4. drawAll
  5. drawBack
  6. drawMail
  7. start
  8. run
  9. stop
  10. suspendThread
  11. 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();
                }

        }
}

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