Merge branch 'master' of github.com:systemed/potlatch2
[potlatch2.git] / net / systemeD / halcyon / connection / actions / CreateEntityAction.as
1 package net.systemeD.halcyon.connection.actions {
2
3     import net.systemeD.halcyon.connection.*;
4     
5     public class CreateEntityAction extends UndoableEntityAction {
6         private var setCreate:Function;
7         private var deleteAction:UndoableAction;
8         
9         // This is a bit unusual, since we need to handle undo and specifically redo slightly differently
10         // When undo is called, instead of simply removing the entity, we work through
11         // to make a Delete[Entity]Action, call that, and store it for later
12         // Then, when this action is called again (i.e. a redo), instead of creating yet another entity, we call the deleteAction.undoAction
13
14         public function CreateEntityAction(entity:Entity, setCreate:Function) {
15             super(entity, "Create");
16             this.setCreate = setCreate;
17         }
18             
19         public override function doAction():uint {
20             // check to see if this is the first pass - i.e. not a redo action.
21             // if it's redo (i.e. we've stored a deleteAction), undo the deletion
22             // if it's the first time, register the new entity with the connection
23             if ( deleteAction != null ) {
24                 deleteAction.undoAction();
25             } else {
26                 setCreate(entity, false);
27             }
28             markDirty(); // if this is the first action taken, undoing it will then be able to clean the connection
29             return SUCCESS;
30         }
31             
32         public override function undoAction():uint {
33             // if the undo is called for the first time, call for a deletion, and (via setAction) store the
34             // deletion action for later. We'll undo the deletion if we get asked to redo this action
35             if ( deleteAction == null ) {
36                 entity.remove(setAction);
37             }
38             deleteAction.doAction();
39             markClean();
40             return SUCCESS;
41         }
42         
43         private function setAction(action:UndoableAction):void {
44             deleteAction = action;
45         }
46     }
47 }
48