You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ha...@apache.org on 2017/02/12 23:01:55 UTC
git commit: [flex-asjs] [refs/heads/develop] - ObjectMap,
UndoManager and CompressionUtils
Repository: flex-asjs
Updated Branches:
refs/heads/develop 3b82a00d1 -> b00b22470
ObjectMap, UndoManager and CompressionUtils
Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/b00b2247
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/b00b2247
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/b00b2247
Branch: refs/heads/develop
Commit: b00b2247072f7c65ac0a289626d0f394f17bad1a
Parents: 3b82a00
Author: Harbs <ha...@in-tools.com>
Authored: Mon Feb 13 01:01:50 2017 +0200
Committer: Harbs <ha...@in-tools.com>
Committed: Mon Feb 13 01:01:50 2017 +0200
----------------------------------------------------------------------
.../projects/Core/src/main/flex/CoreClasses.as | 3 +
.../org/apache/flex/utils/CompressionUtils.as | 69 +++++
.../flex/org/apache/flex/utils/ObjectMap.as | 171 ++++++++++++
.../org/apache/flex/utils/undo/IOperation.as | 54 ++++
.../org/apache/flex/utils/undo/IUndoManager.as | 187 +++++++++++++
.../org/apache/flex/utils/undo/UndoManager.as | 265 +++++++++++++++++++
6 files changed, 749 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/CoreClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/CoreClasses.as b/frameworks/projects/Core/src/main/flex/CoreClasses.as
index a5af3ca..38dabd9 100644
--- a/frameworks/projects/Core/src/main/flex/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/flex/CoreClasses.as
@@ -146,16 +146,19 @@ internal class CoreClasses
import org.apache.flex.utils.HTMLLoader; HTMLLoader;
}
import org.apache.flex.utils.BrowserUtils; BrowserUtils;
+ import org.apache.flex.utils.CompressionUtils; CompressionUtils;
import org.apache.flex.utils.Endian; Endian;
import org.apache.flex.utils.JXON; JXON;
import org.apache.flex.utils.StringPadder; StringPadder;
import org.apache.flex.utils.StringTrimmer; StringTrimmer;
import org.apache.flex.utils.StringUtil; StringUtil;
+ import org.apache.flex.utils.ObjectMap;ObjectMap;
import org.apache.flex.utils.ObjectUtil; ObjectUtil;
import org.apache.flex.utils.Timer; Timer;
import org.apache.flex.utils.UIDUtil; UIDUtil;
import org.apache.flex.utils.UIUtils; UIUtils;
import org.apache.flex.utils.URLUtils; URLUtils;
+ import org.apache.flex.utils.undo.UndoManager; UndoManager;
COMPILE::JS
{
import org.apache.flex.events.utils.EventUtils; EventUtils;
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/CompressionUtils.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/CompressionUtils.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/CompressionUtils.as
new file mode 100644
index 0000000..130b218
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/CompressionUtils.as
@@ -0,0 +1,69 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package org.apache.flex.utils
+{
+ COMPILE::SWF
+ {
+ import flash.utils.ByteArray;
+ }
+
+ public class CompressionUtils
+ {
+ /**
+ * FalconJX will inject html into the index.html file. Surround with
+ * "inject_html" tag as follows:
+ *
+ * <inject_html>
+ * <script src="https://cdnjs.cloudflare.com/ajax/libs/pako/1.0.3/pako.min.js"></script>
+ * </inject_html>
+ */
+
+ COMPILE::SWF
+ public static function inflate(data:BinaryData):BinaryData
+ {
+ var ba:ByteArray = new ByteArray();
+ ba.writeBytes(data.array);
+ ba.inflate();
+ return new BinaryData(ba);
+ }
+
+ COMPILE::JS
+ public static function inflate(data:BinaryData):BinaryData
+ {
+ return new BinaryData(window["pako"].inflate(data.array).buffer);
+ }
+
+ COMPILE::SWF
+ public static function deflate(data:BinaryData):BinaryData
+ {
+ var ba:ByteArray = new ByteArray();
+ ba.writeBytes(data.array);
+ ba.deflate();
+ return new BinaryData(ba);
+ }
+
+ COMPILE::JS
+ public static function deflate(data:BinaryData):BinaryData
+ {
+ return new BinaryData(window["pako"].deflate(data.array).buffer);
+ }
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/ObjectMap.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/ObjectMap.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/ObjectMap.as
new file mode 100644
index 0000000..917ac47
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/ObjectMap.as
@@ -0,0 +1,171 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package org.apache.flex.utils
+{
+ COMPILE::SWF
+ {
+ import flash.utils.Dictionary;
+ }
+
+ COMPILE::JS
+ {
+ import org.apache.flex.utils.UIDUtil;
+ }
+
+ public class ObjectMap
+ {
+ public function ObjectMap(weak:Boolean=false)
+ {
+ _weak = weak;
+ COMPILE::SWF
+ {
+ _map = new Dictionary(weak);
+ }
+ COMPILE::JS
+ {
+ if(weak)
+ {
+ if(typeof WeakMap == "function")
+ _map = new WeakMap();
+ else if(typeof Map == "function")//Map is supported, fall back to that
+ {
+ _map = new Map();
+ _weak = false;
+ }
+ else
+ {
+ _map = {};
+ _usesObjects = true;
+ }
+ }
+ else if(typeof Map == "function")
+ _map = new Map();
+ else
+ {
+ _map = {};
+ _usesObjects = true;
+ }
+ }
+
+ }
+ private var _weak:Boolean;
+ private var _map:Object;
+ private var _usesObjects:Boolean = false;
+ COMPILE::SWF
+ public function delete(key:Object):void
+ {
+ delete _map[key];
+ }
+
+ COMPILE::SWF
+ public function get(key:Object):*
+ {
+ return _map[key];
+ }
+ COMPILE::SWF
+ public function has(key:Object):Boolean
+ {
+ return _map[key] === undefined;
+ }
+ COMPILE::SWF
+ public function set(key:Object,value:*):void
+ {
+ _map[key] = value;
+ }
+ COMPILE::SWF
+ public function clear():void
+ {
+ _map = new Dictionary(_weak);
+ }
+
+ COMPILE::JS
+ public function delete(key:Object):void
+ {
+ if(_usesObjects)
+ delete _map[key];
+ else {
+ _map.delete(key);
+ }
+ }
+
+ COMPILE::JS
+ public function get(key:Object):*
+ {
+ if(_usesObjects)
+ {
+ switch(key.constructor)
+ {
+ case Number:
+ case String:
+ return _map[key];
+ case Object:
+ if(key.object_map_uid)
+ return _map[key["object_map_uid"]];
+ else
+ return undefined;
+ default:
+ return undefined;
+ }
+ }
+ else
+ return _map.get(key);
+ }
+ COMPILE::JS
+ public function has(key:Object):Boolean
+ {
+ if(_usesObjects)
+ return _map[key] === undefined;
+ else
+ return _map.has(key);
+ }
+ COMPILE::JS
+ public function set(key:Object,value:*):void
+ {
+ if(_usesObjects)
+ {
+ switch(key.constructor)
+ {
+ case Number:
+ case String:
+ _map[key] = value;
+ case Object:
+ if(!key.object_map_uid)
+ key.object_map_uid = UIDUtil.createUID();
+ _map[key["object_map_uid"]] = value;
+ default:
+ return;
+ }
+ }
+ else
+ _map.set(key,value);
+ }
+ COMPILE::JS
+ public function clear():void
+ {
+ if(_usesObjects)
+ _map = {};
+ else if(_weak)
+ _map = new WeakMap();
+ else
+ _map = new Map();
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IOperation.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IOperation.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IOperation.as
new file mode 100644
index 0000000..d5fe753
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IOperation.as
@@ -0,0 +1,54 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.utils.undo
+{
+ /**
+ * IOperation defines the interface for operations that can be undone and redone.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public interface IOperation
+ {
+ /**
+ * Reperforms the operation.
+ *
+ * <p>The operation is also responsible for pushing itself onto the undo stack.</p>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function performRedo():void;
+ /**
+ * Reverses the operation.
+ *
+ * <p>The operation is also responsible for pushing itself onto the redo stack.</p>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function performUndo():void;
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IUndoManager.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IUndoManager.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IUndoManager.as
new file mode 100644
index 0000000..43817b8
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/IUndoManager.as
@@ -0,0 +1,187 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.utils.undo
+{
+ /**
+ * IUndoManager defines the interface for managing the undo and redo stacks.
+ *
+ * <p>An undo manager maintains a stack of operations that can be undone and redone.</p>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public interface IUndoManager
+ {
+ /**
+ * Clears both the undo and the redo histories.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function clearAll():void;
+
+ /**
+ * The maximum number of undoable or redoable operations to track.
+ *
+ * <p>To disable the undo function, set this value to 0.</p>
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function get undoAndRedoItemLimit():int;
+ function set undoAndRedoItemLimit(value:int):void;
+
+ /**
+ * Indicates whether there is currently an operation that can be undone.
+ *
+ * @return Boolean <code>true</code>, if there is an operation on the undo stack that can be reversed.
+ * Otherwise, <code>false</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function canUndo():Boolean;
+
+ /**
+ * Returns the next operation to be undone.
+ *
+ * @return The undoable IOperation object, or <code>null</code>, if no undoable operation
+ * is on the stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function peekUndo():IOperation;
+
+ /**
+ * Removes the next operation to be undone from the undo stack, and returns it.
+ *
+ * @return The undoable IOperation object, or <code>null</code>, if no undoable operation
+ * is on the stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function popUndo():IOperation;
+
+ /**
+ * Adds an undoable operation to the undo stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function pushUndo(operation:IOperation):void;
+
+ /**
+ * Clears the redo stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function clearRedo():void;
+
+ /**
+ * Indicates whether there is currently an operation that can be redone.
+ *
+ * @return Boolean <code>true</code>, if there is an operation on the redo stack that can be redone.
+ * Otherwise, <code>false</code>.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function canRedo():Boolean;
+
+ /**
+ * Returns the next operation to be redone.
+ *
+ * @return The redoable IOperation object, or <code>null</code>, if no redoable operation
+ * is on the stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function peekRedo():IOperation;
+
+ /**
+ * Removes the next operation to be redone from the redo stack, and returns it.
+ *
+ * @return The redoable IOperation object, or <code>null</code>, if no redoable operation
+ * is on the stack.
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function popRedo():IOperation;
+
+ /**
+ * Adds a redoable operation to the redo stack.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ function pushRedo(operation:IOperation):void;
+
+ /**
+ * Removes the next IOperation object from the undo stack and calls the performUndo()
+ * function of that object.
+ *
+ * @see org.apache.flex.utils.undo.IUndoManager#canUndo()
+ * @see org.apache.flex.utils.undo.IUndoManager#clearUndo()
+ * @see org.apache.flex.utils.undo.IUndoManager#peekUndo()
+ * @see org.apache.flex.utils.undo.IUndoManager#pushUndo()
+ * @see org.apache.flex.utils.undo.IUndoManager#popUndo()
+ */
+ function undo():void;
+
+ /**
+ * Removes the next IOperation object from the redo stack and calls the performRedo()
+ * function of that object.
+ *
+ * @see org.apache.flex.utils.undo.IUndoManager#canRedo()
+ * @see org.apache.flex.utils.undo.IUndoManager#clearRedo()
+ * @see org.apache.flex.utils.undo.IUndoManager#peekRedo()
+ * @see org.apache.flex.utils.undo.IUndoManager#pushRedo()
+ * @see org.apache.flex.utils.undo.IUndoManager#popRedo()
+ */
+ function redo():void;
+ }
+}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/b00b2247/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/UndoManager.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/UndoManager.as b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/UndoManager.as
new file mode 100644
index 0000000..a837e4f
--- /dev/null
+++ b/frameworks/projects/Core/src/main/flex/org/apache/flex/utils/undo/UndoManager.as
@@ -0,0 +1,265 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Licensed to the Apache Software Foundation (ASF) under one or more
+// contributor license agreements. See the NOTICE file distributed with
+// this work for additional information regarding copyright ownership.
+// The ASF licenses this file to You under the Apache License, Version 2.0
+// (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.utils.undo
+{
+
+ /**
+ * The UndoManager class manages the history of editing operations on a text flow so
+ * that these operations can be undone and redone.
+ *
+ * <p>The undo manager maintains two stacks of IOperation objects. When a reversible
+ * operation is executed, it is placed on the undo stack. If that operation is undone,
+ * it is removed from the undo stack, reversed, and placed on the redo stack. Likewise,
+ * if that operation is then redone, it is removed from the redo stack, re-executed, and
+ * then placed onto the undo stack again. If another operation is executed first, the redo
+ * stack is cleared.</p>
+ *
+ * <p>If the TextFlow is modified directly (not via
+ * calls to the edit manager, but directly via calls to the managed FlowElement objects), then the edit manager
+ * clears the undo stack to prevent the stack from getting out of sync with the current state.</p>
+ *
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ *
+ * @see flashx.textLayout.edit.EditManager
+ */
+ public class UndoManager implements IUndoManager
+ {
+ private var undoStack:Vector.<IOperation>;
+ private var redoStack:Vector.<IOperation>;
+
+ private var _undoAndRedoItemLimit:int = 25;
+
+ /**
+ * Creates an UndoManager object.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function UndoManager()
+ {
+ undoStack = new Vector.<IOperation>;
+ redoStack = new Vector.<IOperation>;
+ }
+
+ /**
+ * @copy IUndoManager#clearAll()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function clearAll():void
+ {
+ undoStack.length = 0;
+ redoStack.length = 0;
+ }
+
+ /**
+ * @copy IUndoManager#canUndo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function canUndo():Boolean
+ {
+ return undoStack.length > 0;
+ }
+
+ /**
+ * @copy IUndoManager#peekUndo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function peekUndo():IOperation
+ {
+ return undoStack.length > 0 ? undoStack[undoStack.length-1] : null;
+ }
+
+ /**
+ * @copy IUndoManager#popUndo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function popUndo():IOperation
+ {
+ return IOperation(undoStack.pop());
+ }
+
+ /**
+ * @copy IUndoManager#pushUndo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function pushUndo(operation:IOperation):void
+ {
+ undoStack.push(operation);
+ trimUndoRedoStacks();
+ }
+
+ /**
+ * @copy IUndoManager#canRedo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function canRedo():Boolean
+ {
+ return redoStack.length > 0;
+ }
+
+ /**
+ * @copy IUndoManager#clearRedo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function clearRedo():void
+ {
+ redoStack.length = 0;
+ }
+
+ /**
+ * @copy IUndoManager#peekRedo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function peekRedo():IOperation
+ {
+ return redoStack.length > 0 ? redoStack[redoStack.length-1] : null;
+ }
+
+ /**
+ * @copy IUndoManager#popRedo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function popRedo():IOperation
+ {
+ return IOperation(redoStack.pop());
+ }
+
+ /**
+ * @copy IUndoManager#pushRedo()
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function pushRedo(operation:IOperation):void
+ {
+ redoStack.push(operation);
+ trimUndoRedoStacks();
+ }
+
+ /**
+ * @copy IUndoManager#undoAndRedoItemLimit
+ * @tiptext The maximum number of undoable or redoable operations to track.
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function get undoAndRedoItemLimit():int
+ { return _undoAndRedoItemLimit; }
+ public function set undoAndRedoItemLimit(value:int):void
+ {
+ _undoAndRedoItemLimit = value;
+ trimUndoRedoStacks();
+ }
+
+ /**
+ * @copy IUndoManager#undo()
+ * @see flashx.textLayout.edit.IEditManager#undo()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function undo():void
+ {
+ if (canUndo())
+ {
+ var undoOp:IOperation = popUndo();
+ undoOp.performUndo();
+ }
+ }
+
+ /**
+ * @copy IUndoManager#redo()
+ *
+ * @see flashx.textLayout.edit.IEditManager#redo()
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion FlexJS 0.0
+ */
+ public function redo():void
+ {
+ if (canRedo())
+ {
+ var redoOp:IOperation = popRedo();
+ redoOp.performRedo();
+ }
+ }
+
+ /** trim the sizes of the undo/redo stacks to the maximum limits */
+ private function trimUndoRedoStacks():void
+ {
+ // trim the undoStack and the redoStack so its in bounds
+ var numItems:int = undoStack.length + redoStack.length;
+ if (numItems > _undoAndRedoItemLimit)
+ {
+ // trim redoStack first
+ var numToSplice:int = Math.min(numItems-_undoAndRedoItemLimit,redoStack.length);
+ if (numToSplice)
+ {
+ redoStack.splice(0,numToSplice);
+ numItems = undoStack.length+redoStack.length;
+ }
+ // trim some undoable items
+ if (numItems > _undoAndRedoItemLimit)
+ {
+ numToSplice = Math.min(numItems-_undoAndRedoItemLimit,undoStack.length);
+ undoStack.splice(0,numToSplice);
+ }
+ }
+ }
+ }
+}