//
/* ----------------------------------------------------------------------------------------------
    chr_code.java		キャラクタコード					ver. 1.01 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.10.01
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;


public class chr_code extends Applet
{
	int			X0=16,Y0=16, X1=38,Y1=38, X=999,Y=999,N=128;
	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,4,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,
					 160,65,66,67,68,69,70,71,72,73,160,160,160,160,160,160,
					 160,74,75,76,77,78,79,80,81,82,160,160,160,160,160,160,
					 160,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};
	int			R,G,B;
	boolean		Jis=true;											// true: JIS,  false: EBCDIC
	boolean		Code=true;											// true: Code, false: Number
	boolean		C[]=new boolean[256];								// true: Code, false: Number
	Graphics	gr;
	Image		Img;
	
	public void init()
	{
		int	r=Integer.parseInt(getParameter("bg_red"));
		int	g=Integer.parseInt(getParameter("bg_green"));
		int	b=Integer.parseInt(getParameter("bg_blue"));
		setBackground(new Color(r,g,b));
		R=Integer.parseInt(getParameter("tb_red"));
		G=Integer.parseInt(getParameter("tb_green"));
		B=Integer.parseInt(getParameter("tb_blue"));
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
		for(r=0;r<256;r++) C[r]=Code;
	}
	
	public void update(Graphics g)
	{
		paint(g);
	}
	
	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 n, int c)
	{
		Graphics	gx=gr.create();
		int			w=0, h=0, ox=0, oy=0;
		switch(n)
		{
			case	 0:	w= 9; h= 9; ox=  0; oy= 0;	break;			// 16進数
			case	 1:	w= 5; h= 9; ox=144; oy= 0;	break;			// 10進数
			case	 2:	w=17; h= 9; ox=  0; oy= 9;	break;			// 制御コード
			case	 3:	w=13; h=13; ox=  0; oy=18;	break;			// SP to ?
			case	 4:	w=13; h=13; ox=  0; oy=31;	break;			// @ to _
			case	 5:	w=13; h=13; ox=  0; oy=44;	break;			// ' to DEL
			case	 6:	w=13; h=13; ox=  0; oy=57;	break;			// 未定義
			case	 7:	w=13; h=13; ox=  0; oy=57;	break;			// 未 to ソ
			case	 8:	w=13; h=13; ox=  0; oy=70;	break;			// タ to ゜
			case	 9:	w=13; h=13; ox=  0; oy=57;	break;			// 未定義
			case	10: w=17; h= 9; ox=194; oy= 0;	break;			// EBCDIC 制御コード
			case	11: w=13; h=13; ox=416; oy=31;	break;			// EBCDIC 文字
			case	12: w=56; h=24; ox=  0; oy=83;	break;			// "JIS 8"
			case	13: w=76; h=24; ox=112; oy=83;	break;			// "EBCDIC"
			case	14: w=46; h=24; ox=264; oy=83;	break;			// "数字"
			case	15: w=46; h=24; ox=356; oy=83;	break;			// "文字"
			case	16: w=64; h=13; ox=442; oy=31;	break;			// "CODE="
			case	17: w=11; h=13; ox=416; oy=18;	break;			// 16進数
			case	18: w=65; h=11; ox=506; oy=31;	break;			// "上位4ビット"
			case	19: w=11; h=72; ox=580; oy=31;	break;			// "下位4ビット"
		}
		gx.clipRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+((n==6 || n==9)?0:c*w)),y-oy,this);
		gx.dispose();
	}
	
	public void dsp_n(int n)										// 数値の表示
	{
		int i=n/16, j=n%16, ox;
		String	dec,c;
		
		gr.clearRect(i*22+X1+1,j*22+Y1+1,21,21);
		if(n<10)
		{
			ox=9;
			dsp_g(X1+i*22+ox,Y1+j*22+7,1,n);
		}
		else if(n<100)
		{
			ox=6;
			dsp_g(X1+i*22+ox,Y1+j*22+7,1,n/10);
			dsp_g(X1+i*22+ox+6,Y1+j*22+7,1,n%10);
		}
		else
		{
			ox=3;
			dec=Integer.toString(n,10);
			c=dec.substring(0,1);
			dsp_g(X1+i*22+ox,Y1+j*22+7,1,Integer.parseInt(c));
			c=dec.substring(1,2);
			dsp_g(X1+i*22+ox+6,Y1+j*22+7,1,Integer.parseInt(c));
			c=dec.substring(2,3);
			dsp_g(X1+i*22+ox+12,Y1+j*22+7,1,Integer.parseInt(c));
		}
	}
	
	public void dsp_c(int n)										// コードの表示
	{
		int g=0, x=n/16, y=n%16;
		if(!Jis) n=E[n];
		gr.clearRect(x*22+X1+1,y*22+Y1+1,21,21);
		if(n<256) g=n/32+2;
		else if(n<279) g=10;
		else if(n>278) {g=11; n-=279;}
		dsp_g(x*22+X1+((g==2 || g==10)?3:5), y*22+Y1+((g==2 || g==10)?7:5), g, (n/16)%2*16+n%16);
	}
	
	public void paint(Graphics g)
	{
		int i,j;
		
		g.setColor(new Color(R,G,B));
		g.fillRect(39,17,351,21);
		g.fillRect(17,39,21,351);
		g.setColor(new Color(0,0,0));
		dsp_g(38,0,18,0); dsp_g(0,38,19,0);							// 上・下位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,0,i);						// 見出しの表示
		for(j=0;j<16;j++) dsp_g(X0+7,Y1+j*22+7,0,j);
		// 表中データの表示
		for(i=0;i<16;i++) for(j=0;j<16;j++) if(C[i*16+j]) dsp_c(i*16+j); else dsp_n(i*16+j);
		dsp_g(139,406,12,(Jis)?1:0);								// "JIS 8"
		dsp_g(197,406,13,(Jis)?0:1);								// "EBCDIC"
		dsp_g(283,406,14,(Code)?0:1);								// "数字"
		dsp_g(331,406,15,(Code)?1:0);								// "文字"
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int mx=(x-X1), my=(y-Y1), n=0;
		boolean b=false;
		if(inside(mx,0,352) && inside(my,0,352))					// コード表
		{
			n=(x-X1)/22*16+(y-Y1)/22;
			if(C[n]) {dsp_n(n); C[n]=false;}
			else	 {dsp_c(n); C[n]=true;}
		}
		if(inside(y,406,430))										// ボタン
		{
			if(inside(x,139,195) || inside(x,197,273))
			{
				if(inside(x,139,195)) Jis=true; else Jis=false;
				dsp_g(139,406,12,(Jis)?1:0);						// "JIS 8"
				dsp_g(197,406,13,(Jis)?0:1);						// "EBCDIC"
				b=true;
			}
			if(inside(x,283,429) || inside(x,331,391))
			{
				if(inside(x,331,391)) Code=true; else Code=false;
				for(n=0;n<256;n++) C[n]=Code;
				dsp_g(283,406,14,(Code)?0:1);						// "数字"
				dsp_g(331,406,15,(Code)?1:0);						// "コード"
				b=true;
			}
			if(b) repaint();
		}
		return true;
	}
	
	public boolean mouseMove(Event e, int x, int y)
	{
		int mx=(x-X1), my=(y-Y1), n=0;
		gr.clearRect(X0+10,411,90,13);
		if(inside(mx,0,351) && inside(my,0,351))
		{
			if(C[N]) dsp_c(N);
			else	 dsp_n(N);
			n=(x-X1)/22*16+(y-Y1)/22;
			if(C[n]) dsp_n(n);
			else	 dsp_c(n);
			dsp_g(X0+10,411,16,0);
			dsp_g(X0+74,411,17,n/16);
			dsp_g(X0+87,411,17,n%16);
			X=mx; Y=my;
			N=n;
		}
		return true;
	}
}
//
戻る