import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.net.URL;

//Author:H.Hakan GENÇ - 2001-2002 - Turkiye
//GSM: +905052610452, E-mail:hasanhakangenc@hotmail.com

public class diyotanahtar extends Applet implements Runnable{
	
	Image winBellek;
	Graphics gBellek;
	
	int y1=10,y2=50, atom =10, direnc =60, x1 =220, son =250, fark =50, bas =50, diyot=40;
	int orta = (son-bas)/2, x=x1-atom/2, y=y1, 
		diyot1_x=(x1-atom/2), diyot1_y=y1,
		diyot2_x=(x1-atom/2), diyot2_y=y1,
		diyot3_x=(x1-atom/2), diyot3_y=y1;
	
	boolean akis = true, A=true, B=true, C=true, diyot1_akis=false, diyot2_akis=false, diyot3_akis=false;
	
	Thread kosucu;
	String gerilim="0.7V";
	String atomrenk = "#ff0000";
	String voltaj_renk  = "#ff0000";
	String voltajA_renk = "#000000";
	String voltajB_renk = "#000000";
	String voltajC_renk = "#000000";
	String zeminRenk, onRenk;

	public void init(){
		zeminRenk = getParameter("zeminrenk");
		onRenk = getParameter("onrenk");
		
		if ((zeminRenk == null) ||
			(onRenk == null))
		{
			zeminRenk = "f0f0f0";
			onRenk = "000000";
		}
		
	//	setBackground(stringToColor(zeminRenk));
		setForeground(stringToColor(onRenk));
		winBellek = createImage(this.getSize().width,this.getSize().height);
		gBellek = winBellek.getGraphics();
		
		addMouseListener(new MouseAdapter(){
			public void mousePressed(MouseEvent olay){
				if(olay.getX()>=(bas-atom) && olay.getX()<=bas 
					&& olay.getY()>=son-2*fark-atom/2 && olay.getY() <=son-2*fark+atom/2){
					if(A){
						A = false;
						diyot1_x=x1-atom/2;	
						diyot1_y=y1;
						voltajA_renk="#ff0000";
					}
					else {A = true;
						voltajA_renk="#000000";
					}
						repaint();
				}
				else if(olay.getX()>=(bas-atom) && olay.getX()<=bas 
						 && olay.getY()>=son-fark-atom/2 && olay.getY() <=son-fark+atom/2){
					if(B){
						B = false;
						diyot2_x=x1-atom/2;
						diyot2_y=y1;
						voltajB_renk="#ff0000";
					}
					else{B = true;
						voltajB_renk="#000000";
					}
					repaint();
				}
				else if(olay.getX()>=(bas-atom) && olay.getX()<=bas 
						&& olay.getY()>=son-atom/2 && olay.getY()<=son+atom/2){
					if(C){
						C=false;
						diyot3_x=x1-atom/2;
						diyot3_y=y1;
						voltajC_renk="#ff0000";
					}
					else{C = true;
						voltajC_renk="#000000";
					}
					repaint();
				}
			}
			
		}) ;
		addMouseMotionListener(new MouseMotionListener(){
			public void mouseMoved(MouseEvent olay){
				if((olay.getX()>=(bas-atom) && olay.getX()<=bas 
				   && olay.getY()>=son-2*fark-atom/2 && olay.getY() <=son-2*fark+atom/2)
				   || (olay.getX()>=(bas-atom) && olay.getX()<=bas 
				   && olay.getY()>=son-fark-atom/2 && olay.getY() <=son-fark+atom/2)
				   || (olay.getX()>=(bas-atom) && olay.getX()<=bas
					&& olay.getY()>=son-atom/2 && olay.getY() <= son+atom/2)){
					
					setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
				}
				else setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
			}
			public void mouseDragged(MouseEvent olay){
			}
		});
	}
	
	private Color stringToColor(String paramDeger)
	{
		int red;
		int green;
		int blue;

		red = (Integer.decode("0x" + paramDeger.substring(0,2))).intValue();
		green = (Integer.decode("0x" + paramDeger.substring(2,4))).intValue();
		blue = (Integer.decode("0x" + paramDeger.substring(4,6))).intValue();

		return new Color(red,green,blue);
	}
	
	public void start(){
		if (kosucu==null){	
			kosucu = new Thread(this);
			kosucu.start();
		}
	}
	
	public void stop(){
		if(kosucu != null){
			kosucu.stop();
			kosucu = null;
			
		}
	}
	
	public void run(){
		while(akis){
			if(A && diyot1_y<son-2*fark-atom/2){
				diyot1_y += 2;
			}
			if(A && diyot1_y>=son-2*fark-atom/2){
				diyot1_x -= 2;
			}
			if(B && diyot2_y<son-fark-atom/2){
				diyot2_y += 2;
			}
			if(B && diyot2_y>=son-fark-atom/2){
				diyot2_x -=2;
			}
			if(C && diyot3_y<son-atom/2){
				diyot3_y += 2;
			}
			if(C && diyot3_y>=son-atom/2){
				diyot3_x -= 2;
			}
			if(diyot1_x <= bas-atom){
				diyot1_x = x1-atom/2;
				diyot1_y = y1;
			}
			if(diyot2_x <= bas-atom){
				diyot2_x = x1-atom/2;
				diyot2_y = y1;
			}
			if(diyot3_x <= bas-atom){
				diyot3_x = x1 -atom/2;
				diyot3_y = y1;
			}
			repaint();
			try{kosucu.sleep(75);}
			catch(InterruptedException e){}
		}
	}
	
	
	public void paint(Graphics g){
		gBellek.setColor(stringToColor(zeminRenk));
		gBellek.fillRect(0,0,this.getSize().width,this.getSize().height);
		
		gBellek.setFont(new Font("Times New Roman",Font.PLAIN,12));
		gBellek.setColor(Color.decode("#007846"));
		gBellek.drawString("A",20,son-2*fark);
		gBellek.drawString("B",20,son-fark);
		gBellek.drawString("C",20,son);
		gBellek.setColor(Color.decode(voltaj_renk));
		gBellek.drawOval(x1-atom/2,y1,atom,atom);
		gBellek.setColor(Color.decode(voltajA_renk));
		gBellek.drawOval(bas-atom,son-2*fark-atom/2,atom,atom);
		gBellek.setColor(Color.decode(voltajB_renk));
		gBellek.drawOval(bas-atom,son-fark-atom/2,atom,atom);
		gBellek.setColor(Color.decode(voltajC_renk));
		gBellek.drawOval(bas-atom,son-atom/2,atom,atom);
		
		
		gBellek.setColor(Color.red);
		gBellek.drawOval(20,300,atom,atom);
		gBellek.drawString("5V",18,290);
		gBellek.setColor(Color.black);
		gBellek.drawOval(50,300,atom,atom);
		gBellek.drawString("0V",48,290);
		
		gBellek.setColor(Color.black);
		gBellek.drawLine(x1,y1+10,x1,y2);
		gBellek.drawLine(x1,direnc+y2,x1,son);
		
		gBellek.drawLine(bas,son-2*fark,x1,son-2*fark);
		gBellek.drawLine(bas,son-fark,x1+30,son-fark);
		gBellek.drawLine(bas,son,x1,son);
		gBellek.fillOval(x1-atom/2,son-2*fark-atom/2,atom,atom);
		gBellek.fillOval(x1-atom/2,son-fark-atom/2,atom,atom);
		gBellek.drawOval(x1+30,son-fark-atom/2,atom,atom);
		
		// direnç çiziliyor
		gBellek.drawLine(x1,y2,x1+10,y2+5);
		gBellek.drawLine(x1+10,y2+5,x1-10,y2+15);
		gBellek.drawLine(x1-10,y2+15,x1+10,y2+25);
		gBellek.drawLine(x1+10,y2+25,x1-10,y2+35);
		gBellek.drawLine(x1-10,y2+35,x1+10,y2+45);
		gBellek.drawLine(x1+10,y2+45,x1-10,y2+55);
		gBellek.drawLine(x1-10,y2+55,x1,y2+60);
		
		//diyotlar çiziliyor
		gBellek.drawLine(orta+diyot/2,son-2*fark+diyot/2,orta+diyot/2,son-2*fark-diyot/2);
		gBellek.drawLine(orta+diyot/2,son-fark+diyot/2,orta+diyot/2,son-fark-diyot/2);
		gBellek.drawLine(orta+diyot/2,son+diyot/2,orta+diyot/2,son-diyot/2);
		
		gBellek.drawLine(orta+diyot/2,son-2*fark,orta+3*diyot/2,son-2*fark-diyot/2);
		gBellek.drawLine(orta+diyot/2,son-fark,orta+3*diyot/2,son-fark-diyot/2);
		gBellek.drawLine(orta+diyot/2,son,orta+3*diyot/2,son-diyot/2);
		
		gBellek.drawLine(orta+diyot/2,son-2*fark,orta+3*diyot/2,son-2*fark+diyot/2);
		gBellek.drawLine(orta+diyot/2,son-fark,orta+3*diyot/2,son-fark+diyot/2);
		gBellek.drawLine(orta+diyot/2,son,orta+3*diyot/2,son+diyot/2);
		
		gBellek.drawLine(orta+3*diyot/2,son-2*fark+diyot/2,orta+3*diyot/2,son-2*fark-diyot/2);
		gBellek.drawLine(orta+3*diyot/2,son-fark+diyot/2,orta+3*diyot/2,son-fark-diyot/2);
		gBellek.drawLine(orta+3*diyot/2,son+diyot/2,orta+3*diyot/2,son-diyot/2);
		
		for(int i=0;i<diyot;i++){
			gBellek.drawLine(orta+diyot/2+i,son-2*fark+i/2,orta+diyot/2+i,son-2*fark-i/2);
			gBellek.drawLine(orta+diyot/2+i,son-fark+i/2,orta+diyot/2+i,son-fark-i/2);
			gBellek.drawLine(orta+diyot/2+i,son+i/2,orta+diyot/2+i,son-i/2);
		}
		
		//toprak işareti ve çıkış gerilimi ölçeği çiziliyor
		gBellek.drawLine(x1+31,son+37,x1+45,son+37);
		gBellek.drawLine(x1+33,son+40,x1+43,son+40);
		gBellek.drawLine(x1+35,son+43,x1+41,son+43);
		gBellek.drawLine(x1+38,son+27,x1+38,son-fark+10);
		
		//çıkış gerilimi ölçeğinin okları çiziliyor
		gBellek.drawLine(x1+38,son-fark+10,x1+35,son-fark+15);
		gBellek.drawLine(x1+38,son-fark+10,x1+41,son-fark+15);
		gBellek.drawLine(x1+38,son+27,x1+35,son+22);
		gBellek.drawLine(x1+38,son+27,x1+41,son+22);
		
		//çıkış gerilimi yazdırılıyor
		if(!akis) gerilim="0V";
		else if(akis && (A || B || C)) gerilim="0.7V";
		else gerilim="5V";
		gBellek.drawString("Vout= ",x1+50,son+10);
		gBellek.drawString(gerilim,x1+80,son+10);
		
		if(!akis) atomrenk="#000000";
		else atomrenk = "#ff0000";
		gBellek.setColor(Color.decode(atomrenk));
		if(A && akis) gBellek.fillOval(diyot1_x,diyot1_y,atom,atom);
		if(B && akis) gBellek.fillOval(diyot2_x,diyot2_y,atom,atom);
		if(C && akis) gBellek.fillOval(diyot3_x,diyot3_y,atom,atom);
		
		//imza
		gBellek.setFont(new Font("Courier",Font.ITALIC,14));
		gBellek.setColor(Color.red);
		gBellek.drawString("H.G.",0,20);
		
		g.drawImage(winBellek,0,0,this);
	}
	
	public void update(Graphics g){
		paint(g);
	}
}