cgma
|
00001 #include "CubitObservable.hpp" 00002 #include "CubitObserver.hpp" 00003 #include "CubitDefines.h" 00004 00005 CubitObservable::CubitObservable() 00006 { 00007 observerList = NULL; 00008 } 00009 00010 CubitObservable::~CubitObservable() 00011 { 00012 if (observerList) 00013 { 00014 assert( (observerList->remove_all_with_value( NULL ), 00015 observerList->size() == 0) ); 00016 delete observerList; 00017 observerList = NULL; 00018 } 00019 } 00020 00021 CubitStatus CubitObservable::add_observer(CubitObserver *observer) 00022 { 00023 if ( !observerList ) 00024 observerList = new DLIList <CubitObserver*>; 00025 if( observerList->append_unique( observer ) == CUBIT_TRUE ) 00026 { 00027 return CUBIT_SUCCESS; 00028 } 00029 return CUBIT_FAILURE; 00030 } 00031 00032 CubitStatus CubitObservable::remove_observer(CubitObserver *observer) 00033 { 00034 CubitStatus success = CUBIT_FAILURE; 00035 if( observerList != NULL ) 00036 { 00037 int i; 00038 for ( i = 0; i < observerList->size(); i++ ) 00039 { 00040 if ( observerList->get() == observer ) 00041 { 00042 success = CUBIT_SUCCESS; 00043 observerList->change_to( NULL ); 00044 break; 00045 } 00046 observerList->step(); 00047 } 00048 } 00049 return success; 00050 } 00051 00052 void CubitObservable::remove_from_observers() 00053 { 00054 if( observerList != NULL ) 00055 observerList->clean_out(); 00056 } 00057 00058 void CubitObservable::get_observer_list( DLIList <CubitObserver*> &observers) 00059 { 00060 if (observerList) 00061 { 00062 for( int i = observerList->size(); i > 0; i-- ) 00063 { 00064 CubitObserver* observer = observerList->get_and_step(); 00065 if( observer ) 00066 observers.append( observer ); 00067 } 00068 } 00069 } 00070 00071 void CubitObservable::notify_observers( const CubitEvent *event ) 00072 { 00073 if ( ! observerList || observerList->size() == 0 ) 00074 return; 00075 00076 CubitObserver *observer = NULL; 00077 for ( int i = 0; i < observerList->size(); i++ ) 00078 { 00079 observerList->reset(); 00080 observerList->step(i); 00081 observer = observerList->get(); 00082 if ( observer != NULL ) 00083 { 00084 observer->notify_observer(event); 00085 } 00086 } 00087 observerList->remove_all_with_value( NULL ); 00088 } 00089