/*
 * @(#)ArcTest.java	1.5 98/06/29
  par PYL Dec 2007    -- oct 08
 
 javac MurTest.java mur_sol.java kolor.java; jar cf MurTest.jar *.class;   open index.html 
 javac MurTest.java mur_sol.java kolor.java; java MurTest
*/

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;                      // Import input-output Library 


public class MurTest extends Applet {
    AilControls controls ;   // The controls 
    AilCanvas canvas;       // The drawing area
    public void init() {
	setLayout(new BorderLayout());
	canvas = new AilCanvas();
	add("Center", canvas);
	add("South", controls = new AilControls(canvas));
    }
   
    public void destroy() {
        remove(controls);
        remove(canvas);
    }

    public void start() {
	controls.setEnabled(true);
    }

    public void stop() {
	controls.setEnabled(false);
    }

    public void processEvent(AWTEvent e) {
        if (e.getID() == Event.WINDOW_DESTROY) {
            System.exit(0);
        }
    }

    public static void main(String args[]) {
	Frame f = new Frame("MurTest");
	MurTest	murTest = new MurTest();

	murTest.init();
	murTest.start();
	
	f.add("Center", murTest);
	f.setSize(1024+256, 480);
	f.show();
    }

    public String getAppletInfo() {
        return "Calcul de mur interactif test par PYL. Can be run \neither as a standalone application by typing 'java MurTest' \nor as an applet in the AppletViewer.";
    }
}

class AilCanvas extends Canvas   {
	double hg,k1=1,e1=0.01,k2=1,e2=0.01,k3=1,e3=0.01,hd,Tg=0,Td=0;
	double      x[],theta[],Bi;
    Font	font;
 
	public void sauveparam()
    {   String texte = "#OK a poursuivre!";  
        try{
            FileOutputStream filename= new FileOutputStream("Mur.dat");
            PrintStream ffile = new PrintStream(filename);
			for (int i = 0; i <= getBounds().width; i++) {
                 ffile.println(x[i] + " " + theta[i]);}
        }
        catch (IOException Ex)
        {
            System.out.println(Ex.getMessage());
        }
    } 
    
    
public void dro(Graphics g, double x1,double y1,double x2,double y2){
  int i1,i2,j1,j2;

  int rr,gg,bb,wwidth,x0width;
  kolor kolorK;
  
  kolorK = new kolor();
  Rectangle r = getBounds();
  wwidth=6*r.width/10;
  x0width=2*r.width/10;
  i1 = x0width+(int)(r.width*x1)*6/10;
  i2 = x0width+(int)(r.width*x2)*6/10;
  j1 = (int)(r.height/2 - (r.height/2./2)*y1);
  j2 = (int)(r.height/2 - (r.height/2./2)*y2); 
  g.drawLine(i1,j1,i2,j2);
}
    public void paint(Graphics g) {
	Rectangle r = getBounds();
	  int  wwidth,x0width;
      wwidth=6*r.width/10;
      x0width=2*r.width/10;
	int hlines = r.height / 10;
	int vlines = r.width / 10;

    x =new double[r.width+1];
	theta=new double[r.width+1];


  //trace grille
	g.setColor(Color.cyan);
	for (int i = 0; i <= hlines; i++) {
	    g.drawLine(0, i * 10, r.width, i * 10);
	}
	for (int i = 0; i <= vlines-1; i++) {
	    g.drawLine(i * 10, 0, i * 10, r.height);
	}
	 
 
	
 
	x[0]=0;theta[0]=1;
 
	for (int i = 1; i <= wwidth; i++) { 
	x[i]=i*1./wwidth;
 
	theta[i]=mur_sol.ture(x[i],Tg,hg,k1,e1,k2,e2,k3,e3,hd,Td);	 
    
	// courbe solution
	g.setColor(Color.black);
	g.setFont(font);
	dro(g, x[i-1],theta[i-1],x[i],theta[i]); 
	//System.out.println("OK "+ (i+x0width)+ " " + x[i]);

	g.setColor(kolor.code(theta[i]));	
	  
	g.drawLine(x0width+i,r.height -64,x0width+i,32);
	}
	System.out.println("OK");
	g.setColor(Color.black);
	g.drawLine(0, r.height/2  , r.width, r.height/2  );
	//g.drawLine(0, r.height  , r.width, r.height  );
   
    int ii1=(int)(wwidth*e1/(e1+e2+e3));
    int ii2=(int)(wwidth*(e1+e2)/(e1+e2+e3));
    g.drawLine(x0width+ii1,r.height -64,x0width+ii1,32); 
    g.drawLine(x0width+ii2,r.height -64,x0width+ii2,32); 
 
	int sx = 10;
	int sy = r.height - 32;
	g.drawString("Distribution de Temperature dans le Mur,", r.width/3, 16);
	g.drawString(" Temperature donnee /Diffusion / diffusion / diffusion / Temperature donnee", r.width/3, sy-14);
	g.drawString("T(x)",x0width,16);
	g.drawString("x",x0width+wwidth+16,r.height/2-16);
	g.drawString("epaisseur totale = " + (e1+e2+e3), r.width/3, sy);
//	g.drawString("Rtotale = " + hg, sx, sy + 14);
//	g.drawString("Q= " + k + " W", sx+80, sy + 14);
//	g.drawString("L = " + L, sx+160, sy + 14);
//	g.drawString("a = " + a, sx+240, sy + 14);
//	g.drawString("coeff Žchange gauche, mur num. 1, k1 et e1, mur num.2 k2 et e2, mur numŽro 3 k2 et e2  "
//	 + a, sx, sy + 14+17);
    sauveparam();
    }

    public void redraw(double pTg,
    double pk1, double pe1,double pk2, double pe2, double pk3, double pe3,
    double pTd) {
    this.Tg =pTg;	this.Td = pTd;
	this.k1 =pk1;	this.e1 = pe1;	
	this.k2 =pk2;	this.e2 = pe2;
	this.k3 =pk3;	this.e3 = pe3;
	repaint();
    }
}

//////////////////////////////////////////


//////////////////////////////////////////


class AilControls extends Panel
                  implements ActionListener {
    TextField Tg,Td,hg,hd,k1,e1,k2,e2,k3,e3;
    TextField h,k;
	TextField L;
	TextField a; 
    AilCanvas canvas;

    public AilControls(AilCanvas canvas) {
	Button b = null;

	this.canvas = canvas; 
	add(new Label("Tg="));
	add(Tg = new TextField(Double.toString(20), 5)); 
	add(new Label(" k1="));
	add(k1 = new TextField("1", 5));
	add(new Label(" e1="));
	add(e1 = new TextField(".01", 5));
	add(new Label(" k2="));
	add(k2 = new TextField("1", 5));
	add(new Label(" e2="));
	add(e2 = new TextField(".01", 5));
	add(new Label(" k3="));
	add(k3 = new TextField("1", 5));
	add(new Label(" e3="));
	add(e3 = new TextField(".01", 5)); 
	add(new Label("Td="));
	add(Td = new TextField(Double.toString(-10), 5));
	
 
	
	b = new Button("Calcul");
	b.addActionListener(this);
	add(b);
    }

    public void actionPerformed(ActionEvent ev) {
	String label = ev.getActionCommand();

	canvas.redraw(
       Double.parseDouble(Tg.getText().trim()),
 	   Double.parseDouble(k1.getText().trim()),
       Double.parseDouble(e1.getText().trim()),
       Double.parseDouble(k2.getText().trim()),
       Double.parseDouble(e2.getText().trim()),
       Double.parseDouble(k3.getText().trim()),
       Double.parseDouble(e3.getText().trim()),
       Double.parseDouble(Td.getText().trim()) );
    }
}