/AppKit/Cib/_CPCibObjectData.j

http://github.com/cacaodev/cappuccino · Unknown · 292 lines · 210 code · 82 blank · 0 comment · 0 complexity · eda2bb47a16a3fc60deab80ba8beec28 MD5 · raw file

  1. /*
  2. * _CPCibObjectData.j
  3. * AppKit
  4. *
  5. * Created by Francisco Tolmasky.
  6. * Copyright 2008, 280 North, Inc.
  7. *
  8. * This library is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * This library is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with this library; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. @import <Foundation/CPArray.j>
  23. @import <Foundation/CPObject.j>
  24. @import <Foundation/CPString.j>
  25. @import "CPCibBindingConnector.j"
  26. @import "CPCibConnector.j"
  27. @import "CPCibControlConnector.j"
  28. @import "CPCibHelpConnector.j"
  29. @import "CPCibOutletConnector.j"
  30. @import "CPCibRuntimeAttributesConnector.j"
  31. @import "CPClipView.j"
  32. @class CPScrollView
  33. @implementation _CPCibObjectData : CPObject
  34. {
  35. CPArray _namesKeys;
  36. CPArray _namesValues;
  37. CPArray _accessibilityConnectors;
  38. CPArray _accessibilityOidsKeys;
  39. CPArray _accessibilityOidsValues;
  40. CPArray _classesKeys;
  41. CPArray _classesValues;
  42. CPArray _connections;
  43. id _fontManager;
  44. CPString _framework;
  45. int _nextOid;
  46. CPArray _objectsKeys;
  47. CPArray _objectsValues;
  48. CPArray _oidKeys;
  49. CPArray _oidValues;
  50. _CPCibCustomObject _fileOwner;
  51. CPSet _visibleWindows;
  52. JSObject _replacementObjects;
  53. }
  54. - (id)init
  55. {
  56. self = [super init];
  57. if (self)
  58. {
  59. _namesKeys = [];
  60. _namesValues = [];
  61. //CPArray _accessibilityConnectors;
  62. //CPArray _accessibilityOidsKeys;
  63. //CPArray _accessibilityOidsValues;
  64. _classesKeys = [];
  65. _classesValues = [];
  66. _connections = [];
  67. //id _fontManager;
  68. _framework = @"";
  69. _nextOid = [];
  70. _objectsKeys = [];
  71. _objectsValues = [];
  72. _oidKeys = [];
  73. _oidValues = [];
  74. _fileOwner = nil;
  75. _visibleWindows = [CPSet set];
  76. }
  77. return self;
  78. }
  79. - (void)displayVisibleWindows
  80. {
  81. var object = nil,
  82. objectEnumerator = [_visibleWindows objectEnumerator];
  83. while ((object = [objectEnumerator nextObject]) !== nil)
  84. [_replacementObjects[[object UID]] makeKeyAndOrderFront:self];
  85. }
  86. @end
  87. var _CPCibObjectDataNamesKeysKey = @"_CPCibObjectDataNamesKeysKey",
  88. _CPCibObjectDataNamesValuesKey = @"_CPCibObjectDataNamesValuesKey",
  89. _CPCibObjectDataAccessibilityConnectorsKey = @"_CPCibObjectDataAccessibilityConnectors",
  90. _CPCibObjectDataAccessibilityOidsKeysKey = @"_CPCibObjectDataAccessibilityOidsKeys",
  91. _CPCibObjectDataAccessibilityOidsValuesKey = @"_CPCibObjectDataAccessibilityOidsValues",
  92. _CPCibObjectDataClassesKeysKey = @"_CPCibObjectDataClassesKeysKey",
  93. _CPCibObjectDataClassesValuesKey = @"_CPCibObjectDataClassesValuesKey",
  94. _CPCibObjectDataConnectionsKey = @"_CPCibObjectDataConnectionsKey",
  95. _CPCibObjectDataFontManagerKey = @"_CPCibObjectDataFontManagerKey",
  96. _CPCibObjectDataFrameworkKey = @"_CPCibObjectDataFrameworkKey",
  97. _CPCibObjectDataNextOidKey = @"_CPCibObjectDataNextOidKey",
  98. _CPCibObjectDataObjectsKeysKey = @"_CPCibObjectDataObjectsKeysKey",
  99. _CPCibObjectDataObjectsValuesKey = @"_CPCibObjectDataObjectsValuesKey",
  100. _CPCibObjectDataOidKeysKey = @"_CPCibObjectDataOidKeysKey",
  101. _CPCibObjectDataOidValuesKey = @"_CPCibObjectDataOidValuesKey",
  102. _CPCibObjectDataFileOwnerKey = @"_CPCibObjectDataFileOwnerKey",
  103. _CPCibObjectDataVisibleWindowsKey = @"_CPCibObjectDataVisibleWindowsKey";
  104. @implementation _CPCibObjectData (CPCoding)
  105. - (id)initWithCoder:(CPCoder)aCoder
  106. {
  107. self = [super init];
  108. if (self)
  109. {
  110. _replacementObjects = {};
  111. _namesKeys = [aCoder decodeObjectForKey:_CPCibObjectDataNamesKeysKey];
  112. _namesValues = [aCoder decodeObjectForKey:_CPCibObjectDataNamesValuesKey];
  113. //CPArray _accessibilityConnectors;
  114. //CPArray _accessibilityOidsKeys;
  115. //CPArray _accessibilityOidsValues;
  116. _classesKeys = [aCoder decodeObjectForKey:_CPCibObjectDataClassesKeysKey];
  117. _classesValues = [aCoder decodeObjectForKey:_CPCibObjectDataClassesValuesKey];
  118. _connections = [aCoder decodeObjectForKey:_CPCibObjectDataConnectionsKey];
  119. //id _fontManager;
  120. _framework = [aCoder decodeObjectForKey:_CPCibObjectDataFrameworkKey];
  121. _nextOid = [aCoder decodeIntForKey:_CPCibObjectDataNextOidKey];
  122. _objectsKeys = [aCoder decodeObjectForKey:_CPCibObjectDataObjectsKeysKey];
  123. _objectsValues = [aCoder decodeObjectForKey:_CPCibObjectDataObjectsValuesKey];
  124. _oidKeys = [aCoder decodeObjectForKey:_CPCibObjectDataOidKeysKey];
  125. _oidValues = [aCoder decodeObjectForKey:_CPCibObjectDataOidValuesKey];
  126. _fileOwner = [aCoder decodeObjectForKey:_CPCibObjectDataFileOwnerKey];
  127. _visibleWindows = [aCoder decodeObjectForKey:_CPCibObjectDataVisibleWindowsKey];
  128. }
  129. return self;
  130. }
  131. - (void)encodeWithCoder:(CPCoder)aCoder
  132. {
  133. [aCoder encodeObject:_namesKeys forKey:_CPCibObjectDataNamesKeysKey];
  134. [aCoder encodeObject:_namesValues forKey:_CPCibObjectDataNamesValuesKey];
  135. //CPArray _accessibilityConnectors;
  136. //CPArray _accessibilityOidsKeys;
  137. //CPArray _accessibilityOidsValues;
  138. [aCoder encodeObject:_classesKeys forKey:_CPCibObjectDataClassesKeysKey];
  139. [aCoder encodeObject:_classesValues forKey:_CPCibObjectDataClassesValuesKey];
  140. [aCoder encodeObject:_connections forKey:_CPCibObjectDataConnectionsKey];
  141. //id _fontManager;
  142. [aCoder encodeObject:_framework forKey:_CPCibObjectDataFrameworkKey];
  143. [aCoder encodeInt:_nextOid forKey:_CPCibObjectDataNextOidKey];
  144. [aCoder encodeObject:_objectsKeys forKey:_CPCibObjectDataObjectsKeysKey];
  145. [aCoder encodeObject:_objectsValues forKey:_CPCibObjectDataObjectsValuesKey];
  146. [aCoder encodeObject:_oidKeys forKey:_CPCibObjectDataOidKeysKey];
  147. [aCoder encodeObject:_oidValues forKey:_CPCibObjectDataOidValuesKey];
  148. [aCoder encodeObject:_fileOwner forKey:_CPCibObjectDataFileOwnerKey];
  149. // CPCustomObject _fileOwner;
  150. [aCoder encodeObject:_visibleWindows forKey:_CPCibObjectDataVisibleWindowsKey];
  151. }
  152. - (void)instantiateWithOwner:(id)anOwner topLevelObjects:(CPMutableArray)topLevelObjects
  153. {
  154. // _objectsValues -> parent
  155. // _objectsKeys -> child
  156. var count = [_objectsKeys count];
  157. while (count--)
  158. {
  159. var object = _objectsKeys[count],
  160. parent = _objectsValues[count],
  161. instantiatedObject = object;
  162. if ([object respondsToSelector:@selector(_cibInstantiate)])
  163. {
  164. var instantiatedObject = [object _cibInstantiate];
  165. if (instantiatedObject !== object)
  166. {
  167. _replacementObjects[[object UID]] = instantiatedObject;
  168. if ([instantiatedObject isKindOfClass:CPView])
  169. {
  170. var clipView = [instantiatedObject superview];
  171. if ([clipView isKindOfClass:CPClipView])
  172. {
  173. var scrollView = [clipView superview];
  174. if ([scrollView isKindOfClass:CPScrollView])
  175. [scrollView setDocumentView:instantiatedObject];
  176. }
  177. }
  178. }
  179. }
  180. if (topLevelObjects && parent === _fileOwner && object !== _fileOwner)
  181. topLevelObjects.push(instantiatedObject);
  182. }
  183. }
  184. - (void)establishConnectionsWithOwner:(id)anOwner topLevelObjects:(CPMutableArray)topLevelObjects
  185. {
  186. _replacementObjects[[_fileOwner UID]] = anOwner;
  187. for (var i = 0, count = _connections.length; i < count; ++i)
  188. {
  189. var connection = _connections[i];
  190. [connection replaceObjects:_replacementObjects];
  191. [connection establishConnection];
  192. }
  193. }
  194. - (void)awakeWithOwner:(id)anOwner topLevelObjects:(CPMutableArray)topLevelObjects
  195. {
  196. var count = [_objectsKeys count];
  197. while (count--)
  198. {
  199. var object = _objectsKeys[count],
  200. instantiatedObject = _replacementObjects[[object UID]];
  201. if (instantiatedObject)
  202. object = instantiatedObject;
  203. // Don't use _fileOwner, by this point its been replaced with anOwner.
  204. if (object !== anOwner && [object respondsToSelector:@selector(awakeFromCib)])
  205. [object awakeFromCib];
  206. }
  207. if ([anOwner respondsToSelector:@selector(awakeFromCib)])
  208. [anOwner awakeFromCib];
  209. }
  210. @end