//
/* ----------------------------------------------------------------------------------------------
    signedbin.java		符号つき2進数						ver. 1.00 (JDK 1.02)
    														ueyama@infonet.co.jp  2002.03.14
---------------------------------------------------------------------------------------------- */

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

public class signedbin extends Applet
{
	int			Bx=80, By=80, Px=52, Nx=175, Ny=230;				// 数値・ボタン表示座標
	int			Dx=163, Dy=154;										// 10進数表示座標
	int			Num;												// 表示数値
	int			Fs=0;												// 0: 符号なし2進数  1: 符号つき2進数
	int			Mn=0, Mx=0;
	int			Bgc;
	Image		Img;
	Thread		th=null;
	Graphics	gr;
	
	public void init()
	{
		String	bg=getParameter("BgColor");
		Bgc=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(Bgc)); 
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
		Random r=new Random();
		Num=Math.abs(r.nextInt())%128+128;							// 初期値を 128〜255 の範囲で
	}
	
	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_img(int x, int y, int c, int m, int n)			// 画像の表示
	{
		int			w=0, h=0, ox=0, oy=0;
		Graphics	gx=gr.create();
		switch(c)
		{
			case  0: w= 32; h=52; ox=  0; oy= 0; break;				// 2進数
			case  1: w= 29; h=46; ox= 64; oy= 0; break;				// 10進数
			case  2: w= 28; h=21; ox= 64; oy=46; break;				// 10進数表示
			case  3: w= 13; h=17; ox=338; oy=80; break;				// "+"
			case  4: w= 55; h=17; ox=338; oy=46; break;				// "2進数", "10進数"
			case  5: w= 26; h=23; ox= 64; oy=88; break;				// +/−
			case  6: w= 26; h=23; ox=116; oy=88; break;				// +
			case  7: w= 26; h=23; ox=168; oy=88; break;				// Dect
			case  8: w= 26; h=23; ox=220; oy=88; break;				// Clear
			case  9: w= 26; h=23; ox=272; oy=88; break;				// Inc
			case 10: w=119; h=21; ox= 92; oy=67; break;				// "符号なし2進数"
			case 11: w= 68; h=21; ox=211; oy=67; break;				// "符号つき"
		}
		gx.clipRect(x, y, (c==2 && m==8)?50:w, h);
		gx.drawImage(Img,x-(ox+m*w),y-(oy+n*h),this);
		gx.dispose();
	}
	
	public void dsp_num()											// 数値の表示
	{
		int		i, m=0, n, x;
		String	bin, dec, c="";
		
		gr.clearRect(0, 0, 476, Ny-1);
		bin=Integer.toString(Num,2);								// 2進数 文字列
		for(i=bin.length();i<8;i++) bin="0"+bin;
		bin+=" ";
		for(i=7;i>0;i--)											// 2進数の表示
		{
			m=Integer.parseInt(bin.substring(i,i+1));
			dsp_img(Bx+Px*i, 0, 0, m, 0);
			dsp_img(Bx+Px*i+3, By, 2, (m==0)?0:8-i, 0);
			dsp_img(Bx+Px*i-15, By, 3, 0, 0);
		}
		dsp_img(Bx, 0, 0, Num/128, Fs);								// 2進数 MSB の表示
		m=Num/128;
		dsp_img(Bx-m*20, By, 2, (m==0)?0:8, Fs);
		dsp_img(0,18,4,0,0); dsp_img(0,Dy+14,4,0,1);				// "2進数", "10進数"
		dsp_img(357, 232, 10, 0, 0);								// "符号なし2進数"
		if(Fs==1)
		{
			dsp_img(357, 232, 11, 0, 0);							// "符号つき"
			n=Math.abs(Num%128-(Num/128)*m*128);
		}
		else n=Num;
		dec=Integer.toString(n,10);									// 10進数 文字列
		x=Dx+(4-dec.length())*20;
		if(Fs==1 && Num>127) x+=20;
		for(i=3; i>=0; i--)											// 10進数の表示
		{
			if(dec.length()>i)
			{
				m=Integer.parseInt(dec.substring(i,i+1));
				dsp_img(x+40*i, Dy, 1, m, 0);
			}
			else gr.clearRect(x+40*i, Dy, 29, 46);
		}
		if(Fs==1 && Num>127) dsp_img(x+40*i, Dy, 1, 10, 0);
		
		showStatus("Num="+Num+",  dec="+dec+",  Fs="+Fs+",  c="+c);
	}

	public void paint(Graphics g)
	{
		dsp_num();
		dsp_img(Nx,    Ny,5+Fs,0,0);								// +/−
		dsp_img(Nx+ 40,Ny,7,0,0);									// Dec
		dsp_img(Nx+ 70,Ny,8,0,0);									// Clear
		dsp_img(Nx+100,Ny,9,0,0);									// Inc
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		int	m=(mx-Bx)/Px, n=1, i;
		Mn=0;
		if((myNy)													// ボタン
		{
			if(inside(mx,Nx,Nx+26))									// +/−
			{
				Mn=5; Mx=Nx;
				dsp_img(Mx,Ny,Mn+Fs,1,0);
				if(Fs==0) Fs=1;
				else      Fs=0;
			}
			if(inside(mx,Nx+40,Nx+40+26))							// Dec
			{
				Mn=7; Mx=Nx+40;
				Num+=255; Num%=256;
			}
			if(inside(mx,Nx+70,Nx+70+26))							// Clear
			{
				Mn=8; Mx=Nx+70;
				Num=0;
			}
			if(inside(mx,Nx+100,Nx+100+26))							// Inc
			{
				Mn=9; Mx=Nx+100;
				Num+=1; Num%=256;
			}
			dsp_num();
			if(Mn>6) dsp_img(Mx,Ny,Mn,1,0);
		}
		return true;
	}

	public boolean mouseUp(Event e, int mx, int my)
	{
		if(Mn>0)
		{
			if(Mn==5) dsp_img(Mx,Ny,Mn+Fs,0,0);
			else dsp_img(Mx,Ny,Mn,0,0);
		}
		return true;
	}
}
//
戻る