/Frameworks/Foundation/objj.platform/CPKeyValueObserving.j

http://github.com/polymar/polish · Unknown · 377 lines · 377 code · 0 blank · 0 comment · 0 complexity · cdba3175431d4a35cdc33af85d7951c6 MD5 · raw file

  1. i;9;CPArray.ji;14;CPDictionary.ji;13;CPException.ji;10;CPObject.ji;7;CPSet.jc;14900;
  2. var _1=objj_getClass("CPObject");
  3. if(!_1){
  4. objj_exception_throw(new objj_exception(OBJJClassNotFoundException,"*** Could not find definition for class \"CPObject\""));
  5. }
  6. var _2=_1.isa;
  7. class_addMethods(_1,[new objj_method(sel_getUid("willChangeValueForKey:"),function(_3,_4,_5){
  8. with(_3){
  9. }
  10. }),new objj_method(sel_getUid("didChangeValueForKey:"),function(_6,_7,_8){
  11. with(_6){
  12. }
  13. }),new objj_method(sel_getUid("willChange:valuesAtIndexes:forKey:"),function(_9,_a,_b,_c,_d){
  14. with(_9){
  15. }
  16. }),new objj_method(sel_getUid("didChange:valuesAtIndexes:forKey:"),function(_e,_f,_10,_11,key){
  17. with(_e){
  18. }
  19. }),new objj_method(sel_getUid("addObserver:forKeyPath:options:context:"),function(_13,_14,_15,_16,_17,_18){
  20. with(_13){
  21. if(!_15||!_16){
  22. return;
  23. }
  24. objj_msgSend(objj_msgSend(_CPKVOProxy,"proxyForObject:",_13),"_addObserver:forKeyPath:options:context:",_15,_16,_17,_18);
  25. }
  26. }),new objj_method(sel_getUid("removeObserver:forKeyPath:"),function(_19,_1a,_1b,_1c){
  27. with(_19){
  28. if(!_1b||!_1c){
  29. return;
  30. }
  31. objj_msgSend(objj_msgSend(_1d,"objectForKey:",objj_msgSend(_19,"hash")),"_removeObserver:forKeyPath:",_1b,_1c);
  32. }
  33. })]);
  34. class_addMethods(_2,[new objj_method(sel_getUid("automaticallyNotifiesObserversForKey:"),function(_1e,_1f,_20){
  35. with(_1e){
  36. return YES;
  37. }
  38. }),new objj_method(sel_getUid("keyPathsForValuesAffectingValueForKey:"),function(_21,_22,_23){
  39. with(_21){
  40. var _24=_23.charAt(0).toUpperCase()+_23.substring(1);
  41. selector="keyPathsForValuesAffectingValueFor"+_24;
  42. if(objj_msgSend(objj_msgSend(_21,"class"),"respondsToSelector:",selector)){
  43. return objj_msgSend(objj_msgSend(_21,"class"),selector);
  44. }
  45. return objj_msgSend(CPSet,"set");
  46. }
  47. })]);
  48. CPKeyValueObservingOptionNew=1<<0;
  49. CPKeyValueObservingOptionOld=1<<1;
  50. CPKeyValueObservingOptionInitial=1<<2;
  51. CPKeyValueObservingOptionPrior=1<<3;
  52. CPKeyValueChangeKindKey="CPKeyValueChangeKindKey";
  53. CPKeyValueChangeNewKey="CPKeyValueChangeNewKey";
  54. CPKeyValueChangeOldKey="CPKeyValueChangeOldKey";
  55. CPKeyValueChangeIndexesKey="CPKeyValueChangeIndexesKey";
  56. CPKeyValueChangeNotificationIsPriorKey="CPKeyValueChangeNotificationIsPriorKey";
  57. CPKeyValueChangeSetting=1;
  58. CPKeyValueChangeInsertion=2;
  59. CPKeyValueChangeRemoval=3;
  60. CPKeyValueChangeReplacement=4;
  61. var _25=CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld;
  62. var _1d=objj_msgSend(CPDictionary,"dictionary"),_26=objj_msgSend(CPDictionary,"dictionary");
  63. var _1=objj_allocateClassPair(CPObject,"_CPKVOProxy"),_2=_1.isa;
  64. class_addIvars(_1,[new objj_ivar("_targetObject"),new objj_ivar("_nativeClass"),new objj_ivar("_changesForKey"),new objj_ivar("_observersForKey"),new objj_ivar("_replacedKeys")]);
  65. objj_registerClassPair(_1);
  66. objj_addClassForBundle(_1,objj_getBundleWithPath(OBJJ_CURRENT_BUNDLE.path));
  67. class_addMethods(_1,[new objj_method(sel_getUid("initWithTarget:"),function(_27,_28,_29){
  68. with(_27){
  69. _27=objj_msgSendSuper({receiver:_27,super_class:objj_getClass("CPObject")},"init");
  70. _targetObject=_29;
  71. _nativeClass=objj_msgSend(_29,"class");
  72. _observersForKey=objj_msgSend(CPDictionary,"dictionary");
  73. _changesForKey=objj_msgSend(CPDictionary,"dictionary");
  74. _replacedKeys=objj_msgSend(CPSet,"set");
  75. return _27;
  76. }
  77. }),new objj_method(sel_getUid("_replaceClass"),function(_2a,_2b){
  78. with(_2a){
  79. var _2c=_nativeClass,_2d="$KVO_"+class_getName(_nativeClass),_2e=objj_lookUpClass(_2d);
  80. if(_2e){
  81. _targetObject.isa=_2e;
  82. return;
  83. }
  84. var _2f=objj_allocateClassPair(_2c,_2d);
  85. objj_registerClassPair(_2f);
  86. _class_initialize(_2f);
  87. var _30=_CPKVOModelSubclass.method_list,_31=_30.length;
  88. for(var i=0;i<_31;i++){
  89. var _33=_30[i];
  90. class_addMethod(_2f,method_getName(_33),method_getImplementation(_33),"");
  91. }
  92. _targetObject.isa=_2f;
  93. }
  94. }),new objj_method(sel_getUid("_replaceSetterForKey:"),function(_34,_35,_36){
  95. with(_34){
  96. if(objj_msgSend(_replacedKeys,"containsObject:",_36)||!objj_msgSend(_nativeClass,"automaticallyNotifiesObserversForKey:",_36)){
  97. return;
  98. }
  99. var _37=_nativeClass,_38=_36.charAt(0).toUpperCase()+_36.substring(1),_39=false,_3a=["set"+_38+":",_3b,"_set"+_38+":",_3b,"insertObject:in"+_38+"AtIndex:",_3c,"replaceObjectIn"+_38+"AtIndex:withObject:",_3d,"removeObjectFrom"+_38+"AtIndex:",_3e];
  100. for(var i=0,_40=_3a.length;i<_40;i+=2){
  101. var _41=sel_getName(_3a[i]),_42=_3a[i+1];
  102. if(objj_msgSend(_nativeClass,"instancesRespondToSelector:",_41)){
  103. var _43=class_getInstanceMethod(_nativeClass,_41);
  104. class_addMethod(_targetObject.isa,_41,_42(_36,_43),"");
  105. _39=true;
  106. }
  107. }
  108. if(_39){
  109. return;
  110. }
  111. var _44=objj_msgSend(objj_msgSend(_nativeClass,"keyPathsForValuesAffectingValueForKey:",_36),"allObjects");
  112. if(!_44){
  113. return;
  114. }
  115. var _45=objj_msgSend(_26,"objectForKey:",objj_msgSend(_nativeClass,"hash"));
  116. if(!_45){
  117. _45=objj_msgSend(CPDictionary,"new");
  118. objj_msgSend(_26,"setObject:forKey:",_45,objj_msgSend(_nativeClass,"hash"));
  119. }
  120. for(var i=0,_40=_44.length;i<_40;i++){
  121. var _46=_44[i],_47=objj_msgSend(_45,"objectForKey:",_46);
  122. if(!_47){
  123. _47=objj_msgSend(CPSet,"new");
  124. objj_msgSend(_45,"setObject:forKey:",_47,_46);
  125. }
  126. objj_msgSend(_47,"addObject:",_36);
  127. objj_msgSend(_34,"_replaceSetterForKey:",_46);
  128. }
  129. }
  130. }),new objj_method(sel_getUid("_addObserver:forKeyPath:options:context:"),function(_48,_49,_4a,_4b,_4c,_4d){
  131. with(_48){
  132. if(!_4a){
  133. return;
  134. }
  135. var _4e=nil;
  136. if(_4b.indexOf(".")!=CPNotFound){
  137. _4e=objj_msgSend(objj_msgSend(_CPKVOForwardingObserver,"alloc"),"initWithKeyPath:object:observer:options:context:",_4b,_targetObject,_4a,_4c,_4d);
  138. }else{
  139. objj_msgSend(_48,"_replaceSetterForKey:",_4b);
  140. }
  141. var _4f=objj_msgSend(_observersForKey,"objectForKey:",_4b);
  142. if(!_4f){
  143. _4f=objj_msgSend(CPDictionary,"dictionary");
  144. objj_msgSend(_observersForKey,"setObject:forKey:",_4f,_4b);
  145. }
  146. objj_msgSend(_4f,"setObject:forKey:",_50(_4a,_4c,_4d,_4e),objj_msgSend(_4a,"hash"));
  147. if(_4c&CPKeyValueObservingOptionInitial){
  148. var _51=objj_msgSend(_targetObject,"valueForKeyPath:",_4b);
  149. if(_51===nil||_51===undefined){
  150. _51=objj_msgSend(CPNull,"null");
  151. }
  152. var _52=objj_msgSend(CPDictionary,"dictionaryWithObject:forKey:",_51,CPKeyValueChangeNewKey);
  153. objj_msgSend(_4a,"observeValueForKeyPath:ofObject:change:context:",_4b,_48,_52,_4d);
  154. }
  155. }
  156. }),new objj_method(sel_getUid("_removeObserver:forKeyPath:"),function(_53,_54,_55,_56){
  157. with(_53){
  158. var _57=objj_msgSend(_observersForKey,"objectForKey:",_56);
  159. if(_56.indexOf(".")!=CPNotFound){
  160. var _58=objj_msgSend(_57,"objectForKey:",objj_msgSend(_55,"hash")).forwarder;
  161. objj_msgSend(_58,"finalize");
  162. }
  163. objj_msgSend(_57,"removeObjectForKey:",objj_msgSend(_55,"hash"));
  164. if(!objj_msgSend(_57,"count")){
  165. objj_msgSend(_observersForKey,"removeObjectForKey:",_56);
  166. }
  167. if(!objj_msgSend(_observersForKey,"count")){
  168. _targetObject.isa=_nativeClass;
  169. objj_msgSend(_1d,"removeObjectForKey:",objj_msgSend(_targetObject,"hash"));
  170. }
  171. }
  172. }),new objj_method(sel_getUid("_sendNotificationsForKey:changeOptions:isBefore:"),function(_59,_5a,_5b,_5c,_5d){
  173. with(_59){
  174. var _5e=objj_msgSend(_changesForKey,"objectForKey:",_5b);
  175. if(_5d){
  176. _5e=_5c;
  177. var _5f=objj_msgSend(_5e,"objectForKey:",CPKeyValueChangeIndexesKey);
  178. if(_5f){
  179. var _60=objj_msgSend(_5e,"objectForKey:",CPKeyValueChangeKindKey);
  180. if(_60==CPKeyValueChangeReplacement||_60==CPKeyValueChangeRemoval){
  181. var _61=objj_msgSend(objj_msgSend(_targetObject,"mutableArrayValueForKeyPath:",_5b),"objectsAtIndexes:",_5f);
  182. objj_msgSend(_5e,"setValue:forKey:",_61,CPKeyValueChangeOldKey);
  183. }
  184. }else{
  185. var _62=objj_msgSend(_targetObject,"valueForKey:",_5b);
  186. if(_62===nil||_62===undefined){
  187. _62=objj_msgSend(CPNull,"null");
  188. }
  189. objj_msgSend(_5e,"setObject:forKey:",_62,CPKeyValueChangeOldKey);
  190. }
  191. objj_msgSend(_5e,"setObject:forKey:",1,CPKeyValueChangeNotificationIsPriorKey);
  192. objj_msgSend(_changesForKey,"setObject:forKey:",_5e,_5b);
  193. }else{
  194. objj_msgSend(_5e,"removeObjectForKey:",CPKeyValueChangeNotificationIsPriorKey);
  195. var _5f=objj_msgSend(_5e,"objectForKey:",CPKeyValueChangeIndexesKey);
  196. if(_5f){
  197. var _60=objj_msgSend(_5e,"objectForKey:",CPKeyValueChangeKindKey);
  198. if(_60==CPKeyValueChangeReplacement||_60==CPKeyValueChangeInsertion){
  199. var _61=objj_msgSend(objj_msgSend(_targetObject,"mutableArrayValueForKeyPath:",_5b),"objectsAtIndexes:",_5f);
  200. objj_msgSend(_5e,"setValue:forKey:",_61,CPKeyValueChangeNewKey);
  201. }
  202. }else{
  203. var _63=objj_msgSend(_targetObject,"valueForKey:",_5b);
  204. if(_63===nil||_63===undefined){
  205. _63=objj_msgSend(CPNull,"null");
  206. }
  207. objj_msgSend(_5e,"setObject:forKey:",_63,CPKeyValueChangeNewKey);
  208. }
  209. }
  210. var _64=objj_msgSend(objj_msgSend(_observersForKey,"objectForKey:",_5b),"allValues"),_65=objj_msgSend(_64,"count");
  211. while(_65--){
  212. var _66=_64[_65];
  213. if(_5d&&(_66.options&CPKeyValueObservingOptionPrior)){
  214. objj_msgSend(_66.observer,"observeValueForKeyPath:ofObject:change:context:",_5b,_targetObject,_5e,_66.context);
  215. }else{
  216. if(!_5d){
  217. objj_msgSend(_66.observer,"observeValueForKeyPath:ofObject:change:context:",_5b,_targetObject,_5e,_66.context);
  218. }
  219. }
  220. }
  221. var _67=objj_msgSend(objj_msgSend(objj_msgSend(_26,"objectForKey:",objj_msgSend(_nativeClass,"hash")),"objectForKey:",_5b),"allObjects");
  222. if(!_67){
  223. return;
  224. }
  225. for(var i=0,_65=_67.length;i<_65;i++){
  226. objj_msgSend(_59,"_sendNotificationsForKey:changeOptions:isBefore:",_67[i],_5c,_5d);
  227. }
  228. }
  229. })]);
  230. class_addMethods(_2,[new objj_method(sel_getUid("proxyForObject:"),function(_69,_6a,_6b){
  231. with(_69){
  232. var _6c=objj_msgSend(_1d,"objectForKey:",objj_msgSend(_6b,"hash"));
  233. if(_6c){
  234. return _6c;
  235. }
  236. _6c=objj_msgSend(objj_msgSend(_69,"alloc"),"initWithTarget:",_6b);
  237. objj_msgSend(_6c,"_replaceClass");
  238. objj_msgSend(_1d,"setObject:forKey:",_6c,objj_msgSend(_6b,"hash"));
  239. return _6c;
  240. }
  241. })]);
  242. var _1=objj_allocateClassPair(Nil,"_CPKVOModelSubclass"),_2=_1.isa;
  243. objj_registerClassPair(_1);
  244. objj_addClassForBundle(_1,objj_getBundleWithPath(OBJJ_CURRENT_BUNDLE.path));
  245. class_addMethods(_1,[new objj_method(sel_getUid("willChangeValueForKey:"),function(_6d,_6e,_6f){
  246. with(_6d){
  247. if(!_6f){
  248. return;
  249. }
  250. var _70=objj_msgSend(CPDictionary,"dictionaryWithObject:forKey:",CPKeyValueChangeSetting,CPKeyValueChangeKindKey);
  251. objj_msgSend(objj_msgSend(_CPKVOProxy,"proxyForObject:",_6d),"_sendNotificationsForKey:changeOptions:isBefore:",_6f,_70,YES);
  252. }
  253. }),new objj_method(sel_getUid("didChangeValueForKey:"),function(_71,_72,_73){
  254. with(_71){
  255. if(!_73){
  256. return;
  257. }
  258. objj_msgSend(objj_msgSend(_CPKVOProxy,"proxyForObject:",_71),"_sendNotificationsForKey:changeOptions:isBefore:",_73,nil,NO);
  259. }
  260. }),new objj_method(sel_getUid("willChange:valuesAtIndexes:forKey:"),function(_74,_75,_76,_77,_78){
  261. with(_74){
  262. if(!_78){
  263. return;
  264. }
  265. var _79=objj_msgSend(CPDictionary,"dictionaryWithObjects:forKeys:",[_76,_77],[CPKeyValueChangeKindKey,CPKeyValueChangeIndexesKey]);
  266. objj_msgSend(objj_msgSend(_CPKVOProxy,"proxyForObject:",_74),"_sendNotificationsForKey:changeOptions:isBefore:",_78,_79,YES);
  267. }
  268. }),new objj_method(sel_getUid("didChange:valuesAtIndexes:forKey:"),function(_7a,_7b,_7c,_7d,_7e){
  269. with(_7a){
  270. if(!_7e){
  271. return;
  272. }
  273. objj_msgSend(objj_msgSend(_CPKVOProxy,"proxyForObject:",_7a),"_sendNotificationsForKey:changeOptions:isBefore:",_7e,nil,NO);
  274. }
  275. }),new objj_method(sel_getUid("class"),function(_7f,_80){
  276. with(_7f){
  277. return objj_msgSend(_1d,"objectForKey:",objj_msgSend(_7f,"hash"))._nativeClass;
  278. }
  279. }),new objj_method(sel_getUid("superclass"),function(_81,_82){
  280. with(_81){
  281. return objj_msgSend(objj_msgSend(_81,"class"),"superclass");
  282. }
  283. }),new objj_method(sel_getUid("isKindOfClass:"),function(_83,_84,_85){
  284. with(_83){
  285. return objj_msgSend(objj_msgSend(_83,"class"),"isSubclassOfClass:",_85);
  286. }
  287. }),new objj_method(sel_getUid("isMemberOfClass:"),function(_86,_87,_88){
  288. with(_86){
  289. return objj_msgSend(_86,"class")==_88;
  290. }
  291. }),new objj_method(sel_getUid("className"),function(_89,_8a){
  292. with(_89){
  293. return objj_msgSend(_89,"class").name;
  294. }
  295. })]);
  296. var _1=objj_allocateClassPair(CPObject,"_CPKVOForwardingObserver"),_2=_1.isa;
  297. class_addIvars(_1,[new objj_ivar("_object"),new objj_ivar("_observer"),new objj_ivar("_context"),new objj_ivar("_firstPart"),new objj_ivar("_secondPart"),new objj_ivar("_value")]);
  298. objj_registerClassPair(_1);
  299. objj_addClassForBundle(_1,objj_getBundleWithPath(OBJJ_CURRENT_BUNDLE.path));
  300. class_addMethods(_1,[new objj_method(sel_getUid("initWithKeyPath:object:observer:options:context:"),function(_8b,_8c,_8d,_8e,_8f,_90,_91){
  301. with(_8b){
  302. _8b=objj_msgSendSuper({receiver:_8b,super_class:objj_getClass("CPObject")},"init");
  303. _context=_91;
  304. _observer=_8f;
  305. _object=_8e;
  306. var _92=_8d.indexOf(".");
  307. if(_92==CPNotFound){
  308. objj_msgSend(CPException,"raise:reason:",CPInvalidArgumentException,"Created _CPKVOForwardingObserver without compound key path: "+_8d);
  309. }
  310. _firstPart=_8d.substring(0,_92);
  311. _secondPart=_8d.substring(_92+1);
  312. objj_msgSend(_object,"addObserver:forKeyPath:options:context:",_8b,_firstPart,_25,nil);
  313. _value=objj_msgSend(_object,"valueForKey:",_firstPart);
  314. if(_value){
  315. objj_msgSend(_value,"addObserver:forKeyPath:options:context:",_8b,_secondPart,_25,nil);
  316. }
  317. return _8b;
  318. }
  319. }),new objj_method(sel_getUid("observeValueForKeyPath:ofObject:change:context:"),function(_93,_94,_95,_96,_97,_98){
  320. with(_93){
  321. if(_96==_object){
  322. objj_msgSend(_observer,"observeValueForKeyPath:ofObject:change:context:",_firstPart,_object,_97,_context);
  323. if(_value){
  324. objj_msgSend(_value,"removeObserver:forKeyPath:",_93,_secondPart);
  325. }
  326. _value=objj_msgSend(_object,"valueForKey:",_firstPart);
  327. if(_value){
  328. objj_msgSend(_value,"addObserver:forKeyPath:options:context:",_93,_secondPart,_25,nil);
  329. }
  330. }else{
  331. objj_msgSend(_observer,"observeValueForKeyPath:ofObject:change:context:",_firstPart+"."+_95,_object,_97,_context);
  332. }
  333. }
  334. }),new objj_method(sel_getUid("finalize"),function(_99,_9a){
  335. with(_99){
  336. if(_value){
  337. objj_msgSend(_value,"removeObserver:forKeyPath:",_99,_secondPart);
  338. }
  339. objj_msgSend(_object,"removeObserver:forKeyPath:",_99,_firstPart);
  340. _object=nil;
  341. _observer=nil;
  342. _context=nil;
  343. _value=nil;
  344. }
  345. })]);
  346. var _50=_50=function(_9b,_9c,_9d,_9e){
  347. return {observer:_9b,options:_9c,context:_9d,forwarder:_9e};
  348. };
  349. var _3b=_3b=function(_9f,_a0){
  350. return function(_a1,_a2,_a3){
  351. objj_msgSend(_a1,"willChangeValueForKey:",_9f);
  352. _a0.method_imp(_a1,_a2,_a3);
  353. objj_msgSend(_a1,"didChangeValueForKey:",_9f);
  354. };
  355. };
  356. var _3c=_3c=function(_a4,_a5){
  357. return function(_a6,_a7,_a8,_a9){
  358. objj_msgSend(_a6,"willChange:valuesAtIndexes:forKey:",CPKeyValueChangeInsertion,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_a9),_a4);
  359. _a5.method_imp(_a6,_a7,_a8,_a9);
  360. objj_msgSend(_a6,"didChange:valuesAtIndexes:forKey:",CPKeyValueChangeInsertion,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_a9),_a4);
  361. };
  362. };
  363. var _3d=_3d=function(_aa,_ab){
  364. return function(_ac,_ad,_ae,_af){
  365. objj_msgSend(_ac,"willChange:valuesAtIndexes:forKey:",CPKeyValueChangeReplacement,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_ae),_aa);
  366. _ab.method_imp(_ac,_ad,_ae,_af);
  367. objj_msgSend(_ac,"didChange:valuesAtIndexes:forKey:",CPKeyValueChangeReplacement,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_ae),_aa);
  368. };
  369. };
  370. var _3e=_3e=function(_b0,_b1){
  371. return function(_b2,_b3,_b4){
  372. objj_msgSend(_b2,"willChange:valuesAtIndexes:forKey:",CPKeyValueChangeRemoval,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_b4),_b0);
  373. _b1.method_imp(_b2,_b3,_b4);
  374. objj_msgSend(_b2,"didChange:valuesAtIndexes:forKey:",CPKeyValueChangeRemoval,objj_msgSend(CPIndexSet,"indexSetWithIndex:",_b4),_b0);
  375. };
  376. };
  377. i;13;CPArray+KVO.j