1 package net.systemeD.halcyon.connection {
5 public class MainUndoStack extends EventDispatcher {
6 private static const GLOBAL_INSTANCE:MainUndoStack = new MainUndoStack();
8 public static function getGlobalStack():MainUndoStack {
9 return GLOBAL_INSTANCE;
12 private var undoActions:Array = [];
13 private var redoActions:Array = [];
16 * Performs the action, then puts it on the undo stack.
18 * If you want to delay execution don't put it on this
19 * stack -- find another one.
21 public function addAction(action:UndoableAction):void {
22 trace("doing "+action);
23 var result:uint = action.doAction();
27 case UndoableAction.FAIL:
28 throw new Error("Failure performing "+action);
30 case UndoableAction.NO_CHANGE:
31 // nothing to do, and don't add to stack
34 case UndoableAction.SUCCESS:
36 if ( undoActions.length > 0 ) {
37 var previous:UndoableAction = undoActions[undoActions.length - 1];
38 var isMerged:Boolean = action.mergePrevious(previous);
42 undoActions.push(action);
44 dispatchEvent(new Event("new_undo_item"));
45 dispatchEvent(new Event("new_redo_item"));
52 * Call to kill the undo queue -- the user will not be able to undo
53 * anything they previously did after this is called.
55 public function breakUndo():void {
60 [Bindable(event="new_undo_item")]
61 public function canUndo():Boolean {
62 return undoActions.length > 0;
65 [Bindable(event="new_redo_item")]
66 public function canRedo():Boolean {
67 return redoActions.length > 0;
70 public function undo():void {
71 if (!undoActions.length) { return; }
72 var action:UndoableAction = undoActions.pop();
73 trace("undoing "+action);
75 redoActions.push(action);
76 dispatchEvent(new Event("new_undo_item"));
77 dispatchEvent(new Event("new_redo_item"));
80 public function redo():void {
81 if (!redoActions.length) { return; }
82 var action:UndoableAction = redoActions.pop();
83 trace("redoing "+action);
85 undoActions.push(action);
86 dispatchEvent(new Event("new_undo_item"));
87 dispatchEvent(new Event("new_redo_item"));