Added a ptr() method to SGPropertyNode_ptr to get the raw pointer.
Added the SGPropertyChangeListener interface and addChangeListener and firePropertyChange methods.
This commit is contained in:
+73
-9
@@ -360,9 +360,15 @@ inline bool
|
|||||||
SGPropertyNode::set_bool (bool val)
|
SGPropertyNode::set_bool (bool val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.bool_val->setValue(val);
|
if (_value.bool_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_local_val.bool_val = val;
|
_local_val.bool_val = val;
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -371,9 +377,15 @@ inline bool
|
|||||||
SGPropertyNode::set_int (int val)
|
SGPropertyNode::set_int (int val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.int_val->setValue(val);
|
if (_value.int_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_local_val.int_val = val;
|
_local_val.int_val = val;
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,9 +394,15 @@ inline bool
|
|||||||
SGPropertyNode::set_long (long val)
|
SGPropertyNode::set_long (long val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.long_val->setValue(val);
|
if (_value.long_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_local_val.long_val = val;
|
_local_val.long_val = val;
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -393,9 +411,15 @@ inline bool
|
|||||||
SGPropertyNode::set_float (float val)
|
SGPropertyNode::set_float (float val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.float_val->setValue(val);
|
if (_value.float_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_local_val.float_val = val;
|
_local_val.float_val = val;
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -404,9 +428,15 @@ inline bool
|
|||||||
SGPropertyNode::set_double (double val)
|
SGPropertyNode::set_double (double val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.double_val->setValue(val);
|
if (_value.double_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
_local_val.double_val = val;
|
_local_val.double_val = val;
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -415,10 +445,16 @@ inline bool
|
|||||||
SGPropertyNode::set_string (const char * val)
|
SGPropertyNode::set_string (const char * val)
|
||||||
{
|
{
|
||||||
if (_tied) {
|
if (_tied) {
|
||||||
return _value.string_val->setValue(val);
|
if (_value.string_val->setValue(val)) {
|
||||||
|
firePropertyChange();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
delete [] _local_val.string_val;
|
delete [] _local_val.string_val;
|
||||||
_local_val.string_val = copy_string(val);
|
_local_val.string_val = copy_string(val);
|
||||||
|
firePropertyChange();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -592,7 +628,8 @@ SGPropertyNode::SGPropertyNode ()
|
|||||||
_type(NONE),
|
_type(NONE),
|
||||||
_tied(false),
|
_tied(false),
|
||||||
_attr(READ|WRITE),
|
_attr(READ|WRITE),
|
||||||
_count(0)
|
_count(0),
|
||||||
|
_listeners(0)
|
||||||
{
|
{
|
||||||
_local_val.string_val = 0;
|
_local_val.string_val = 0;
|
||||||
}
|
}
|
||||||
@@ -608,7 +645,8 @@ SGPropertyNode::SGPropertyNode (const SGPropertyNode &node)
|
|||||||
_type(node._type),
|
_type(node._type),
|
||||||
_tied(node._tied),
|
_tied(node._tied),
|
||||||
_attr(node._attr),
|
_attr(node._attr),
|
||||||
_count(0)
|
_count(0),
|
||||||
|
_listeners(0) // CHECK!!
|
||||||
{
|
{
|
||||||
_name = copy_string(node._name);
|
_name = copy_string(node._name);
|
||||||
_local_val.string_val = 0;
|
_local_val.string_val = 0;
|
||||||
@@ -690,7 +728,8 @@ SGPropertyNode::SGPropertyNode (const char * name,
|
|||||||
_type(NONE),
|
_type(NONE),
|
||||||
_tied(false),
|
_tied(false),
|
||||||
_attr(READ|WRITE),
|
_attr(READ|WRITE),
|
||||||
_count(0)
|
_count(0),
|
||||||
|
_listeners(0)
|
||||||
{
|
{
|
||||||
_name = copy_string(name);
|
_name = copy_string(name);
|
||||||
_local_val.string_val = 0;
|
_local_val.string_val = 0;
|
||||||
@@ -705,6 +744,7 @@ SGPropertyNode::~SGPropertyNode ()
|
|||||||
delete [] _name;
|
delete [] _name;
|
||||||
delete _path_cache;
|
delete _path_cache;
|
||||||
clear_value();
|
clear_value();
|
||||||
|
delete _listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -812,6 +852,8 @@ SGPropertyNode::getChild (const char * name, int index, bool create)
|
|||||||
node = new SGPropertyNode(name, index, this);
|
node = new SGPropertyNode(name, index, this);
|
||||||
}
|
}
|
||||||
_children.push_back(node);
|
_children.push_back(node);
|
||||||
|
if (_parent != 0)
|
||||||
|
_parent->firePropertyChange();
|
||||||
return _children[_children.size()-1];
|
return _children[_children.size()-1];
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@@ -870,6 +912,8 @@ SGPropertyNode::removeChild (const char * name, int index, bool keep)
|
|||||||
node->setAttribute(REMOVED, true);
|
node->setAttribute(REMOVED, true);
|
||||||
ret = node;
|
ret = node;
|
||||||
}
|
}
|
||||||
|
if (_parent != 0)
|
||||||
|
_parent->firePropertyChange();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1939,6 +1983,26 @@ SGPropertyNode::untie (const char * relative_path)
|
|||||||
return (node == 0 ? false : node->untie());
|
return (node == 0 ? false : node->untie());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SGPropertyNode::addChangeListener (SGPropertyChangeListener * listener)
|
||||||
|
{
|
||||||
|
if (_listeners == 0)
|
||||||
|
_listeners = new vector<SGPropertyChangeListener *>;
|
||||||
|
_listeners->push_back(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SGPropertyNode::firePropertyChange (SGPropertyNode * node)
|
||||||
|
{
|
||||||
|
if (_listeners != 0) {
|
||||||
|
for (int i = 0; i < _listeners->size(); i++) {
|
||||||
|
(*_listeners)[i]->propertyChanged(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (_parent != 0)
|
||||||
|
_parent->firePropertyChange(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -503,6 +503,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
operator const SGPropertyNode *() const;
|
operator const SGPropertyNode *() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the pointer.
|
||||||
|
*/
|
||||||
|
SGPropertyNode * ptr () { return _ptr; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validity test
|
* Validity test
|
||||||
*/
|
*/
|
||||||
@@ -513,6 +518,23 @@ private:
|
|||||||
SGPropertyNode *_ptr;
|
SGPropertyNode *_ptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The property change listener interface.
|
||||||
|
*
|
||||||
|
* <p>Any class that needs to listen for property changes must implement
|
||||||
|
* this interface.</p>
|
||||||
|
*/
|
||||||
|
class SGPropertyChangeListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void propertyChanged (SGPropertyNode * node) = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A node in a property tree.
|
* A node in a property tree.
|
||||||
@@ -1098,9 +1120,30 @@ public:
|
|||||||
bool untie (const char * relative_path);
|
bool untie (const char * relative_path);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a change listener to the property.
|
||||||
|
*/
|
||||||
|
void addChangeListener (SGPropertyChangeListener * listener);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fire a property change to all listeners.
|
||||||
|
*/
|
||||||
|
void firePropertyChange ()
|
||||||
|
{
|
||||||
|
firePropertyChange(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fire a property change with an explicit target node.
|
||||||
|
*/
|
||||||
|
void firePropertyChange (SGPropertyNode * node);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protected constructor for making new nodes on demand.
|
* Protected constructor for making new nodes on demand.
|
||||||
*/
|
*/
|
||||||
@@ -1198,6 +1241,8 @@ private:
|
|||||||
char * string_val;
|
char * string_val;
|
||||||
} _local_val;
|
} _local_val;
|
||||||
|
|
||||||
|
vector <SGPropertyChangeListener *> * _listeners;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user