package tv;

import java.beans.*;
import java.io.*;

/**
 * Verifica se um valor inteiro cai entre dois limites e lança exceção se não aceitável
 */
public class Limites
       implements VetoableChangeListener, Serializable {

  protected int inferior; // propriedade: limite inferior para "valor"
  protected int superior; // propriedade: limite inferior para "valor"
  protected int valor;    // propriedade: o valor do Bean
  protected PropertyChangeSupport pcs;

  public Limites() {
    pcs = new PropertyChangeSupport(this);
    inferior = 1;   // valores default
    superior = 99;
  }

  // getter de inferior
  public int getInferior() {
    return inferior;
  }

  // setter de inferior
  public void setInferior(int inferior) {
    this.inferior = inferior;
  }

  // getter de superior
  public int getSuperior() {
    return superior;
  }

  // setter de superior
  public void setSuperior(int superior) {
    this.superior = superior;
  }

  // verifica validade do valor
  public boolean isValorValido(int valor) {
    return inferior <= valor && valor <= superior;
  }

  // getter de valor
  public int getValor() {
    return valor;
  }

  public void setValor(int valor) {
    pcs.firePropertyChange("valor", new Integer(this.valor), new Integer(valor));
    this.valor = valor;
  }

  // vetoableChange - é aqui que recebemos o evento de mudança de valor
  // e verificamos se é aceitável
  public void vetoableChange(PropertyChangeEvent pce)
              throws PropertyVetoException {

    String propriedadeMudada = pce.getPropertyName();
    Object novoValor = pce.getNewValue();
    if(propriedadeMudada.equals("valor")) {
      int valorProposto = ((Integer)novoValor).intValue();
      if(isValorValido(valorProposto)) {
        setValor(valorProposto);
      } else {
        throw new PropertyVetoException("Valor fora dos limites", pce);
      }
    }
  }

  // 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);
  }
}

