//
/* ----------------------------------------------------------------------------------------------
    chr_code.java		キャラクタコード					ver. 2.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.10.01
    														update: 2009.12.12
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;


public class chr_code extends Applet
{
	int			X0=16,Y0=16, X1=38,Y1=38;								// コード表表示位置
	int			X=99,Y=99,M=128;										// 青→黒 表示変更用 (マウスの位置)
	int			Col;													// コード表見出し背景色
	int			N=-1;													// クリックされた文字
	boolean		Jis=true;												// true: JIS,  false: EBCDIC
	int			E[]={  0,  1,  2,  3,256,  9,257,127,160,258,259, 11, 12, 13, 14, 15,	// EBCDIC Code data
					  16, 17, 18,260,261,262,  8,263, 24, 25,264,265,266,267,268,269,
					 270,271, 28,160,272, 10, 23, 27,160,160,273,274,160,  5,  6,  7,
					 160,160, 22,160,275, 30,276,  4,160,160,160,277, 20, 21,160, 26,
					  32,160,160,160,160,160,160,160,160,160,279, 46, 60, 40, 43,124,
					  38,160,160,160,160,160,160,160,160,160, 33, 36, 42, 41, 59,280,
					  45, 47,160,160,160,160,160,160,160,160, 94, 44, 37, 95, 62, 63,
					 160,160,160,160,160,160,160,160,160,160, 58, 35, 64, 39, 61, 34,
					 160, 97, 98, 99,100,101,102,103,104,105,160,160,160,160,160,160,
					 160,106,107,108,109,110,111,112,113,114,160,160,160,160,160,160,
					 160,126,115,116,117,118,119,120,121,122,160,160,160,160,160,160,
					 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
					 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,160,160,160,160,160,160,
					 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,160,160,160,160,160,160,
					 281,160, 83, 84, 85, 86, 87, 88, 89, 90,160,160,160,160,160,160,
					  48, 49, 50, 51, 52, 53, 54, 55, 56, 57,160,160,160,160,160,278};
	Image		Img;
	
	public void init()
	{
		String bg=getParameter("bgcolor");								// 背景色の読み込み
		int bgc=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(bgc));
		bg=getParameter("tbcolor");										// コード表見出し背景色
		Col=Integer.valueOf(bg,16).intValue();
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
	}

	public boolean inside(int x, int a, int b)
	{
		return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
	}
	
	public void dsp_g(int x, int y, int m, int n, int c, int d)			// 画像の表示
	{
		Graphics 	gx=getGraphics();
		int  w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0: w= 17; h=13; ox=  0; oy=  0; break;				// 制御コード & 文字
			case	 1: w=  9; h= 9; ox=328; oy=234; break;				// 16進数 (コード表見出し)
			case	 3: w=180; h=13; ox=  0; oy=104; break;				// 文字コードクリアのため
			case	 4: w= 11; h=13; ox=  0; oy=234; break;				// 16進数 (文字コード)
			case	 5: w= 14; h=14; ox=  0; oy=247; break;				// ラジオボタン
			case	 6: w= 66; h=14; ox= 28; oy=247; break;				// "JIS", "EBCDIC"
			case	 7: w=  9; h=13; ox=209; oy=234; break;				// 10進数
			case	 8: w= 65; h=11; ox=171; oy=221; break;				// "上位4ビット"
			case	 9: w= 11; h=72; ox=544; oy=  0; break;				// "下位4ビット"
			case	10: w= 26; h=23; ox=472; oy=221; break;				// クリアボタン
		}
		gx.clipRect(x,y,w,h);
		if(d>0) gx.clearRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
		gx.dispose();
	}
	
	public void paint(Graphics g)
	{
		int i,j,k,n;
		g.clearRect(0,0,size().width,size().height);
		g.setColor(new Color(Col));
		g.fillRect(39,17,351,21);
		g.fillRect(17,39,21,351);
		g.setColor(new Color(0,0,0));
		dsp_g(38,0,0,0,8,1); dsp_g(0,38,0,0,9,1);						// "上・下位4ビット" の表示
		for(i=0;i<18;i++) g.drawLine(X0+i*22,(i==0)?Y1:Y0,X0+i*22,Y0+374);	// 表の罫線の表示
		for(j=0;j<18;j++) g.drawLine((j==0)?X1:X0,Y0+j*22,X0+374,Y0+j*22);
		for(i=0;i<16;i++)												// 見出しの表示
		{
			dsp_g(X1+i*22+7,Y0+7,i,0,1,0);
			dsp_g(X0+7,Y1+i*22+7,i,0,1,0);
		}
		for(i=0;i<256;i++)												// コード表の表示
		{
			n=(Jis)? i:E[i];
			j=i/16; k=i%16;
			dsp_g(j*22+X1+3,k*22+Y1+5,n%16+((N>=0 && i==N)?16:0),n/16,0,1);	// 文字の表示
		}
		if(N>=0) dsp_code(N);											// クリックされたコードの表示
		dsp_g(192,410,0,0,6,1);											// "JIS"
		dsp_g(271,410,1,0,6,1);											// "EBCDIC"
		dsp_g(192,410,(Jis)?0:1,0,5,1);									// ラジオボタン (JIS)
		dsp_g(251,410,(Jis)?1:0,0,5,1);									// ラジオボタン (EBCDIC)
		dsp_g(350,405,(N<0)?2:0,0,10,1);								// クリアボタン
	}

	public void dsp_code(int m)
	{
		int i, n;
		n=(Jis)? m:E[m];
		dsp_g(24,410,17,0,4,1);											// "["
		dsp_g(36,410,n%16,n/16,0,1);									// 表の下部に文字を表示
		dsp_g(54,410,18,0,4,1);											// "]"
		dsp_g(66,410,16,0,4,1);											// ":"
		dsp_g(80,410,m/16,0,4,1);										// コード(16進数)の表示
		dsp_g(93,410,m%16,0,4,1);										// コード(16進数)の表示
		dsp_g(114,410,10,0,7,1);										// "("
		String dec=Integer.toString(m,10);								// 10進数文字列の作成
		for(i=0; i=0)
			{
				n=(Jis)? N:E[N];
				dsp_g(X*22+X1+3,Y*22+Y1+5,n%16,n/16,0,1);				// コード表の文字を黒色表示に戻す
			}
			X=mx; Y=my;
			N=mx*16+my;
			n=(Jis)? N:E[N];
			dsp_g(mx*22+X1+3,my*22+Y1+5,n%16+16,n/16,0,1);				// コード表の文字を青色表示
			dsp_g(10,410,0,0,3,1);										// コード表示領域のクリア
			dsp_code((Jis)? n:N);
			dsp_g(350,405,0,0,10,1);									// クリアボタン
		}
		if(y>405)
		{
			if(inside(x,189,239)) Jis=true;								// "JIS" をクリック
			if(inside(x,247,337)) Jis=false;							// "EBCDIC" をクリック
			if(inside(x,350,376) && N>=0) dsp_g(350,405,1,0,10,1);		// クリアボタン をクリック
		}
		return true;
	}

	public boolean mouseUp(Event e, int x, int y)
	{
		if(y>405 && x>189)
		{
			if(inside(x,192,337)) repaint();							// "JIS", "EBCDIC" をクリック
			if(inside(x,350,376) && N>=0)								// クリアボタン をクリック
			{
				repaint();
				dsp_g(350,405,0,0,10,1);								// クリアボタン
			}
			N=-1; X=99; Y=99;
		}
		return true;
	}

	public boolean mouseMove(Event e, int x, int y)
	{
		int mx=(x-X1)/22, my=(y-Y1)/22, m=mx*16+my, n;
		if(inside(x,X1,X1+351) && inside(y,Y1,Y1+351) && N<0)
		{
			dsp_g(10,410,0,0,3,1);										// コード表示領域のクリア
			n=(Jis)? M:E[M];
			dsp_g(X*22+X1+3,Y*22+Y1+5,n%16,n/16,0,1);					// コード表の文字を黒色表示に戻す
			n=(Jis)? m:E[m];
			dsp_g(mx*22+X1+3,my*22+Y1+5,n%16+16,n/16,0,1);				// コード表の文字を青色表示
			X=mx; Y=my;
			M=m;
			dsp_code((N<0)? m:N);										// コードの表示
		}
		return true;
	}
}
//
戻る