package tv;

import java.util.*;
import java.awt.*;
import java.beans.*;
import java.io.*;

/**
 * Um display de TV simples
 */
public class TVDisplay extends Canvas
                       implements PropertyChangeListener, Serializable {
  protected int       canal;  // propriedade
  protected boolean   on;     // propriedade

  protected PropertyChangeSupport pcs;

  // Construtor
  public TVDisplay() {
    super();
    pcs = new PropertyChangeSupport(this);
    canal = 0;
    on = false;
  }

  public void paint(Graphics g) {
    int altura = getSize().height;
    int largura = getSize().width;
    int x = 0;
    int y = 0;
    int offset = 1;
    g.setColor(Color.black);
    g.drawRect(x, y, largura-offset, altura-offset);
    g.setColor(corDaTela());
    g.fillRect(x+1, y+1, largura-offset-1, altura-offset-1);
    if(isOn()) {
      g.setColor(Color.green);
      g.drawString(String.valueOf(canal), largura/2, altura/2);
    }
  }

  private Color corDaTela() {
    // cor da tela depende do canal sintonizado
    Random nr = new Random(canal);
    // queria usar nextInt(int n) mas os browsers não têm esse método
    return isOn() ? new Color(nr.nextInt()&0xFF, nr.nextInt()&0xFF, nr.nextInt()&0xFF) : Color.gray;
  }

  // getter para "on"
  public boolean isOn() {
    return on;
  }

  // setter para "on"
  public void setOn(boolean on) {
    if(on != this.on) {
      pcs.firePropertyChange("on", new Boolean(this.on),
                                   new Boolean(on));
      this.on = on;
    }
    repaint();
  }

  // getter para o canal
  public int getCanal() {
    return canal;
  }

  // setter para canal
  public void setCanal(int canal) {
    pcs.firePropertyChange("canal", new Integer(this.canal),
                                    new Integer(canal));
    this.canal = canal;
    repaint();
  }

  // trata da mudança da propriedade canal de outro bean
  public void propertyChange(PropertyChangeEvent pce) {
    String propriedadeMudada = pce.getPropertyName();
    Object novoValor = pce.getNewValue();
    // mudança de "valor" de outro Bean altera o canal
    if(propriedadeMudada.equals("valor")) {
        this.setCanal(((Integer)novoValor).intValue());
    }
    if(propriedadeMudada.equals("on")) {
        this.setOn(((Boolean)novoValor).booleanValue());
    }
  }

  // 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);
  }
}

