//: C10:Observable.h
// Z knihy "Myslíme v jazyce C++, část 2" od Bruce Eckela a Chucka Allisona.
// (c) 1995-2004 MindView, Inc. Všechna práva vyhrazena.
// Přečtěte si podmínky používání zdrojových kódů umístěné v souboru 
// 'Licence.txt' dodávaném spolu s balíčkem kódu dostupným na www.MindView.net.
// Třída Pozorovatelny.
#ifndef OBSERVABLE_H
#define OBSERVABLE_H
#include <set>
#include "Observer.h"

class Pozorovatelny {
  bool zmeneny;
  std::set<Pozorovatel*> pozorovatele;
protected:
  virtual void nastavitZmeneny() { zmeneny = true; }
  virtual void zrusitZmeneny() { zmeneny = false; }
public:
  virtual void pridatPozorovatele(Pozorovatel& o) {
    pozorovatele.insert(&o);
  }
  virtual void smazatPozorovatele(Pozorovatel& o) {
    pozorovatele.erase(&o);
  }
  virtual void smazatVsechnyPozorovatele() {
    pozorovatele.clear();
  }
  virtual int pocetPozorovatelu() {
    return pozorovatele.size();
  }
  virtual bool zmenilSe() { return zmeneny; }
  //Jestliže se tento objekt změnil, informovat 
	//o tom všechny jeho pozorovatele:
  virtual void upozornitPozorovatele(Argument* arg = 0) {
    if(!zmenilSe()) return;
    zrusitZmeneny(); // Již není změněný
    std::set<Pozorovatel*>::iterator it;
    for(it = pozorovatele.begin();it != pozorovatele.end(); it++)
      (*it)->aktualizovat(this, arg);
  }
  virtual ~Pozorovatelny() {}
};
#endif // OBSERVABLE_H ///:~
