//
/* ----------------------------------------------------------------------------------------------
    counter.java	カウンタ								ver. 1.01 (JDK 1.02)
    														ueyama@infonet.co.jp  2000.03.11
---------------------------------------------------------------------------------------------- */

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


public class counter extends Applet implements Runnable
{
	int			Dec;												// カウンタの値
	int			Wait=16, N=0;
	boolean		Run=false;
	Image		Img;
	Graphics	gr;
	Thread		th=null;
	
	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("gif"));
		mt.addImage(Img, 0);
		try
		{
			mt.waitForID(0);
		}
		catch(InterruptedException e){};
		gr=getGraphics();
		Random rnd=new Random();
		Dec=Math.abs(rnd.nextInt())%256;							// カウンタ初期値(乱数)
	}
	
	public void start()
	{
		if(th==null)
		{
			th=new Thread(this);
			th.start();
		}
	}
	
	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)
	{
		Graphics	gx=gr.create();
		int			w=0, h=0, ox=0, oy=0;
		switch(n)
		{
			case  0: w=177; h=30; ox=  0; oy=  0;	break;			// カウンタ
			case  1: w= 15; h=22; ox=177; oy=  0;	break;			// 2進数 (0〜1)
			case  2: w= 10; h=14; ox=207; oy=  0;	break;			// 10進数 (1〜9, =)
			case  3: w= 47; h=11; ox=207; oy= 14;	break;			// "(10進数)"
			case  4: w= 44; h=11; ox=254; oy= 14;	break;			// "(2進数)"
			case  5: w= 26; h=23; ox=  0; oy= 30;	break;			// UP ボタン
			case  6: w= 26; h=23; ox= 52; oy= 30;	break;			// DOWN ボタン
			case  7: w= 26; h=23; ox=104; oy= 30;	break;			// RUN ボタン
			case  8: w= 26; h=23; ox=156; oy= 30;	break;			// STOP ボタン
			case  9: w= 26; h=23; ox=208; oy= 30;	break;			// FAST ボタン
			case 10: w= 26; h=23; ox=286; oy= 30;	break;			// SLOW ボタン
			case 11: w= 52; h=13; ox=298; oy= 14;	break;			// "カウンタ"
		}
		gx.clipRect(x,y,w,h);
		gx.clearRect(x,y,w,h);
		gx.drawImage(Img,x-(ox+c*w),y-oy,this);
		gx.dispose();
	}
	
	public void dsp_s()												// 数値の表示
	{
		int i,j,m,n=0,x=0;
		for(j=128, i=0; i<8; i++,j/=2)								// カウンタの値表示
		{
			m=((Dec & j)==0)?0:1;
			dsp_p(42+22*i,24,1,m);
			dsp_p(x+13*i,70,2,m);
		}
		x+=13*i;
		dsp_p(x,73,4,0);											// "(2進数)" の表示
		dsp_p(x+49,70,2,10);										// = の表示
		m=Dec/100; dsp_p(x+64,70,2,(m>0)?m:11); if(m>0) n++;		// 10進数表示
		m=Dec/10; m%=10; dsp_p(x+77,70,2,(m+n>0)?m:11);
		m=Dec%10; dsp_p(x+90,70,2,m);
		dsp_p(x+103,73,3,0);										// "(10進数)" の表示
	}
	
	public void paint(Graphics g)
	{
		g.clearRect(0,0,size().width,size().height);
		dsp_p(101,0,11,0);											// "カウンタ" の表示
		dsp_p(38,20,0,0);											// カウンタの表示
		dsp_p( 54,100,6,0);											// DEC ボタン
		dsp_p( 84,100,5,0);											// INC ボタン
		dsp_p(114,100,10,0);										// SLOW ボタン
		dsp_p(144,100,9,(Wait==1)?2:0);								// FAST ボタン
		dsp_p(174,100,(Run)?8:7,0);									// RUN ボタン
		dsp_s();
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int i,m,n=99;
		
		if(inside(y,20,50) && inside(x,38,215))						// カウンタ数値変更
		{
			m=7-(x-38)/22; n=1;
			for(i=0; i< m; i++) n*=2;
			if((Dec & n) ==0) Dec+=n;
			else Dec-=n;
		}
		if(y>100 && inside(x,54,200))
		{
			if((x-54)%30<26) n=(x-54)/30;
			switch(n)
			{
				case 0:	dsp_p( 54,100,6,1); Dec+=255; Dec%=256;		break;
				case 1:	dsp_p( 84,100,5,1); Dec++; Dec%=256;		break;
				case 2:	dsp_p(114,100,10,1); Wait*=2;				break;
				case 3:	if(Wait>1){dsp_p(144,100,9,1); Wait/=2;}	break;
				case 4:	dsp_p(174,100,(Run)?8:7,1); Run=!Run;		break;
			}
		}
		dsp_s();
		return true;
	}
	
	public boolean mouseUp(Event e, int x, int y)
	{
		int n=99;
		if(y>100 && inside(x,54,200))
		{
			if((x-54)%30<26) n=(x-54)/30;
			switch(n)
			{
				case 0:	dsp_p( 54,100,6,0);				break;
				case 1:	dsp_p( 84,100,5,0);				break;
				case 2:	dsp_p(114,100,10,0); dsp_p(144,100,9,0);	break;
				case 3:	dsp_p(144,100,9,(Wait==1)?2:0);	break;
				case 4:	dsp_p(174,100,(Run)?8:7,0);		break;
			}
		}
		return true;
	}
	
	public void run()
	{
		while(true)
		{
			N++;
			try
			{
				th.sleep(100);
			}
			catch (InterruptedException e){}
			if(Run && N%Wait==0)
			{
				Dec++; Dec%=256;
				dsp_s();
			}
		}
	}
	
	public void stop()
	{
		if(th!=null)
		{
			th.stop();
			th=null;
		}
	}
}
//
戻る