import java.awt.event.*; 
import java.awt.*;
import java.applet.*;



public class Calcuprj extends Applet {
	
	
	
	
	Desplegar mostrar ;
	Panel teclado;
	Frame f;
		Button b1;
		Button b2;
		Button b3;
		Button b4;
		Button b5;
		Button b6;
		Button b7;
		Button b8;
		Button b9;
		Button b10;
		Button b11;
		Button b12;
		Button b13;
		Button b14;
		Button b15;
		Button b16;
		Button b17;
		Button b18;

	

	private void iniTeclado(){
		teclado.add(b1= new Button("7"));
		teclado.add( b2= new Button("8"));
		teclado.add( b3= new Button ("9"));
		 teclado.add (b4= new Button("/"));
		teclado.add( b5= new Button("4"));
		 teclado.add(b6= new Button("5"));
		 teclado.add(b7= new Button("6"));
		 teclado.add(b8= new Button("*"));
		 teclado.add(b9= new Button("1"));
		 teclado.add(b10= new Button("2"));
		 teclado.add(b11= new Button("3"));
		 teclado.add(b12= new Button("-"));
		 teclado.add(b13= new Button("."));
		 teclado.add(b14= new Button("0"));
		 teclado.add(b15= new Button("+/"));
		 teclado.add(b16= new Button("+"));
		 teclado.add(b17= new Button("C"));
		 teclado.add(b18= new Button("="));
		
		
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b1.getLabel());
			}
		});	
		
				b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b2.getLabel());
			}
		});	
				b3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b3.getLabel());
			}
		});	
				b5.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b5.getLabel());
			}
		});	
				b6.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b6.getLabel());
			}
		});	
				b7.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b7.getLabel());
			}
		});	
				b9.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b9.getLabel());
			}
		});	
				b10.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b10.getLabel());
			}
		});	
				b11.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b11.getLabel());
			}
		});	
		
			b14.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Digito(b14.getLabel());
			}
		});	
	
	
			b4.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Divi();
			}
		});	
		
				b8.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Multi();
			}
		});	
		
				b12.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Resta();
			}
		});	
	    
	    		b13.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Punto();
			}
		});	
		
				b15.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.MasMenos();
			}
		});	
		
				b16.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Suma();
			}
		});	
		b17.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Clear();
			}
		});	
		
				b18.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e){
				mostrar.Igual();
			}
		});	
	
		
		teclado.setLayout (new GridLayout (5, 4, 4, 4));
}
	
	public void init(){
		f = new Frame("Calculadora");
		Calcuprj calculadora = new Calcuprj();
		mostrar = new Desplegar();
		teclado = new Panel();
		iniTeclado();
		setLayout(new BorderLayout());
		add ("North", mostrar);
		add ("Center", teclado); 
		resize(270,230);
        f.add ("Center", calculadora);
        
	}
	
	
	public void paint(Graphics g) {
		  f.setVisible(true);
      mostrar.setVisible(true);
      teclado.setVisible(true);
      setVisible(true);
	}


	


}





class Desplegar extends Panel{

public final int OPSUMA=1;
public final int OPRESTA=2;
public final int OPMULTI=3;
public final int OPDIVI=4;
boolean equal = false;
int longitud = 10;
String digitos;
Label LCD = new Label("");
double anterior = 0;
int opera = 0;

public Desplegar () {
	setLayout(new BorderLayout()); 
	add ("Center",LCD);
	repaint();
	Clear ();
}


void Digito (String digito) {

if (digitos.length () == 1 && digitos.charAt (0) == '0' && digito.charAt (0) != '.')
	digitos = digitos.substring (1);

if (digitos.length () < longitud)
	digitos = digitos + digito;
Refrescar ();
}

void Punto () {
if (digitos.indexOf ('.') != -1)
	return;

if (digitos.length () < longitud)
	digitos = digitos + ".";
	Refrescar ();
}

void Suma () {
	opera= OPSUMA;
	Calcular ();
}


void Resta () {
	opera = OPRESTA;
	Calcular ();
}


void Multi () {
	opera = OPMULTI;
	Calcular ();
}


void Divi () {
opera = OPDIVI;
Calcular ();
}

void Clear () {
anterior = 0;
opera = 0;
digitos = "0";
equal = false;
Refrescar ();
}

private void Calcular () {
if (digitos.length () == 0) return;

Double valor = Double.valueOf (digitos);
anterior = valor.doubleValue ();
equal = false;
digitos = "0";
}

void MasMenos () {
if (digitos.length () == 0) return;

if (digitos.charAt (0) == '-')
 digitos = digitos.substring (1);
else digitos = "-" + digitos;
Refrescar ();
}


private void Refrescar () {
	LCD.setText(digitos);
	repaint ();
}

void Igual () {
double resultado;

if (digitos.length () == 0) return;
	Double valor = Double.valueOf (digitos);
switch (opera) {
	case OPSUMA:
		resultado = anterior + valor.doubleValue ();
		break;

	case OPRESTA:
		resultado = anterior - valor.doubleValue ();
		break;

	case OPMULTI:
		resultado = anterior * valor.doubleValue ();
		break;

	case OPDIVI:
		resultado = anterior / valor.doubleValue ();
		break;

	default:
		resultado = 0;
		
}

digitos = new Double (resultado).toString ();
Refrescar ();
equal= true;
anterior = 0;
opera = 0;
}







}
