home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2012 April / ME_04_2012.iso / Video-Tutorial / iPhoto / media / player.swf / scripts / mx / controls / Tree.as < prev    next >
Encoding:
Text File  |  2011-11-11  |  80.9 KB  |  2,331 lines

  1. package mx.controls
  2. {
  3.    import flash.display.DisplayObject;
  4.    import flash.display.Graphics;
  5.    import flash.display.Shape;
  6.    import flash.display.Sprite;
  7.    import flash.events.Event;
  8.    import flash.events.KeyboardEvent;
  9.    import flash.events.MouseEvent;
  10.    import flash.geom.Point;
  11.    import flash.geom.Rectangle;
  12.    import flash.ui.Keyboard;
  13.    import flash.xml.XMLNode;
  14.    import mx.collections.ArrayCollection;
  15.    import mx.collections.CursorBookmark;
  16.    import mx.collections.ICollectionView;
  17.    import mx.collections.IViewCursor;
  18.    import mx.collections.ItemResponder;
  19.    import mx.collections.XMLListCollection;
  20.    import mx.collections.errors.ItemPendingError;
  21.    import mx.controls.listClasses.BaseListData;
  22.    import mx.controls.listClasses.IDropInListItemRenderer;
  23.    import mx.controls.listClasses.IListItemRenderer;
  24.    import mx.controls.listClasses.ListBaseSelectionDataPending;
  25.    import mx.controls.listClasses.ListRowInfo;
  26.    import mx.controls.treeClasses.DefaultDataDescriptor;
  27.    import mx.controls.treeClasses.HierarchicalCollectionView;
  28.    import mx.controls.treeClasses.HierarchicalViewCursor;
  29.    import mx.controls.treeClasses.ITreeDataDescriptor;
  30.    import mx.controls.treeClasses.ITreeDataDescriptor2;
  31.    import mx.controls.treeClasses.TreeItemRenderer;
  32.    import mx.controls.treeClasses.TreeListData;
  33.    import mx.core.ClassFactory;
  34.    import mx.core.EdgeMetrics;
  35.    import mx.core.EventPriority;
  36.    import mx.core.FlexShape;
  37.    import mx.core.FlexSprite;
  38.    import mx.core.IFlexDisplayObject;
  39.    import mx.core.IIMESupport;
  40.    import mx.core.IInvalidating;
  41.    import mx.core.UIComponent;
  42.    import mx.core.UIComponentGlobals;
  43.    import mx.core.mx_internal;
  44.    import mx.effects.Tween;
  45.    import mx.events.CollectionEvent;
  46.    import mx.events.CollectionEventKind;
  47.    import mx.events.DragEvent;
  48.    import mx.events.ListEvent;
  49.    import mx.events.ListEventReason;
  50.    import mx.events.ScrollEvent;
  51.    import mx.events.TreeEvent;
  52.    import mx.managers.DragManager;
  53.    
  54.    use namespace mx_internal;
  55.    
  56.    public class Tree extends List implements IIMESupport
  57.    {
  58.       mx_internal static var createAccessibilityImplementation:Function;
  59.       
  60.       mx_internal static const VERSION:String = "4.5.0.20967";
  61.       
  62.       private var IS_NEW_ROW_STYLE:Object = {
  63.          "depthColors":true,
  64.          "indentation":true,
  65.          "disclosureOpenIcon":true,
  66.          "disclosureClosedIcon":true,
  67.          "folderOpenIcon":true,
  68.          "folderClosedIcon":true,
  69.          "defaultLeafIcon":true
  70.       };
  71.       
  72.       private var opening:Boolean;
  73.       
  74.       private var tween:Object;
  75.       
  76.       private var maskList:Array;
  77.       
  78.       private var _userMaxHorizontalScrollPosition:Number = 0;
  79.       
  80.       private var eventPending:Object;
  81.       
  82.       private var eventAfterTween:Object;
  83.       
  84.       private var oldLength:int = -1;
  85.       
  86.       private var expandedItem:Object;
  87.       
  88.       private var bSelectedItemRemoved:Boolean = false;
  89.       
  90.       private var minScrollInterval:Number = 50;
  91.       
  92.       private var rowNameID:Number = 0;
  93.       
  94.       private var _editable:Boolean = false;
  95.       
  96.       private var dontEdit:Boolean = false;
  97.       
  98.       private var lastUserInteraction:Event;
  99.       
  100.       mx_internal var _dropData:Object;
  101.       
  102.       public var itemIcons:Object;
  103.       
  104.       mx_internal var isOpening:Boolean = false;
  105.       
  106.       private var rowIndex:int;
  107.       
  108.       private var rowsTweened:int;
  109.       
  110.       private var rowList:Array;
  111.       
  112.       mx_internal var collectionLength:int;
  113.       
  114.       mx_internal var wrappedCollection:ICollectionView;
  115.       
  116.       mx_internal var collectionThrowsIPE:Boolean;
  117.       
  118.       private var haveItemIndices:Boolean;
  119.       
  120.       private var lastTreeSeekPending:TreeSeekPending;
  121.       
  122.       private var bFinishArrowKeySelection:Boolean = false;
  123.       
  124.       private var proposedSelectedItem:Object;
  125.       
  126.       private var dataProviderChanged:Boolean = false;
  127.       
  128.       private var _dragMoveEnabled:Boolean = true;
  129.       
  130.       mx_internal var _dataDescriptor:ITreeDataDescriptor = new DefaultDataDescriptor();
  131.       
  132.       mx_internal var _showRoot:Boolean = true;
  133.       
  134.       mx_internal var showRootChanged:Boolean = false;
  135.       
  136.       mx_internal var _hasRoot:Boolean = false;
  137.       
  138.       mx_internal var _rootModel:ICollectionView;
  139.       
  140.       private var _openItems:Object = {};
  141.       
  142.       private var openItemsChanged:Boolean = false;
  143.       
  144.       public function Tree()
  145.       {
  146.          super();
  147.          itemRenderer = new ClassFactory(TreeItemRenderer);
  148.          editorXOffset = 12;
  149.          editorWidthOffset = -12;
  150.          addEventListener(TreeEvent.ITEM_OPENING,this.mx_internal::expandItemHandler,false,EventPriority.DEFAULT_HANDLER);
  151.       }
  152.       
  153.       [Bindable("collectionChange")]
  154.       override public function set dataProvider(param1:Object) : void
  155.       {
  156.          var _loc2_:XMLList = null;
  157.          var _loc3_:Array = null;
  158.          if(this.mx_internal::_rootModel)
  159.          {
  160.             this.mx_internal::_rootModel.removeEventListener(CollectionEvent.COLLECTION_CHANGE,this.collectionChangeHandler);
  161.          }
  162.          if(typeof param1 == "string")
  163.          {
  164.             param1 = new XML(param1);
  165.          }
  166.          else if(param1 is XMLNode)
  167.          {
  168.             param1 = new XML(XMLNode(param1).toString());
  169.          }
  170.          else if(param1 is XMLList)
  171.          {
  172.             param1 = new XMLListCollection(param1 as XMLList);
  173.          }
  174.          if(param1 is XML)
  175.          {
  176.             this.mx_internal::_hasRoot = true;
  177.             _loc2_ = new XMLList();
  178.             _loc2_ += param1;
  179.             this.mx_internal::_rootModel = new XMLListCollection(_loc2_);
  180.          }
  181.          else if(param1 is ICollectionView)
  182.          {
  183.             this.mx_internal::_rootModel = ICollectionView(param1);
  184.             if(this.mx_internal::_rootModel.length == 1)
  185.             {
  186.                this.mx_internal::_hasRoot = true;
  187.             }
  188.          }
  189.          else if(param1 is Array)
  190.          {
  191.             this.mx_internal::_rootModel = new ArrayCollection(param1 as Array);
  192.          }
  193.          else if(param1 is Object)
  194.          {
  195.             this.mx_internal::_hasRoot = true;
  196.             _loc3_ = [];
  197.             _loc3_.push(param1);
  198.             this.mx_internal::_rootModel = new ArrayCollection(_loc3_);
  199.          }
  200.          else
  201.          {
  202.             this.mx_internal::_rootModel = new ArrayCollection();
  203.          }
  204.          this.dataProviderChanged = true;
  205.          invalidateProperties();
  206.       }
  207.       
  208.       override public function get dataProvider() : Object
  209.       {
  210.          if(this.mx_internal::_rootModel)
  211.          {
  212.             return this.mx_internal::_rootModel;
  213.          }
  214.          return null;
  215.       }
  216.       
  217.       override public function get maxHorizontalScrollPosition() : Number
  218.       {
  219.          return this._userMaxHorizontalScrollPosition > 0 ? this._userMaxHorizontalScrollPosition : super.maxHorizontalScrollPosition;
  220.       }
  221.       
  222.       override public function set maxHorizontalScrollPosition(param1:Number) : void
  223.       {
  224.          this._userMaxHorizontalScrollPosition = param1;
  225.          param1 += this.getIndent();
  226.          super.maxHorizontalScrollPosition = param1;
  227.       }
  228.       
  229.       override public function get dragMoveEnabled() : Boolean
  230.       {
  231.          return this._dragMoveEnabled;
  232.       }
  233.       
  234.       override public function set dragMoveEnabled(param1:Boolean) : void
  235.       {
  236.          this._dragMoveEnabled = param1;
  237.       }
  238.       
  239.       [Bindable("firstVisibleItemChanged")]
  240.       public function get firstVisibleItem() : Object
  241.       {
  242.          if(listItems.length > 0 && listItems[0].length > 0)
  243.          {
  244.             return listItems[0][0].data;
  245.          }
  246.          return null;
  247.       }
  248.       
  249.       public function set firstVisibleItem(param1:Object) : void
  250.       {
  251.          var _loc2_:int = this.getItemIndex(param1);
  252.          if(_loc2_ < 0)
  253.          {
  254.             return;
  255.          }
  256.          verticalScrollPosition = Math.min(maxVerticalScrollPosition,_loc2_);
  257.          dispatchEvent(new Event("firstVisibleItemChanged"));
  258.       }
  259.       
  260.       public function set dataDescriptor(param1:ITreeDataDescriptor) : void
  261.       {
  262.          this.mx_internal::_dataDescriptor = param1;
  263.       }
  264.       
  265.       public function get dataDescriptor() : ITreeDataDescriptor
  266.       {
  267.          return ITreeDataDescriptor(this.mx_internal::_dataDescriptor);
  268.       }
  269.       
  270.       public function get showRoot() : Boolean
  271.       {
  272.          return this.mx_internal::_showRoot;
  273.       }
  274.       
  275.       public function set showRoot(param1:Boolean) : void
  276.       {
  277.          if(this.mx_internal::_showRoot != param1)
  278.          {
  279.             this.mx_internal::_showRoot = param1;
  280.             this.mx_internal::showRootChanged = true;
  281.             invalidateProperties();
  282.          }
  283.       }
  284.       
  285.       public function get hasRoot() : Boolean
  286.       {
  287.          return this.mx_internal::_hasRoot;
  288.       }
  289.       
  290.       public function get openItems() : Object
  291.       {
  292.          var _loc2_:* = undefined;
  293.          var _loc1_:Array = [];
  294.          for each(_loc2_ in this._openItems)
  295.          {
  296.             _loc1_.push(_loc2_);
  297.          }
  298.          return _loc1_;
  299.       }
  300.       
  301.       public function set openItems(param1:Object) : void
  302.       {
  303.          var _loc2_:String = null;
  304.          var _loc3_:* = undefined;
  305.          if(param1 != null)
  306.          {
  307.             for(_loc2_ in this._openItems)
  308.             {
  309.                delete this._openItems[_loc2_];
  310.             }
  311.             for each(_loc3_ in param1)
  312.             {
  313.                this._openItems[itemToUID(_loc3_)] = _loc3_;
  314.             }
  315.             this.openItemsChanged = true;
  316.             invalidateProperties();
  317.          }
  318.       }
  319.       
  320.       override protected function initializeAccessibility() : void
  321.       {
  322.          if(Tree.mx_internal::createAccessibilityImplementation != null)
  323.          {
  324.             Tree.mx_internal::createAccessibilityImplementation(this);
  325.          }
  326.       }
  327.       
  328.       override protected function commitProperties() : void
  329.       {
  330.          var _loc1_:ICollectionView = null;
  331.          var _loc2_:* = undefined;
  332.          if(this.mx_internal::showRootChanged)
  333.          {
  334.             if(!this.mx_internal::_hasRoot)
  335.             {
  336.                this.mx_internal::showRootChanged = false;
  337.             }
  338.          }
  339.          if(this.dataProviderChanged || this.mx_internal::showRootChanged || this.openItemsChanged)
  340.          {
  341.             this.dataProviderChanged = false;
  342.             this.mx_internal::showRootChanged = false;
  343.             if(!this.openItemsChanged)
  344.             {
  345.                this._openItems = {};
  346.             }
  347.             this.openItemsChanged = false;
  348.             if(this.mx_internal::_rootModel && !this.mx_internal::_showRoot && this.mx_internal::_hasRoot)
  349.             {
  350.                _loc2_ = this.mx_internal::_rootModel.createCursor().current;
  351.                if(_loc2_ != null && this.mx_internal::_dataDescriptor.isBranch(_loc2_,this.mx_internal::_rootModel) && this.mx_internal::_dataDescriptor.hasChildren(_loc2_,this.mx_internal::_rootModel))
  352.                {
  353.                   _loc1_ = this.mx_internal::getChildren(_loc2_,this.mx_internal::_rootModel);
  354.                }
  355.             }
  356.             if(this.mx_internal::_rootModel)
  357.             {
  358.                super.dataProvider = this.mx_internal::wrappedCollection = this.mx_internal::_dataDescriptor is ITreeDataDescriptor2 ? ITreeDataDescriptor2(this.mx_internal::_dataDescriptor).getHierarchicalCollectionAdaptor(_loc1_ != null ? _loc1_ : this.mx_internal::_rootModel,itemToUID,this._openItems) : new HierarchicalCollectionView(_loc1_ != null ? _loc1_ : this.mx_internal::_rootModel,this.mx_internal::_dataDescriptor,itemToUID,this._openItems);
  359.                this.mx_internal::wrappedCollection.addEventListener(CollectionEvent.COLLECTION_CHANGE,this.collectionChangeHandler,false,EventPriority.DEFAULT_HANDLER,true);
  360.             }
  361.             else
  362.             {
  363.                super.dataProvider = null;
  364.             }
  365.          }
  366.          super.commitProperties();
  367.       }
  368.       
  369.       override protected function updateDisplayList(param1:Number, param2:Number) : void
  370.       {
  371.          if(this.tween)
  372.          {
  373.             this.tween.endTween();
  374.          }
  375.          super.updateDisplayList(param1,param2);
  376.          if(collection)
  377.          {
  378.             this.mx_internal::collectionLength = collection.length;
  379.          }
  380.       }
  381.       
  382.       override public function styleChanged(param1:String) : void
  383.       {
  384.          if(param1 == null || param1 == "styleName" || Boolean(this.IS_NEW_ROW_STYLE[param1]))
  385.          {
  386.             itemsSizeChanged = true;
  387.             invalidateDisplayList();
  388.          }
  389.          super.styleChanged(param1);
  390.       }
  391.       
  392.       override public function showDropFeedback(param1:DragEvent) : void
  393.       {
  394.          var _loc5_:int = 0;
  395.          super.showDropFeedback(param1);
  396.          var _loc2_:EdgeMetrics = viewMetrics;
  397.          var _loc3_:int = 0;
  398.          this.updateDropData(param1);
  399.          var _loc4_:int = 0;
  400.          if(this.mx_internal::_dropData.parent)
  401.          {
  402.             _loc3_ = this.getItemIndex(iterator.current);
  403.             _loc5_ = this.mx_internal::getItemDepth(this.mx_internal::_dropData.parent,Math.abs(_loc3_ - this.getItemIndex(this.mx_internal::_dropData.parent)));
  404.             _loc4_ = (_loc5_ + 1) * getStyle("indentation");
  405.          }
  406.          else
  407.          {
  408.             _loc4_ = getStyle("indentation");
  409.          }
  410.          if(_loc4_ < 0)
  411.          {
  412.             _loc4_ = 0;
  413.          }
  414.          mx_internal::dropIndicator.width = listContent.width - _loc4_;
  415.          mx_internal::dropIndicator.x = _loc4_ + _loc2_.left + 2;
  416.          if(this.mx_internal::_dropData.emptyFolder)
  417.          {
  418.             mx_internal::dropIndicator.y += this.mx_internal::_dropData.rowHeight / 2;
  419.          }
  420.       }
  421.       
  422.       override public function calculateDropIndex(param1:DragEvent = null) : int
  423.       {
  424.          if(param1)
  425.          {
  426.             this.updateDropData(param1);
  427.          }
  428.          return this.mx_internal::_dropData.rowIndex;
  429.       }
  430.       
  431.       override protected function addDragData(param1:Object) : void
  432.       {
  433.          param1.addHandler(this.collapseSelectedItems,"treeItems");
  434.       }
  435.       
  436.       override mx_internal function addClipMask(param1:Boolean) : void
  437.       {
  438.          var _loc2_:EdgeMetrics = viewMetrics;
  439.          if(Boolean(horizontalScrollBar) && horizontalScrollBar.visible)
  440.          {
  441.             _loc2_.bottom -= horizontalScrollBar.minHeight;
  442.          }
  443.          if(Boolean(verticalScrollBar) && verticalScrollBar.visible)
  444.          {
  445.             _loc2_.right -= verticalScrollBar.minWidth;
  446.          }
  447.          listContent.scrollRect = new Rectangle(0,0,unscaledWidth - _loc2_.left - _loc2_.right,listContent.heightExcludingOffsets);
  448.       }
  449.       
  450.       override mx_internal function removeClipMask() : void
  451.       {
  452.       }
  453.       
  454.       override protected function makeListData(param1:Object, param2:String, param3:int) : BaseListData
  455.       {
  456.          var _loc4_:TreeListData = new TreeListData(itemToLabel(param1),param2,this,param3);
  457.          this.initListData(param1,_loc4_);
  458.          return _loc4_;
  459.       }
  460.       
  461.       override public function itemToIcon(param1:Object) : Class
  462.       {
  463.          var _loc2_:* = undefined;
  464.          if(param1 == null)
  465.          {
  466.             return null;
  467.          }
  468.          var _loc3_:Boolean = this.isItemOpen(param1);
  469.          var _loc4_:Boolean = this.isBranch(param1);
  470.          var _loc5_:String = itemToUID(param1);
  471.          var _loc6_:Class = Boolean(this.itemIcons) && Boolean(this.itemIcons[_loc5_]) ? this.itemIcons[_loc5_][_loc3_ ? "iconID2" : "iconID"] : null;
  472.          if(_loc6_)
  473.          {
  474.             return _loc6_;
  475.          }
  476.          if(iconFunction != null)
  477.          {
  478.             return iconFunction(param1);
  479.          }
  480.          if(_loc4_)
  481.          {
  482.             return getStyle(_loc3_ ? "folderOpenIcon" : "folderClosedIcon");
  483.          }
  484.          if(param1 is XML)
  485.          {
  486.             try
  487.             {
  488.                if(param1[iconField].length() != 0)
  489.                {
  490.                   _loc2_ = String(param1[iconField]);
  491.                }
  492.             }
  493.             catch(e:Error)
  494.             {
  495.             }
  496.          }
  497.          else if(param1 is Object)
  498.          {
  499.             try
  500.             {
  501.                if(Boolean(iconField) && Boolean(param1[iconField]))
  502.                {
  503.                   _loc2_ = param1[iconField];
  504.                }
  505.                else if(param1.icon)
  506.                {
  507.                   _loc2_ = param1.icon;
  508.                }
  509.             }
  510.             catch(e:Error)
  511.             {
  512.             }
  513.          }
  514.          if(_loc2_ == null)
  515.          {
  516.             _loc2_ = getStyle("defaultLeafIcon");
  517.          }
  518.          if(_loc2_ is Class)
  519.          {
  520.             return _loc2_;
  521.          }
  522.          if(_loc2_ is String)
  523.          {
  524.             _loc6_ = Class(systemManager.getDefinitionByName(String(_loc2_)));
  525.             if(_loc6_)
  526.             {
  527.                return _loc6_;
  528.             }
  529.             return document[_loc2_];
  530.          }
  531.          return Class(_loc2_);
  532.       }
  533.       
  534.       override protected function drawRowBackgrounds() : void
  535.       {
  536.          var _loc2_:* = undefined;
  537.          var _loc3_:Array = null;
  538.          var _loc8_:int = 0;
  539.          var _loc9_:Object = null;
  540.          var _loc10_:int = 0;
  541.          var _loc11_:uint = 0;
  542.          var _loc1_:Sprite = Sprite(listContent.getChildByName("rowBGs"));
  543.          if(!_loc1_)
  544.          {
  545.             _loc1_ = new FlexSprite();
  546.             _loc1_.name = "rowBGs";
  547.             _loc1_.mouseEnabled = false;
  548.             listContent.addChildAt(_loc1_,0);
  549.          }
  550.          var _loc4_:Boolean = false;
  551.          _loc3_ = getStyle("depthColors");
  552.          if(_loc3_)
  553.          {
  554.             _loc4_ = true;
  555.          }
  556.          else
  557.          {
  558.             _loc9_ = getStyle("alternatingItemColors");
  559.             if(_loc9_)
  560.             {
  561.                _loc3_ = _loc9_ is Array ? _loc9_ as Array : [_loc9_];
  562.             }
  563.          }
  564.          _loc2_ = getStyle("backgroundColor");
  565.          if(_loc2_ === undefined)
  566.          {
  567.             _loc2_ = 16777215;
  568.          }
  569.          if(!_loc3_ || _loc3_.length == 0)
  570.          {
  571.             while(_loc1_.numChildren > _loc8_)
  572.             {
  573.                _loc1_.removeChildAt(_loc1_.numChildren - 1);
  574.             }
  575.             return;
  576.          }
  577.          styleManager.getColorNames(_loc3_);
  578.          var _loc5_:int = 0;
  579.          var _loc6_:int = verticalScrollPosition;
  580.          var _loc7_:int = 0;
  581.          _loc8_ = int(listItems.length);
  582.          while(_loc5_ < _loc8_)
  583.          {
  584.             if(_loc4_)
  585.             {
  586.                try
  587.                {
  588.                   if(listItems[_loc5_][0])
  589.                   {
  590.                      _loc10_ = this.mx_internal::getItemDepth(listItems[_loc5_][0].data,_loc5_);
  591.                      _loc11_ = !!_loc3_[_loc10_ - 1] ? uint(_loc3_[_loc10_ - 1]) : uint(_loc2_);
  592.                      drawRowBackground(_loc1_,_loc7_++,rowInfo[_loc5_].y,rowInfo[_loc5_].height,_loc11_,_loc5_);
  593.                   }
  594.                   else
  595.                   {
  596.                      drawRowBackground(_loc1_,_loc7_++,rowInfo[_loc5_].y,rowInfo[_loc5_].height,uint(_loc2_),_loc5_);
  597.                   }
  598.                }
  599.                catch(e:Error)
  600.                {
  601.                }
  602.             }
  603.             else
  604.             {
  605.                drawRowBackground(_loc1_,_loc7_++,rowInfo[_loc5_].y,rowInfo[_loc5_].height,_loc3_[_loc6_ % _loc3_.length],_loc6_);
  606.             }
  607.             _loc5_++;
  608.             _loc6_++;
  609.          }
  610.          while(_loc1_.numChildren > _loc8_)
  611.          {
  612.             _loc1_.removeChildAt(_loc1_.numChildren - 1);
  613.          }
  614.       }
  615.       
  616.       public function setItemIcon(param1:Object, param2:Class, param3:Class) : void
  617.       {
  618.          if(!this.itemIcons)
  619.          {
  620.             this.itemIcons = {};
  621.          }
  622.          if(!param3)
  623.          {
  624.             param3 = param2;
  625.          }
  626.          this.itemIcons[itemToUID(param1)] = {
  627.             "iconID":param2,
  628.             "iconID2":param3
  629.          };
  630.          itemsSizeChanged = true;
  631.          invalidateDisplayList();
  632.       }
  633.       
  634.       private function isBranch(param1:Object) : Boolean
  635.       {
  636.          if(param1 != null)
  637.          {
  638.             return this.mx_internal::_dataDescriptor.isBranch(param1,iterator.view);
  639.          }
  640.          return false;
  641.       }
  642.       
  643.       mx_internal function getChildren(param1:Object, param2:Object) : ICollectionView
  644.       {
  645.          return this.mx_internal::_dataDescriptor.getChildren(param1,param2);
  646.       }
  647.       
  648.       mx_internal function getItemDepth(param1:Object, param2:int) : int
  649.       {
  650.          if(!collection)
  651.          {
  652.             return 0;
  653.          }
  654.          if(!iterator)
  655.          {
  656.             listContent.iterator = collection.createCursor();
  657.          }
  658.          if(iterator.current == param1)
  659.          {
  660.             return this.getCurrentCursorDepth();
  661.          }
  662.          var _loc3_:CursorBookmark = iterator.bookmark;
  663.          iterator.seek(_loc3_,param2);
  664.          var _loc4_:int = this.getCurrentCursorDepth();
  665.          iterator.seek(_loc3_,0);
  666.          return _loc4_;
  667.       }
  668.       
  669.       private function getCurrentCursorDepth() : int
  670.       {
  671.          if(this.mx_internal::_dataDescriptor is ITreeDataDescriptor2)
  672.          {
  673.             return ITreeDataDescriptor2(this.mx_internal::_dataDescriptor).getNodeDepth(iterator.current,iterator,this.mx_internal::_rootModel);
  674.          }
  675.          return HierarchicalViewCursor(iterator).currentDepth;
  676.       }
  677.       
  678.       private function getVisibleChildrenCount(param1:Object) : int
  679.       {
  680.          var _loc4_:Object = null;
  681.          var _loc5_:IViewCursor = null;
  682.          var _loc2_:int = 0;
  683.          if(param1 == null)
  684.          {
  685.             return _loc2_;
  686.          }
  687.          var _loc3_:String = itemToUID(param1);
  688.          if(this._openItems[_loc3_] && this.mx_internal::_dataDescriptor.isBranch(param1,iterator.view) && this.mx_internal::_dataDescriptor.hasChildren(param1,iterator.view))
  689.          {
  690.             _loc4_ = this.mx_internal::getChildren(param1,iterator.view);
  691.          }
  692.          if(_loc4_ != null)
  693.          {
  694.             _loc5_ = _loc4_.createCursor();
  695.             while(!_loc5_.afterLast)
  696.             {
  697.                _loc2_++;
  698.                _loc3_ = itemToUID(_loc5_.current);
  699.                if(this._openItems[_loc3_])
  700.                {
  701.                   _loc2_ += this.getVisibleChildrenCount(_loc5_.current);
  702.                }
  703.                _loc5_.moveNext();
  704.             }
  705.          }
  706.          return _loc2_;
  707.       }
  708.       
  709.       public function isItemOpen(param1:Object) : Boolean
  710.       {
  711.          var _loc2_:String = itemToUID(param1);
  712.          return this._openItems[_loc2_] != null;
  713.       }
  714.       
  715.       private function makeMask() : DisplayObject
  716.       {
  717.          var _loc1_:Shape = new FlexShape();
  718.          _loc1_.name = "mask";
  719.          var _loc2_:Graphics = _loc1_.graphics;
  720.          _loc2_.beginFill(16777215);
  721.          _loc2_.moveTo(0,0);
  722.          _loc2_.lineTo(0,10);
  723.          _loc2_.lineTo(10,10);
  724.          _loc2_.lineTo(10,0);
  725.          _loc2_.lineTo(0,0);
  726.          _loc2_.endFill();
  727.          listContent.addChild(_loc1_);
  728.          return _loc1_;
  729.       }
  730.       
  731.       public function expandItem(param1:Object, param2:Boolean, param3:Boolean = false, param4:Boolean = false, param5:Event = null) : void
  732.       {
  733.          var bSelected:Boolean;
  734.          var bHighlight:Boolean;
  735.          var bCaret:Boolean;
  736.          var uid:String;
  737.          var bookmark:CursorBookmark;
  738.          var event:CollectionEvent;
  739.          var rC:int;
  740.          var rowsToMove:int;
  741.          var dur:Number;
  742.          var i:int = 0;
  743.          var newRowIndex:int = 0;
  744.          var rowData:BaseListData = null;
  745.          var tmpMask:DisplayObject = null;
  746.          var tmpRowInfo:Object = null;
  747.          var row:Array = null;
  748.          var n:int = 0;
  749.          var eventArr:Array = null;
  750.          var renderer:IListItemRenderer = null;
  751.          var xx:Number = NaN;
  752.          var ww:Number = NaN;
  753.          var yy:Number = NaN;
  754.          var hh:Number = NaN;
  755.          var delta:int = 0;
  756.          var maxDist:Number = NaN;
  757.          var oE:Function = null;
  758.          var di:IDropInListItemRenderer = null;
  759.          var treeListData:TreeListData = null;
  760.          var data:Object = null;
  761.          var referenceRowInfo:ListRowInfo = null;
  762.          var rh:Number = NaN;
  763.          var more:Boolean = false;
  764.          var valid:Boolean = false;
  765.          var startY:Number = NaN;
  766.          var maskY:Number = NaN;
  767.          var maskX:Number = NaN;
  768.          var indicator:Object = null;
  769.          var item:Object = param1;
  770.          var open:Boolean = param2;
  771.          var animate:Boolean = param3;
  772.          var dispatchEvent:Boolean = param4;
  773.          var cause:Event = param5;
  774.          if(iterator == null)
  775.          {
  776.             return;
  777.          }
  778.          if(cause)
  779.          {
  780.             this.lastUserInteraction = cause;
  781.          }
  782.          this.expandedItem = item;
  783.          listContent.mx_internal::allowItemSizeChangeNotification = false;
  784.          bSelected = false;
  785.          bHighlight = false;
  786.          bCaret = false;
  787.          uid = itemToUID(item);
  788.          if(!this.isBranch(item) || this.isItemOpen(item) == open || this.mx_internal::isOpening)
  789.          {
  790.             return;
  791.          }
  792.          if(itemEditorInstance)
  793.          {
  794.             endEdit(ListEventReason.OTHER);
  795.          }
  796.          this.oldLength = this.mx_internal::collectionLength;
  797.          bookmark = iterator.bookmark;
  798.          event = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE,false,true,CollectionEventKind.mx_internal::EXPAND);
  799.          event.items = [item];
  800.          if(open)
  801.          {
  802.             this._openItems[uid] = item;
  803.             collection.dispatchEvent(event);
  804.             this.rowsTweened = Math.abs(this.oldLength - collection.length);
  805.          }
  806.          else
  807.          {
  808.             delete this._openItems[uid];
  809.             collection.dispatchEvent(event);
  810.             this.rowsTweened = Math.abs(this.oldLength - collection.length);
  811.          }
  812.          if(this.isItemVisible(item))
  813.          {
  814.             if(visibleData[uid])
  815.             {
  816.                n = int(listItems.length);
  817.                this.rowIndex = 0;
  818.                while(this.rowIndex < n)
  819.                {
  820.                   if(rowInfo[this.rowIndex].uid == uid)
  821.                   {
  822.                      ++this.rowIndex;
  823.                      break;
  824.                   }
  825.                   ++this.rowIndex;
  826.                }
  827.             }
  828.             rC = int(listItems.length);
  829.             rowsToMove = this.rowsTweened;
  830.             dur = getStyle("openDuration");
  831.             if(animate && this.rowIndex < rC && rowsToMove > 0 && rowsToMove < 20 && dur != 0)
  832.             {
  833.                if(this.tween)
  834.                {
  835.                   this.tween.endTween();
  836.                }
  837.                renderer = listItems[this.rowIndex - 1][0];
  838.                if(renderer is IDropInListItemRenderer)
  839.                {
  840.                   di = IDropInListItemRenderer(renderer);
  841.                   treeListData = TreeListData(di.listData);
  842.                   treeListData = TreeListData(this.makeListData(treeListData.item,treeListData.uid,treeListData.rowIndex));
  843.                   di.listData = treeListData;
  844.                   renderer.data = renderer.data;
  845.                }
  846.                this.opening = open;
  847.                this.mx_internal::isOpening = true;
  848.                this.maskList = [];
  849.                this.rowList = [];
  850.                xx = getStyle("paddingLeft") - horizontalScrollPosition;
  851.                ww = Number(renderer.width);
  852.                yy = 0;
  853.                delta = this.rowIndex;
  854.                maxDist = 0;
  855.                if(open)
  856.                {
  857.                   newRowIndex = this.rowIndex;
  858.                   maxDist = listContent.height - rowInfo[this.rowIndex].y;
  859.                   iterator.seek(CursorBookmark.CURRENT,delta);
  860.                   i = 0;
  861.                   while(i < rowsToMove && yy < maxDist)
  862.                   {
  863.                      data = iterator.current;
  864.                      if(freeItemRenderers.length)
  865.                      {
  866.                         renderer = freeItemRenderers.pop();
  867.                      }
  868.                      else
  869.                      {
  870.                         renderer = createItemRenderer(data);
  871.                         renderer.owner = this;
  872.                         renderer.styleName = listContent;
  873.                         listContent.addChild(DisplayObject(renderer));
  874.                      }
  875.                      uid = itemToUID(data);
  876.                      rowData = this.makeListData(data,uid,this.rowIndex + i);
  877.                      rowMap[renderer.name] = rowData;
  878.                      if(renderer is IDropInListItemRenderer)
  879.                      {
  880.                         IDropInListItemRenderer(renderer).listData = !!data ? rowData : null;
  881.                      }
  882.                      renderer.data = data;
  883.                      renderer.enabled = enabled;
  884.                      if(data)
  885.                      {
  886.                         visibleData[uid] = renderer;
  887.                         renderer.visible = true;
  888.                      }
  889.                      else
  890.                      {
  891.                         renderer.visible = false;
  892.                      }
  893.                      renderer.explicitWidth = ww;
  894.                      if(renderer is IInvalidating && (wordWrapChanged || variableRowHeight))
  895.                      {
  896.                         IInvalidating(renderer).invalidateSize();
  897.                      }
  898.                      UIComponentGlobals.mx_internal::layoutManager.validateClient(renderer,true);
  899.                      hh = Math.ceil(variableRowHeight ? renderer.getExplicitOrMeasuredHeight() + mx_internal::cachedPaddingTop + mx_internal::cachedPaddingBottom : rowHeight);
  900.                      rh = Number(renderer.getExplicitOrMeasuredHeight());
  901.                      renderer.setActualSize(ww,variableRowHeight ? rh : rowHeight - mx_internal::cachedPaddingTop - mx_internal::cachedPaddingBottom);
  902.                      renderer.move(xx,yy + mx_internal::cachedPaddingTop);
  903.                      bSelected = selectedData[uid] != null;
  904.                      bHighlight = highlightUID == uid;
  905.                      bCaret = caretUID == uid;
  906.                      tmpRowInfo = new ListRowInfo(yy,hh,uid,data);
  907.                      if(data)
  908.                      {
  909.                         drawItem(renderer,bSelected,bHighlight,bCaret);
  910.                      }
  911.                      yy += hh;
  912.                      rowInfo.splice(this.rowIndex + i,0,tmpRowInfo);
  913.                      row = [];
  914.                      row.push(renderer);
  915.                      listItems.splice(this.rowIndex + i,0,row);
  916.                      if(i < rowsToMove - 1)
  917.                      {
  918.                         try
  919.                         {
  920.                            iterator.moveNext();
  921.                         }
  922.                         catch(e:ItemPendingError)
  923.                         {
  924.                            rowsToMove = i + 1;
  925.                            break;
  926.                         }
  927.                      }
  928.                      i++;
  929.                   }
  930.                   this.rowsTweened = i;
  931.                   referenceRowInfo = rowInfo[this.rowIndex + this.rowsTweened];
  932.                   i = 0;
  933.                   while(i < this.rowsTweened)
  934.                   {
  935.                      renderer = listItems[this.rowIndex + i][0];
  936.                      renderer.move(renderer.x,renderer.y - (yy - referenceRowInfo.y));
  937.                      rowInfo[this.rowIndex + i].y -= yy - referenceRowInfo.y;
  938.                      tmpMask = this.makeMask();
  939.                      tmpMask.x = xx;
  940.                      tmpMask.y = referenceRowInfo.y;
  941.                      tmpMask.width = ww;
  942.                      tmpMask.height = yy;
  943.                      listItems[this.rowIndex + i][0].mask = tmpMask;
  944.                      i++;
  945.                   }
  946.                }
  947.                else
  948.                {
  949.                   more = true;
  950.                   valid = true;
  951.                   startY = yy = rowInfo[listItems.length - 1].y + rowInfo[listItems.length - 1].height;
  952.                   i = this.rowIndex;
  953.                   while(i < this.rowIndex + rowsToMove && i < rC)
  954.                   {
  955.                      maxDist += rowInfo[i].height;
  956.                      this.rowList.push({"item":listItems[i][0]});
  957.                      tmpMask = this.makeMask();
  958.                      tmpMask.x = xx;
  959.                      tmpMask.y = listItems[this.rowIndex][0].y;
  960.                      tmpMask.width = ww;
  961.                      tmpMask.height = maxDist;
  962.                      listItems[i][0].mask = tmpMask;
  963.                      i++;
  964.                   }
  965.                   rowsToMove = i - this.rowIndex;
  966.                   rowInfo.splice(this.rowIndex,rowsToMove);
  967.                   listItems.splice(this.rowIndex,rowsToMove);
  968.                   iterator.seek(CursorBookmark.CURRENT,listItems.length);
  969.                   more = iterator != null && !iterator.afterLast && iteratorValid;
  970.                   maxDist += yy;
  971.                   i = 0;
  972.                   while(i < rowsToMove && yy < maxDist)
  973.                   {
  974.                      uid = null;
  975.                      data = null;
  976.                      renderer = null;
  977.                      valid = more;
  978.                      data = more ? iterator.current : null;
  979.                      if(valid)
  980.                      {
  981.                         if(freeItemRenderers.length)
  982.                         {
  983.                            renderer = freeItemRenderers.pop();
  984.                         }
  985.                         else
  986.                         {
  987.                            renderer = createItemRenderer(data);
  988.                            renderer.owner = this;
  989.                            renderer.styleName = listContent;
  990.                            listContent.addChild(DisplayObject(renderer));
  991.                         }
  992.                         uid = itemToUID(data);
  993.                         rowData = this.makeListData(data,uid,rC - rowsToMove + i);
  994.                         rowMap[renderer.name] = rowData;
  995.                         if(renderer is IDropInListItemRenderer)
  996.                         {
  997.                            IDropInListItemRenderer(renderer).listData = !!data ? rowData : null;
  998.                         }
  999.                         renderer.data = data;
  1000.                         renderer.enabled = enabled;
  1001.                         if(data)
  1002.                         {
  1003.                            visibleData[uid] = renderer;
  1004.                            renderer.visible = true;
  1005.                         }
  1006.                         else
  1007.                         {
  1008.                            renderer.visible = false;
  1009.                         }
  1010.                         renderer.explicitWidth = ww;
  1011.                         if(renderer is IInvalidating && (wordWrapChanged || variableRowHeight))
  1012.                         {
  1013.                            IInvalidating(renderer).invalidateSize();
  1014.                         }
  1015.                         UIComponentGlobals.mx_internal::layoutManager.validateClient(renderer,true);
  1016.                         hh = Math.ceil(variableRowHeight ? renderer.getExplicitOrMeasuredHeight() + mx_internal::cachedPaddingTop + mx_internal::cachedPaddingBottom : rowHeight);
  1017.                         rh = Number(renderer.getExplicitOrMeasuredHeight());
  1018.                         renderer.setActualSize(ww,variableRowHeight ? rh : rowHeight - mx_internal::cachedPaddingTop - mx_internal::cachedPaddingBottom);
  1019.                         renderer.move(xx,yy + mx_internal::cachedPaddingTop);
  1020.                      }
  1021.                      else if(!variableRowHeight)
  1022.                      {
  1023.                         hh = this.rowIndex + i > 0 ? Number(rowInfo[this.rowIndex + i - 1].height) : rowHeight;
  1024.                      }
  1025.                      else if(this.rowList[i])
  1026.                      {
  1027.                         hh = Math.ceil(this.rowList[i].item.getExplicitOrMeasuredHeight() + mx_internal::cachedPaddingTop + mx_internal::cachedPaddingBottom);
  1028.                      }
  1029.                      else
  1030.                      {
  1031.                         hh = rowHeight;
  1032.                      }
  1033.                      bSelected = selectedData[uid] != null;
  1034.                      bHighlight = highlightUID == uid;
  1035.                      bCaret = caretUID == uid;
  1036.                      tmpRowInfo = new ListRowInfo(yy,hh,uid,data);
  1037.                      rowInfo.push(tmpRowInfo);
  1038.                      if(data)
  1039.                      {
  1040.                         drawItem(renderer,bSelected,bHighlight,bCaret);
  1041.                      }
  1042.                      yy += hh;
  1043.                      if(valid)
  1044.                      {
  1045.                         row = [];
  1046.                         row.push(renderer);
  1047.                         listItems.push(row);
  1048.                      }
  1049.                      else
  1050.                      {
  1051.                         listItems.push([]);
  1052.                      }
  1053.                      if(more)
  1054.                      {
  1055.                         try
  1056.                         {
  1057.                            more = iterator.moveNext();
  1058.                         }
  1059.                         catch(e:ItemPendingError)
  1060.                         {
  1061.                            more = false;
  1062.                         }
  1063.                      }
  1064.                      i++;
  1065.                   }
  1066.                   maskY = this.rowList[0].item.y - getStyle("paddingTop");
  1067.                   maskX = this.rowList[0].item.x - getStyle("paddingLeft");
  1068.                   i = 0;
  1069.                   while(i < this.rowList.length)
  1070.                   {
  1071.                      indicator = selectionIndicators[itemToUID(this.rowList[i].item.data)];
  1072.                      if(indicator)
  1073.                      {
  1074.                         tmpMask = this.makeMask();
  1075.                         tmpMask.x = maskX;
  1076.                         tmpMask.y = maskY;
  1077.                         tmpMask.width = this.rowList[i].item.width + getStyle("paddingLeft") + getStyle("paddingRight");
  1078.                         tmpMask.height = this.rowList[i].item.y + this.rowList[i].item.height + getStyle("paddingTop") + getStyle("paddingBottom") - maskY;
  1079.                         selectionIndicators[itemToUID(this.rowList[i].item.data)].mask = tmpMask;
  1080.                      }
  1081.                      i++;
  1082.                   }
  1083.                }
  1084.                iterator.seek(bookmark,0);
  1085.                rC = int(this.rowList.length);
  1086.                i = 0;
  1087.                while(i < rC)
  1088.                {
  1089.                   this.rowList[i].itemOldY = this.rowList[i].item.y;
  1090.                   i++;
  1091.                }
  1092.                rC = int(listItems.length);
  1093.                i = this.rowIndex;
  1094.                while(i < rC)
  1095.                {
  1096.                   if(listItems[i].length)
  1097.                   {
  1098.                      rowInfo[i].itemOldY = listItems[i][0].y;
  1099.                   }
  1100.                   rowInfo[i].oldY = rowInfo[i].y;
  1101.                   i++;
  1102.                }
  1103.                dur *= Math.max(rowsToMove / 5,1);
  1104.                if(dispatchEvent)
  1105.                {
  1106.                   this.eventAfterTween = item;
  1107.                }
  1108.                this.tween = new Tween(this,0,open ? yy : startY - yy,dur,5);
  1109.                oE = getStyle("openEasingFunction") as Function;
  1110.                if(oE != null)
  1111.                {
  1112.                   this.tween.easingFunction = oE;
  1113.                }
  1114.                UIComponent.suspendBackgroundProcessing();
  1115.                UIComponentGlobals.mx_internal::layoutManager.validateNow();
  1116.             }
  1117.             else
  1118.             {
  1119.                if(dispatchEvent)
  1120.                {
  1121.                   this.mx_internal::dispatchTreeEvent(open ? TreeEvent.ITEM_OPEN : TreeEvent.ITEM_CLOSE,item,visibleData[itemToUID(item)],this.lastUserInteraction);
  1122.                   this.lastUserInteraction = null;
  1123.                }
  1124.                itemsSizeChanged = true;
  1125.                invalidateDisplayList();
  1126.             }
  1127.             if(!wordWrap && initialized)
  1128.             {
  1129.                super.maxHorizontalScrollPosition = this._userMaxHorizontalScrollPosition > 0 ? this._userMaxHorizontalScrollPosition + this.getIndent() : super.maxHorizontalScrollPosition;
  1130.             }
  1131.             listContent.mx_internal::allowItemSizeChangeNotification = variableRowHeight;
  1132.             return;
  1133.          }
  1134.          eventArr = open ? this.buildUpCollectionEvents(true) : this.buildUpCollectionEvents(false);
  1135.          i = 0;
  1136.          while(i < eventArr.length)
  1137.          {
  1138.             collection.dispatchEvent(eventArr[i]);
  1139.             i++;
  1140.          }
  1141.       }
  1142.       
  1143.       mx_internal function onTweenUpdate(param1:Object) : void
  1144.       {
  1145.          var _loc2_:IFlexDisplayObject = null;
  1146.          var _loc3_:int = 0;
  1147.          var _loc4_:int = 0;
  1148.          var _loc5_:Number = NaN;
  1149.          var _loc6_:Number = NaN;
  1150.          var _loc7_:Sprite = null;
  1151.          _loc3_ = int(listItems.length);
  1152.          _loc4_ = this.rowIndex;
  1153.          while(_loc4_ < _loc3_)
  1154.          {
  1155.             if(listItems[_loc4_].length)
  1156.             {
  1157.                _loc2_ = IFlexDisplayObject(listItems[_loc4_][0]);
  1158.                _loc6_ = Number(_loc2_.y);
  1159.                _loc2_.move(_loc2_.x,rowInfo[_loc4_].itemOldY + param1);
  1160.                _loc5_ = _loc2_.y - _loc6_;
  1161.             }
  1162.             _loc7_ = selectionIndicators[rowInfo[_loc4_].uid];
  1163.             rowInfo[_loc4_].y += _loc5_;
  1164.             if(_loc7_)
  1165.             {
  1166.                _loc7_.y += _loc5_;
  1167.             }
  1168.             _loc4_++;
  1169.          }
  1170.          _loc3_ = int(this.rowList.length);
  1171.          _loc4_ = 0;
  1172.          while(_loc4_ < _loc3_)
  1173.          {
  1174.             _loc7_ = null;
  1175.             _loc2_ = IFlexDisplayObject(this.rowList[_loc4_].item);
  1176.             if(rowMap[_loc2_.name] != null)
  1177.             {
  1178.                _loc7_ = selectionIndicators[BaseListData(rowMap[_loc2_.name]).uid];
  1179.             }
  1180.             _loc6_ = Number(_loc2_.y);
  1181.             _loc2_.move(_loc2_.x,this.rowList[_loc4_].itemOldY + param1);
  1182.             _loc5_ = _loc2_.y - _loc6_;
  1183.             if(_loc7_)
  1184.             {
  1185.                _loc7_.y += _loc5_;
  1186.             }
  1187.             _loc4_++;
  1188.          }
  1189.       }
  1190.       
  1191.       mx_internal function onTweenEnd(param1:Object) : void
  1192.       {
  1193.          var _loc2_:int = 0;
  1194.          var _loc3_:* = undefined;
  1195.          var _loc4_:IDropInListItemRenderer = null;
  1196.          var _loc6_:* = undefined;
  1197.          var _loc7_:Object = null;
  1198.          var _loc8_:Array = null;
  1199.          var _loc9_:int = 0;
  1200.          var _loc10_:DisplayObject = null;
  1201.          UIComponent.resumeBackgroundProcessing();
  1202.          this.mx_internal::onTweenUpdate(param1);
  1203.          var _loc5_:int = int(listItems.length);
  1204.          this.mx_internal::isOpening = false;
  1205.          if(collection)
  1206.          {
  1207.             _loc8_ = this.opening ? this.buildUpCollectionEvents(true) : this.buildUpCollectionEvents(false);
  1208.             _loc2_ = 0;
  1209.             while(_loc2_ < _loc8_.length)
  1210.             {
  1211.                collection.dispatchEvent(_loc8_[_loc2_]);
  1212.                _loc2_++;
  1213.             }
  1214.          }
  1215.          if(this.opening)
  1216.          {
  1217.             _loc9_ = -1;
  1218.             _loc2_ = this.rowIndex;
  1219.             while(_loc2_ < _loc5_)
  1220.             {
  1221.                if(listItems[_loc2_].length)
  1222.                {
  1223.                   _loc3_ = listItems[_loc2_][0];
  1224.                   _loc10_ = _loc3_.mask;
  1225.                   if(_loc10_)
  1226.                   {
  1227.                      listContent.removeChild(_loc10_);
  1228.                      _loc3_.mask = null;
  1229.                   }
  1230.                   rowMap[_loc3_.name].rowIndex = _loc2_;
  1231.                   if(_loc3_ is IDropInListItemRenderer)
  1232.                   {
  1233.                      _loc4_ = IDropInListItemRenderer(_loc3_);
  1234.                      if(_loc4_.listData)
  1235.                      {
  1236.                         _loc4_.listData.rowIndex = _loc2_;
  1237.                         _loc4_.listData = _loc4_.listData;
  1238.                      }
  1239.                   }
  1240.                   if(_loc3_.y > listContent.height)
  1241.                   {
  1242.                      addToFreeItemRenderers(_loc3_);
  1243.                      _loc6_ = itemToUID(_loc3_.data);
  1244.                      if(selectionIndicators[_loc6_])
  1245.                      {
  1246.                         _loc7_ = selectionIndicators[_loc6_];
  1247.                         if(_loc7_)
  1248.                         {
  1249.                            _loc10_ = _loc7_.mask;
  1250.                            if(_loc10_)
  1251.                            {
  1252.                               listContent.removeChild(_loc10_);
  1253.                               _loc7_.mask = null;
  1254.                            }
  1255.                         }
  1256.                         removeIndicators(_loc6_);
  1257.                      }
  1258.                      delete rowMap[_loc3_.name];
  1259.                      if(_loc9_ < 0)
  1260.                      {
  1261.                         _loc9_ = _loc2_;
  1262.                      }
  1263.                   }
  1264.                }
  1265.                else if(rowInfo[_loc2_].y >= listContent.height)
  1266.                {
  1267.                   if(_loc9_ < 0)
  1268.                   {
  1269.                      _loc9_ = _loc2_;
  1270.                   }
  1271.                }
  1272.                _loc2_++;
  1273.             }
  1274.             if(_loc9_ >= 0)
  1275.             {
  1276.                rowInfo.splice(_loc9_);
  1277.                listItems.splice(_loc9_);
  1278.             }
  1279.          }
  1280.          else
  1281.          {
  1282.             _loc2_ = 0;
  1283.             while(_loc2_ < this.rowList.length)
  1284.             {
  1285.                _loc10_ = this.rowList[_loc2_].item.mask;
  1286.                if(_loc10_)
  1287.                {
  1288.                   listContent.removeChild(_loc10_);
  1289.                   this.rowList[_loc2_].item.mask = null;
  1290.                }
  1291.                addToFreeItemRenderers(this.rowList[_loc2_].item);
  1292.                _loc6_ = itemToUID(this.rowList[_loc2_].item.data);
  1293.                if(selectionIndicators[_loc6_])
  1294.                {
  1295.                   _loc7_ = selectionIndicators[_loc6_];
  1296.                   if(_loc7_)
  1297.                   {
  1298.                      _loc10_ = _loc7_.mask;
  1299.                      if(_loc10_)
  1300.                      {
  1301.                         listContent.removeChild(_loc10_);
  1302.                         _loc7_.mask = null;
  1303.                      }
  1304.                   }
  1305.                   removeIndicators(_loc6_);
  1306.                }
  1307.                delete rowMap[this.rowList[_loc2_].item.name];
  1308.                _loc2_++;
  1309.             }
  1310.             _loc2_ = this.rowIndex;
  1311.             while(_loc2_ < _loc5_)
  1312.             {
  1313.                if(listItems[_loc2_].length)
  1314.                {
  1315.                   _loc3_ = listItems[_loc2_][0];
  1316.                   rowMap[_loc3_.name].rowIndex = _loc2_;
  1317.                   if(_loc3_ is IDropInListItemRenderer)
  1318.                   {
  1319.                      _loc4_ = IDropInListItemRenderer(_loc3_);
  1320.                      if(_loc4_.listData)
  1321.                      {
  1322.                         _loc4_.listData.rowIndex = _loc2_;
  1323.                         _loc4_.listData = _loc4_.listData;
  1324.                      }
  1325.                   }
  1326.                }
  1327.                _loc2_++;
  1328.             }
  1329.          }
  1330.          if(this.eventAfterTween)
  1331.          {
  1332.             this.mx_internal::dispatchTreeEvent(this.isItemOpen(this.eventAfterTween) ? TreeEvent.ITEM_OPEN : TreeEvent.ITEM_CLOSE,this.eventAfterTween,visibleData[itemToUID(this.eventAfterTween)],this.lastUserInteraction);
  1333.             this.lastUserInteraction = null;
  1334.             this.eventAfterTween = false;
  1335.          }
  1336.          itemsSizeChanged = true;
  1337.          invalidateDisplayList();
  1338.          this.tween = null;
  1339.       }
  1340.       
  1341.       private function buildUpCollectionEvents(param1:Boolean) : Array
  1342.       {
  1343.          var _loc2_:CollectionEvent = null;
  1344.          var _loc3_:int = 0;
  1345.          var _loc4_:Object = null;
  1346.          var _loc5_:Array = null;
  1347.          var _loc10_:ICollectionView = null;
  1348.          var _loc11_:IViewCursor = null;
  1349.          var _loc12_:Boolean = false;
  1350.          var _loc13_:Array = null;
  1351.          var _loc14_:int = 0;
  1352.          var _loc6_:Array = [];
  1353.          var _loc7_:Array = [];
  1354.          var _loc8_:Array = [];
  1355.          var _loc9_:int = this.getItemIndex(this.expandedItem);
  1356.          if(param1)
  1357.          {
  1358.             _loc10_ = this.mx_internal::getChildren(this.expandedItem,iterator.view);
  1359.             if(!_loc10_)
  1360.             {
  1361.                return [];
  1362.             }
  1363.             _loc11_ = _loc10_.createCursor();
  1364.             _loc12_ = true;
  1365.             while(!_loc11_.afterLast)
  1366.             {
  1367.                _loc6_.push(_loc11_.current);
  1368.                _loc11_.moveNext();
  1369.             }
  1370.          }
  1371.          else
  1372.          {
  1373.             _loc13_ = [];
  1374.             _loc14_ = 0;
  1375.             _loc13_ = this.getOpenChildrenStack(this.expandedItem,_loc13_);
  1376.             while(_loc14_ < _loc13_.length)
  1377.             {
  1378.                _loc3_ = 0;
  1379.                while(_loc3_ < selectedItems.length)
  1380.                {
  1381.                   if(selectedItems[_loc3_] == _loc13_[_loc14_])
  1382.                   {
  1383.                      this.bSelectedItemRemoved = true;
  1384.                   }
  1385.                   _loc3_++;
  1386.                }
  1387.                _loc7_.push(_loc13_[_loc14_]);
  1388.                _loc14_++;
  1389.             }
  1390.          }
  1391.          if(_loc6_.length > 0)
  1392.          {
  1393.             _loc2_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
  1394.             _loc2_.kind = CollectionEventKind.ADD;
  1395.             _loc2_.location = _loc9_ + 1;
  1396.             _loc2_.items = _loc6_;
  1397.             _loc8_.push(_loc2_);
  1398.          }
  1399.          if(_loc7_.length > 0)
  1400.          {
  1401.             _loc2_ = new CollectionEvent(CollectionEvent.COLLECTION_CHANGE);
  1402.             _loc2_.kind = CollectionEventKind.REMOVE;
  1403.             _loc2_.location = _loc9_ + 1;
  1404.             _loc2_.items = _loc7_;
  1405.             _loc8_.push(_loc2_);
  1406.          }
  1407.          return _loc8_;
  1408.       }
  1409.       
  1410.       private function getIndent() : Number
  1411.       {
  1412.          var _loc2_:String = null;
  1413.          var _loc1_:Number = 0;
  1414.          for(_loc2_ in this._openItems)
  1415.          {
  1416.             _loc1_ = Math.max(this.getParentStack(this._openItems[_loc2_]).length + 1,_loc1_);
  1417.          }
  1418.          return _loc1_ * getStyle("indentation");
  1419.       }
  1420.       
  1421.       override public function isItemVisible(param1:Object) : Boolean
  1422.       {
  1423.          var _loc3_:String = null;
  1424.          if(visibleData[itemToUID(param1)])
  1425.          {
  1426.             return true;
  1427.          }
  1428.          var _loc2_:Object = this.getParentItem(param1);
  1429.          if(_loc2_)
  1430.          {
  1431.             _loc3_ = itemToUID(_loc2_);
  1432.             if(Boolean(visibleData[_loc3_]) && Boolean(this._openItems[_loc3_]))
  1433.             {
  1434.                return true;
  1435.             }
  1436.          }
  1437.          return false;
  1438.       }
  1439.       
  1440.       public function getItemIndex(param1:Object) : int
  1441.       {
  1442.          var _loc2_:IViewCursor = collection.createCursor();
  1443.          var _loc3_:int = 0;
  1444.          while(_loc2_.current !== param1)
  1445.          {
  1446.             _loc3_++;
  1447.             if(!_loc2_.moveNext())
  1448.             {
  1449.                break;
  1450.             }
  1451.          }
  1452.          _loc2_.seek(CursorBookmark.FIRST,0);
  1453.          return _loc3_;
  1454.       }
  1455.       
  1456.       private function getIndexItem(param1:int) : Object
  1457.       {
  1458.          var _loc2_:IViewCursor = collection.createCursor();
  1459.          var _loc3_:int = param1;
  1460.          while(_loc2_.moveNext())
  1461.          {
  1462.             if(_loc3_ == 0)
  1463.             {
  1464.                return _loc2_.current;
  1465.             }
  1466.             _loc3_--;
  1467.          }
  1468.          return null;
  1469.       }
  1470.       
  1471.       public function expandChildrenOf(param1:Object, param2:Boolean) : void
  1472.       {
  1473.          var _loc3_:ICollectionView = null;
  1474.          var _loc4_:IViewCursor = null;
  1475.          if(iterator == null)
  1476.          {
  1477.             return;
  1478.          }
  1479.          if(this.isBranch(param1))
  1480.          {
  1481.             this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,param1,null,null,param2,false,true);
  1482.             if(param1 != null && this.mx_internal::_dataDescriptor.isBranch(param1,iterator.view) && this.mx_internal::_dataDescriptor.hasChildren(param1,iterator.view))
  1483.             {
  1484.                _loc3_ = this.mx_internal::getChildren(param1,iterator.view);
  1485.             }
  1486.             if(_loc3_)
  1487.             {
  1488.                _loc4_ = _loc3_.createCursor();
  1489.                while(!_loc4_.afterLast)
  1490.                {
  1491.                   if(this.isBranch(_loc4_.current))
  1492.                   {
  1493.                      this.expandChildrenOf(_loc4_.current,param2);
  1494.                   }
  1495.                   _loc4_.moveNext();
  1496.                }
  1497.             }
  1498.          }
  1499.       }
  1500.       
  1501.       public function getParentItem(param1:Object) : *
  1502.       {
  1503.          if(param1 == null)
  1504.          {
  1505.             return null;
  1506.          }
  1507.          if(Boolean(param1) && Boolean(collection))
  1508.          {
  1509.             if(this.mx_internal::_dataDescriptor is ITreeDataDescriptor2)
  1510.             {
  1511.                return ITreeDataDescriptor2(this.mx_internal::_dataDescriptor).getParent(param1,this.mx_internal::wrappedCollection,this.mx_internal::_rootModel);
  1512.             }
  1513.             return HierarchicalCollectionView(collection).getParentItem(param1);
  1514.          }
  1515.          return null;
  1516.       }
  1517.       
  1518.       private function getParentStack(param1:Object) : Array
  1519.       {
  1520.          var _loc2_:Array = [];
  1521.          if(param1 == null)
  1522.          {
  1523.             return _loc2_;
  1524.          }
  1525.          var _loc3_:* = this.getParentItem(param1);
  1526.          while(_loc3_)
  1527.          {
  1528.             _loc2_.push(_loc3_);
  1529.             _loc3_ = this.getParentItem(_loc3_);
  1530.          }
  1531.          return _loc2_;
  1532.       }
  1533.       
  1534.       private function getOpenChildrenStack(param1:Object, param2:Array) : Array
  1535.       {
  1536.          var _loc3_:Object = null;
  1537.          if(param1 == null)
  1538.          {
  1539.             return param2;
  1540.          }
  1541.          var _loc4_:ICollectionView = this.mx_internal::getChildren(param1,iterator.view);
  1542.          if(!_loc4_)
  1543.          {
  1544.             return [];
  1545.          }
  1546.          var _loc5_:IViewCursor = _loc4_.createCursor();
  1547.          while(!_loc5_.afterLast)
  1548.          {
  1549.             _loc3_ = _loc5_.current;
  1550.             param2.push(_loc3_);
  1551.             if(this.isBranch(_loc3_) && this.isItemOpen(_loc3_))
  1552.             {
  1553.                this.getOpenChildrenStack(_loc3_,param2);
  1554.             }
  1555.             _loc5_.moveNext();
  1556.          }
  1557.          return param2;
  1558.       }
  1559.       
  1560.       private function getChildIndexInParent(param1:Object, param2:Object) : int
  1561.       {
  1562.          var _loc4_:IViewCursor = null;
  1563.          var _loc5_:ICollectionView = null;
  1564.          var _loc3_:int = 0;
  1565.          if(!param1)
  1566.          {
  1567.             _loc4_ = ICollectionView(iterator.view).createCursor();
  1568.             while(!_loc4_.afterLast)
  1569.             {
  1570.                if(param2 === _loc4_.current)
  1571.                {
  1572.                   break;
  1573.                }
  1574.                _loc3_++;
  1575.                _loc4_.moveNext();
  1576.             }
  1577.          }
  1578.          else if(param1 != null && this.mx_internal::_dataDescriptor.isBranch(param1,iterator.view) && this.mx_internal::_dataDescriptor.hasChildren(param1,iterator.view))
  1579.          {
  1580.             _loc5_ = this.mx_internal::getChildren(param1,iterator.view);
  1581.             if(_loc5_.contains(param2))
  1582.             {
  1583.                _loc4_ = _loc5_.createCursor();
  1584.                while(!_loc4_.afterLast)
  1585.                {
  1586.                   if(param2 === _loc4_.current)
  1587.                   {
  1588.                      break;
  1589.                   }
  1590.                   _loc4_.moveNext();
  1591.                   _loc3_++;
  1592.                }
  1593.             }
  1594.          }
  1595.          return _loc3_;
  1596.       }
  1597.       
  1598.       private function collapseSelectedItems() : Array
  1599.       {
  1600.          var _loc3_:Object = null;
  1601.          var _loc4_:Array = null;
  1602.          var _loc5_:int = 0;
  1603.          var _loc6_:int = 0;
  1604.          var _loc7_:Object = null;
  1605.          var _loc1_:ArrayCollection = new ArrayCollection(selectedItems);
  1606.          var _loc2_:int = 0;
  1607.          while(_loc2_ < selectedItems.length)
  1608.          {
  1609.             _loc3_ = selectedItems[_loc2_];
  1610.             _loc4_ = this.getParentStack(_loc3_);
  1611.             _loc5_ = 0;
  1612.             while(_loc5_ < _loc4_.length)
  1613.             {
  1614.                if(_loc1_.contains(_loc4_[_loc5_]))
  1615.                {
  1616.                   _loc6_ = _loc1_.getItemIndex(_loc3_);
  1617.                   _loc7_ = _loc1_.removeItemAt(_loc6_);
  1618.                   break;
  1619.                }
  1620.                _loc5_++;
  1621.             }
  1622.             _loc2_++;
  1623.          }
  1624.          return _loc1_.source;
  1625.       }
  1626.       
  1627.       private function updateDropData(param1:DragEvent) : void
  1628.       {
  1629.          var _loc9_:Object = null;
  1630.          var _loc10_:int = 0;
  1631.          var _loc2_:int = int(rowInfo.length);
  1632.          var _loc3_:int = 0;
  1633.          var _loc4_:int = int(rowInfo[_loc3_].height);
  1634.          var _loc5_:Point = globalToLocal(new Point(param1.stageX,param1.stageY));
  1635.          while(Boolean(rowInfo[_loc3_]) && _loc5_.y >= _loc4_)
  1636.          {
  1637.             if(_loc3_ != rowInfo.length - 1)
  1638.             {
  1639.                _loc3_++;
  1640.                _loc4_ += rowInfo[_loc3_].height;
  1641.             }
  1642.             else
  1643.             {
  1644.                _loc4_ += rowInfo[_loc3_].height;
  1645.                _loc3_++;
  1646.             }
  1647.          }
  1648.          var _loc6_:Number = _loc3_ < rowInfo.length ? Number(rowInfo[_loc3_].y) : rowInfo[_loc3_ - 1].y + rowInfo[_loc3_ - 1].height;
  1649.          var _loc7_:Number = _loc5_.y - _loc6_;
  1650.          var _loc8_:Number = _loc3_ < rowInfo.length ? Number(rowInfo[_loc3_].height) : Number(rowInfo[_loc3_ - 1].height);
  1651.          _loc3_ += verticalScrollPosition;
  1652.          var _loc11_:Boolean = false;
  1653.          var _loc12_:int = !!collection ? collection.length : 0;
  1654.          var _loc13_:Object = _loc3_ > mx_internal::_verticalScrollPosition && _loc3_ <= _loc12_ ? listItems[_loc3_ - mx_internal::_verticalScrollPosition - 1][0].data : null;
  1655.          var _loc14_:Object = _loc3_ - verticalScrollPosition < rowInfo.length && _loc3_ < _loc12_ ? listItems[_loc3_ - mx_internal::_verticalScrollPosition][0].data : null;
  1656.          var _loc15_:Object = !!collection ? this.getParentItem(_loc13_) : null;
  1657.          var _loc16_:Object = !!collection ? this.getParentItem(_loc14_) : null;
  1658.          if(_loc7_ > _loc8_ * 0.5 && this.isItemOpen(_loc14_) && this.mx_internal::_dataDescriptor.isBranch(_loc14_,iterator.view) && (!this.mx_internal::_dataDescriptor.hasChildren(_loc14_,iterator.view) || this.mx_internal::_dataDescriptor.getChildren(_loc14_,iterator.view).length == 0))
  1659.          {
  1660.             _loc9_ = _loc14_;
  1661.             _loc10_ = 0;
  1662.             _loc11_ = true;
  1663.          }
  1664.          else if(!_loc13_ && !_loc3_ == _loc2_)
  1665.          {
  1666.             _loc9_ = !!collection ? this.getParentItem(_loc14_) : null;
  1667.             _loc10_ = !!_loc14_ ? this.getChildIndexInParent(_loc9_,_loc14_) : 0;
  1668.             _loc3_ = 0;
  1669.          }
  1670.          else if(Boolean(_loc14_) && _loc16_ == _loc13_)
  1671.          {
  1672.             _loc9_ = _loc13_;
  1673.             _loc10_ = 0;
  1674.          }
  1675.          else if(Boolean(_loc13_) && Boolean(_loc14_) && _loc15_ == _loc16_)
  1676.          {
  1677.             _loc9_ = !!collection ? this.getParentItem(_loc13_) : null;
  1678.             _loc10_ = !!iterator ? this.getChildIndexInParent(_loc9_,_loc14_) : 0;
  1679.          }
  1680.          else if(Boolean(_loc13_) && _loc7_ < _loc8_ * 0.5)
  1681.          {
  1682.             _loc9_ = _loc15_;
  1683.             _loc10_ = this.getChildIndexInParent(_loc9_,_loc13_) + 1;
  1684.          }
  1685.          else if(!_loc14_)
  1686.          {
  1687.             _loc9_ = null;
  1688.             if(_loc3_ - verticalScrollPosition == 0)
  1689.             {
  1690.                _loc10_ = 0;
  1691.             }
  1692.             else if(collection)
  1693.             {
  1694.                _loc10_ = collection.length;
  1695.             }
  1696.             else
  1697.             {
  1698.                _loc10_ = 0;
  1699.             }
  1700.          }
  1701.          else
  1702.          {
  1703.             _loc9_ = _loc16_;
  1704.             _loc10_ = this.getChildIndexInParent(_loc9_,_loc14_);
  1705.          }
  1706.          this.mx_internal::_dropData = {
  1707.             "parent":_loc9_,
  1708.             "index":_loc10_,
  1709.             "localX":param1.localX,
  1710.             "localY":param1.localY,
  1711.             "emptyFolder":_loc11_,
  1712.             "rowHeight":_loc8_,
  1713.             "rowIndex":_loc3_
  1714.          };
  1715.       }
  1716.       
  1717.       protected function initListData(param1:Object, param2:TreeListData) : void
  1718.       {
  1719.          if(param1 == null)
  1720.          {
  1721.             return;
  1722.          }
  1723.          var _loc3_:Boolean = this.isItemOpen(param1);
  1724.          var _loc4_:Boolean = this.isBranch(param1);
  1725.          var _loc5_:String = itemToUID(param1);
  1726.          param2.disclosureIcon = getStyle(_loc3_ ? "disclosureOpenIcon" : "disclosureClosedIcon");
  1727.          param2.open = _loc3_;
  1728.          param2.hasChildren = _loc4_;
  1729.          param2.depth = this.mx_internal::getItemDepth(param1,param2.rowIndex);
  1730.          param2.indent = (param2.depth - 1) * getStyle("indentation");
  1731.          param2.item = param1;
  1732.          param2.icon = this.itemToIcon(param1);
  1733.       }
  1734.       
  1735.       override protected function layoutEditor(param1:int, param2:int, param3:int, param4:int) : void
  1736.       {
  1737.          var _loc5_:int = int(rowMap[editedItemRenderer.name].indent);
  1738.          itemEditorInstance.move(param1 + _loc5_,param2);
  1739.          itemEditorInstance.setActualSize(param3 - _loc5_,param4);
  1740.       }
  1741.       
  1742.       override protected function scrollHandler(param1:Event) : void
  1743.       {
  1744.          if(this.mx_internal::isOpening)
  1745.          {
  1746.             return;
  1747.          }
  1748.          if(param1 is ScrollEvent)
  1749.          {
  1750.             super.scrollHandler(param1);
  1751.          }
  1752.       }
  1753.       
  1754.       override protected function keyDownHandler(param1:KeyboardEvent) : void
  1755.       {
  1756.          var _loc2_:ListEvent = null;
  1757.          var _loc3_:Point = null;
  1758.          var _loc6_:IListItemRenderer = null;
  1759.          var _loc7_:* = false;
  1760.          var _loc8_:Object = null;
  1761.          var _loc9_:ICollectionView = null;
  1762.          var _loc10_:IViewCursor = null;
  1763.          if(this.mx_internal::isOpening)
  1764.          {
  1765.             param1.stopImmediatePropagation();
  1766.             return;
  1767.          }
  1768.          if(itemEditorInstance)
  1769.          {
  1770.             return;
  1771.          }
  1772.          var _loc4_:uint = uint(mx_internal::mapKeycodeForLayoutDirection(param1));
  1773.          var _loc5_:Object = selectedItem;
  1774.          if(param1.ctrlKey)
  1775.          {
  1776.             super.keyDownHandler(param1);
  1777.          }
  1778.          else if(_loc4_ == Keyboard.SPACE)
  1779.          {
  1780.             if(caretIndex != selectedIndex)
  1781.             {
  1782.                _loc6_ = indexToItemRenderer(caretIndex);
  1783.                if(_loc6_)
  1784.                {
  1785.                   drawItem(_loc6_);
  1786.                }
  1787.                caretIndex = selectedIndex;
  1788.             }
  1789.             if(this.isBranch(_loc5_))
  1790.             {
  1791.                _loc7_ = !this.isItemOpen(_loc5_);
  1792.                this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,_loc5_,null,param1,_loc7_,true,true);
  1793.             }
  1794.             param1.stopImmediatePropagation();
  1795.          }
  1796.          else if(_loc4_ == Keyboard.LEFT)
  1797.          {
  1798.             if(this.isItemOpen(_loc5_))
  1799.             {
  1800.                this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,_loc5_,null,param1,false,true,true);
  1801.             }
  1802.             else
  1803.             {
  1804.                _loc8_ = this.getParentItem(_loc5_);
  1805.                if(_loc8_)
  1806.                {
  1807.                   this.proposedSelectedItem = _loc8_;
  1808.                   this.finishArrowKeySelection();
  1809.                }
  1810.             }
  1811.             param1.stopImmediatePropagation();
  1812.          }
  1813.          else if(_loc4_ == Keyboard.RIGHT)
  1814.          {
  1815.             if(this.isBranch(_loc5_))
  1816.             {
  1817.                if(this.isItemOpen(_loc5_))
  1818.                {
  1819.                   if(_loc5_)
  1820.                   {
  1821.                      _loc9_ = this.mx_internal::getChildren(_loc5_,iterator.view);
  1822.                      if(_loc9_)
  1823.                      {
  1824.                         _loc10_ = _loc9_.createCursor();
  1825.                         if(_loc10_.current)
  1826.                         {
  1827.                            this.proposedSelectedItem = _loc10_.current;
  1828.                         }
  1829.                      }
  1830.                      else
  1831.                      {
  1832.                         this.proposedSelectedItem = null;
  1833.                      }
  1834.                   }
  1835.                   else
  1836.                   {
  1837.                      selectedItem = this.proposedSelectedItem = null;
  1838.                   }
  1839.                   this.finishArrowKeySelection();
  1840.                }
  1841.                else
  1842.                {
  1843.                   this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,_loc5_,null,param1,true,true,true);
  1844.                }
  1845.             }
  1846.             param1.stopImmediatePropagation();
  1847.          }
  1848.          else if(_loc4_ == Keyboard.NUMPAD_MULTIPLY)
  1849.          {
  1850.             this.expandChildrenOf(_loc5_,!this.isItemOpen(_loc5_));
  1851.          }
  1852.          else if(_loc4_ == Keyboard.NUMPAD_ADD)
  1853.          {
  1854.             if(this.isBranch(_loc5_))
  1855.             {
  1856.                if(!this.isItemOpen(_loc5_))
  1857.                {
  1858.                   this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,_loc5_,null,param1,true,true,true);
  1859.                }
  1860.             }
  1861.          }
  1862.          else if(_loc4_ == Keyboard.NUMPAD_SUBTRACT)
  1863.          {
  1864.             if(this.isItemOpen(_loc5_))
  1865.             {
  1866.                this.mx_internal::dispatchTreeEvent(TreeEvent.ITEM_OPENING,_loc5_,null,param1,false,true,true);
  1867.             }
  1868.          }
  1869.          else
  1870.          {
  1871.             super.keyDownHandler(param1);
  1872.          }
  1873.       }
  1874.       
  1875.       private function finishArrowKeySelection() : void
  1876.       {
  1877.          var _loc1_:ListEvent = null;
  1878.          var _loc2_:Point = null;
  1879.          var _loc3_:int = 0;
  1880.          this.bFinishArrowKeySelection = false;
  1881.          if(this.proposedSelectedItem)
  1882.          {
  1883.             selectedItem = this.proposedSelectedItem;
  1884.          }
  1885.          if(selectedItem === this.proposedSelectedItem || !this.proposedSelectedItem)
  1886.          {
  1887.             _loc1_ = new ListEvent(ListEvent.CHANGE);
  1888.             _loc1_.itemRenderer = indexToItemRenderer(selectedIndex);
  1889.             _loc2_ = itemRendererToIndices(_loc1_.itemRenderer);
  1890.             if(_loc2_)
  1891.             {
  1892.                _loc1_.rowIndex = _loc2_.y;
  1893.                _loc1_.columnIndex = _loc2_.x;
  1894.             }
  1895.             dispatchEvent(_loc1_);
  1896.             _loc3_ = this.getItemIndex(selectedItem);
  1897.             if(_loc3_ != caretIndex)
  1898.             {
  1899.                caretIndex = selectedIndex;
  1900.             }
  1901.             if(_loc3_ < mx_internal::_verticalScrollPosition)
  1902.             {
  1903.                verticalScrollPosition = _loc3_;
  1904.             }
  1905.          }
  1906.          else
  1907.          {
  1908.             this.bFinishArrowKeySelection = true;
  1909.          }
  1910.       }
  1911.       
  1912.       override protected function mouseOverHandler(param1:MouseEvent) : void
  1913.       {
  1914.          if(!this.tween)
  1915.          {
  1916.             super.mouseOverHandler(param1);
  1917.          }
  1918.       }
  1919.       
  1920.       override protected function mouseOutHandler(param1:MouseEvent) : void
  1921.       {
  1922.          if(!this.tween)
  1923.          {
  1924.             super.mouseOutHandler(param1);
  1925.          }
  1926.       }
  1927.       
  1928.       override protected function mouseClickHandler(param1:MouseEvent) : void
  1929.       {
  1930.          if(!this.tween)
  1931.          {
  1932.             super.mouseClickHandler(param1);
  1933.          }
  1934.       }
  1935.       
  1936.       override protected function mouseDoubleClickHandler(param1:MouseEvent) : void
  1937.       {
  1938.          if(!this.tween)
  1939.          {
  1940.             super.mouseDoubleClickHandler(param1);
  1941.          }
  1942.       }
  1943.       
  1944.       override protected function mouseDownHandler(param1:MouseEvent) : void
  1945.       {
  1946.          if(!this.tween)
  1947.          {
  1948.             super.mouseDownHandler(param1);
  1949.          }
  1950.       }
  1951.       
  1952.       override protected function mouseUpHandler(param1:MouseEvent) : void
  1953.       {
  1954.          if(!this.tween)
  1955.          {
  1956.             super.mouseUpHandler(param1);
  1957.          }
  1958.       }
  1959.       
  1960.       override protected function mouseWheelHandler(param1:MouseEvent) : void
  1961.       {
  1962.          if(!this.tween)
  1963.          {
  1964.             super.mouseWheelHandler(param1);
  1965.          }
  1966.       }
  1967.       
  1968.       override protected function dragEnterHandler(param1:DragEvent) : void
  1969.       {
  1970.          var event:DragEvent = param1;
  1971.          if(event.isDefaultPrevented())
  1972.          {
  1973.             return;
  1974.          }
  1975.          mx_internal::lastDragEvent = event;
  1976.          this.haveItemIndices = false;
  1977.          try
  1978.          {
  1979.             if(iteratorValid && event.dragSource.hasFormat("treeItems"))
  1980.             {
  1981.                DragManager.acceptDragDrop(this);
  1982.                DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
  1983.                this.showDropFeedback(event);
  1984.                return;
  1985.             }
  1986.          }
  1987.          catch(e:ItemPendingError)
  1988.          {
  1989.             if(!lastTreeSeekPending)
  1990.             {
  1991.                lastTreeSeekPending = new TreeSeekPending(event,dragEnterHandler);
  1992.                e.addResponder(new ItemResponder(seekPendingDuringDragResultHandler,seekPendingDuringDragFailureHandler,lastTreeSeekPending));
  1993.             }
  1994.          }
  1995.          catch(e1:Error)
  1996.          {
  1997.          }
  1998.          hideDropFeedback(event);
  1999.          DragManager.showFeedback(DragManager.NONE);
  2000.       }
  2001.       
  2002.       override protected function dragOverHandler(param1:DragEvent) : void
  2003.       {
  2004.          var event:DragEvent = param1;
  2005.          if(event.isDefaultPrevented())
  2006.          {
  2007.             return;
  2008.          }
  2009.          mx_internal::lastDragEvent = event;
  2010.          try
  2011.          {
  2012.             if(iteratorValid && event.dragSource.hasFormat("treeItems"))
  2013.             {
  2014.                if(this.mx_internal::collectionThrowsIPE)
  2015.                {
  2016.                   this.checkItemIndices(event);
  2017.                }
  2018.                DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
  2019.                this.showDropFeedback(event);
  2020.                return;
  2021.             }
  2022.          }
  2023.          catch(e:ItemPendingError)
  2024.          {
  2025.             if(!lastTreeSeekPending)
  2026.             {
  2027.                lastTreeSeekPending = new TreeSeekPending(event,dragOverHandler);
  2028.                e.addResponder(new ItemResponder(seekPendingDuringDragResultHandler,seekPendingDuringDragFailureHandler,lastTreeSeekPending));
  2029.             }
  2030.          }
  2031.          catch(e1:Error)
  2032.          {
  2033.          }
  2034.          hideDropFeedback(event);
  2035.          DragManager.showFeedback(DragManager.NONE);
  2036.       }
  2037.       
  2038.       private function seekPendingDuringDragFailureHandler(param1:Object, param2:TreeSeekPending) : void
  2039.       {
  2040.       }
  2041.       
  2042.       private function seekPendingDuringDragResultHandler(param1:Object, param2:TreeSeekPending) : void
  2043.       {
  2044.          this.lastTreeSeekPending = null;
  2045.          if(mx_internal::lastDragEvent)
  2046.          {
  2047.             param2.retryFunction(param2.event);
  2048.          }
  2049.       }
  2050.       
  2051.       private function checkItemIndices(param1:DragEvent) : void
  2052.       {
  2053.          var _loc2_:Array = null;
  2054.          var _loc3_:int = 0;
  2055.          var _loc4_:int = 0;
  2056.          var _loc5_:Object = null;
  2057.          if(this.haveItemIndices)
  2058.          {
  2059.             return;
  2060.          }
  2061.          if((param1.action == DragManager.MOVE || param1.action == DragManager.NONE) && this.dragMoveEnabled)
  2062.          {
  2063.             if(param1.dragInitiator == this)
  2064.             {
  2065.                _loc2_ = param1.dragSource.dataForFormat("treeItems") as Array;
  2066.                _loc3_ = int(_loc2_.length);
  2067.                _loc4_ = 0;
  2068.                while(_loc4_ < _loc3_)
  2069.                {
  2070.                   _loc5_ = this.getParentItem(_loc2_[_loc4_]);
  2071.                   this.getChildIndexInParent(_loc5_,_loc2_[_loc4_]);
  2072.                   _loc4_++;
  2073.                }
  2074.                this.haveItemIndices = true;
  2075.             }
  2076.          }
  2077.       }
  2078.       
  2079.       override protected function dragDropHandler(param1:DragEvent) : void
  2080.       {
  2081.          var _loc2_:Array = null;
  2082.          var _loc3_:int = 0;
  2083.          var _loc4_:int = 0;
  2084.          var _loc5_:int = 0;
  2085.          var _loc6_:* = undefined;
  2086.          var _loc7_:* = undefined;
  2087.          var _loc8_:int = 0;
  2088.          var _loc9_:Array = null;
  2089.          var _loc10_:Object = null;
  2090.          if(param1.isDefaultPrevented())
  2091.          {
  2092.             return;
  2093.          }
  2094.          hideDropFeedback(param1);
  2095.          if(param1.dragSource.hasFormat("treeItems"))
  2096.          {
  2097.             _loc2_ = param1.dragSource.dataForFormat("treeItems") as Array;
  2098.             if(param1.action == DragManager.MOVE && this.dragMoveEnabled)
  2099.             {
  2100.                if(param1.dragInitiator == this)
  2101.                {
  2102.                   this.calculateDropIndex(param1);
  2103.                   _loc8_ = int(this.mx_internal::_dropData.index);
  2104.                   _loc9_ = this.getParentStack(this.mx_internal::_dropData.parent);
  2105.                   _loc9_.unshift(this.mx_internal::_dropData.parent);
  2106.                   _loc4_ = int(_loc2_.length);
  2107.                   _loc3_ = 0;
  2108.                   while(_loc3_ < _loc4_)
  2109.                   {
  2110.                      _loc6_ = this.getParentItem(_loc2_[_loc3_]);
  2111.                      _loc5_ = this.getChildIndexInParent(_loc6_,_loc2_[_loc3_]);
  2112.                      for each(_loc7_ in _loc9_)
  2113.                      {
  2114.                         if(_loc2_[_loc3_] === _loc7_)
  2115.                         {
  2116.                            return;
  2117.                         }
  2118.                      }
  2119.                      this.mx_internal::removeChildItem(_loc6_,_loc2_[_loc3_],_loc5_);
  2120.                      if(_loc6_ == this.mx_internal::_dropData.parent && _loc5_ < this.mx_internal::_dropData.index)
  2121.                      {
  2122.                         _loc8_--;
  2123.                      }
  2124.                      this.mx_internal::addChildItem(this.mx_internal::_dropData.parent,_loc2_[_loc3_],_loc8_);
  2125.                      _loc3_++;
  2126.                   }
  2127.                   return;
  2128.                }
  2129.             }
  2130.             if(param1.action == DragManager.COPY)
  2131.             {
  2132.                if(!this.dataProvider)
  2133.                {
  2134.                   this.dataProvider = [];
  2135.                   validateNow();
  2136.                }
  2137.                _loc4_ = int(_loc2_.length);
  2138.                _loc3_ = 0;
  2139.                while(_loc3_ < _loc4_)
  2140.                {
  2141.                   _loc10_ = copyItemWithUID(_loc2_[_loc3_]);
  2142.                   this.mx_internal::addChildItem(this.mx_internal::_dropData.parent,_loc10_,this.mx_internal::_dropData.index);
  2143.                   _loc3_++;
  2144.                }
  2145.             }
  2146.          }
  2147.          mx_internal::lastDragEvent = null;
  2148.       }
  2149.       
  2150.       override protected function dragCompleteHandler(param1:DragEvent) : void
  2151.       {
  2152.          var items:Array = null;
  2153.          var parent:* = undefined;
  2154.          var index:int = 0;
  2155.          var i:int = 0;
  2156.          var n:int = 0;
  2157.          var targetTree:Tree = null;
  2158.          var item:Object = null;
  2159.          var event:DragEvent = param1;
  2160.          mx_internal::isPressed = false;
  2161.          if(event.isDefaultPrevented())
  2162.          {
  2163.             return;
  2164.          }
  2165.          mx_internal::resetDragScrolling();
  2166.          try
  2167.          {
  2168.             if(event.dragSource.hasFormat("treeItems"))
  2169.             {
  2170.                if(event.action == DragManager.MOVE && this.dragMoveEnabled)
  2171.                {
  2172.                   if(event.relatedObject != this)
  2173.                   {
  2174.                      items = event.dragSource.dataForFormat("treeItems") as Array;
  2175.                      n = int(items.length);
  2176.                      i = 0;
  2177.                      while(i < n)
  2178.                      {
  2179.                         parent = this.getParentItem(items[i]);
  2180.                         index = this.getChildIndexInParent(parent,items[i]);
  2181.                         this.mx_internal::removeChildItem(parent,items[i],index);
  2182.                         i++;
  2183.                      }
  2184.                      if(event.relatedObject is Tree)
  2185.                      {
  2186.                         targetTree = Tree(event.relatedObject);
  2187.                         if(!targetTree.dataProvider)
  2188.                         {
  2189.                            targetTree.dataProvider = [];
  2190.                            targetTree.validateNow();
  2191.                         }
  2192.                         n = int(items.length);
  2193.                         i = 0;
  2194.                         while(i < n)
  2195.                         {
  2196.                            item = items[i];
  2197.                            targetTree.mx_internal::addChildItem(targetTree.mx_internal::_dropData.parent,item,targetTree.mx_internal::_dropData.index);
  2198.                            i++;
  2199.                         }
  2200.                      }
  2201.                   }
  2202.                   clearSelected(false);
  2203.                }
  2204.             }
  2205.          }
  2206.          catch(e:ItemPendingError)
  2207.          {
  2208.             e.addResponder(new ItemResponder(seekPendingDuringDragResultHandler,seekPendingDuringDragFailureHandler,new TreeSeekPending(event,dragCompleteHandler)));
  2209.          }
  2210.          mx_internal::lastDragEvent = null;
  2211.       }
  2212.       
  2213.       mx_internal function addChildItem(param1:Object, param2:Object, param3:Number) : Boolean
  2214.       {
  2215.          return this.mx_internal::_dataDescriptor.addChildAt(param1,param2,param3,iterator.view);
  2216.       }
  2217.       
  2218.       mx_internal function removeChildItem(param1:Object, param2:Object, param3:Number) : Boolean
  2219.       {
  2220.          return this.mx_internal::_dataDescriptor.removeChildAt(param1,param2,param3,iterator.view);
  2221.       }
  2222.       
  2223.       mx_internal function dispatchTreeEvent(param1:String, param2:Object, param3:IListItemRenderer, param4:Event = null, param5:Boolean = true, param6:Boolean = true, param7:Boolean = true) : void
  2224.       {
  2225.          var _loc8_:TreeEvent = null;
  2226.          if(param1 == TreeEvent.ITEM_OPENING)
  2227.          {
  2228.             _loc8_ = new TreeEvent(TreeEvent.ITEM_OPENING,false,true);
  2229.             _loc8_.opening = param5;
  2230.             _loc8_.animate = param6;
  2231.             _loc8_.dispatchEvent = param7;
  2232.          }
  2233.          if(!_loc8_)
  2234.          {
  2235.             _loc8_ = new TreeEvent(param1);
  2236.          }
  2237.          _loc8_.item = param2;
  2238.          _loc8_.itemRenderer = param3;
  2239.          _loc8_.triggerEvent = param4;
  2240.          dispatchEvent(_loc8_);
  2241.       }
  2242.       
  2243.       override protected function collectionChangeHandler(param1:Event) : void
  2244.       {
  2245.          var _loc2_:Object = null;
  2246.          var _loc3_:Object = null;
  2247.          var _loc4_:CollectionEvent = null;
  2248.          if(iterator == null)
  2249.          {
  2250.             return;
  2251.          }
  2252.          if(param1 is CollectionEvent)
  2253.          {
  2254.             _loc4_ = CollectionEvent(param1);
  2255.             if(_loc4_.kind == CollectionEventKind.mx_internal::EXPAND)
  2256.             {
  2257.                param1.stopPropagation();
  2258.             }
  2259.             if(_loc4_.kind == CollectionEventKind.UPDATE)
  2260.             {
  2261.                param1.stopPropagation();
  2262.                itemsSizeChanged = true;
  2263.                invalidateDisplayList();
  2264.             }
  2265.             else
  2266.             {
  2267.                super.collectionChangeHandler(param1);
  2268.             }
  2269.          }
  2270.       }
  2271.       
  2272.       override protected function adjustAfterRemove(param1:Array, param2:int, param3:Boolean) : Boolean
  2273.       {
  2274.          var _loc4_:int = int(selectedItems.length);
  2275.          var _loc5_:Boolean = param3;
  2276.          var _loc6_:int = int(param1.length);
  2277.          if(mx_internal::_selectedIndex > param2)
  2278.          {
  2279.             mx_internal::_selectedIndex -= _loc6_;
  2280.             _loc5_ = true;
  2281.          }
  2282.          if(this.bSelectedItemRemoved && _loc4_ < 1)
  2283.          {
  2284.             mx_internal::_selectedIndex = this.getItemIndex(this.expandedItem);
  2285.             _loc5_ = true;
  2286.             mx_internal::bSelectionChanged = true;
  2287.             mx_internal::bSelectedIndexChanged = true;
  2288.             invalidateDisplayList();
  2289.          }
  2290.          return _loc5_;
  2291.       }
  2292.       
  2293.       mx_internal function expandItemHandler(param1:TreeEvent) : void
  2294.       {
  2295.          if(param1.isDefaultPrevented())
  2296.          {
  2297.             return;
  2298.          }
  2299.          if(param1.type == TreeEvent.ITEM_OPENING)
  2300.          {
  2301.             this.expandItem(param1.item,param1.opening,param1.animate,param1.dispatchEvent,param1.triggerEvent);
  2302.          }
  2303.       }
  2304.       
  2305.       override mx_internal function selectionDataPendingResultHandler(param1:Object, param2:ListBaseSelectionDataPending) : void
  2306.       {
  2307.          super.mx_internal::selectionDataPendingResultHandler(param1,param2);
  2308.          if(this.bFinishArrowKeySelection && selectedItem === this.proposedSelectedItem)
  2309.          {
  2310.             this.finishArrowKeySelection();
  2311.          }
  2312.       }
  2313.    }
  2314. }
  2315.  
  2316. import mx.events.DragEvent;
  2317.  
  2318. class TreeSeekPending
  2319. {
  2320.    public var event:DragEvent;
  2321.    
  2322.    public var retryFunction:Function;
  2323.    
  2324.    public function TreeSeekPending(param1:DragEvent, param2:Function)
  2325.    {
  2326.       super();
  2327.       this.event = param1;
  2328.       this.retryFunction = param2;
  2329.    }
  2330. }
  2331.