00001 #ifndef ocobserve_h 00002 #define ocobserve_h 00003 00004 #include <InterViews/observe.h> 00005 00006 struct Object; 00007 class cTemplate; 00008 00009 // For an Observer watching a hoc Object 00010 // when the last ref disappears, disconnect is called on the Observer 00011 // Some objects may be written so that update gets called on the Observer 00012 00013 extern "C" { 00014 void hoc_obj_notify(Object* ob); 00015 } 00016 00017 class ObjObservable : public Observable { 00018 public: 00019 static void Attach(Object*, Observer*); 00020 static void Detach(Object*, Observer*); 00021 virtual ~ObjObservable(); 00022 00023 Object* object() { return ob_; } 00024 private: 00025 ObjObservable(Object*); 00026 private: 00027 Object* ob_; 00028 }; 00029 00030 // For an Observer watching a cTemplate 00031 00032 extern "C" { 00033 void hoc_template_notify(Object*, int message); 00034 } 00035 00036 class ClassObservable : public Observable { 00037 public: 00038 // only the first two guarantee an update on the Observer 00039 enum {Delete, Create, Changed}; 00040 00041 static void Attach(cTemplate*, Observer*); 00042 static void Detach(cTemplate*, Observer*); 00043 virtual ~ClassObservable(); 00044 00045 cTemplate* ctemplate() { return ct_; } 00046 Object* object() { return ob_;} 00047 int message() { return message_;} 00048 private: 00049 friend void hoc_template_notify(Object*, int); 00050 ClassObservable(cTemplate*); 00051 void attach(Observer*); 00052 void detach(Observer*); 00053 private: 00054 cTemplate* ct_; 00055 Object* ob_; 00056 int message_; 00057 int cnt_; 00058 }; 00059 00060 #endif