home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Freeware / Adobe Air 1.5 / AdobeAIRInstaller.exe / setup.swf / scripts / mx / binding / Binding.as < prev    next >
Encoding:
Text File  |  2008-10-29  |  6.7 KB  |  215 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 = "3.0.0.0";
  12.       
  13.       mx_internal var destFunc:Function;
  14.       
  15.       mx_internal var srcFunc:Function;
  16.       
  17.       mx_internal var destString:String;
  18.       
  19.       mx_internal var document:Object;
  20.       
  21.       private var hasHadValue:Boolean;
  22.       
  23.       mx_internal var disabledRequests:Dictionary;
  24.       
  25.       mx_internal var isExecuting:Boolean;
  26.       
  27.       mx_internal var isHandlingEvent:Boolean;
  28.       
  29.       public var twoWayCounterpart:Binding;
  30.       
  31.       private var wrappedFunctionSuccessful:Boolean;
  32.       
  33.       mx_internal var _isEnabled:Boolean;
  34.       
  35.       public var uiComponentWatcher:int;
  36.       
  37.       private var lastValue:Object;
  38.       
  39.       public function Binding(param1:Object, param2:Function, param3:Function, param4:String)
  40.       {
  41.          super();
  42.          this.mx_internal::document = param1;
  43.          this.mx_internal::srcFunc = param2;
  44.          this.mx_internal::destFunc = param3;
  45.          this.mx_internal::destString = param4;
  46.          mx_internal::_isEnabled = true;
  47.          mx_internal::isExecuting = false;
  48.          mx_internal::isHandlingEvent = false;
  49.          hasHadValue = false;
  50.          uiComponentWatcher = -1;
  51.          BindingManager.addBinding(param1,param4,this);
  52.       }
  53.       
  54.       private function registerDisabledExecute(param1:Object) : void
  55.       {
  56.          if(param1 != null)
  57.          {
  58.             mx_internal::disabledRequests = mx_internal::disabledRequests != null ? mx_internal::disabledRequests : new Dictionary(true);
  59.             mx_internal::disabledRequests[param1] = true;
  60.          }
  61.       }
  62.       
  63.       protected function wrapFunctionCall(param1:Object, param2:Function, param3:Object = null, ... rest) : Object
  64.       {
  65.          var result:Object = null;
  66.          var thisArg:Object = param1;
  67.          var wrappedFunction:Function = param2;
  68.          var object:Object = param3;
  69.          var args:Array = rest;
  70.          wrappedFunctionSuccessful = false;
  71.          try
  72.          {
  73.             result = wrappedFunction.apply(thisArg,args);
  74.             wrappedFunctionSuccessful = true;
  75.             return result;
  76.          }
  77.          catch(itemPendingError:ItemPendingError)
  78.          {
  79.             itemPendingError.addResponder(new EvalBindingResponder(this,object));
  80.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  81.             {
  82.                trace("Binding: destString = " + mx_internal::destString + ", error = " + itemPendingError);
  83.             }
  84.          }
  85.          catch(rangeError:RangeError)
  86.          {
  87.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  88.             {
  89.                trace("Binding: destString = " + mx_internal::destString + ", error = " + rangeError);
  90.             }
  91.          }
  92.          catch(error:Error)
  93.          {
  94.             if(error.errorID != 1006 && error.errorID != 1009 && error.errorID != 1010 && error.errorID != 1055 && error.errorID != 1069)
  95.             {
  96.                throw error;
  97.             }
  98.             if(BindingManager.debugDestinationStrings[mx_internal::destString])
  99.             {
  100.                trace("Binding: destString = " + mx_internal::destString + ", error = " + error);
  101.             }
  102.          }
  103.          return null;
  104.       }
  105.       
  106.       public function watcherFired(param1:Boolean, param2:int) : void
  107.       {
  108.          var commitEvent:Boolean = param1;
  109.          var cloneIndex:int = param2;
  110.          if(mx_internal::isHandlingEvent)
  111.          {
  112.             return;
  113.          }
  114.          try
  115.          {
  116.             mx_internal::isHandlingEvent = true;
  117.             execute(cloneIndex);
  118.          }
  119.          finally
  120.          {
  121.             mx_internal::isHandlingEvent = false;
  122.          }
  123.       }
  124.       
  125.       private function nodeSeqEqual(param1:XMLList, param2:XMLList) : Boolean
  126.       {
  127.          var _loc4_:uint = 0;
  128.          var _loc3_:uint = uint(param1.length());
  129.          if(_loc3_ == param2.length())
  130.          {
  131.             _loc4_ = 0;
  132.             while(_loc4_ < _loc3_ && param1[_loc4_] === param2[_loc4_])
  133.             {
  134.                _loc4_++;
  135.             }
  136.             return _loc4_ == _loc3_;
  137.          }
  138.          return false;
  139.       }
  140.       
  141.       mx_internal function set isEnabled(param1:Boolean) : void
  142.       {
  143.          mx_internal::_isEnabled = param1;
  144.          if(param1)
  145.          {
  146.             processDisabledRequests();
  147.          }
  148.       }
  149.       
  150.       private function processDisabledRequests() : void
  151.       {
  152.          var _loc1_:Object = null;
  153.          if(mx_internal::disabledRequests != null)
  154.          {
  155.             for(_loc1_ in mx_internal::disabledRequests)
  156.             {
  157.                execute(_loc1_);
  158.             }
  159.             mx_internal::disabledRequests = null;
  160.          }
  161.       }
  162.       
  163.       public function execute(param1:Object = null) : void
  164.       {
  165.          var o:Object = param1;
  166.          if(!mx_internal::isEnabled)
  167.          {
  168.             if(o != null)
  169.             {
  170.                registerDisabledExecute(o);
  171.             }
  172.             return;
  173.          }
  174.          if(mx_internal::isExecuting || twoWayCounterpart && twoWayCounterpart.mx_internal::isExecuting)
  175.          {
  176.             hasHadValue = true;
  177.             return;
  178.          }
  179.          try
  180.          {
  181.             mx_internal::isExecuting = true;
  182.             wrapFunctionCall(this,innerExecute,o);
  183.          }
  184.          finally
  185.          {
  186.             mx_internal::isExecuting = false;
  187.          }
  188.       }
  189.       
  190.       mx_internal function get isEnabled() : Boolean
  191.       {
  192.          return mx_internal::_isEnabled;
  193.       }
  194.       
  195.       private function innerExecute() : void
  196.       {
  197.          var _loc1_:Object = wrapFunctionCall(mx_internal::document,mx_internal::srcFunc);
  198.          if(BindingManager.debugDestinationStrings[mx_internal::destString])
  199.          {
  200.             trace("Binding: destString = " + mx_internal::destString + ", srcFunc result = " + _loc1_);
  201.          }
  202.          if(hasHadValue || wrappedFunctionSuccessful)
  203.          {
  204.             if(!(lastValue is XML && Boolean(lastValue.hasComplexContent()) && lastValue === _loc1_) && !(lastValue is XMLList && lastValue.hasComplexContent() && _loc1_ is XMLList && nodeSeqEqual(lastValue as XMLList,_loc1_ as XMLList)))
  205.             {
  206.                mx_internal::destFunc.call(mx_internal::document,_loc1_);
  207.                lastValue = _loc1_;
  208.                hasHadValue = true;
  209.             }
  210.          }
  211.       }
  212.    }
  213. }
  214.  
  215.