//
/* ----------------------------------------------------------------------------------------------
    jisx0208.java	JIS漢字コード							ver. 2.00 (JDK 1.02)  
    															ueyama@infonet.co.jp  1998.10.03
    															update: 2007.06.26
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;
import java.lang.Math;
import java.util.*;


public class jisx0208 extends Applet implements Runnable
{
	int			Ph	=20;
	int			Ofsx= 40,	Ofsy= 40;								// コード表左上の座標
	int			Cx  =320,	Cy  =320;								// コード表サイズ
	int			Mx  = 99,	My  = 99;								// コード表のマウスクリック値 (0 〜 15)
	int			Dx	=  0,	Dy	=  0;								// マウスドラッグ値
	int			Dx0	=385,	Dy0	= 91;								// コード表エリア左上の座標
	int			Bx[]={465, 465, 436, 494, 370, 465};				// ボタン表示 X座標  0:↑ 1:↓ 2:← 3:→
	int			By[]={287, 338, 313, 313, 338, 313};				// ボタン表示 Y座標  4: Clr  5: Run/Stop
	int			Wait=1024;
	Image		Tbl, Img;
	Thread		th=null;
	boolean		Run=false;
	boolean		Mov=false;											// true: 早送りモード
	int			Dir=0;												// 0:↑  1:↓  2:←  3:→
	Graphics	gx,gr;
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	public void update(Graphics g)
	{
		paint(g);
	}
	
	public void init()
	{
		String bg=getParameter("BgColor");
		int c=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(c)); 
		gr=getGraphics();
		
		MediaTracker mt=new MediaTracker(this);
		Tbl=getImage(getCodeBase(), getParameter("figure0"));
		mt.addImage(Tbl, 0);
		Img=getImage(getCodeBase(), getParameter("figure1"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
	}
	
	public boolean inside(int n, int a, int b)
	{
		return (n<=Math.max(a,b) && n>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_b(int x, int y, int f, int v, int c)			// ボタンの表示
	{
		int ox=0, oy=0, w=0, h=0;
		switch(c)
		{
			case 0:	w= 13; h= 14; ox=  0; oy=  0; 	break;			// 16進数
			case 1:	w= 11; h= 14; ox=208; oy=  0; 	break;			// 2進数 & ()
			case 2:	w= 65; h= 14; ox=202; oy= 14; 	break;			// "CODE="
			case 3: w= 26; h= 23; ox=202; oy= 28; 	break;			// ボタン
			case 4: w= 15; h= 94; ox=280; oy=  0; 	break;			// "第1バイト"
			case 5: w= 94; h= 15; ox=202; oy=189; 	break;			// "第2バイト"
			case 6: w=202; h=199; ox=  0; oy= 14; 	break;			// コード表図
		}
		gx=gr.create();
		gx.clipRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+f*w),y-(oy+v*h),this);
		gx.dispose();
	}
	
	public void dsp_tbl(int x, int y, int f, int v, int c)			// コード表の表示
	{
		int ox=0, oy=0, w=0, h=0;
		switch(c)
		{
			case 0:	w=321; h=321; ox= 20; oy= 20; 	break;			// コード表の表示
			case 1:	w=321; h= 21; ox= 20; oy=  0; 	break;			// 上部見出しの表示
			case 2:	w= 21; h=321; ox=  0; oy= 20; 	break;			// 左見出しの表示
		}
		gx=gr.create();
		gx.clipRect(x,y,w,h);
		gx.drawImage(Tbl,x-(ox+f*Ph),y-(oy+v*Ph),this);
		gx.dispose();
	}

	public void dsp_code(int x, int y, boolean b)					// コードの表示
	{
		int i;
		String	bin,bx,by, hex;
		gr.clearRect(0,size().width-213,360,30);
		dsp_b(24,374,0,0,2);										// "CODE=" の表示
		hex=Integer.toString(y+33+Dy,16)+Integer.toString(x+33+Dx,16);	// 16進数
		for(i=3; i>=0; i--) dsp_b(94+13*i,374,Integer.parseInt(hex.substring(i,i+1),16),0,0);	// 16進数の表示
		if(b)														// コードを2進数で表示
		{
			bx=Integer.toString(x+33+Dx,2);							// コードの表示
			by=Integer.toString(y+33+Dy,2);
			for(i=bx.length(); i<8; i++) bx="0"+bx;					// 上位の 0 をつけて8桁の2進数に
			for(i=by.length(); i<8; i++) by="0"+by;
			bin="2"+by+"4"+bx+"3";									// カッコ(2,3)やスペース(4)を加える
			for(i=18;i>=0;i--) dsp_b(150+11*i,374,Integer.parseInt(bin.substring(i,i+1)),0,1);	// 2進数の表示
		}
	}

	public void paint(Graphics g)
	{
		int		i, j, m=0;

		if(Run)
		{
			g.clearRect(0,0,size().width-213,size().height);		// コード表のクリア
			g.clearRect(Dx0,Dy0,186,186);
		}
		else
		{
			g.clearRect(0,0,size().width,size().height);
			for(i=0; i<6; i++)										// ボタンの表示
			{
				if(i==0 && Dy==0 || i==1 && Dy==78 || i==2 && Dx==0 || i==3 && Dx==78 || i==4 && Mx==99) m=2;
				else m=0;
				j=(i==5 && Mov)?i+1:i;
				dsp_b(Bx[i], By[i], m,j,3);
			}
		}
		g.setColor(new Color(247,247,208));							// 表の見出しの色
		g.fillRect(Ofsx,21,Cx,Ph);
		g.fillRect(21,Ofsy,Ph,Cy);
		if(Mx<16 && My<16)
		{
			g.setColor(new Color(240,240,192));						// クリックされた行・列の色
			g.fillRect(Ofsx,Ofsy+My*Ph,Cx,Ph);
			g.fillRect(Ofsx+Mx*Ph,Ofsy,Ph,Cy);
			g.setColor(new Color(224,224,176));						// クリックされた行・列の見出しの色
			g.fillRect(21,Ofsy+My*Ph,Ph,Ph);
			g.fillRect(Ofsx+Mx*Ph,21,Ph,Ph);
			g.setColor(new Color(208,208,144));						// クリックされた行・列の色
			g.fillRect(Ofsx+Mx*Ph,Ofsy+My*Ph,Ph,Ph);
			dsp_code(Mx, My, true);
		}
		g.setColor(new Color(200,200,168));							// コード表エリアの表示
		g.fillRect(Dx0+Dx*2,Dy0+Dy*2,32,32);
		dsp_b(Ofsx-Ph*2+1,Ofsy, 0, 0, 4);							// 「第1バイト」の表示
		dsp_b(Ofsx,Ofsy-Ph*2+1, 0, 0, 5);							// 「第2バイト」の表示
		dsp_b(Dx0-14,Dy0-11, 0, 0, 6);								// コード表図の表示
		dsp_tbl(Ofsx, Ofsy-Ph, Dx,  0, 1);							// 上部見出しの表示
		dsp_tbl(Ofsx-Ph, Ofsy,  0, Dy, 2);							// 左見出しの表示
		dsp_tbl(Ofsx,    Ofsy, Dx, Dy, 0);							// コード表(詳細)の表示
	}
	
	public boolean area_chk(int n)
	{
		boolean f=true;
		if(n==0) Dy--; if(Dy<0) {Dy=0;  f=false;}
		if(n==1) Dy++; if(Dy>78){Dy=78; f=false;}
		if(n==2) Dx--; if(Dx<0) {Dx=0;  f=false;}
		if(n==3) Dx++; if(Dx>78){Dx=78; f=false;}
		return f;
	}

	public void run()
	{
		while(true)
		{
			if(Run)
			{
				Run=area_chk(Dir);
				repaint();
			}
			try
			{
				Thread.sleep(Wait);
			}
			catch (InterruptedException e){}
			Wait=64;
		}
	}
	
	public boolean mouseDown(Event e, int mx, int my)				// マウスをクリック
	{
		int i;
		boolean f=true;
		if(inside(mx,Ofsx,Ofsx+Cx) && inside(my,Ofsy,Ofsy+Cy))		// コード表をクリック
		{
			Mx=(mx-Ofsx)/Ph;
			My=(my-Ofsy)/Ph;
			repaint();
		}
		if(inside(mx,Dx0,Dx0+188) && inside(my,Dy0,Dy0+188))		// コード表エリアをクリック
		{
			Dx=(mx-Dx0-16)/2; Dy=(my-Dy0-16)/2;
			area_chk(-1);
			repaint();
		}
		for(i=0; i<6; i++)
		{
			if(inside(mx,Bx[i],Bx[i]+26) && inside(my,By[i],By[i]+23))	// ボタンをクリック
			{
				if(i<4)
				{
					f=area_chk(i);
					if(Mov) Run=true;
				}
				if(i==4 && Mx<16 && My<16) {Mx=99; My=99;} 			// Clr ボタン
				if(i==5) Mov=!Mov;									// Run/Stop ボタン
				if(f)
				{
					dsp_b(Bx[i],By[i], 1,(i==5 && !Mov)?i+1:i, 3);	// ボタンを緑で表示
					Dir=i;
				}
			}
		}
		return true;
	}
	
	public boolean mouseDrag(Event e, int mx, int my)				// マウスをドラッグ
	{
		if(inside(mx,Dx0,Dx0+188) && inside(my,Dy0,Dy0+188))
		{
			Dx=(mx-Dx0-16)/2; Dy=(my-Dy0-16)/2;
			area_chk(-1);
			repaint();
		}
		return true;
	}

	public boolean mouseMove(Event e, int mx, int my)				// マウスをコード表の中で移動
	{
		if(inside(mx,Ofsx,Ofsx+Cx) && inside(my,Ofsy,Ofsy+Cy) && Mx==99 && My==99)
		{
			dsp_code((mx-Ofsx)/Ph, (my-Ofsy)/Ph, false);			// コード(16進数)を表示
		}
		return true;
	}
	
	public boolean mouseUp(Event e, int mx, int my)					// マウスのクリックを離す
	{
		if(Mov) Run=false;
		Wait=1024;
		repaint();
		return true;
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
}
//
戻る