home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2012 April / ME_04_2012.iso / Video-Tutorial / iPhoto / media / player.swf / scripts / mx / binding / Binding.as < prev    next >
Encoding:
Text File  |  2011-11-11  |  8.4 KB  |  262 lines

  1. package mx.binding
  2. {
  3.    import flash.utils.Dictionary;
  4.    import mx.collections.errors.ItemPendingError;
  5.    import mx.core.mx_internal;
  6.    
  7.    use namespace mx_internal;
  8.    
  9.    public class Binding
  10.    {
  11.       mx_internal static const VERSION:String = "4.5.0.20967";
  12.       
  13.       mx_internal var _isEnabled:Boolean;
  14.       
  15.       mx_internal var isExecuting:Boolean;
  16.       
  17.       mx_internal var isHandlingEvent:Boolean;
  18.       
  19.       mx_internal var disabledRequests:Dictionary;
  20.       
  21.       private var hasHadValue:Boolean;
  22.       
  23.       public var uiComponentWatcher:int;
  24.       
  25.       public var twoWayCounterpart:Binding;
  26.       
  27.       public var isTwoWayPrimary:Boolean;
  28.       
  29.       private var wrappedFunctionSuccessful:Boolean;
  30.       
  31.       mx_internal var document:Object;
  32.       
  33.       mx_internal var srcFunc:Function;
  34.       
  35.       mx_internal var destFunc:Function;
  36.       
  37.       mx_internal var destString:String;
  38.       
  39.       mx_internal var srcString:String;
  40.       
  41.       private var lastValue:Object;
  42.       
  43.       public function Binding(param1:Object, param2:Function, param3:Function, param4:String, param5:String = null)
  44.       {
  45.          super();
  46.          this.mx_internal::document = param1;
  47.          this.mx_internal::srcFunc = param2;
  48.          this.mx_internal::destFunc = param3;
  49.          this.mx_internal::destString = param4;
  50.          this.mx_internal::srcString = param5;
  51.          if(this.mx_internal::srcFunc == null)
  52.          {
  53.             this.mx_internal::srcFunc = this.defaultSrcFunc;
  54.          }
  55.          if(this.mx_internal::destFunc == null)
  56.          {
  57.             this.mx_internal::destFunc = this.defaultDestFunc;
  58.          }
  59.          this.mx_internal::_isEnabled = true;
  60.          this.mx_internal::isExecuting = false;
  61.          this.mx_internal::isHandlingEvent = false;
  62.          this.hasHadValue = false;
  63.          this.uiComponentWatcher = -1;
  64.          BindingManager.addBinding(param1,param4,this);
  65.       }
  66.       
  67.       mx_internal function get isEnabled() : Boolean
  68.       {
  69.          return this.mx_internal::_isEnabled;
  70.       }
  71.       
  72.       mx_internal function set isEnabled(param1:Boolean) : void
  73.       {
  74.          this.mx_internal::_isEnabled = param1;
  75.          if(param1)
  76.          {
  77.             this.processDisabledRequests();
  78.          }
  79.       }
  80.       
  81.       private function defaultDestFunc(param1:Object) : void
  82.       {
  83.          var _loc2_:Array = this.mx_internal::destString.split(".");
  84.          var _loc3_:Object = this.mx_internal::document;
  85.          var _loc4_:uint = 0;
  86.          if(_loc2_[0] == "this")
  87.          {
  88.             _loc4_++;
  89.          }
  90.          while(_loc4_ < _loc2_.length - 1)
  91.          {
  92.             _loc3_ = _loc3_[_loc2_[_loc4_++]];
  93.          }
  94.          _loc3_[_loc2_[_loc4_]] = param1;
  95.       }
  96.       
  97.       private function defaultSrcFunc() : Object
  98.       {
  99.          return this.mx_internal::document[this.mx_internal::srcString];
  100.       }
  101.       
  102.       public function execute(param1:Object = null) : void
  103.       {
  104.          var o:Object = param1;
  105.          if(!this.mx_internal::isEnabled)
  106.          {
  107.             if(o != null)
  108.             {
  109.                this.registerDisabledExecute(o);
  110.             }
  111.             return;
  112.          }
  113.          if(this.twoWayCounterpart && !this.twoWayCounterpart.hasHadValue && this.twoWayCounterpart.isTwoWayPrimary)
  114.          {
  115.             this.twoWayCounterpart.execute();
  116.             this.hasHadValue = true;
  117.             return;
  118.          }
  119.          if(this.mx_internal::isExecuting || this.twoWayCounterpart && this.twoWayCounterpart.mx_internal::isExecuting)
  120.          {
  121.             this.hasHadValue = true;
  122.             return;
  123.          }
  124.          try
  125.          {
  126.             this.mx_internal::isExecuting = true;
  127.             this.wrapFunctionCall(this,this.innerExecute,o);
  128.          }
  129.          catch(error:Error)
  130.          {
  131.             if(error.errorID != 1507)
  132.             {
  133.                throw error;
  134.             }
  135.          }
  136.          finally
  137.          {
  138.             this.mx_internal::isExecuting = false;
  139.          }
  140.       }
  141.       
  142.       private function registerDisabledExecute(param1:Object) : void
  143.       {
  144.          if(param1 != null)
  145.          {
  146.             this.mx_internal::disabledRequests = this.mx_internal::disabledRequests != null ? this.mx_internal::disabledRequests : new Dictionary(true);
  147.             this.mx_internal::disabledRequests[param1] = true;
  148.          }
  149.       }
  150.       
  151.       private function processDisabledRequests() : void
  152.       {
  153.          var _loc1_:Object = null;
  154.          if(this.mx_internal::disabledRequests != null)
  155.          {
  156.             for(_loc1_ in this.mx_internal::disabledRequests)
  157.             {
  158.                this.execute(_loc1_);
  159.             }
  160.             this.mx_internal::disabledRequests = null;
  161.          }
  162.       }
  163.       
  164.       protected function wrapFunctionCall(param1:Object, param2:Function, param3:Object = null, ... rest) : Object
  165.       {
  166.          var result:Object = null;
  167.          var thisArg:Object = param1;
  168.          var wrappedFunction:Function = param2;
  169.          var object:Object = param3;
  170.          var args:Array = rest;
  171.          this.wrappedFunctionSuccessful = false;
  172.          try
  173.          {
  174.             result = wrappedFunction.apply(thisArg,args);
  175.             this.wrappedFunctionSuccessful = true;
  176.             return result;
  177.          }
  178.          catch(itemPendingError:ItemPendingError)
  179.          {
  180.             itemPendingError.addResponder(new EvalBindingResponder(this,object));
  181.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  182.             {
  183.                trace("Binding: destString = " + mx_internal::destString + ", error = " + itemPendingError);
  184.             }
  185.          }
  186.          catch(rangeError:RangeError)
  187.          {
  188.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  189.             {
  190.                trace("Binding: destString = " + mx_internal::destString + ", error = " + rangeError);
  191.             }
  192.          }
  193.          catch(error:Error)
  194.          {
  195.             if(error.errorID != 1006 && error.errorID != 1009 && error.errorID != 1010 && error.errorID != 1055 && error.errorID != 1069)
  196.             {
  197.                throw error;
  198.             }
  199.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  200.             {
  201.                trace("Binding: destString = " + mx_internal::destString + ", error = " + error);
  202.             }
  203.          }
  204.          return null;
  205.       }
  206.       
  207.       private function nodeSeqEqual(param1:XMLList, param2:XMLList) : Boolean
  208.       {
  209.          var _loc4_:uint = 0;
  210.          var _loc3_:uint = uint(param1.length());
  211.          if(_loc3_ == param2.length())
  212.          {
  213.             _loc4_ = 0;
  214.             while(_loc4_ < _loc3_ && param1[_loc4_] === param2[_loc4_])
  215.             {
  216.                _loc4_++;
  217.             }
  218.             return _loc4_ == _loc3_;
  219.          }
  220.          return false;
  221.       }
  222.       
  223.       private function innerExecute() : void
  224.       {
  225.          var _loc1_:Object = this.wrapFunctionCall(this.mx_internal::document,this.mx_internal::srcFunc);
  226.          if(BindingManager.debugDestinationStrings[this.mx_internal::destString])
  227.          {
  228.             trace("Binding: destString = " + this.mx_internal::destString + ", srcFunc result = " + _loc1_);
  229.          }
  230.          if(this.hasHadValue || this.wrappedFunctionSuccessful)
  231.          {
  232.             if(!(this.lastValue is XML && Boolean(this.lastValue.hasComplexContent()) && this.lastValue === _loc1_) && !(this.lastValue is XMLList && this.lastValue.hasComplexContent() && _loc1_ is XMLList && this.nodeSeqEqual(this.lastValue as XMLList,_loc1_ as XMLList)))
  233.             {
  234.                this.mx_internal::destFunc.call(this.mx_internal::document,_loc1_);
  235.                this.lastValue = _loc1_;
  236.                this.hasHadValue = true;
  237.             }
  238.          }
  239.       }
  240.       
  241.       public function watcherFired(param1:Boolean, param2:int) : void
  242.       {
  243.          var commitEvent:Boolean = param1;
  244.          var cloneIndex:int = param2;
  245.          if(this.mx_internal::isHandlingEvent)
  246.          {
  247.             return;
  248.          }
  249.          try
  250.          {
  251.             this.mx_internal::isHandlingEvent = true;
  252.             this.execute(cloneIndex);
  253.          }
  254.          finally
  255.          {
  256.             this.mx_internal::isHandlingEvent = false;
  257.          }
  258.       }
  259.    }
  260. }
  261.  
  262.