- MementoRedoCommand(obj_T &obj,
- XMLNode &after)
- : obj(obj), after(after) {}
- void operator() () { obj.set_state(after); }
- void undo() { /* noop */ }
- virtual XMLNode &get_state()
- {
- XMLNode *node = new XMLNode("MementoRedoCommand");
- node->add_property("obj_id", obj.id().to_s());
- node->add_child_nocopy(after);
- return *node;
- }
+ MementoCommand (obj_T& a_object, XMLNode* a_before, XMLNode* a_after)
+ : _binder (new SimpleMementoCommandBinder<obj_T> (a_object)), before (a_before), after (a_after)
+ {
+ /* The binder's object died, so we must die */
+ _binder->DropReferences.connect_same_thread (_binder_death_connection, boost::bind (&MementoCommand::binder_dying, this));
+ }
+
+ MementoCommand (MementoCommandBinder<obj_T>* b, XMLNode* a_before, XMLNode* a_after)
+ : _binder (b), before (a_before), after (a_after)
+ {
+ /* The binder's object died, so we must die */
+ _binder->DropReferences.connect_same_thread (_binder_death_connection, boost::bind (&MementoCommand::binder_dying, this));
+ }
+
+ ~MementoCommand () {
+ drop_references ();
+ delete before;
+ delete after;
+ delete _binder;
+ }
+
+ void binder_dying () {
+ delete this;
+ }
+
+ void operator() () {
+ if (after) {
+ _binder->get()->set_state(*after, Stateful::current_state_version);
+ }
+ }
+
+ void undo() {
+ if (before) {
+ _binder->get()->set_state(*before, Stateful::current_state_version);
+ }
+ }
+
+ virtual XMLNode &get_state() {
+ std::string name;
+ if (before && after) {
+ name = "MementoCommand";
+ } else if (before) {
+ name = "MementoUndoCommand";
+ } else {
+ name = "MementoRedoCommand";
+ }
+
+ XMLNode* node = new XMLNode(name);
+ _binder->add_state (node);
+
+ node->add_property ("type_name", _binder->type_name ());
+
+ if (before) {
+ node->add_child_copy(*before);
+ }
+
+ if (after) {
+ node->add_child_copy(*after);
+ }
+
+ return *node;
+ }
+