+#include "viewmgr.hxx"
+
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Saved command states.
+////////////////////////////////////////////////////////////////////////
+
+
+/**
+ * Base saved state for property commands.
+ *
+ * Since this class isn't publicly visible, it is simply an aggregate
+ * of all the stuff any property command needs.
+ */
+class PropertyCommandState : public SGCommandState
+{
+public:
+ PropertyCommandState (const SGPropertyNode * arg);
+ virtual SGPropertyNode * getProp () const { return _prop; }
+ virtual SGPropertyNode * getProp2 () const { return _prop2; }
+ virtual const SGPropertyNode * getValue () const
+ { return _value ? _value : &_dummy_0; }
+ virtual const bool hasStep () const { return _step != 0; }
+ virtual const SGPropertyNode * getStep () const
+ { return _step ? _step : &_dummy_0; }
+ virtual const SGPropertyNode * getMin () const { return _min; }
+ virtual const SGPropertyNode * getMax () const { return _max; }
+ virtual const SGPropertyNode * getWrap () const
+ { return _wrap ? _wrap : &_dummy_0; }
+ virtual const SGPropertyNode * getFactor () const
+ { return _factor ? _factor : &_dummy_1; }
+ virtual const SGPropertyNode * getSquared () const
+ { return _squared ? _squared : &_dummy_1; }
+ virtual const SGPropertyNode * getSetting () const
+ { return _setting ? _setting : &_dummy_0; }
+ virtual const SGPropertyNode * getOffset () const
+ { return _offset ? _offset : &_dummy_0; }
+private:
+ static SGPropertyNode _dummy_0;
+ static SGPropertyNode _dummy_1;
+ mutable SGPropertyNode * _prop;
+ mutable SGPropertyNode * _prop2;
+ const SGPropertyNode * _value;
+ const SGPropertyNode * _step;
+ const SGPropertyNode * _min;
+ const SGPropertyNode * _max;
+ const SGPropertyNode * _wrap;
+ const SGPropertyNode * _factor;
+ const SGPropertyNode * _squared;
+ const SGPropertyNode * _setting;
+ const SGPropertyNode * _offset;
+};
+
+SGPropertyNode PropertyCommandState::_dummy_0;
+SGPropertyNode PropertyCommandState::_dummy_1;
+
+PropertyCommandState::PropertyCommandState (const SGPropertyNode * arg)
+ : SGCommandState(arg),
+ _prop(fgGetNode(arg->getStringValue("property[0]", "/null"), true)),
+ _prop2(fgGetNode(arg->getStringValue("property[1]", "/null"), true)),
+ _value(arg->getNode("value")),
+ _step(arg->getNode("step")),
+ _min(arg->getNode("min")),
+ _max(arg->getNode("max")),
+ _wrap(arg->getNode("wrap")),
+ _factor(arg->getNode("factor")),
+ _squared(arg->getNode("squared")),
+ _setting(arg->getNode("setting")),
+ _offset(arg->getNode("offset"))
+{
+ // It would be better not to do this
+ // every time, but it's not that big
+ // a deal. I don't know enough about
+ // C++ static initialization to fix it.
+ _dummy_1.setDoubleValue(1.0);
+}
+
+
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Command implementations.
+////////////////////////////////////////////////////////////////////////