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

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

public class diyot1 extends Applet
{
	//diyot1 apleti ilk yüklendiğinde diyot devresi resminin ve kaydırma menüsünün
	//birer örnekleri oluşturulur ve ekrana yerleştirilir.
	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));
		Image resim=getImage(getCodeBase(),"diyot1.jpg");
		Panel kontrol = new Panel();
		Canvas diyotResim = new DiyotResim(resim);
	//	Canvas akimEgrisi = new AkimEgrisi(10E-13,0.66);
		Slider kaydirac = new Slider(6300,10,40,6400);	
		
		kontrol.setLayout(new BorderLayout());
	//	kontrol.add(akimEgrisi,"North");
		kontrol.add(diyotResim,"Center");
		kontrol.add(kaydirac,"South");
		
		setLayout(new FlowLayout(FlowLayout.LEFT));
		add(kontrol);
	}	
	
	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);
	}
	
}

// diyot devresi resminin hazırlanmasını sağlayan sınıf
// diyot devresi resmi 3Boyut görünüm etkisi kazandırılmış
// zemin üzerine yerleştirilir.
class DiyotResim extends Canvas{
	Image resim;
	
	public DiyotResim(Image resim){
		this.resim = resim;
	}
	
	public void paint(Graphics g){
		setBackground(Color.lightGray);
		setForeground(Color.lightGray);
		g.draw3DRect(2,2,317,176,true);
		g.drawImage(resim,4,4,this);
	}
	
	public Dimension getPreferredSize(){
		return new Dimension(326,183);
	}
}
/*
class AkimEgrisi extends Canvas{
	final double Vtermal = 0.027;
//	int n = 1;
	double Is, V, I;
	double Idizi[] = new double[16];
	double Vdizi[] = new double[16];
	
	public AkimEgrisi(double Is, double V){
		this.Is	= Is;
		this.V	= V;
		
		if(V >= 0.5) n = 1;
		else n = 2;
		
		I = Is*(Math.exp(V/(n*Vtermal)) - 1);
		Vdizi[0] = 0.55;
		
		for(int i=1;i<16;i++){
			Vdizi[i] = Vdizi[0] + 0.01;
		}
		for(int i=0;i<16;i++){
			Idizi[i] = (Is*(Math.exp(Vdizi[i]/(n*Vtermal)) - 1))*10000;
		}
		
		for(int i=0;i<16;i++){
			Vdizi[i]=Vdizi[i]*1000;
		}
	}
	
	public void paint(Graphics g){
	//	setBackground(Color.blue);
		for(int i=0;i<15;i++){ 
			g.drawLine(20 + (int)Vdizi[i],50-(int)Idizi[i],20 + (int)Vdizi[i+1],50-(int)Idizi[i+1]);
		}
	}
	
	public Dimension getPreferredSize(){
		return new Dimension(100,100);
	}
}*/
//kaydırma menüsünün üzerine yerleştirileceği 3Boyut görünüm
//etkisi kazandırılmış panel oluşturuluyor.
class CerceveliPanel extends Panel{
	public Insets getInsets(){
		return new Insets(2,2,2,2);
	}
	
	public Dimension getPreferredSize(){
		return new Dimension(200,150);
	}
	
	public void paint(Graphics g){
		setBackground(Color.lightGray);
		Dimension boyut = getSize();
		g.setColor(Color.black);
		g.drawRect(0,0,boyut.width-1,boyut.height-1);
		
		g.setColor(Color.lightGray);
		g.draw3DRect(1,1,boyut.width-3,boyut.height-3,true);
	}
}

//apletin en önemli kısmı. Burada kaydırma çubuğunun hareketi doğrultusunda
//matematiksel eşitliklere göre gerekli değer değişiklikleri elde ediliyor.
class Slider extends CerceveliPanel implements Adjustable{
	int deger,satir, dc_direnc, ac_direnc;
	double devre_akimi, termal=0.026;
	String devre_akimi_stringi, devre_akimi_dizisi = "";
	String dc_direnc_stringi, ac_direnc_stringi, tilde="~";
	
	Scrollbar scrollbar;

	Label direncDegeri, direncBaslik, diyotGerilimDegeri, diyotGerilimBaslik,
		akimDegeri, akimBaslik, dcDiyotDirenci, dcDirencBaslik,
		acDiyotDirenci, acDirencBaslik;
	
	// devrenin analizinde kullanıcıya görsel izleme olanağı sağlayacak olan
	// devre değerlerinin bastırılması için 5 ayrı panel oluşturuluyor.
	Panel panel1 = new Panel();
	Panel panel2 = new Panel();
	Panel panel3 = new Panel();
	Panel panel4 = new Panel();
	Panel panel5 = new Panel();
	
	//bu 5 paneli tek bir bütün olarak bir yerde toplamak üzere 
	//bunları taşıyacak ortak bir panel oluşturuluyor.
	Panel hepsi	 = new Panel();
	
	//tüm veri işlemlerinin yapıldığı ve ana Slider sınıfının
	//iskeletini teşkil eden kısım. sınıf konstrüktörünün oluşturulmasını sağlayan gövde.
	public Slider(int ilkDeger,int visible, int min, int max){
		String ilkDegerStringi=Integer.toString(ilkDeger);
		
		direncBaslik		= new Label("Direnç (ohm) :",Label.LEFT);
		diyotGerilimBaslik	= new Label("Diyot (Volt) :",Label.RIGHT);
		akimBaslik			= new Label("Akım (mA)    :",Label.LEFT);
		dcDirencBaslik		= new Label("RD (ohm)     :",Label.RIGHT);
		acDirencBaslik		= new Label("rd (ohm)       :",Label.LEFT);
		
		direncBaslik.setForeground		(Color.red);
		diyotGerilimBaslik.setForeground(Color.red);
		akimBaslik.setForeground		(Color.red);
		dcDirencBaslik.setForeground	(Color.red);
		acDirencBaslik.setForeground	(Color.red);
		
		direncDegeri		= new Label(ilkDegerStringi);
		diyotGerilimDegeri	= new Label("0.55");
		akimDegeri			= new Label("0.706");
		dcDiyotDirenci		= new Label("779");
		acDiyotDirenci		= new Label("~36 ");
		
		direncDegeri.setFont		(new Font("TimesRoman",Font.BOLD,16));
		diyotGerilimDegeri.setFont	(new Font("TimesRoman",Font.BOLD,16));
		akimDegeri.setFont			(new Font("TimesRoman",Font.BOLD,16));
		dcDiyotDirenci.setFont		(new Font("TimesRoman",Font.BOLD,16));
		acDiyotDirenci.setFont		(new Font("TimesRoman",Font.BOLD,16));
		
		scrollbar=new Scrollbar(Scrollbar.HORIZONTAL,ilkDeger,visible,min,max);
		
		panel1.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel2.setLayout(new FlowLayout(FlowLayout.RIGHT));
		panel3.setLayout(new FlowLayout(FlowLayout.LEFT));
		panel4.setLayout(new FlowLayout(FlowLayout.RIGHT));
		panel5.setLayout(new FlowLayout(FlowLayout.LEFT));
		hepsi.setLayout (new GridLayout(3,2));
		
		panel1.add(direncBaslik);
		panel1.add(direncDegeri);
		
		panel2.add(diyotGerilimBaslik);
		panel2.add(diyotGerilimDegeri);
		
		panel3.add(akimBaslik);
		panel3.add(akimDegeri);
				
		panel4.add(dcDirencBaslik);
		panel4.add(dcDiyotDirenci);
				
		panel5.add(acDirencBaslik);
		panel5.add(acDiyotDirenci);
				
		hepsi.add(panel1);
		hepsi.add(panel2);
		hepsi.add(panel3);
		hepsi.add(panel4);
		hepsi.add(panel5);
		
		setLayout(new BorderLayout());
		setBackground(Color.lightGray);
		
		add(hepsi,"North");	
		add(scrollbar,"Center");
		
		//kaydırma çubuğunun(scrollbar) hareketine göre matematiksel işlemler
		//neticesinde 5 farklı eşitliğin sonuçlarının hesaplanması ve hesaplanan
		//bu değerlerin döndürülmesi. bu şekilde sürekli olarak hesaplanan değerler
		//anında ekrana etiketler aracılığıyla yansıtılır.
		scrollbar.addAdjustmentListener(new AdjustmentListener(){
			public void adjustmentValueChanged(AdjustmentEvent olay){
				deger = scrollbar.getValue();
				direncDegeri.setText(Integer.toString(deger));
				direncDegeri.setFont(new Font("TimesRoman",Font.BOLD,16));
				
				// aşağıdaki bu şart ifadesinin içinde gerçekleştirilen hesaplama
				//yöntemleri diğer şart ifadeleri için de aynıdır.
				if (deger > 4200 && deger <= 6300){
				
					diyotGerilimDegeri.setText("0.55");
					
					devre_akimi = ((5 - 0.55)/deger);
				
					dc_direnc = (int)(0.55/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					//'devre_akimi' değişkeni double bir değer olduğundan
					//ekrana yazdırılması neticesinde ekrana sığmayacaktır.
					//zaten noktadan sonra 2.hanesinden sonrasınıda bilmeye gerek yoktur.
					//bu nedenle öncelikle string değere dönüştürülmüş olan akim_degeri
					//değişkeninin 3 hanelik kısmını ekranda görüntülemek için 4 turlu bir
					//('nokta' içinde bir döngü) döngü içerisinde ekrana yazdırılacak kısım
					//elde edilir.
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
					
				}
				else if(deger > 2800 && deger<=4200 ){
					
					diyotGerilimDegeri.setText("0.56");
					
					devre_akimi = ((5 - 0.56)/deger);
					
					dc_direnc = (int)(0.55/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
					
				}
				else if(deger > 600 && deger<=2800 ){
				
					diyotGerilimDegeri.setText("0.57");
					
					devre_akimi = ((5 - 0.57)/deger);
				
					dc_direnc = (int)(0.57/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
				
				}
				else if(deger > 400 && deger<=600 ){
					
					diyotGerilimDegeri.setText("0.61");
					
					devre_akimi = ((5 - 0.61)/deger);
					
					dc_direnc = (int)(0.61/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
				}
				else if(deger > 280 && deger<=400 ){
					
					diyotGerilimDegeri.setText("0.62");
					
					devre_akimi = ((5 - 0.62)/deger);
				
					dc_direnc = (int)(0.62/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
				}
				else if(deger > 80 && deger<=280 ){
					
					diyotGerilimDegeri.setText("0.63");
					
					devre_akimi = ((5 - 0.63)/deger);
					
					dc_direnc = (int)(0.63/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
				}
				else if(deger > 60 && deger<=80 ){
					
					diyotGerilimDegeri.setText("0.66");
					
					devre_akimi = ((5 - 0.66)/deger);
				
					dc_direnc = (int)(0.66/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
				}
				else if(deger > 40 && deger<=60 ){
					
					diyotGerilimDegeri.setText("0.67");
					
					devre_akimi = ((5 - 0.67)/deger);
					
					dc_direnc = (int)(0.67/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Double.toString(dc_direnc);
					ac_direnc_stringi	= Double.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
			
				}
				else{
					diyotGerilimDegeri.setText("0.68");
					
					devre_akimi = ((5 - 0.68)/deger);
					dc_direnc = (int)(0.68/devre_akimi);
					ac_direnc = (int)(termal/devre_akimi);
					devre_akimi_stringi	= Double.toString(devre_akimi*1000);
					dc_direnc_stringi	= Integer.toString(dc_direnc);
					ac_direnc_stringi	= Integer.toString(ac_direnc);
					
					for(int i=0;i<4;++i){
						devre_akimi_dizisi	+= devre_akimi_stringi.charAt(i);}
					
					akimDegeri.setText(devre_akimi_dizisi);
					dcDiyotDirenci.setText(dc_direnc_stringi);
					acDiyotDirenci.setText(tilde+ac_direnc_stringi);
					
				}
				devre_akimi_dizisi="";
			}
		});
		
	scrollbar.setBlockIncrement(10);
	scrollbar.setUnitIncrement(10);
	scrollbar.setMaximum(6400);
	scrollbar.setMinimum(40);
	scrollbar.setLineIncrement(10);
	scrollbar.setOrientation(0);
	scrollbar.setVisibleAmount(100);
	}
	
	//aşağıdaki sınıf yöntemleri Adjustable olarak ayarlanmış olan Slider sınıfı
	//için gereklidir. Ancak bu örnek aplet için aşağıdaki metotların bir etkisi
	//söz konusu değildir. Diğer bir ifadeyle bu aplette aşağıdaki metodlara değer
	//gönderilmemekte ve bu nedenlede herhangi bir işlem yapılmamaktadır.
	public void addAdjustmentListener(AdjustmentListener l) {
		scrollbar.addAdjustmentListener(l);
	}
	public void removeAdjustmentListener(AdjustmentListener l) {
		scrollbar.removeAdjustmentListener(l);
	}
	public int getOrientation() {
		return scrollbar.getOrientation();	
	}
	public void setOrientation(int orient) {
		scrollbar.setOrientation(orient);	
	}
	public int getValue() {
		return scrollbar.getValue();
	}
	public int getVisibleAmount() {
		return scrollbar.getVisibleAmount();
	}
	public int getMinimum() {
		return scrollbar.getMinimum();
	}
	public int getMaximum() {
		return scrollbar.getMaximum();
	}
	
	public int getUnitIncrement() {
		return scrollbar.getUnitIncrement();
	}
	public int getBlockIncrement() {
		return scrollbar.getBlockIncrement();
	}
	public void setValue(int value) {
		scrollbar.setValue(value);
		direncDegeri.setText(Integer.toString(value));
	}
	public void setVisibleAmount(int value) {
		scrollbar.setVisibleAmount(value);
	}
	public void setMinimum(int min) {
		scrollbar.setMinimum(min);
	}
	public void setMaximum(int max) {
		scrollbar.setMaximum(max);
	}
	public void setUnitIncrement(int inc) {
		scrollbar.setUnitIncrement(10);
	}
	public void setBlockIncrement(int inc) {
		scrollbar.setBlockIncrement(10);
	}
	public void setLineIncrement(int inc){
		scrollbar.setLineIncrement(10);
	}
}