package tv;

import java.beans.*;
import java.io.*;

/**
 * Manutenção do estado da TV
 */
public class TVEstado implements Serializable {
  protected int       canal;  // propriedade: canal da TV
  protected boolean   on;     // propriedade: TV ligada ou não
  protected PropertyChangeSupport pcs;
  protected VetoableChangeSupport vcs;

  // Construtor
  public TVEstado() {
    pcs = new PropertyChangeSupport(this);
    vcs = new VetoableChangeSupport(this);
    canal = 0;
    on = false;
  }

  // getter para propriedade "on"
  public boolean isOn() {
    return on;
  }

  // setter para propriedade "on"
  public void setOn(boolean on) {
    if(on != this.on) {
      pcs.firePropertyChange("on", new Boolean(this.on), new Boolean(on));
      this.on = on;
    }
  }

  // getter para propriedade "canal"
  public int getCanal() {
    return canal;
  }

  // setter para propriedade "canal"
  public void setCanal(int canal) throws PropertyVetoException {
    vcs.fireVetoableChange("valor", new Integer(this.canal), new Integer(canal));
    // se for vetado, não chegaremos aqui
    this.canal = canal;
  }

  // Incrementa canal
  public void incrementaCanal() {
    mudaCanal(1);
  }

  // Decrementa canal
  public void decrementaCanal() {
    mudaCanal(-1);
  }

  private void mudaCanal(int incremento) {
    try {
      setCanal(getCanal() + incremento);
    } catch(PropertyVetoException e) {
      // mensagem de visualização para testes
      System.out.println("Vetado!");
    }
  }

  // Método de mudança on/off
  public void onOff() {
    setOn(!isOn());
  }

  // 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);
  }

  // cadastro para mudança "vetável" de propriedade
  public void addVetoableChangeListener(VetoableChangeListener l) {
    vcs.addVetoableChangeListener(l);
  }

  // remoção de cadastro para mudança "vetável" de propriedade
  public void removeVetoableChangeListener(VetoableChangeListener l) {
    vcs.removeVetoableChangeListener(l);
  }
}

