package tv;

//import java.awt.*;
//import java.awt.event.*;
//import javax.swing.JContainer;
import java.awt.Container;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.GridLayout;
import java.awt.BorderLayout;
import java.beans.*;
import java.io.*;

/**
 * Um keypad
 */
public class KeyPad extends Container implements ActionListener {
  protected int   valor = 0;      // propriedade do bean
  protected int   maxDígitos = 3; // propriedade do bean: número max de dígitos
  private String  valorDisplay;   // valor mostrado no display antes de dar ENTER
  protected PropertyChangeSupport pcs;
  private JButton botãoEnter = new JButton("ENTER");
  private JLabel display = new JLabel("");

  // Construtor
  public KeyPad() {
    pcs = new PropertyChangeSupport(this);
    JPanel p = new JPanel(); // para os botões de 0 a 9
    p.setLayout(new GridLayout(2,5));
    setLayout(new BorderLayout()); // para conter o keypad inteiro

    // cria os botões
    for(int i = 0; i < 10; i++) {
      JButton b = new JButton(Integer.toString(i));
      p.add(b);
      b.addActionListener(this);
    }
    botãoEnter.addActionListener(this);
    add("South", botãoEnter);
    add("Center", p);
    add("North", display);
    display.setHorizontalAlignment(JLabel.CENTER);
    valorDisplay = "";
  }

  // getter do valor
  public int getValor() {
    return valor;
  }

  // setter do valor
  public void setValor(int valor) {
    pcs.firePropertyChange("valor", new Integer(this.valor),
                                    new Integer(valor));
    this.valor = valor;
    valorDisplay = "";
    display.setText(valorDisplay);
  }

  // getter de maxDígitos
  public int getMaxDígitos() {
    return maxDígitos;
  }

  // setter de maxDígitos
  public void setMaxDígitos(int maxDígitos) {
    this.maxDígitos = maxDígitos;
  }

  // Mudança do display
  public void mudaDisplay(String digito) {
    valorDisplay += digito;
    // só permite maxDígitos digitos de display
    if(valorDisplay.length() > maxDígitos) {
      valorDisplay = digito;
    }
    display.setText(valorDisplay);
  }

  // cadastro para mudança de propriedade
  public void addPropertyChangeListener(PropertyChangeListener l) {
    pcs.addPropertyChangeListener(l);
  }

  // remoção de cadastro para mudança de propriedade
  public void removePropertyChangeListener(PropertyChangeListener l) {
    pcs.removePropertyChangeListener(l);
  }

  // trata o evento de clique de qualquer botão
  public void actionPerformed(ActionEvent ae) {
    if(ae.getSource().equals(botãoEnter)) {
      try {
        setValor(Integer.parseInt(valorDisplay));
      } catch(NumberFormatException nfe) {
        // "não deveria" acontecer
        nfe.printStackTrace();
        return;
      }
    } else {
      mudaDisplay(ae.getActionCommand());
    }
  }
}

