//
/* ----------------------------------------------------------------------------------------------
    or_gate.java	OR回路								ver. 2.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.02.04
    														update: 2007.11.24
---------------------------------------------------------------------------------------------- */

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


public class or_gate extends Applet
{
	int			A=0, B=0, X=0;											// A, B: 入力信号  X: 出力
	int			Tt[][]={{0,0,0},{0,1,1},{1,0,1},{1,1,1}};				// 真理値表
	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"));			// gif ファイルの読み込み
		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 m, int n, int c)				// 画像の表示
	{
		Graphics	gx=getGraphics();
		int			w=0, h=0, ox=0, oy=0;
		switch(c)
		{
			case	 0:	w=15; h=21; ox=258; oy= 0;	break;				// 数字(大)
			case	 1:	w=32; h=21; ox=273; oy= 0;	break;				// スイッチ
			case	 2:	w=21; h=21; ox=305; oy= 0;	break;				// 電球
			case	 3:	w= 8; h=11; ox=258; oy=42;	break;				// 数字(小)
			case	 4:	w=28; h=11; ox=274; oy=42;	break;				// OFF/ON
			case	 5:	w=28; h=13; ox=258; oy=64;	break;				// 消灯/点灯
			case	 6:	w=10; h=12; ox=258; oy=90;	break;				// A・B・X
			case	 7:	w=63; h=15; ox=258; oy=102;	break;				// 真理値表・電球回路
		}
		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_s()													// 数値、スイッチ、電球の表示
	{
		int	i,j,m=A*2+B;
		Graphics gr=getGraphics();
		dsp_p(32,5,0,A,0); dsp_p(32,34,0,B,0);							// 入力信号 (0,1)
		dsp_p(190,20,0,X,0);											// 入力信号 (0,1)
		dsp_p(100, 82,0,A,1); dsp_p(100,110,0,B,1);						// スイッチ
		dsp_p(220,135,0,X,2);											// 電球
		dsp_p(322, 10,0,0,7); dsp_p(492, 10,0,1,7);						// 真理値表/電球回路
		gr.setColor(new Color(153,153,153));
		for(i=0;i<6;i++)												// 真理値表の表示
		{
			gr.drawLine(286,35+i*27,421,35+i*27);						// 真理値表罫線
			gr.drawLine(456,35+i*27,591,35+i*27);
			if(i>1)
			{
				for(j=0;j<4;j++)
				{
					gr.drawLine(286+j*45,35,286+j*45,170);				// 真理値表罫線
					gr.drawLine(456+j*45,35,456+j*45,170);
					if(j<3) dsp_p(286+j*45+17,42,j,0,6);				// A, B, X
					if(j<3) dsp_p(456+j*45+17,42,j,0,6);
				}
				dsp_p(286+0*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],3);	// A (0,1)
				dsp_p(286+1*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],3);	// B (0,1)
				dsp_p(286+2*45+17,70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],3);	// X (0,1)
				dsp_p(456+0*45+8, 70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][0],4);	// A (ON, OFF)
				dsp_p(456+1*45+8, 70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][1],4);	// B (ON, OFF)
				dsp_p(456+2*45+8, 70+(i-2)*27,(i-2==m)?1:0,Tt[i-2][2],5);	// X (消灯,点灯)
			}
		}
	}
	
	public void paint(Graphics g)
	{
		g.clearRect(0,0,size().width,size().height);
		Graphics	gx=getGraphics();
		gx.clipRect(0,0,257,size().height);
		gx.drawImage(Img,0,0,this);										// 記号、回路図の表示
		gx.dispose();
		dsp_s();														// 数値、スイッチ、電球の表示
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int	m=0;
		if(inside(x, 20, 85) && inside(y, 0, 30)) m=1;					// 入力 A がクリックされた
		if(inside(x, 20, 85) && inside(y,30, 60)) m=2;					// 入力 B
		if(inside(x,100,132) && inside(y,80,109)) m=1;					// SW A がクリックされた
		if(inside(x,100,132) && inside(y,110,130)) m=2;					// SW B
		if((inside(x,286,421) || inside(x,456,591)) && inside(y, 62, 170))	// 真理値表 がクリックされた
		{
			A=Tt[(y-62)/27][0];
			B=Tt[(y-62)/27][1];
			m=3;
		}
		if(m>0)
		{
			if(m==1) A=(A==0)?1:0;
			if(m==2) B=(B==0)?1:0;
			X=Tt[A*2+B][2];												// 出力 X の値を変更
			dsp_s();													// 数値、スイッチ、電球の表示
		}
		return true;
	}
}
//
戻る