00001
00002 #ifdef HAVE_CONFIG_H
00003 # include <simgear_config.h>
00004 #endif
00005
00006 #include "AtomicChangeListener.hxx"
00007
00008 #include <algorithm>
00009 #include <iterator>
00010 #include <vector>
00011
00012 #include <boost/bind.hpp>
00013
00014 #include <simgear/structure/Singleton.hxx>
00015
00016 namespace simgear
00017 {
00018 using namespace std;
00019
00020 MultiChangeListener::MultiChangeListener()
00021 {
00022 }
00023
00024 void MultiChangeListener::valueChanged(SGPropertyNode* node)
00025 {
00026 valueChangedImplementation();
00027 }
00028
00029 void MultiChangeListener::valueChangedImplementation()
00030 {
00031 }
00032
00033 AtomicChangeListener::AtomicChangeListener(std::vector<SGPropertyNode*>& nodes)
00034 : _dirty(false), _valid(true)
00035 {
00036 listenToProperties(nodes.begin(), nodes.end());
00037 }
00038
00039 void AtomicChangeListener::unregister_property(SGPropertyNode* node)
00040 {
00041 _valid = false;
00042
00043 vector<SGPropertyNode*>::iterator itr
00044 = find(_watched.begin(), _watched.end(), node);
00045 if (itr != _watched.end())
00046 *itr = 0;
00047 MultiChangeListener::unregister_property(node);
00048 }
00049
00050 void AtomicChangeListener::fireChangeListeners()
00051 {
00052 vector<SGSharedPtr<AtomicChangeListener> >& listeners
00053 = ListenerListSingleton::instance()->listeners;
00054 for (vector<SGSharedPtr<AtomicChangeListener> >::iterator itr = listeners.begin(),
00055 end = listeners.end();
00056 itr != end;
00057 ++itr) {
00058 (*itr)->valuesChanged();
00059 (*itr)->_dirty = false;
00060 }
00061 listeners.clear();
00062 }
00063
00064 void AtomicChangeListener::valueChangedImplementation()
00065 {
00066 if (!_dirty) {
00067 _dirty = true;
00068 if (_valid)
00069 ListenerListSingleton::instance()->listeners.push_back(this);
00070 }
00071 }
00072
00073 void AtomicChangeListener::valuesChanged()
00074 {
00075 }
00076 }