/Frameworks/AppKit/rhino.platform/CPThemedAttribute.j

http://github.com/jfahrenkrug/MapKit-HelloWorld · Unknown · 256 lines · 204 code · 52 blank · 0 comment · 0 complexity · fac4c3415be8b93d7fcbef7d5b8cdc62 MD5 · raw file

  1. I;21;Foundation/CPObject.jc;7686;
  2. CPControlStateNormal = 0,
  3. CPControlStateHighlighted = 1 << 0,
  4. CPControlStateDisabled = 1 << 1,
  5. CPControlStateSelected = 1 << 2,
  6. CPControlStateDefault = 1 << 3,
  7. CPControlStateBordered = 1 << 4,
  8. CPControlStateBezeled = 1 << 5,
  9. CPControlStateVertical = 1 << 6,
  10. CPControlStateEditable = 1 << 7,
  11. CPControlStateEditing = 1 << 8;
  12. var BIT_COUNT = [ 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 ,
  13. 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 ,
  14. 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 ,
  15. 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 ],
  16. bit_count = function(bits)
  17. {
  18. var count = 0;
  19. while (bits)
  20. {
  21. ++count;
  22. bits &= (bits - 1);
  23. }
  24. return count ;
  25. }
  26. {var the_class = objj_allocateClassPair(CPObject, "CPThemedAttribute"),
  27. meta_class = the_class.isa;class_addIvars(the_class, [new objj_ivar("_cache"), new objj_ivar("_name"), new objj_ivar("_defaultValue"), new objj_ivar("_theme"), new objj_ivar("_themedClass"), new objj_ivar("_values"), new objj_ivar("_attributeFromTheme")]);
  28. objj_registerClassPair(the_class);
  29. objj_addClassForBundle(the_class, objj_getBundleWithPath(OBJJ_CURRENT_BUNDLE.path));
  30. class_addMethods(the_class, [new objj_method(sel_getUid("initWithName:defaultValue:theme:class:"), function(self, _cmd, aName, aDefaultValue, aTheme, aClass)
  31. { with(self)
  32. {
  33. self = objj_msgSendSuper({ receiver:self, super_class:objj_getClass("CPObject") }, "init");
  34. if (self)
  35. {
  36. _cache = {};
  37. _name = aName;
  38. _defaultValue = aDefaultValue;
  39. _theme = aTheme;
  40. _themedClass = aClass;
  41. _values = objj_msgSend(CPDictionary, "dictionary");
  42. _attributeFromTheme = objj_msgSend(_theme, "valueForAttributeName:inClass:", _name, _themedClass);
  43. }
  44. return self;
  45. }
  46. }), new objj_method(sel_getUid("setName:"), function(self, _cmd, aName)
  47. { with(self)
  48. {
  49. _name = aName;
  50. }
  51. }), new objj_method(sel_getUid("name"), function(self, _cmd)
  52. { with(self)
  53. {
  54. return _name;
  55. }
  56. }), new objj_method(sel_getUid("setDefaultValue:"), function(self, _cmd, aValue)
  57. { with(self)
  58. {
  59. _cache = {};
  60. _defaultValue = aValue;
  61. }
  62. }), new objj_method(sel_getUid("setTheme:"), function(self, _cmd, aTheme)
  63. { with(self)
  64. {
  65. if (_theme === aTheme)
  66. return;
  67. _cache = {};
  68. _theme = aTheme;
  69. _attributeFromTheme = objj_msgSend(_theme, "valueForAttributeName:inClass:", _name, _themedClass);
  70. }
  71. }), new objj_method(sel_getUid("setThemedClass:"), function(self, _cmd, aClass)
  72. { with(self)
  73. {
  74. if (_themedClass === aClass)
  75. return;
  76. _cache = {};
  77. _themedClass = aClass;
  78. _attributeFromTheme = objj_msgSend(_theme, "valueForAttributeName:inClass:", _name, _themedClass);
  79. }
  80. }), new objj_method(sel_getUid("setValue:"), function(self, _cmd, aValue)
  81. { with(self)
  82. {
  83. _cache = {};
  84. if (aValue === undefined || aValue === nil)
  85. _values = objj_msgSend(CPDictionary, "dictionary");
  86. else
  87. _values = objj_msgSend(CPDictionary, "dictionaryWithObject:forKey:", aValue, String(CPControlStateNormal));
  88. }
  89. }), new objj_method(sel_getUid("value"), function(self, _cmd)
  90. { with(self)
  91. {
  92. return objj_msgSend(self, "valueForControlState:", CPControlStateNormal);
  93. }
  94. }), new objj_method(sel_getUid("setValue:forControlState:"), function(self, _cmd, aValue, aState)
  95. { with(self)
  96. {
  97. _cache = {};
  98. if ((aValue === undefined) || (aValue === nil))
  99. objj_msgSend(_values, "removeObjectForKey:", String(aState));
  100. else
  101. objj_msgSend(_values, "setObject:forKey:", aValue, String(aState));
  102. }
  103. }), new objj_method(sel_getUid("valueForControlState:"), function(self, _cmd, aState)
  104. { with(self)
  105. {
  106. var value = _cache[aState];
  107. if (value !== undefined)
  108. return value;
  109. value = objj_msgSend(_values, "objectForKey:", String(aState));
  110. if ((value === undefined || value === nil) && aState > 0)
  111. {
  112. if (aState & (aState - 1))
  113. {
  114. var highestBitCount = 0,
  115. states = objj_msgSend(_values, "allKeys"),
  116. count = states.length;
  117. while (count--)
  118. {
  119. state = Number(states[count]);
  120. if ((state & aState) === state)
  121. {
  122. var bitCount = (state < BIT_COUNT.length) ? BIT_COUNT[state] : bit_count(state);
  123. if (bitCount > highestBitCount)
  124. {
  125. highestBitCount = bitCount;
  126. value = objj_msgSend(_values, "objectForKey:", String(state));
  127. }
  128. }
  129. }
  130. }
  131. if (value === undefined || value === nil)
  132. value = objj_msgSend(_values, "objectForKey:", String(CPControlStateNormal));
  133. }
  134. if (value === undefined || value === nil)
  135. value = objj_msgSend(_attributeFromTheme, "valueForControlState:", aState);
  136. if (value === undefined || value === nil)
  137. value = _defaultValue;
  138. _cache[aState] = value;
  139. return value;
  140. }
  141. }), new objj_method(sel_getUid("themedAttributeMergedWithThemedAttribute:"), function(self, _cmd, aThemedAttribute)
  142. { with(self)
  143. {
  144. var mergedAttribute = CPThemedAttributeMake(_name, _defaultValue, _theme, _themedClass);
  145. mergedAttribute._values = objj_msgSend(_values, "copy");
  146. objj_msgSend(mergedAttribute._values, "addEntriesFromDictionary:", aThemedAttribute._values);
  147. return mergedAttribute;
  148. }
  149. }), new objj_method(sel_getUid("initWithCoder:"), function(self, _cmd, aCoder)
  150. { with(self)
  151. {
  152. self = objj_msgSendSuper({ receiver:self, super_class:objj_getClass("CPObject") }, "init");
  153. if (self)
  154. {
  155. _cache = {};
  156. _values = objj_msgSend(aCoder, "decodeObjectForKey:", "values");
  157. }
  158. return self;
  159. }
  160. }), new objj_method(sel_getUid("encodeWithCoder:"), function(self, _cmd, aCoder)
  161. { with(self)
  162. {
  163. objj_msgSend(aCoder, "encodeObject:forKey:", _values, "values");
  164. }
  165. })]);
  166. }
  167. CPThemedAttributeMake= function(aName, aDefaultValue, aTheme, aClass)
  168. {
  169. return objj_msgSend(objj_msgSend(CPThemedAttribute, "alloc"), "initWithName:defaultValue:theme:class:", aName, aDefaultValue, aTheme, aClass);
  170. }
  171. CPThemedAttributeEncode= function(aCoder, aThemedAttribute)
  172. {
  173. var values = aThemedAttribute._values,
  174. count = objj_msgSend(values, "count");
  175. if (count === 1)
  176. {
  177. var key = objj_msgSend(values, "allKeys")[0];
  178. if (Number(key) === 0)
  179. return objj_msgSend(aCoder, "encodeObject:forKey:", objj_msgSend(values, "objectForKey:", key), "$a" + objj_msgSend(aThemedAttribute, "name"));
  180. }
  181. if (count >= 1)
  182. objj_msgSend(aCoder, "encodeObject:forKey:", aThemedAttribute, "$a" + objj_msgSend(aThemedAttribute, "name"));
  183. }
  184. CPThemedAttributeDecode= function(aCoder, anAttributeName, aDefaultValue, aTheme, aClass)
  185. {
  186. var key = "$a" + anAttributeName;
  187. if (!objj_msgSend(aCoder, "containsValueForKey:", key))
  188. return CPThemedAttributeMake(anAttributeName, aDefaultValue, aTheme, aClass);
  189. var attribute = objj_msgSend(aCoder, "decodeObjectForKey:", key);
  190. if (!attribute.isa || !objj_msgSend(attribute, "isKindOfClass:", objj_msgSend(CPThemedAttribute, "class")))
  191. {
  192. var themedAttribute = CPThemedAttributeMake(anAttributeName, aDefaultValue, aTheme, aClass);
  193. objj_msgSend(themedAttribute, "setValue:", attribute);
  194. attribute = themedAttribute;
  195. }
  196. else
  197. {
  198. objj_msgSend(attribute, "setName:", anAttributeName);
  199. objj_msgSend(attribute, "setDefaultValue:", aDefaultValue);
  200. objj_msgSend(attribute, "setTheme:", aTheme);
  201. objj_msgSend(attribute, "setThemedClass:", aClass);
  202. }
  203. return attribute;
  204. }