//
/* ----------------------------------------------------------------------------------------------
    nor.java		NOR 回路								ver. 1.10 (JDK 1.02)
    														ueyama@infonet.co.jp  2005.01.28
    														update: 2007.08.03
---------------------------------------------------------------------------------------------- */

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


public class nor extends Applet
{
	int			A=0, B=0, X=1;											// 入力 A, B、 出力 X
	int			T=1;													// トランジスタの表示  0:SW  1:Tr
	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_g(int x, int y, int m, int n, int c)
	{
		int w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w= 24; h=31; ox=493; oy=  0; break;			// トランジスタ
			case	 1:	w=  9; h=14; ox=493; oy=124; break;			// 2進数 (大)
			case	 2:	w=  8; h=12; ox=511; oy=124; break;			// 2進数 (小)
			case	 3:	w=  6; h= 6; ox=527; oy=124; break;			// ラジオボタン用ドット
		}
		Graphics gx=getGraphics();
		gx.clipRect(x,y,w,h);
		gx.clearRect(x,y,w,h);
		gx.drawImage(Img, x-(ox+m*w), y-(oy+n*h), this);
		gx.dispose();
	}
	
	public void dsp_p()
	{
		int x,y;
		X=(A+B==0)?1:0;
		dsp_g(199, 29, T, (A==0)?1:0, 0);							// トランジスタ T1 の表示
		dsp_g(199, 88, T, (B==0)?1:0, 0);							// トランジスタ T2 の表示
		dsp_g(199,162, T, A+2, 0);									// トランジスタ T3 の表示
		dsp_g(116,162, T, B+2, 0);									// トランジスタ T4 の表示
		dsp_g(  3, 37, 1, A, 1);									// 入力 A の2進数表示
		dsp_g(  3, 96, 1, B, 1);									// 入力 B の2進数表示
		dsp_g(337,133, 1, X, 1);									// 出力 X の2進数表示
		for(y=0; y<4; y++)
		{
			dsp_g(426, 85+y*25, (y==A*2+B)?1:0, y/2, 2);			// 真理値表 A の表示
			dsp_g(449, 85+y*25, (y==A*2+B)?1:0, y%2, 2);			// 真理値表 B の表示
			dsp_g(472, 85+y*25, (y==A*2+B)?1:0, (y==0)?1:0, 2);		// 真理値表 X の表示
		}
		dsp_g(416,196, 0, T, 3);									// ラジオボタン Tr の表示
		dsp_g(455,196, 0, (T==1)?0:1, 3);							// ラジオボタン SW の表示
	}   

	public void paint(Graphics g)
	{
		int i;
		g.clearRect(0, 0, size().width, size().height);
		g.drawImage(Img, 0, 0, this);
		dsp_p();
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		if(x<40)													// 入力信号をクリック
		{
			if(inside(y, 25, 55)) A=(A==0)?1:0;
			if(inside(y, 85,115)) B=(B==0)?1:0;
		}
		if(inside(x, 418, 488) && inside(y, 78, 178))				// 真理値表をクリック
		{
			A=(y-78)/50; B=((y-78)/25)%2;
			X=((y-78)/25==3)?0:1;
		}
		if(x>410 && inside(y, 188, 207))							// SW, Tr 表示の切り替え
		{
			if(x>447) T=0;
			else	  T=1;
		}
		dsp_p();
		return true;
	}
}
//
戻る