import java.util.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class ConvertTemp extends JFrame {

    public ConvertTemp(String[] text, double[][] constante) {
	// operation de fermeture 
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setResizable(false);
	
	// extraire les dimensions
	Toolkit kit=Toolkit.getDefaultToolkit();
	Dimension screenSize = kit.getScreenSize();
	
	// centrer l'image
	setLocation(screenSize.width/4,screenSize.height/4);

	// ajout des champs textes
	SujetTempCelsius sujet = new SujetTempCelsius(); 
	GridLayout grid = new GridLayout(text.length,2);
	setLayout(grid);

	for (int i=0; i<text.length; i++) {
	    add(new JLabel(text[i]));
	    VueTemp vue = new VueTemp(constante[i][0],constante[i][1],sujet);
	    add(vue);
	    vue.getDocument().addDocumentListener(vue);
	    sujet.ajoutObservateur(vue);
	}

      // rend visible le cadre
	pack();
	setVisible(true);

    }


    public static void main(String[] args){
	String[] identTemp = {"Celsius", "Farenheit","Kelvin", "Rankine"};
	double[][] constante = {{1,0}, {1.8,-32*1.8}, {1,-273.15}, {1.8,-273.15*1.8}};

	ConvertTemp cadre = new ConvertTemp(identTemp,constante);
    }

}

class SujetTempCelsius {
    
    public double val = 0;

    public void set(double v) {
	val = v;
	signaler();
    }

    ArrayList<Observateur> listeObservateur = new ArrayList<Observateur>();

    public void ajoutObservateur(Observateur obs) {
	listeObservateur.add(obs);
    }

    public void signaler() {
	for (int i=0; i<listeObservateur.size(); i++)
	    listeObservateur.get(i).miseAJour(val);
    }
}

interface Observateur {
    public void miseAJour(double val);
}

class VueTemp extends JTextField implements Observateur, DocumentListener {

    double A;
    double B;
    SujetTempCelsius sujet;
    boolean libre = true;

    public VueTemp(double A, double B, SujetTempCelsius sujet) {
	super(5);
	this.A = A;
	this.B = B;
	this.sujet = sujet;

	setHorizontalAlignment(JTextField.RIGHT);
    }

    /* aspect observateur */

    public void miseAJour(double celsius) {
	if (libre) {
	    getDocument().removeDocumentListener(this);
	    double temp = (celsius -B)/A;
	    setText(Math.round(temp) + "");
	    getDocument().addDocumentListener(this);
	}
    }

    /* aspect documentListener */
    private void effetModification() {
	libre = false;
	try {
	    int temp = Integer.parseInt(getText().trim());
	    double celsius = A*temp+B;
	    sujet.set(celsius);
	}	    
	catch (Exception ef) {}
	libre = true;
    }
    
    public void changedUpdate(DocumentEvent e) {
	effetModification();
    }
    
    public void insertUpdate(DocumentEvent e) {
	effetModification();
    }

    public void removeUpdate(DocumentEvent e) {
	effetModification();
    }
}