change relation.appendMember to use the undo system, and update various places as...
[potlatch2.git] / net / systemeD / halcyon / connection / UndoableEntityAction.as
1 package net.systemeD.halcyon.connection {
2
3     /**
4     * An UndoableEntityAction is an action that affects an entity. The allows the clean/dirty status of both the individual entity and
5     * the connection as a whole to be tracked correctly when doing an action, undoing it and redoing it.
6     *
7     * Individual entity actions extend this class in order to do useful things.
8     */
9
10     public class UndoableEntityAction extends UndoableAction {
11         public var wasDirty:Boolean;
12                 public var connectionWasDirty:Boolean;
13         private var initialised:Boolean = false;
14         protected var name:String;
15         protected var entity:Entity;
16
17         /**
18         * Create a new UndoableEntityAction. Usually called as super() from a subclass
19         *
20         * @param entity The entity that it being modified
21         * @param name The name of this action, useful for debugging.
22         */
23         public function UndoableEntityAction(entity:Entity, name:String) {
24             this.entity = entity;
25             this.name = name;
26         }
27
28         /**
29         * Mark this action as dirty. This will mark the entity and/or connection dirty, as appropriate.
30         */
31         protected function markDirty():void {
32             if ( !initialised ) init();
33
34             if ( !wasDirty ) {
35               entity.markDirty();
36             }
37
38             if ( !connectionWasDirty ) {
39               Connection.getConnectionInstance().markDirty();
40             }
41         }
42
43         /**
44         * Mark this action as clean. This will entity and/or connection clean, as appropriate,
45         * based on whether they were clean before this action started.
46         */
47         protected function markClean():void {
48             if ( !initialised ) init();
49
50             if ( !wasDirty ) {
51               entity.markClean();
52             }
53
54             if ( !connectionWasDirty ) {
55               Connection.getConnectionInstance().markClean();
56             }
57         }
58
59         /**
60         * Record whether or not the entity and connection were clean before this action started.
61         * This allows the correct state to be restored when undo/redo is called
62         */
63         private function init():void {
64             wasDirty = entity.isDirty;
65             connectionWasDirty = Connection.getConnectionInstance().isDirty;
66             initialised = true;
67         }
68             
69         public function toString():String {
70             return name + " " + entity.getType() + " " + entity.id;
71         }
72     }
73 }
74