/* * @author Galaburda Oleg a_[w] * http://actualwave.com/ * */ package aw.xml.cover{ import aw.events.XMLEvent; import aw.utils.object_utils; import aw.xml.XMLCover; import aw.xml.XMLNotifier; import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.utils.Proxy; import flash.utils.flash_proxy; [Event(name="attributeAdded", type="aw.events.XMLEvent")] [Event(name="attributeChanged", type="aw.events.XMLEvent")] [Event(name="attributeRemoved", type="aw.events.XMLEvent")] [Event(name="nodeAdded", type="aw.events.XMLEvent")] [Event(name="nodeChanged", type="aw.events.XMLEvent")] [Event(name="nodeRemoved", type="aw.events.XMLEvent")] [Event(name="namespaceAdded", type="aw.events.XMLEvent")] [Event(name="namespaceRemoved", type="aw.events.XMLEvent")] [Event(name="namespaceSet", type="aw.events.XMLEvent")] [Event(name="textSet", type="aw.events.XMLEvent")] [Event(name="nameSet", type="aw.events.XMLEvent")] [Event(name="changed", type="aw.events.XMLEvent")] dynamic public class XMLCoverProxy extends Proxy{ static public const ADD_NAMESPACE_METHOD:String = 'addNamespace'; static public const APPEND_CHILD_METHOD:String = 'appendChild'; static public const ATTRIBUTE_METHOD:String = 'attribute'; static public const ATTRIBUTES_METHOD:String = 'attributes'; static public const CHILD_METHOD:String = 'child'; static public const CHILD_INDEX_METHOD:String = 'childIndex'; static public const CHILDREN_METHOD:String = 'children'; static public const COMMENTS_METHOD:String = 'comments'; static public const CONTAINS_METHOD:String = 'contains'; static public const COPY_METHOD:String = 'copy'; static public const DEFAULT_SETTINGS_METHOD:String = 'defaultSettings'; static public const DESCENDANTS_METHOD:String = 'descendants'; static public const ELEMENTS_METHOD:String = 'elements'; static public const HAS_COMPLEX_CONTENT_METHOD:String = 'hasComplexContent'; static public const HAS_OWN_PROPERTY_METHOD:String = 'hasOwnProperty'; static public const HAS_SIMPLE_CONTENT_METHOD:String = 'hasSimpleContent'; static public const IN_SCOPE_NAMESPACES_METHOD:String = 'inScopeNamespaces'; static public const INSERT_CHILD_AFTER_METHOD:String = 'insertChildAfter'; static public const INSERT_CHILD_BEFORE_METHOD:String = 'insertChildBefore'; static public const IS_PROTOTYPE_OF_METHOD:String = 'isPrototypeOf'; static public const LENGTH_METHOD:String = 'length'; static public const LOCAL_NAME_METHOD:String = 'localName'; static public const NAME_METHOD:String = 'name'; static public const NAMESPACE_METHOD:String = 'namespace'; static public const NAMESPACE_DECLARATIONS_METHOD:String = 'namespaceDeclarations'; static public const NODE_KIND_METHOD:String = 'nodeKind'; static public const NORMALIZE_METHOD:String = 'normalize'; static public const PARENT_METHOD:String = 'parent'; static public const PREPEND_CHILD_METHOD:String = 'prependChild'; static public const PROCESSING_INSTRUCTIONS_METHOD:String = 'processingInstructions'; static public const PROPERTY_IS_ENUMERABLE_METHOD:String = 'propertyIsEnumerable'; static public const REMOVE_NAMESPACE_METHOD:String = 'removeNamespace'; static public const REPLACE_METHOD:String = 'replace'; static public const SET_CHILDREN_METHOD:String = 'setChildren'; static public const SET_LOCAL_NAME_METHOD:String = 'setLocalName'; static public const SET_NAME_METHOD:String = 'setName'; static public const SET_NAMESPACE_METHOD:String = 'setNamespace'; static public const SET_SETTINGS_METHOD:String = 'setSettings'; static public const SETTINGS_METHOD:String = 'settings'; static public const TEXT_METHOD:String = 'text'; static public const TO_STRING_METHOD:String = 'toString'; static public const TO_XML_STRING_METHOD:String = 'toXMLString'; static public const VALUE_OF_METHOD:String = 'valueOf'; protected var _createTree:Boolean; protected var _object:Object; public function XMLCoverProxy(obj:Object, cTree:Boolean=true):void{ super(); _object = obj; _createTree = cTree; } object_utils function set createTree(p:Boolean):void{ this._createTree = p; } object_utils function get createTree():Boolean{ return this._createTree; } override flash_proxy function callProperty(name:*, ... rest):*{ var val:*; if(!(name is QName) || !name.uri){ var lname:String = name is QName ? name.localName : String(name); var len:int = rest.length; var farg:* = len>0 ? rest[0] : null; if(lname==PARENT_METHOD){ val = this._object.parent(); }else if(lname==TEXT_METHOD){ val = this._object.text(); }else if(lname==APPEND_CHILD_METHOD){ val = this._object.appendChild(farg); }else if(lname==ATTRIBUTE_METHOD){ val = this._object.attribute(farg); }else if(lname==ATTRIBUTES_METHOD){ val = this._object.attributes(); }else if(lname==CHILD_METHOD){ val = this._object.child(farg); }else if(lname==CHILD_INDEX_METHOD){ val = this._object.childIndex(); }else if(lname==CHILDREN_METHOD){ val = this._object.children(); }else if(lname==COMMENTS_METHOD){ val = this._object.comments(); }else if(lname==CONTAINS_METHOD){ val = this._object.contains(farg); }else if(lname==INSERT_CHILD_AFTER_METHOD){ val = this._object.insertChildAfter(farg, rest[1]); }else if(lname==INSERT_CHILD_BEFORE_METHOD){ val = this._object.insertChildBefore(farg, rest[1]); }else if(lname==TO_STRING_METHOD){ val = this._object.toString(); }else if(lname==TO_XML_STRING_METHOD){ val = this._object.toXMLString(); }else if(lname==ADD_NAMESPACE_METHOD){ val = this._object.addNamespace(farg); }else if(lname==COPY_METHOD){ val = this._object.copy(); }else if(lname==DESCENDANTS_METHOD){ val = len>0 ? this._object.descendants(farg) : this._object.descendants(); }else if(lname==ELEMENTS_METHOD){ val = len>0 ? this._object.elements(farg) : this._object.elements(); }else if(lname==HAS_COMPLEX_CONTENT_METHOD){ val = this._object.hasComplexContent(); }else if(lname==HAS_OWN_PROPERTY_METHOD){ val = this._object.hasOwnProperty(farg); }else if(lname==HAS_SIMPLE_CONTENT_METHOD){ val = this._object.hasSimpleContent(); }else if(lname==IN_SCOPE_NAMESPACES_METHOD){ val = this._object.inScopeNamespaces(); }else if(lname==IS_PROTOTYPE_OF_METHOD){ val = this._object.isPrototypeOf(farg); }else if(lname==LENGTH_METHOD){ val = this._object.length(); }else if(lname==LOCAL_NAME_METHOD){ val = this._object.localName(); }else if(lname==NAME_METHOD){ val = this._object.name(); }else if(lname==NAMESPACE_METHOD){ val = this._object.namespace(farg); }else if(lname==NAMESPACE_DECLARATIONS_METHOD){ val = this._object.namespaceDeclarations(); }else if(lname==NODE_KIND_METHOD){ val = this._object.nodeKind(); }else if(lname==NORMALIZE_METHOD){ val = this._object.normalize(); }else if(lname==PREPEND_CHILD_METHOD){ val = this._object.prependChild(farg); }else if(lname==PROCESSING_INSTRUCTIONS_METHOD){ val = len>0 ? this._object.processingInstructions(farg) : this._object.processingInstructions(); }else if(lname==PROPERTY_IS_ENUMERABLE_METHOD){ val = this._object.propertyIsEnumerable(farg); }else if(lname==REMOVE_NAMESPACE_METHOD){ val = this._object.removeNamespace(farg); }else if(lname==REPLACE_METHOD){ val = this._object.replace(farg, rest[1]); }else if(lname==SET_CHILDREN_METHOD){ val = this._object.setChildren(farg); }else if(lname==SET_LOCAL_NAME_METHOD){ val = this._object.setLocalName(farg); }else if(lname==SET_NAME_METHOD){ val = this._object.setName(farg); }else if(lname==SET_NAMESPACE_METHOD){ val = this._object.setNamespace(farg); }else if(lname==VALUE_OF_METHOD){ val = this._object.valueOf(); }else val = this.callUnknown(name, rest); }else val = this.callUnknown(name, rest); if(this._createTree){ if(val is XML) val = this.createCover(val as XML); else if(val is XMLList) val = this.createCoverList(val as XMLList); } return val; } protected function callUnknown(name:*, args:Array):*{ var val:* = flash_proxy::isAttribute(name) ? this._object.@[name] : this._object[name]; if(val is Function) val = (val as Function).apply(this._object, args); return val; } override flash_proxy function deleteProperty(name:*):Boolean{ return flash_proxy::isAttribute(name) ? delete this._object.@[name] : delete this._object[name]; } override flash_proxy function getDescendants(name:*):*{ return this._createTree ? this.createCoverList(this._object.descendants(name)) : this._object.descendants(name); } override flash_proxy function getProperty(name:*):*{ var val:* = flash_proxy::isAttribute(name) ? this._object.@[name] : this._object[name]; if(this._createTree){ if(val is XML) val = this.createCover(val as XML); else if(val is XMLList) val = this.createCoverList(val as XMLList); } return val; } override flash_proxy function hasProperty(name:*):Boolean{ return name in this._object; } override flash_proxy function setProperty(name:*, value:*):void{ if(flash_proxy::isAttribute(name)){ this._object.@[name] = value; }else{ this._object[name] = value; } } override flash_proxy function nextName(index:int):String{ return this.nextName(index); } override flash_proxy function nextNameIndex(index:int):int{ return this.nextNameIndex(index); } override flash_proxy function nextValue(index:int):*{ return this.nextValue(index); } protected function nextName(index:int):String{ return '0'; } protected function nextNameIndex(index:int):int{ return 0; } protected function nextValue(index:int):*{ return null; } protected function createCover(xml:XML):XMLCover{ return xml===this._object ? this as XMLCover : new XMLCover(xml, this._createTree); } protected function createCoverList(list:XMLList):XMLCoverList{ return list===this._object ? this as XMLCoverList : new XMLCoverList(list, this._createTree); } } }