#ifndef _BAKERYEXTRAS_VIEWSUBSCRIBER_HH_ #define _BAKERYEXTRAS_VIEWSUBSCRIBER_HH_ #include "bakery/bakery.h" #include "BakeryExtras/View_Linked.hh" namespace BakeryExtras { template< class T_Document, class T_Entity > class View_Subscriber : virtual public Bakery::View { public: View_Subscriber() : _entity(0) { } virtual ~View_Subscriber() { } typedef Bakery::View type_view; virtual void subscribe_view(type_view* pView) { if(pView) { pView->set_document(get_document()); m_vecViews.push_back(pView); } } virtual void unsubscribe_view(type_view* pView) { type_vecViews::iterator iter = std::find(m_vecViews.begin(), m_vecViews.end(), pView); if(iter != m_vecViews.end()) m_vecViews.erase(iter); } virtual void delete_subscribed_views(void) { for (int cpt = 0; cpt < m_vecViews.size(); cpt++) { delete m_vecViews[cpt]; } m_vecViews.clear(); } virtual void set_document(T_Document* pDocument) { //Call base class: Bakery::View::set_document(pDocument); //Change the document in the child views. for(type_vecViews::iterator iter = m_vecViews.begin(); iter != m_vecViews.end(); iter++) { type_view* pView = *iter; if(pView) pView->set_document(pDocument); } } virtual void notify_subscribees() { //Notify the dependent views: BakeryExtras::View_Linked< T_Document, T_Entity> * tmp = 0; for(type_vecViews::iterator iter = m_vecViews.begin(); iter != m_vecViews.end(); iter++) { type_view* pView = *iter; if(pView) { tmp = dynamic_cast< BakeryExtras::View_Linked < T_Document, T_Entity > * >(pView); if (tmp != 0) { tmp->set_parent_entity(_entity); } } } } virtual void set_entity(T_Entity * entity) { _entity = entity; } protected: typedef std::vector type_vecViews; type_vecViews m_vecViews; T_Entity * _entity; }; }; #endif