| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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 mx.utils |
| { |
| |
| import flash.utils.Proxy; |
| import flash.utils.flash_proxy; |
| import mx.utils.object_proxy; |
| |
| use namespace flash_proxy; |
| use namespace object_proxy; |
| |
| /** |
| * OrderedObject acts as a wrapper to Object to preserve the ordering of the |
| * properties as they are added. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| public dynamic class OrderedObject extends flash.utils.Proxy |
| { |
| //-------------------------------------------------------------------------- |
| // |
| // Constructor |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Constructor. |
| * |
| * @param item An Object containing name/value pairs. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| public function OrderedObject(item:Object=null) |
| { |
| super(); |
| |
| if (!item) |
| item = {}; |
| _item = item; |
| |
| propertyList = []; |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Variables |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Contains a list of all of the property names for the proxied object. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| object_proxy var propertyList:Array; |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Properties |
| // |
| //-------------------------------------------------------------------------- |
| |
| //---------------------------------- |
| // object |
| //---------------------------------- |
| |
| /** |
| * Storage for the object property. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| private var _item:Object; |
| |
| |
| /** |
| * @private |
| * |
| * Work around for the Flash Player bug #232854. The Proxy bug occurs when |
| * the Proxy class is used in a sibling ApplicationDomain of the main |
| * application's ApplicationDomain. When the Proxy class is used in a |
| * sibling ApplicationDomain the RTE looks like this: |
| * |
| * ArgumentError: Error #1063: Argument count mismatch on |
| * Object/http://adobe.com/AS3/2006/builtin::hasOwnProperty(). |
| * Expected 0, got 2. |
| * |
| * Returns the specified property value of the proxied object. |
| * |
| * @param name Typically a string containing the name of the property, or |
| * possibly a QName where the property name is found by inspecting the |
| * <code>localName</code> property. |
| * |
| * @return The value of the property. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| object_proxy function getObjectProperty(name:*):* |
| { |
| return getProperty(name); |
| } |
| |
| /** |
| * @private |
| * |
| * Work around for the Flash Player bug #232854. See the comments in |
| * getObjectProperty() for more details. |
| * |
| * Call this method to set a property value instead of hashing into an |
| * OrderObject which would end up calling setProperty(). |
| * |
| * Updates the specified property on the proxied object. |
| * |
| * @param name Object containing the name of the property that should be |
| * updated on the proxied object. |
| * |
| * @param value Value that should be set on the proxied object. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| object_proxy function setObjectProperty(name:*, value:*):void |
| { |
| setProperty(name, value); |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Overridden methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * Returns the specified property value of the proxied object. |
| * |
| * @param name Typically a string containing the name of the property, or |
| * possibly a QName where the property name is found by inspecting the |
| * <code>localName</code> property. |
| * |
| * @return The value of the property. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function getProperty(name:*):* |
| { |
| // if we have a data proxy for this then |
| var result:Object = null; |
| |
| result = _item[name]; |
| |
| return result; |
| } |
| |
| /** |
| * Returns the value of the proxied object's method with the specified |
| * name. |
| * |
| * @param name The name of the method being invoked. |
| * @param rest An array specifying the arguments to the called method. |
| * |
| * @return The return value of the called method. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function callProperty(name:*, ... rest):* |
| { |
| return _item[name].apply(_item, rest) |
| } |
| |
| /** |
| * Deletes the specified property on the proxied object. |
| * |
| * @param name Typically a string containing the name of the property, |
| * or possibly a QName where the property name is found by |
| * inspecting the <code>localName</code> property. |
| * |
| * @return A Boolean indicating if the property was deleted. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function deleteProperty(name:*):Boolean |
| { |
| var oldVal:Object = _item[name]; |
| var deleted:Boolean = delete _item[name]; |
| |
| var deleteIndex:int = -1; |
| for (var i:int = 0; i < propertyList.length; i++) |
| { |
| if (propertyList[i] == name) |
| { |
| deleteIndex = i; |
| break; |
| } |
| } |
| if (deleteIndex > -1) |
| { |
| propertyList.splice(deleteIndex, 1); |
| } |
| |
| return deleted; |
| } |
| |
| /** |
| * This is an internal function that must be implemented by a subclass of |
| * flash.utils.Proxy. |
| * |
| * @param name The property name that should be tested for existence. |
| * |
| * @return If the property exists, <code>true</code>; otherwise |
| * <code>false</code>. |
| * |
| * @see flash.utils.Proxy#hasProperty() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function hasProperty(name:*):Boolean |
| { |
| return(name in _item); |
| } |
| |
| /** |
| * This is an internal function that must be implemented by a subclass of |
| * flash.utils.Proxy. |
| * |
| * @param index The zero-based index value of the object's property. |
| * |
| * @return The property's name. |
| * |
| * @see flash.utils.Proxy#nextName() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function nextName(index:int):String |
| { |
| return propertyList[index -1]; |
| } |
| |
| /** |
| * This is an internal function that must be implemented by a subclass of |
| * flash.utils.Proxy. |
| * |
| * @see flash.utils.Proxy#nextNameIndex() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function nextNameIndex(index:int):int |
| { |
| if (index < propertyList.length) |
| { |
| return index + 1; |
| } |
| else |
| { |
| return 0; |
| } |
| } |
| |
| /** |
| * This is an internal function that must be implemented by a subclass of |
| * flash.utils.Proxy. |
| * |
| * @param index The zero-based index value of the object's property. |
| * |
| * @return The property's value. |
| * |
| * @see flash.utils.Proxy#nextValue() |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function nextValue(index:int):* |
| { |
| return _item[propertyList[index -1]]; |
| } |
| |
| /** |
| * Updates the specified property on the proxied object. |
| * |
| * @param name Object containing the name of the property that should be |
| * updated on the proxied object. |
| * |
| * @param value Value that should be set on the proxied object. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 9 |
| * @playerversion AIR 1.1 |
| * @productversion Flex 3 |
| */ |
| override flash_proxy function setProperty(name:*, value:*):void |
| { |
| var oldVal:* = _item[name]; |
| if (oldVal !== value) |
| { |
| // Update item. |
| _item[name] = value; |
| |
| for (var i:int = 0; i < propertyList.length; i++) |
| { |
| if (propertyList[i] == name) |
| { |
| return; |
| } |
| } |
| propertyList.push(name); |
| } |
| } |
| |
| } |
| |
| } |