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

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

DEFINITIONS

This source file includes following definitions.
  1. MailSim
  2. init
  3. setDefault
  4. paint
  5. update
  6. drawAll
  7. drawBack
  8. drawPacket
  9. start
  10. run
  11. stop
  12. loadImages
  13. addPacket
  14. getImageArray
  15. getParentFrame
  16. mousePressed
  17. mouseClicked
  18. mouseEntered
  19. mouseExited
  20. mouseReleased

package jp.ac.nime.computer.mailsim;
                  
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

import jp.ac.nime.computer.*;

/**
 * MAILシミュレータメインアプレットクラス
 * 
 * @version 1.00 2003/03/31
 * @author Toshikazu Matsumoto Avion Corp.
 */
public class MailSim extends JApplet implements MouseListener,Runnable
{
        private Vector  m_vcMachine     =null;          //描画するPC,サーバーなどのオブジェクト列
        private Vector  m_vcPacket      =null;          //アニメーションするパケットオブジェクト列
        private Image   m_imPc          =null;          //PC画像
        private Image   m_imServ        =null;          //サーバー画像
        private Image   m_imMail        =null;          //メール画像(大)
        private Image   m_imMail2       =null;          //メール画像(小)
        private Image   m_imPack        =null;          //パケット画像
        private Thread  m_Thread        =null;          //スレッド
        private Image   m_imOff         =null;          //オフスクリーンイメージ
        
        private Image[] m_imArray;                              //画像格納配列
        
        private PcItem[]                m_objPc;                //PCオブジェクト配列
        private MailServItem[]  m_objServ;              //サーバーオブジェクト配列
        
        /**
         * アプレットの初期化
         */
        public void init()
        {
                //各種クラス初期化
                this.m_vcMachine=new Vector();
                this.m_vcPacket=new Vector();
                this.m_imArray=new Image[5];
                
                //画像の読み込み
                if(this.loadImages()==false)
                {
                        JOptionPane.showMessageDialog(null, "エラー","画像の読み込みに失敗しました", JOptionPane.ERROR_MESSAGE);
                        return;
                }
                
                //アプレットの初期化
                this.getContentPane().setBackground(new Color(57,109,165));
                this.addMouseListener(this);
                //デフォルト値のセット
                this.setDefault();
                this.repaint();
        }
        /**
         * オブジェクトの位置など起動デフォルト値をセット
         */
        private void setDefault()
        {
                //PC側の位置等のデフォルト値設定
                this.m_objPc=new PcItem[4];
                this.m_objPc[0]=new PcItem(this,"192.168.0.4","user1@host.a.jp",this.m_imPc,140,30);
                this.m_objPc[1]=new PcItem(this,"192.168.0.5","user2@host.a.jp",this.m_imPc,340,40);
                this.m_objPc[2]=new PcItem(this,"192.168.0.6","user3@host.b.jp",this.m_imPc,45,340);
                this.m_objPc[3]=new PcItem(this,"192.168.0.7","user4@host.c.jp",this.m_imPc,500,360);
                //サーバー側のデフォルト値設定
                this.m_objServ=new MailServItem[3];
                this.m_objServ[0]=new MailServItem(this,"IMAP,SMTP","192.168.0.1",this.m_imServ,this.m_imMail,240,120);
                this.m_objServ[1]=new MailServItem(this,"POP,SMTP","192.168.0.2",this.m_imServ,this.m_imMail,180,280);
                this.m_objServ[2]=new MailServItem(this,"POP,SMTP","192.168.0.3",this.m_imServ,this.m_imMail,400,240);
                
                this.m_objServ[0].setHost("host.a.jp");
                this.m_objServ[1].setHost("host.b.jp");
                this.m_objServ[2].setHost("host.c.jp");
                
                this.m_objPc[0].addTarget(this.m_objServ[0]);
                this.m_objPc[1].addTarget(this.m_objServ[0]);
                this.m_objPc[2].addTarget(this.m_objServ[1]);
                this.m_objPc[3].addTarget(this.m_objServ[2]);
                this.m_objServ[0].addTarget(this.m_objServ[1]);
                this.m_objServ[0].addTarget(this.m_objServ[2]);
                this.m_objServ[1].addTarget(this.m_objServ[0]);
                this.m_objServ[1].addTarget(this.m_objServ[2]);
                this.m_objServ[2].addTarget(this.m_objServ[0]);
                this.m_objServ[2].addTarget(this.m_objServ[1]);
                
                //全てのオブジェクトをVectorに格納
                for(int i=0;i<4;i++)
                {
                        this.m_vcMachine.addElement(this.m_objPc[i]);
                }
                
                for(int i=0;i<3;i++)
                {
                        this.m_vcMachine.addElement(this.m_objServ[i]);
                        this.m_objServ[i].init();
                }
        }
        /**
         * グラフィックの描画
         * @param g 描画Grapchisクラス
         */
        public void paint(Graphics g)
        {
                if(this.m_imOff==null)
                {
                        Dimension d=this.getSize();
                        this.m_imOff=this.createImage(d.width,d.height);
                }
                this.drawAll();
                g.drawImage(this.m_imOff,0,0,this);
                this.m_imOff.flush();
                //this.repaint();
        }
        /**
         * グラフィックの再描画
         * @param g 再描画するGraphicsクラス
         */
        public void update(Graphics g)
        {
                //this.drawAll();
                this.paint(g);
        }
        /**
         * オフスクリーンへの描画。オフスクリーンイメージのGraphicsを取得。
         */
        private void drawAll()
        {
                Graphics g=this.m_imOff.getGraphics();
                this.drawBack(g);
                this.drawPacket(g);
        }
        /**
         * 背景などの描画
         * @param g 描画を行うGraphics
         */
        private void drawBack(Graphics g)
        {
                //背景塗りつぶし
                g.setColor(new Color(57,109,165));
                g.fillRect(0,0,640,480);
                
                g.setColor(Color.black);
                g.setFont(new Font("Helvetica",Font.BOLD,12));
                FontMetrics fontMet=g.getFontMetrics();
                
                //全てのオブジェクト分のループ
                for(int i=0;i<this.m_vcMachine.size();i++)
                {
                        MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
                        int nTag=item.getTargetSize();
                        
                        //それぞれのオブジェクトからラインを引くため接続されたオブジェクトを抽出
                        for(int j=0;j<nTag;j++)
                        {
                                MachineItem objTag=item.getTarget(j);
                                //ラインの描画
                                g.drawLine
                                        (
                                                item.m_nPosX+item.getImage().getWidth(this)/2,
                                                item.m_nPosY+item.getImage().getHeight(this)/2,
                                                objTag.m_nPosX+objTag.getImage().getWidth(this)/2,
                                                objTag.m_nPosY+objTag.getImage().getHeight(this)/2
                                        );
                        }
                }
                //各マシンの画像、説明を描画
                for(int i=0;i<this.m_vcMachine.size();i++)
                {
                        MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
                        g.drawImage(item.getImage(),item.m_nPosX,item.m_nPosY,this);
                        g.drawString(item.getLabel(),item.m_nPosX+(item.getImage().getWidth(this)-fontMet.stringWidth(item.getLabel()))/2,item.m_nPosY+item.getImage().getHeight(this));
                }
        }
        /**
         * アニメーションするパケットの描画
         * @param g 描画するGraphics
         */
        private void drawPacket(Graphics g)
        {
                Vector vcPack=this.m_vcPacket;
                //パケットオブジェクト分のループ
                for(int i=0;i<vcPack.size();i++)
                {
                        MailDataObject objMail=(MailDataObject)this.m_vcPacket.elementAt(i);
                        MachineItem objFrom     =objMail.getMoveFrom();
                        MachineItem objTo       =objMail.getMoveTo();
                        int nProcess            =objMail.getProcess();
                        int nStatus                     =objMail.getStatus();
                        
                        //プロセスカウンターが100%になったら描画終了
                        if(nProcess>=100)
                        {
                                objMail.setProcess(1);
                                objMail.setStatus(nStatus+1);
                                objTo.postMailAction(objMail);
                                this.m_vcPacket.removeElementAt(i);
                                continue;
                        }
                        
                        //描画位置の計算
                        int nPointX=(int)((float)((objTo.m_nPosX-objFrom.m_nPosX)*nProcess)/100)+objFrom.m_nPosX+objFrom.getImage().getWidth(this)/2-objMail.getIcon().getWidth(this)/2;
                        int nPointY=(int)((float)((objTo.m_nPosY-objFrom.m_nPosY)*nProcess)/100)+objFrom.m_nPosY+objFrom.getImage().getHeight(this)/2-objMail.getIcon().getHeight(this)/2;
                        
                        //画像の描画
                        g.drawImage
                                (
                                        objMail.getIcon(),
                                        nPointX,
                                        nPointY,
                                        this
                                );
                        
                }
        }
        /**
         * アプレットの開始。スレッドの生成
         */
        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)
                {
                        this.repaint();
                        try
                        {
                                this.m_Thread.sleep(100);
                        }
                        catch(InterruptedException e)
                        {
                                this.m_Thread=null;
                        }
                }
        }
        /**
         * アプレットの停止
         */
        public void stop()
        {
                this.m_Thread=null;
        }
        /**
         * アイコンなどの画像の読み込み
         * @return 画像の読み込みの成功、不成功 
         */
        private boolean loadImages()
        {
                //メディアトラッカーの生成
                MediaTracker objTrack=new MediaTracker(this);
                try
                {
                        this.m_imPc=this.getImage(this.getCodeBase(),"images/pc.gif");
                        this.m_imServ=this.getImage(this.getCodeBase(),"images/server.gif");
                        this.m_imMail=this.getImage(this.getCodeBase(),"images/mail.gif");
                        this.m_imMail2=this.getImage(this.getCodeBase(),"images/mail2.gif");
                        this.m_imPack=this.getImage(this.getCodeBase(),"images/packet.gif");
                }
                catch(Exception e)
                {
                        return false;
                }
                //各読み込み画像をメディアトラッカーに登録
                objTrack.addImage(this.m_imPc,0);
                objTrack.addImage(this.m_imServ,0);
                objTrack.addImage(this.m_imMail,0);
                objTrack.addImage(this.m_imMail2,0);
                objTrack.addImage(this.m_imPack,0);
                
                this.m_imArray[0]=this.m_imPc;
                this.m_imArray[1]=this.m_imServ;
                this.m_imArray[2]=this.m_imMail;
                this.m_imArray[3]=this.m_imMail2;
                this.m_imArray[4]=this.m_imPack;
                
                //画像の読み込みをウエイト
                try
                {
                        objTrack.checkID(0);
                        objTrack.waitForAll();
                }
                catch(Exception e)
                {
                        return false;
                }
                
                return true;
        }
        /**
         * 描画パケット列にオブジェクトを追加
         * @param objMail 描画に追加するオブジェクト
         */
        public void addPacket(MailDataObject objMail)
        {
                this.m_vcPacket.addElement(objMail);
        }
        /**
         * 画像を番号で取得する
         * @param n 取得する画像番号
         * @return 取得した画像
         */
        public Image getImageArray(int n)
        {
                return  this.m_imArray[n];
        }
        /**
         * 親のフレームを取得
         * @param comp 取得する子のコンポーネント
         * @return 取得したフレームクラス
         */
        private Frame getParentFrame(Component comp)
        {
                Component current=(Component)comp;
                while(current!=null)
                {
                        if(current instanceof Frame) return (Frame)current;
                        current=current.getParent();
                }
                return null;
        }
        /**
         * マウス押下時の処理
         * @param evt マウス押下時のイベント
         */
        public void mousePressed(MouseEvent evt)
        {
                //マシンオブジェクトがクリックされたかのヒットテスト
                for(int i=0;i<this.m_vcMachine.size();i++)
                {
                        MachineItem item=(MachineItem)this.m_vcMachine.elementAt(i);
                        
                        if(
                           evt.getX()>=item.m_nPosX
                           &&evt.getX()<=item.m_nPosX+item.getImage().getWidth(this)
                           &&evt.getY()>=item.m_nPosY
                           &&evt.getY()<=item.m_nPosY+item.getImage().getHeight(this)
                          )
                        {
                                item.onMousePressed();
                        }
                }
                //パケットオブジェクトがクリックされたかのヒットテスト
                Vector vcPack=this.m_vcPacket;
                for(int i=0;i<vcPack.size();i++)
                {
                        MailDataObject objMail=(MailDataObject)this.m_vcPacket.elementAt(i);
                        MachineItem objFrom     =objMail.getMoveFrom();
                        MachineItem objTo       =objMail.getMoveTo();
                        int nProcess            =objMail.getProcess();
                        int nStatus                     =objMail.getStatus();
                        
                        if(nProcess>=100)
                        {
                                continue;
                        }
                        
                        int nPointX=(int)((float)((objTo.m_nPosX-objFrom.m_nPosX)*nProcess)/100)+objFrom.m_nPosX+objFrom.getImage().getWidth(this)/2-objMail.getIcon().getWidth(this)/2;
                        int nPointY=(int)((float)((objTo.m_nPosY-objFrom.m_nPosY)*nProcess)/100)+objFrom.m_nPosY+objFrom.getImage().getHeight(this)/2-objMail.getIcon().getHeight(this)/2;
                        
                        if(
                           evt.getX()>=nPointX
                           &&evt.getX()<=nPointX+objMail.getIcon().getWidth(this)
                           &&evt.getY()>=nPointY
                           &&evt.getY()<=nPointY+objMail.getIcon().getHeight(this)
                          )
                        {
                                //メールオブジェクトがクリックされた場合にはメールヘッダを表示
                                String sHeader=objMail.getHeader();
                                new TextAreaDialog(getParentFrame(this),"メール内容",sHeader);
                        }
                }
        }
        /**
         * マウスクリック時の処理
         */
        public void mouseClicked(MouseEvent evt) 
        {
        }
        /**
         * マウスが領域内に入ったときの処理
         */
        public void mouseEntered(MouseEvent evt)
        {
        }
        /**
         * マウスが領域街に出た時の処理
         */
        public void mouseExited(MouseEvent evt)
        {
        }
        /**
         * マウスを離したときの処理
         */
        public void mouseReleased(MouseEvent evt)
        {
        }
}

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