//
/* ----------------------------------------------------------------------------------------------
    information.java	情報量									ver. 2.10 (JDK 1.02)
    															ueyama@infonet.co.jp  2003.02.15
    															update: 2011.08.10
---------------------------------------------------------------------------------------------- */

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


public class information extends Applet
{
	int			Kox=15, Koy=60, Dox=15, Doy=15;							// キー・液晶 表示基準座標
	int			Kx[]={  0,  0, 46, 92,  0, 46, 92,  0, 46, 92, 46, 92, 92};	// キー表示座標値
	int			Ky[]={152,114,114,114, 76, 76, 76, 38, 38, 38,152,152,  0};	// 0,1,2,3,4,5,6,7,8,9,.,=,P
	int			Dp=-1;													// 小数点位置
	String		Key="1";												// キー入力値
	boolean		Eq =true;												// true: '=' キーをクリック
	boolean		Err=false, One=true;
	double		Val=0.0;												// 情報量 (bit)
	Image		Img;
	
	public void init()
	{
		String	bg=getParameter("bgcolor");
		int 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){};
	}
	
	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_p(int x, int y, int n, int c)						// 図や文字を描く
	{
		int w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w=14; h=17; ox=  0; oy= 0;	break;				// キー数字
			case	 1:	w=38; h=31; ox=  0; oy=59;	break;				// キー
			case	 2:	w=13; h=21; ox=  0; oy=17;	break;				// 液晶数字
			case	 3:	w=13; h=21; ox=  0; oy=38;	break;				// 液晶数字(小数点付き)
			case	 4:	w=20; h=12; ox=130; oy=59;	break;				// "bit"
			case	 5:	w=37; h=21; ox=143; oy=17;	break;				// "Err."
		}
		Graphics gx=getGraphics();
		gx.clipRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+n*w),y-oy,this);
		gx.dispose();
	}
	
	public void dsp_lcd()												// 液晶表示
	{
		int i=0,m=0,l=0, in=0, dc=0;
		double real=0.0, dec=0.0;
		Graphics gx=getGraphics();
		gx.setColor(new Color(181,181,156));
		gx.fillRect(Dox-4,Doy-4,138,40);								// 液晶部のクリア
		
		Dp=Key.indexOf(".");											// キー入力文字列中の小数点の位置
		String ks=(Dp>=0)? Key.substring(0,Dp)+Key.substring(Dp+1): Key;	// 液晶表示用文字列("." を含まない)
		if(Eq)															// 情報量の表示 ('=' キークリック時)
		{
			i=Integer.parseInt(ks);
			if(i==0) Err=true;
			if(i==1 && Dp==-1) One=true;
			if(Dp>=0)													// 小数点を含むとき
			{
				String ds=ks.substring(Dp);								// 入力値 小数部文字列
				if(Dp>0) in=Integer.parseInt(ks.substring(0,Dp));		// 入力値 整数部
				dc=Integer.parseInt(ds);								// 入力値 小数部
				real=in+dc/Math.pow(10, ds.length());					// 入力値 実数値
				if(real>1.0) real=1/real;								// 逆数入力時
			}
			else
			{
				real=Integer.parseInt(ks);								// 入力値
				real=1/real;											// 逆数入力モード時
			}
			Val = -1 * Math.log(real) / Math.log(2.0);					// 情報量
			ks=""+(int)Val;												// 情報量 整数部(文字列)
			Dp=ks.length();												// 情報量 整数部桁数(情報量の表示のため)
			dec=Val-(int)Val;											// 情報量 小数部
			for(i=0; i<8; i++)											// 情報量 小数部を1桁ずつ ks に加える
			{															//                (表示桁数確保のため)
				dec*=10.0;
				ks+=(int)dec;
				dec-=(int)dec;
			}
			if(One) ks="0";
			else
			{
				l=ks.length();
				while(ks.endsWith("0") && l>Dp)							// 情報量 末尾の '0' を削除
				{
					ks=ks.substring(0,l-1);
					l=ks.length();
				}
			}
			if(ks.length()==Dp) Dp=-1;
			if(!Err) dsp_p(108+Dox, 23+Doy, 0, 4);						// "bit" の表示
		}
		if(Err) dsp_p(91+Dox, Doy, 0, 5);								// "Err." の表示
		else															// 数値 (入力値 or 情報量) の表示
		{
			l=10-ks.length();
			if(l<10)
			{
				for(i=0; i<10; i++)
				{
					m=(i>=l)? Integer.parseInt(ks.substring(i-l, i-l+1)): 10;
					dsp_p(13*i+Dox, Doy, m, (i-l+1==Dp && Dp>=0)? 3:2);
				}
			}
			else dsp_p(13*9+Dox, Doy, 10, (Dp<0)?2:3);					// 最初に入力された "." の表示
		}
	}
	
	public void paint(Graphics g)
	{
		int i,j;
		g.clearRect(0,0,size().width,size().height);
		g.setColor(new Color(181,181,156));
		g.fillRect(Dox-5,Doy-5,140,42);									// 液晶部
		g.drawRoundRect(0, 0, size().width-1, size().height-1,10,10);	// 外枠
		g.setColor(new Color(120,120,100));
		g.drawRect(Dox-5,Doy-5,140,42);									// 液晶部枠
		for(i=0; i<12; i++) dsp_p(Kx[i]+Kox, Ky[i]+Koy, 0, 1);			// キーの表示
		for(i=0; i<12; i++) dsp_p(Kx[i]+Kox+12, Ky[i]+Koy+7, i, 0);		// キー文字の表示
		dsp_p(Kx[i]+Kox, Ky[i]+Koy, 1, 1);								// P, 1/P キー
		dsp_lcd();														// 液晶 数値の表示
	}
	
	public boolean mouseDown(Event e, int mx, int my)
	{
		int i, n=Key.length();
		for(i=0;i<13;i++) if(inside(mx,Kx[i]+Kox,Kx[i]+Kox+38) && inside(my,Ky[i]+Koy,Ky[i]+Koy+31)) break;
		if(i<13)														// キーがクリックされた
		{
			Val=0.0;
			if(Eq) Key="";
			Eq=Err=One=false;
			if(i<10 && n<9) Key+=i;										// 数値キー
			if(i==10) Key+=".";											// '.'
			if(i==11 && n>0) Eq=true;									// '='
			if(i==12 && n>0 && !Eq) Key=Key.substring(0, n-1);			// "BS"
			dsp_lcd();													// キー入力値 or 情報量の表示
		}
		return true;
	}
}
//
戻る