/*
 * @(#)Graph.java	1.9 99/08/04
 * MODIFS PYL juillet Aout 2005!!!!!!!!!!
 * www.lmm.jussieu.fr/~lagree
 + py@cccr.jussieu.fr
 *
 * This software is  designed and intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear facility.
 */
//javac guiSAGv1.java Kul.java kolor.java tridiag.java;java guiSAGv1  
//javac guiSAGv1.java Kul.java kolor.java tridiag.java; open index.html  

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

 
class GraphPanel extends Panel
    implements Runnable, MouseListener {
    guiSAGv1 graph;
	Kul kkul=new Kul();
    public double dt0=10.0;
   
	Thread relaxer;
	
	public GraphPanel (){
	}

    GraphPanel(guiSAGv1 graph) {
	this.graph = graph;
	addMouseListener(this);
    }

    void initout() {
    System.out.println("init t=" + kkul.t +" ....................... dt     =" +dt0);
	kkul.start();
	}
	
 
	 
	 	public void sauveparam()
    {   String texte = "#OK a poursuivre!";  
	    System.out.println("sauf" );
        try{
            FileOutputStream filename= new FileOutputStream("xyz.dat");
            PrintStream ffile = new PrintStream(filename);
			for (int i = kkul.n/2; i <= kkul.n/2; i++) {
			for (int j = 0; j <= kkul.n; j++) {
                 ffile.println(i*kkul.dx + " "+ j*kkul.dy + " " + kkul.T[i][j]);
				 }
				  ffile.println(" " );}
			FileOutputStream filenameF= new FileOutputStream("xy.dat");
            PrintStream ffileF = new PrintStream(filenameF);
			for (int i = 1; i < kkul.n; i++) { 
                 ffileF.println(i*kkul.dx + "  " + kkul.T[i][0] + " " + (kkul.qw[i]));
				 }  	  
        }
        catch (IOException Ex)
        {System.out.println(Ex.getMessage());}
    } 

    public void run() {
        Thread me = Thread.currentThread();
	while (relaxer == me) {
	    relax();
	    try {
		Thread.sleep(200);
	    } catch (InterruptedException e) {
		break;
	    }
	}
    }

    synchronized void relax() {
	repaint();
    }

    
    Image offscreen;
    Dimension offscreensize;
    Graphics offgraphics;
 

    public synchronized void update(Graphics g) {
	    
      Dimension d = getSize();
      if ((offscreen == null) || (d.width != offscreensize.width) || (d.height != offscreensize.height)) {
	    offscreen = createImage(d.width, d.height);
	    offscreensize = d;
	    if (offgraphics != null) {
	        offgraphics.dispose();
	    }
	    offgraphics = offscreen.getGraphics();
	    offgraphics.setFont(getFont());
	}

	offgraphics.setColor(getBackground());
	offgraphics.fillRect(0, 0, d.width, d.height);
	offgraphics.setColor(Color.black) ;
	offgraphics.drawLine(d.width/10,  d.height*9/10,(9*d.width)/10 ,  d.height*9/10);
	offgraphics.drawLine(d.width/10,  d.height*9/10,d.width/10 , d.height/10);
	offgraphics.drawLine((9*d.width)/10,  d.height*9/10,(9*d.width)/10 , d.height*1/10);
	offgraphics.drawLine(d.width/10,  d.height*1/10,(9*d.width)/10, d.height*1/10);
	offgraphics.drawString("x " , ((int)( 9.5*d.width/10)), ((int) (d.height*9.5/10)));
	offgraphics.drawString("log10 err.max DeltaN(x,y,t="+(((int)(kkul.t*1000))/1000.)+")= "+ kkul.erreur + "   ",  d.width/2, d.height/11);	
	offgraphics.drawString(" champ de perturbation R=" + kkul.qw[1] + "         ("+kkul.T[1][0]+")",  d.width/11, d.height/22);
	offgraphics.setColor(Color.red) ;
	for (int i = 1 ; i <= kkul.n ; i++) {
	//    offgraphics.drawLine(d.width/4+(i-1)*d.width/kkul.n/2, d.height*8/10-(int)(d.height*kkul.T[i-1]/2),
	//	                     d.width/4+   i* d.width/kkul.n/2, d.height*8/10-(int)(d.height*kkul.T[ i ]/2));
	}
	
	double max=0.00000000001,val;
		
	for (int i = 0 ; i <= kkul.n ; i++) {
	for (int j = 0 ; j <= kkul.n ; j++) {
	val=(kkul.T[i][j]-kkul.exacte(j*kkul.dy));
	if(max<val){max=val;}
	}}
	
	int naff=kkul.n;
	int in=1;
	if(kkul.n>64){naff=64;in=kkul.n/64;}

	for (int i = 0 ; i <= naff ; i++) {
	for (int j = 0 ; j <= naff ; j++) {
    offgraphics.setColor(kolor.code((kkul.T[in*i][in*j]-kkul.exacte(in*j*kkul.dy))/max));	 
	offgraphics.fillRect(d.width/10+(i)*d.width/naff*8/10, d.height*9/10-(int)(j*d.height*8/(naff*10)),
		                          (1+d.width*8/(naff*10)), (1+ d.height*8/(naff*10)));					 
	}}
	offgraphics.setColor(Color.black) ;
	 
	for (int i = 2 ; i < kkul.n ; i++) {
	offgraphics.drawLine(d.width/10+(i-1)*d.width/kkul.n*8/10, d.height*9/10-(int)(kkul.qw[i-1]*d.height/4),
	 d.width/10+(i)*d.width/kkul.n*8/10, d.height*9/10-(int)(kkul.qw[i]*d.height/4));}
	offgraphics.drawLine(d.width/10+(1-1)*d.width/kkul.n*8/10, d.height*9/10-(int)(1*d.height/4),
	 d.width/10+d.width*8/10, d.height*9/10-(int)(1*d.height/4));
	
	offgraphics.drawLine(d.width/10,  d.height*9/10,(9*d.width)/10 ,  d.height*9/10);
	offgraphics.drawLine(d.width/10,  d.height*9/10,d.width/10 , d.height/10);
	offgraphics.drawLine((9*d.width)/10,  d.height*9/10,(9*d.width)/10 , d.height*1/10);
	offgraphics.drawLine(d.width/10,  d.height*1/10,(9*d.width)/10, d.height*1/10);
	offgraphics.drawString("x " , ((int)( 9.5*d.width/10)), ((int) (d.height*9.5/10)));
	offgraphics.drawString("N(x,y,t="+(((int)(kkul.t*1000))/1000.)+")",  d.width/11, d.height/11);	
	g.drawImage(offscreen, 0, 0, null);
    }

    //1.1 event handling
    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e)  {}
    public void mouseDragged(MouseEvent e) {}
    public void mouseMoved(MouseEvent e)   {}
	
    public void start() {
	relaxer = new Thread(this);
	relaxer.start();
	}

    public void stop() {
	relaxer = null;
    }

}
 
public class guiSAGv1 extends Applet  implements ActionListener, ItemListener {
    
    GraphPanel panel;
    Panel controlPanel;
    
	JButton raz    = new JButton("RAZ"); 
    JButton calcul = new JButton("Calcul");
    JButton pause  = new JButton("Pause");
	JButton kit = new JButton("Quitte");
	//JSlider sliderR = new JSlider(JSlider.HORIZONTAL, 0, 250, 180);
	
    JLabel lab = new JLabel("<html><font size=\"10\" color=\"red\">gros coucou rouge</font><br><b>et ligne en italique gras<i></b></i></html>  ", JLabel.CENTER) ; 
	JTextField saizie= new JTextField ("10.0"); 
	Choice choix = new Choice();
	JLabel labo1 = new JLabel("  ", JLabel.CENTER) ; 
	JTextField saizio1= new JTextField ("1.000");
	JLabel labo2 = new JLabel("   ", JLabel.CENTER) ; 
	JTextField saizio2= new JTextField (".5000");
	JLabel labo3 = new JLabel("   ", JLabel.CENTER) ; 
	JTextField saizio3= new JTextField ("1.000");
	JLabel labo4 = new JLabel("   ", JLabel.CENTER) ; 
	JTextField saizio4= new JTextField ("7.000");

    public void init() {
		
	setLayout(new BorderLayout()); 
	panel = new GraphPanel(this);
	add("Center", panel);
	
	 
	controlPanel = new Panel();
	add("South", controlPanel);
    //controlPanel.add(sliderR);
    controlPanel.add(lab) ;   lab.setText("dt=") ;
	controlPanel.add(saizie);
	 raz.setLocation(10,10);raz.setSize(220,23); controlPanel.add(raz);  raz.addActionListener(this);
	controlPanel.add(calcul); calcul.addActionListener(this);
	controlPanel.add(pause);  pause.addActionListener(this);
	String champ="T imp....";
	controlPanel.add(labo1) ;  labo1.setText(champ) ;
    controlPanel.add(saizio1);
	controlPanel.add(labo2) ;  labo2.setText("wo=") ;
    controlPanel.add(saizio2);
	controlPanel.add(labo3) ;  labo3.setText("wm=") ;
    controlPanel.add(saizio3);
	controlPanel.add(labo4) ;  labo4.setText("L=") ;
    controlPanel.add(saizio4);
	controlPanel.add(new JLabel("CL", Label.RIGHT));       
        choix.addItemListener(this);
        controlPanel.add(choix);
      /*  choix.addItem("T(x,0)=0 T(1,y)=0 T(x,1)=0 T(0,y)=0");//0
        choix.addItem("T(x,0)=1 T(1,y)=0 T(x,1)=0 T(0,y)=0"); 
		choix.addItem("T(x,0)=0 T(1,y)=1 T(x,1)=0 T(0,y)=0"); 
        choix.addItem("T(x,0)=0 T(1,y)=0 T(x,1)=1 T(0,y)=0");//3
        choix.addItem("T(0)=1, T'(1)=0        ");
        choix.addItem("T(0)=0, T'(1)=0        ");
        choix.addItem("T(0)=sin(om t),T(1)=0  ");//6
        choix.addItem("T(0)=sin(om t),T'(1)=0 ");
        choix.addItem("T'(0)=-q, T(1)=0       ");
        choix.addItem("T'(0)=-q, T'(1)=0      ");//9
        choix.addItem("Bi T'(x,0)=T(x,0),  T(autres bords)=1");*/
        choix.addItem("N'(x,0)=hN(x,0),N(x,H)=1,N'(0,y)=0,N'(1,y)=0");
        choix.addItem("N'(x,0)=hN(x,0),N(x,H)=1,N'(0,y)=0,N(1,y)=1");
	controlPanel.add(kit);    kit.addActionListener(this);
	panel.initout();
	}

    public void destroy() {
        remove(panel);
        remove(controlPanel);
    }

    public void start() {
	razz(); 
	panel.start();
	}
	

    public void stop() {
	panel.stop();
    }
	
	
	public void razz() {
	 panel.kkul.prems();
	 	 synchronized (panel.kkul) {
		 panel.kkul.pleaseWait = true;}
	 change_it(); 
	 System.out.println("Init" );
	     }

    public void actionPerformed(ActionEvent e) {
		Object src = e.getSource();
	if (src == raz) { 
	    razz(); 
    	System.out.println("RAZ, t=" + panel.kkul.t);
	    return;
	}
	
	if (src == calcul) { 
	    String ch=saizie.getText();
		double z =Double.parseDouble(ch);  
	    System.out.println("calcul, t=" + panel.kkul.t + "................dt =" + z );
	    panel.kkul.setdt(z);  
	    change_it();
		
        synchronized (panel.kkul) {
            panel.kkul.pleaseWait = false;
            panel.kkul.notify();}
		return;
	}

	if (src == pause) {
		 synchronized (panel.kkul) {
		 panel.kkul.pleaseWait = true;}
		 panel.sauveparam(); 
	    	}
	if (src == kit) {
		  destroy(); 
		  System.out.println("kenavo"); 
		  System.exit(0) ;
	    	}		
    }

    public void itemStateChanged(ItemEvent e) {
	 change_it();
	    }
    
  
	
   public void change_it(){
   int ined=choix.getSelectedIndex(); 
	String ch=saizie.getText();
	double z =Double.parseDouble(ch); 
    ch=saizio1.getText();
	double z1 =Double.parseDouble(ch); 
	ch=saizio2.getText();
	double z2 =Double.parseDouble(ch); 
	ch=saizio3.getText();
	double z3 =Double.parseDouble(ch); 
	ch=saizio4.getText();
	double z4 =Double.parseDouble(ch); 
	System.out.println("param  " +  z1  );
	panel.kkul.wo=z2;
	panel.kkul.wm=z3;
	panel.kkul.Lx=z4;
		
	/*if (ined==0 ){panel.kkul.cl0000(); labo.setText("T imp....") ;}
	if (ined==1 ){panel.kkul.cl1000(); labo.setText("T imp....") ;}
	if (ined==2 ){panel.kkul.cl0100(); labo.setText("T imp....") ;}
	if (ined==3 ){panel.kkul.cl0010(); labo.setText("T imp....") ;}	
	if (ined==4 ){panel.kkul.cl1s(); labo.setText("T imp.sym") ;}
	if (ined==5 ){panel.kkul.cl0s(); labo.setText("T imp.sym") ;}
	if (ined==6 ){panel.kkul.omega=z;panel.kkul.clt0(); labo.setText("omega=   ");}
	if (ined==7 ){panel.kkul.omega=z;panel.kkul.clts(); labo.setText("omega=   ");}
	if (ined==8 ){panel.kkul.q=z;    panel.kkul.clq1(); labo.setText("q=     ") ;}
	if (ined==9 ){panel.kkul.q=z;    panel.kkul.clqs(); labo.setText("q=     ") ;}
	if (ined==10){panel.kkul.Bi=z;   panel.kkul.clB1(); labo.setText("Bi=    ") ;}*/
	if (ined==1){panel.kkul.h=z1;   panel.kkul.clB();   labo1.setText("h=") ;}
	if (ined==0){panel.kkul.h=z1;   panel.kkul.clBqs(); labo1.setText("h=") ;}
   }
   
	
///////////////////////////////////////////////////////////
	public static void main(String args[]) {
	JFrame f = new JFrame("guiSAG par PYL");
	guiSAGv1 guiSAG = new guiSAGv1();
//	System.out.println(args[]);

	guiSAG.init();
	guiSAG.start();
	

	f.getContentPane().add(guiSAG);
	f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE ) ;
	f.setSize(1124,700);
	f.setLocation(10, 10);
	f.show();
    }

    public String getAppletInfo() {
        return "Calcul interactif par PYL. \n 'java guiGraph' \nou applet.";
    }

}