sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (754) hide show
  1. data/Buildfile +4 -2
  2. data/frameworks/sproutcore/Buildfile +3 -2
  3. data/frameworks/sproutcore/README +2 -1
  4. data/frameworks/sproutcore/apps/docs/core.js +27 -0
  5. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  6. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  7. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  8. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  9. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  10. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  11. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  12. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  13. data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  14. data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  15. data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  16. data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
  17. data/frameworks/sproutcore/apps/docs/main.js +30 -0
  18. data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
  19. data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
  20. data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
  22. data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
  23. data/frameworks/sproutcore/apps/tests/core.js +114 -16
  24. data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
  27. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
  28. data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
  29. data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
  30. data/frameworks/sproutcore/apps/tests/main.js +9 -20
  31. data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
  32. data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
  33. data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
  34. data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
  35. data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
  36. data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
  37. data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
  38. data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
  39. data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  40. data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
  41. data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
  42. data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  43. data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  44. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
  45. data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  46. data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  47. data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  48. data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
  49. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  50. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  51. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  52. data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  53. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  54. data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  55. data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  56. data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  57. data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  58. data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  59. data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  60. data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  61. data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  62. data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  63. data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  64. data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  65. data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  66. data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  67. data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  68. data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  69. data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  70. data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  71. data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  72. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
  73. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
  74. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
  75. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
  76. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
  77. data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
  78. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
  79. data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
  80. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
  81. data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
  82. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
  83. data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
  84. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
  85. data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
  98. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
  99. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
  100. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
  101. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
  102. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
  103. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
  104. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
  105. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
  106. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
  107. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
  108. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
  109. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
  110. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
  111. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
  112. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
  113. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
  114. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
  115. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
  116. data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
  118. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
  119. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
  120. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
  121. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
  122. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
  123. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
  124. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
  125. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
  126. data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
  127. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
  128. data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
  129. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
  130. data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
  131. data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
  132. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
  133. data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
  134. data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
  135. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
  136. data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
  137. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
  138. data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
  139. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
  140. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
  141. data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
  142. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
  143. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
  144. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
  145. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
  146. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
  147. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
  148. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
  149. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
  150. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  151. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
  152. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
  153. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
  154. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
  155. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
  156. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
  157. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
  158. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
  159. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
  160. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
  161. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
  162. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
  163. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
  164. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
  165. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
  166. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
  167. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  168. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  169. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
  170. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
  171. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  172. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  173. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
  174. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  175. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  176. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  177. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
  178. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
  179. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  180. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
  181. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  182. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  183. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
  184. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  185. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
  186. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  187. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
  188. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
  189. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
  190. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
  191. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
  192. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
  193. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
  194. data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
  195. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
  196. data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
  197. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
  198. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
  199. data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
  200. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
  201. data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
  202. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
  203. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
  204. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
  205. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
  206. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
  207. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
  208. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
  209. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
  210. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
  211. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
  212. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
  213. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
  214. data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
  215. data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
  216. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
  217. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
  218. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
  219. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
  220. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
  221. data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
  222. data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
  223. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
  224. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
  225. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
  226. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
  227. data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
  228. data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
  229. data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
  230. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
  231. data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
  232. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
  233. data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
  234. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
  235. data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
  236. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
  237. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
  238. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
  239. data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
  240. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
  241. data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
  242. data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
  243. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
  244. data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
  245. data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
  246. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
  247. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
  248. data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
  249. data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
  250. data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
  251. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
  252. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
  253. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
  254. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
  255. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
  256. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
  257. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
  258. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
  259. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
  260. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
  261. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
  262. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
  263. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  264. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
  265. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
  266. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
  267. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  268. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  269. data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  270. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
  271. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
  272. data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
  273. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
  274. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
  275. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
  276. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
  277. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
  278. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
  279. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
  280. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
  281. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
  282. data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
  283. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
  284. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
  285. data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
  286. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
  287. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
  288. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
  289. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
  290. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
  291. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
  292. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
  293. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
  294. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
  295. data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
  296. data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
  297. data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
  298. data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
  299. data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
  300. data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
  301. data/frameworks/sproutcore/frameworks/runtime/README +1 -0
  302. data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
  303. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
  304. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  305. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  306. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  307. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  308. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  309. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  310. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  311. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  312. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  313. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  314. data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  315. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
  316. data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
  317. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
  318. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
  319. data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
  320. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
  321. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
  322. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
  323. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
  324. data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
  325. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
  326. data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
  327. data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
  328. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
  329. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
  330. data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
  331. data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
  332. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
  333. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
  334. data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  335. data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  336. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
  337. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
  338. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
  339. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
  340. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
  341. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
  342. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
  343. data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  344. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
  345. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
  346. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  347. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  348. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  349. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  350. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  351. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  352. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  353. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
  354. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  355. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  356. data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  357. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
  358. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  359. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  360. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  361. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  362. data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  363. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
  364. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
  365. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
  366. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
  367. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
  368. data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
  369. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
  370. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
  371. data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
  372. data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
  373. data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
  374. data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
  375. data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
  376. data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
  377. data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
  378. data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
  379. data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
  380. data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
  381. data/frameworks/sproutcore/lib/index.rhtml +4 -1
  382. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  383. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  384. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  385. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  386. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  387. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  388. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  389. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  390. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  391. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  392. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  393. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  394. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  395. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  396. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  397. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  398. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  399. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  400. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  401. data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  402. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  403. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  404. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  405. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  406. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  407. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  408. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  409. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  410. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  411. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  412. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  413. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  414. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  415. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  416. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  417. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  418. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  419. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  420. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  421. data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  422. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  423. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  424. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  425. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  426. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  427. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  428. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  429. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  430. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  431. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  432. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  433. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  434. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  435. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  436. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  437. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  438. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  439. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  440. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  441. data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  442. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  443. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  444. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  445. data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  446. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  447. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  448. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  449. data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  450. data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  451. data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  452. data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  453. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
  454. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
  455. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
  456. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
  457. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  458. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
  459. data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
  460. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
  461. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
  462. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
  463. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
  464. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
  465. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
  466. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
  467. data/lib/sproutcore/builders/minify.rb +2 -2
  468. data/lib/sproutcore/builders/test.rb +1 -1
  469. data/lib/sproutcore/buildfile.rb +1 -0
  470. data/lib/sproutcore/rack/dev.rb +1 -1
  471. data/lib/sproutcore/rack/filesystem.rb +265 -0
  472. data/lib/sproutcore/rack/proxy.rb +11 -3
  473. data/lib/sproutcore/rack/service.rb +11 -1
  474. data/lib/sproutcore/tools.rb +11 -1
  475. data/lib/sproutcore/tools/server.rb +6 -4
  476. data/vendor/jsdoc/README.txt +151 -0
  477. data/vendor/jsdoc/changes.txt +47 -0
  478. metadata +263 -308
  479. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
  480. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
  481. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
  482. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
  483. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  484. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
  485. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
  486. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
  487. data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
  488. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
  489. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
  490. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  491. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
  492. data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
  493. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
  494. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
  495. data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
  496. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  497. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
  498. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
  499. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
  500. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
  501. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
  502. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
  503. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
  504. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
  505. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
  506. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
  507. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
  508. data/spec/buildtasks/manifest/spec_helper.rb +0 -35
  509. data/spec/buildtasks/target_spec.rb +0 -214
  510. data/spec/fixtures/builder_tests/Buildfile +0 -15
  511. data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
  512. data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
  513. data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
  514. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
  515. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
  516. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
  517. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
  518. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
  519. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  520. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  521. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
  522. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
  523. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  524. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  525. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
  526. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
  527. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  528. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
  529. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
  530. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
  531. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
  532. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
  533. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
  534. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
  535. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
  536. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
  537. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
  538. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
  539. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
  540. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  541. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  542. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  543. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  544. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  545. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
  546. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
  547. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  548. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  549. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
  550. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
  551. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  552. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  553. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
  554. data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
  555. data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
  556. data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
  557. data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
  558. data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
  559. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
  560. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  561. data/spec/fixtures/entry_for_project/Buildfile +0 -1
  562. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  563. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  564. data/spec/fixtures/find_targets/custom/Buildfile +0 -8
  565. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  566. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  567. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  568. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  569. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
  570. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  571. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  572. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  573. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  574. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  575. data/spec/fixtures/find_targets/nested/Buildfile +0 -8
  576. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
  577. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  578. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  579. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  580. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  581. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  582. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  583. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  584. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  585. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  586. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  587. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  588. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  589. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  590. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  591. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  592. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  593. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  594. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  595. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  596. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  597. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  598. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  599. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  600. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  601. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  602. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  603. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  604. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  605. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  606. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
  607. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
  608. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
  609. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
  610. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
  611. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
  612. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
  613. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
  614. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  615. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  616. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  617. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  618. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  619. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  620. data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
  621. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
  622. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
  623. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
  624. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
  625. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
  626. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
  627. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
  628. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
  629. data/spec/fixtures/real_world/Buildfile +0 -12
  630. data/spec/fixtures/real_world/apps/account/README +0 -1
  631. data/spec/fixtures/real_world/apps/calendar/README +0 -1
  632. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
  633. data/spec/fixtures/real_world/apps/files/README +0 -1
  634. data/spec/fixtures/real_world/apps/mail/README +0 -1
  635. data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
  636. data/spec/fixtures/real_world/apps/photos/README +0 -1
  637. data/spec/fixtures/real_world/apps/uploader/README +0 -1
  638. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  639. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  640. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  641. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
  642. data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
  643. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  644. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  645. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  646. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  647. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  648. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  649. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  650. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
  651. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
  652. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  653. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  654. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
  655. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  656. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  657. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
  658. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
  659. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
  660. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  661. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
  662. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
  663. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
  664. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  665. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
  666. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  667. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  668. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  669. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  670. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  671. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  672. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  673. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  674. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  675. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  676. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  677. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  678. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
  679. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  680. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  681. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
  682. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
  683. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
  684. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  685. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
  686. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  687. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  688. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  689. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
  690. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  691. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
  692. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  693. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
  694. data/spec/fixtures/recursive_project/Buildfile +0 -8
  695. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  696. data/spec/lib/builders/combine_spec.rb +0 -67
  697. data/spec/lib/builders/html_spec.rb +0 -577
  698. data/spec/lib/builders/javascript_spec.rb +0 -81
  699. data/spec/lib/builders/sass_spec.rb +0 -43
  700. data/spec/lib/builders/spec_helper.rb +0 -30
  701. data/spec/lib/builders/strings_spec.rb +0 -52
  702. data/spec/lib/builders/stylesheet_spec.rb +0 -63
  703. data/spec/lib/builders/test_index_spec.rb +0 -44
  704. data/spec/lib/builders/test_spec.rb +0 -135
  705. data/spec/lib/buildfile/config_for_spec.rb +0 -81
  706. data/spec/lib/buildfile/define_spec.rb +0 -59
  707. data/spec/lib/buildfile/dup_spec.rb +0 -65
  708. data/spec/lib/buildfile/invoke_spec.rb +0 -130
  709. data/spec/lib/buildfile/load_spec.rb +0 -49
  710. data/spec/lib/buildfile/task/dup_spec.rb +0 -55
  711. data/spec/lib/buildfile/task_defined_spec.rb +0 -17
  712. data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
  713. data/spec/lib/buildfile_commands/config_spec.rb +0 -97
  714. data/spec/lib/buildfile_commands/import_spec.rb +0 -17
  715. data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
  716. data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
  717. data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
  718. data/spec/lib/buildfile_commands/task_spec.rb +0 -36
  719. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
  720. data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
  721. data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
  722. data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
  723. data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
  724. data/spec/lib/models/hash_struct/method_missing.rb +0 -41
  725. data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
  726. data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
  727. data/spec/lib/models/manifest/build_spec.rb +0 -78
  728. data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
  729. data/spec/lib/models/manifest/find_entry.rb +0 -84
  730. data/spec/lib/models/manifest/prepare_spec.rb +0 -62
  731. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
  732. data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
  733. data/spec/lib/models/project/add_target_spec.rb +0 -44
  734. data/spec/lib/models/project/buildfile_spec.rb +0 -35
  735. data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
  736. data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
  737. data/spec/lib/models/project/target_for_spec.rb +0 -33
  738. data/spec/lib/models/project/targets_spec.rb +0 -62
  739. data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
  740. data/spec/lib/models/target/config_spec.rb +0 -30
  741. data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
  742. data/spec/lib/models/target/installed_languages_spec.rb +0 -47
  743. data/spec/lib/models/target/lproj_for_spec.rb +0 -38
  744. data/spec/lib/models/target/manifest_for_spec.rb +0 -42
  745. data/spec/lib/models/target/parent_target_spec.rb +0 -21
  746. data/spec/lib/models/target/prepare_spec.rb +0 -53
  747. data/spec/lib/models/target/required_targets_spec.rb +0 -119
  748. data/spec/lib/models/target/target_for_spec.rb +0 -56
  749. data/spec/lib/tools/build_number_spec.rb +0 -28
  750. data/spec/lib/tools/gen_spec.rb +0 -207
  751. data/spec/lib/tools/tools_spec.rb +0 -78
  752. data/spec/spec_helper.rb +0 -138
  753. data/vendor/github_gem_lint.rb +0 -22
  754. data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -99,7 +99,7 @@ SC.SourceListGroupView = SC.View.extend(SC.Control, SC.CollectionGroup,
99
99
  }
100
100
 
101
101
  // set the title if that changed.
102
- var groupTitleKey = this.getDelegateProperty(this.displayDelegate, 'groupTitleKey') ;
102
+ var groupTitleKey = this.getDelegateProperty('groupTitleKey', this.displayDelegate) ;
103
103
  if ((key == '*') || (groupTitleKey && (key == groupTitleKey))) {
104
104
  var title = (content && content.get && groupTitleKey) ? content.get(groupTitleKey) : content;
105
105
  if (title != this._title) {
@@ -110,7 +110,7 @@ SC.SourceListGroupView = SC.View.extend(SC.Control, SC.CollectionGroup,
110
110
  }
111
111
 
112
112
  // set the group visibility if changed
113
- var groupVisibleKey = this.getDelegateProperty(this.displayDelegate, 'groupVisibleKey') ;
113
+ var groupVisibleKey = this.getDelegateProperty('groupVisibleKey', this.displayDelegate) ;
114
114
  if ((key == '*') || (groupVisibleKey && (key == groupVisibleKey))) {
115
115
  if (groupVisibleKey) {
116
116
  labelView.removeClassName('no-disclosure') ;
@@ -134,7 +134,7 @@ SC.SourceListGroupView = SC.View.extend(SC.Control, SC.CollectionGroup,
134
134
 
135
135
  // update group if necessary
136
136
  var group = this.get('content') ;
137
- var groupVisibleKey = this.getDelegateProperty(this.displayDelegate, 'groupVisibleKey') ;
137
+ var groupVisibleKey = this.getDelegateProperty('groupVisibleKey', this.displayDelegate) ;
138
138
  if (group && group.set && groupVisibleKey) {
139
139
  group.set(groupVisibleKey, newValue) ;
140
140
  }
@@ -119,9 +119,11 @@ SC.SplitView = SC.View.extend(
119
119
  A number less than one will be treated as a percentage, while a number
120
120
  greater than one will be treated as a pixel width.
121
121
 
122
+ The thickness will be applied to the opposite view defined by autoresizeBehavior.
123
+
122
124
  @property {Number}
123
125
  */
124
- topLeftDefaultThickness: 0.5,
126
+ defaultThickness: 0.5,
125
127
 
126
128
  /**
127
129
  Yes, we're a split view.
@@ -133,6 +135,22 @@ SC.SplitView = SC.View.extend(
133
135
  dividerView: SC.SplitDividerView,
134
136
  bottomRightView: SC.View,
135
137
 
138
+ /**
139
+ The current thickness for the topLeftView
140
+ */
141
+ topLeftThickness: function() {
142
+ var view = this.get('topLeftView');
143
+ return view ? this.thicknessForView(view) : 0;
144
+ }.property('topLeftView').cacheable(),
145
+
146
+ /**
147
+ The current thickness for the bottomRightView
148
+ */
149
+ bottomRightThickness: function() {
150
+ var view = this.get('bottomRightView');
151
+ return view ? this.thicknessForView(view) : 0;
152
+ }.property('bottomRightView').cacheable(),
153
+
136
154
  /**
137
155
  @property {SC.Cursor} the cursor thumb view should use for themselves
138
156
  */
@@ -355,6 +373,8 @@ SC.SplitView = SC.View.extend(
355
373
  // topLeftView.updateDisplayLayout();
356
374
  // dividerView.updateDisplayLayout();
357
375
  // bottomRightView.updateDisplayLayout();
376
+ this.notifyPropertyChange('topLeftThickness')
377
+ .notifyPropertyChange('bottomRightThickness');
358
378
  },
359
379
 
360
380
  /** @private */
@@ -366,15 +386,21 @@ SC.SplitView = SC.View.extend(
366
386
  this.set('thumbViewCursor', SC.Cursor.create()) ;
367
387
  }
368
388
 
369
- var direction = this.get('layoutDirection') ;
370
- var splitViewThickness = (direction == SC.LAYOUT_HORIZONTAL) ? this.get('frame').width : this.get('frame').height ;
389
+ var layoutDirection = this.get('layoutDirection') ;
390
+ var splitViewThickness = (layoutDirection == SC.LAYOUT_HORIZONTAL) ? this.get('frame').width : this.get('frame').height ;
391
+ var desiredThickness = this.get('defaultThickness') ;
392
+ var autoResizeBehavior = this.get('autoresizeBehavior') ;
371
393
 
372
- // if topLeftDefaultThickness is < 1, treat as a percentage, otherwise
373
- // treat as actual number.
374
- var desired = this.get('topLeftDefaultThickness');
375
- if (SC.none(desired) || (desired > 0 && desired < 1)) {
376
- this._desiredTopLeftThickness = Math.floor(splitViewThickness * (desired || 0.5)) ;
377
- } else this._desiredTopLeftThickness = desired ;
394
+ // if default thickness is < 1, convert from percentage to absolute
395
+ if (SC.none(desiredThickness) || (desiredThickness > 0 && desiredThickness < 1)) {
396
+ desiredThickness = Math.floor(splitViewThickness * (desiredThickness || 0.5)) ;
397
+ }
398
+ if (autoResizeBehavior === SC.RESIZE_BOTTOM_RIGHT) {
399
+ this._desiredTopLeftThickness = desiredThickness ;
400
+ } else { // (autoResizeBehavior === SC.RESIZE_TOP_LEFT)
401
+ var dividerThickness = this.get('dividerThickness') || 7 ;
402
+ this._desiredTopLeftThickness = splitViewThickness - dividerThickness - desiredThickness ;
403
+ }
378
404
 
379
405
  // make sure we don't exceed our min and max values, and that collapse
380
406
  // settings are respected
@@ -0,0 +1,101 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2009 Apple, Inc. All rights reserved.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ sc_require('views/collection') ;
9
+
10
+ /**
11
+ @class
12
+
13
+ A StackedView is a CollectionView that expects its content to use static
14
+ layout to stack vertically. This type of collection view is not designed
15
+ for use with large size collections, but it can be very useful for
16
+ collections with complex displays and variable heights such as comments or
17
+ small notification queues.
18
+
19
+ h2. Static Layout
20
+
21
+ This view makes no attempt to size or position your child views. It assumes
22
+ you are using StaticLayout for your child views. If you don't enable static
23
+ layout your views will probably overlay on top of eachother and will look
24
+ incorrect.
25
+
26
+ Note also that the default layout for this view set's the height to "auto".
27
+ This is usually the behavior you will want.
28
+
29
+ @extends SC.CollectionView
30
+ @since SproutCore 0.9
31
+ */
32
+ SC.StackedView = SC.CollectionView.extend(
33
+ /** SC.StackedView.prototype */ {
34
+
35
+ classNames: ['sc-stacked-view'],
36
+
37
+ /**
38
+ Default layout for a stacked view will fill the parent view but auto-
39
+ adjust the height of the view.
40
+ */
41
+ layout: { top: 0, left: 0, right: 0, height: 1 },
42
+
43
+ /**
44
+ Updates the height of the stacked view to reflect the current content of
45
+ the view. This is called automatically whenever an item view is reloaded.
46
+ You can also call this method directly if the height of one of your views
47
+ has changed.
48
+
49
+ The height will be recomputed based on the actual location and dimensions
50
+ of the last child view.
51
+
52
+ Note that normally this method will defer actually updating the height
53
+ of the view until the end of the run loop. You can force an immediate
54
+ update by passing YES to the "immediately" parameter.
55
+
56
+ @param {Boolean} immediately YES to update immedately
57
+ @returns {SC.StackedView} receiver
58
+ */
59
+ updateHeight: function(immediately) {
60
+ if (immediately) this._updateHeight();
61
+ else this.invokeLast(this._updateHeight);
62
+ // ^ use invokeLast() here because we need to wait until all rendering has
63
+ // completed.
64
+
65
+ return this;
66
+ },
67
+
68
+ _updateHeight: function() {
69
+
70
+ var childViews = this.get('childViews'),
71
+ len = childViews.get('length'),
72
+ view, layer, height;
73
+
74
+ if (len === 0) {
75
+ height = 1;
76
+ } else {
77
+ view = childViews.objectAt(len-1);
78
+ layer = view ? view.get('layer') : null ;
79
+ height = layer ? (layer.offsetTop + layer.offsetHeight) : 1 ;
80
+ layer = null ; // avoid memory leaks
81
+ }
82
+ this.adjust('height', height);
83
+ },
84
+
85
+ // ..........................................................
86
+ // INTERNAL SUPPORT
87
+ //
88
+
89
+ /** @private
90
+ Whenever the collection view reloads some views, reset the cache on the
91
+ frame as well so that it will recalculate.
92
+ */
93
+ didReload: function(set) { return this.updateHeight(); },
94
+
95
+ /** @private
96
+ When layer is first created, make sure we update the height using the
97
+ newly calculated value.
98
+ */
99
+ didCreateLayer: function() { return this.updateHeight(); }
100
+
101
+ });
@@ -99,8 +99,19 @@ SC.TabView = SC.View.extend(
99
99
  },
100
100
 
101
101
  createChildViews: function() {
102
- var childViews = [], view;
103
- view = this.containerView = this.createChildView(this.containerView, {
102
+ var childViews = [], view, ContainerView ;
103
+
104
+ if (this.get('tabLocation') === SC.TOP_LOCATION) {
105
+ ContainerView = this.containerView.extend({
106
+ layout: { top:12, left:0, right:0, bottom: 0 }
107
+ });
108
+ } else {
109
+ ContainerView = this.containerView.extend({
110
+ layout: { top:0, left:0, right:0, bottom: 12 }
111
+ });
112
+ }
113
+
114
+ view = this.containerView = this.createChildView(ContainerView, {
104
115
  rootElementPath: [0]
105
116
  }) ;
106
117
  childViews.push(view);
@@ -109,7 +120,7 @@ SC.TabView = SC.View.extend(
109
120
  rootElementPath: [1]
110
121
  }) ;
111
122
  childViews.push(view);
112
-
123
+
113
124
  this.set('childViews', childViews);
114
125
  return this;
115
126
  },
@@ -123,23 +134,7 @@ SC.TabView = SC.View.extend(
123
134
  custom container view. You can access this view but you cannot change
124
135
  it.
125
136
  */
126
- containerView: SC.ContainerView.extend({
127
-
128
- /** @private
129
- When we need to actually create a container, look for the tab loc from
130
- the parent view and adjust the internal frame accordingly.
131
- */
132
- render: function(context, firstTime) {
133
- var pv = this.get('parentView');
134
- var tabLoc = (pv) ? pv.get('tabLocation') : SC.TOP_LOCATION ;
135
- if (tabLoc === SC.TOP_LOCATION) {
136
- context.addStyle('top', '11px');
137
- } else {
138
- context.addStyle('bottom', '11px');
139
- }
140
- this.renderChildViews(context, firstTime);
141
- }
142
- }),
137
+ containerView: SC.ContainerView,
143
138
 
144
139
  /**
145
140
  The segmentedView managed by this tab view. Note that this TabView uses
@@ -147,14 +142,20 @@ SC.TabView = SC.View.extend(
147
142
  it.
148
143
  */
149
144
  segmentedView: SC.SegmentedView.extend({
150
- layout: { left: 0, right: 0, height: 23 },
145
+ layout: { left: 0, right: 0, height: 24 },
151
146
 
152
147
  /** @private
153
148
  When the value changes, update the parentView's value as well.
154
149
  */
155
- valueDidChange: function() {
150
+ _sc_tab_segmented_valueDidChange: function() {
156
151
  var pv = this.get('parentView');
157
152
  if (pv) pv.set('nowShowing', this.get('value'));
153
+
154
+ // FIXME: why is this necessary? 'value' is a displayProperty and should
155
+ // automatically cause displayDidChange() to fire, which should cause
156
+ // the two lines below to execute in the normal course of things...
157
+ this.set('layerNeedsUpdate', YES) ;
158
+ this.invokeOnce(this.updateLayerIfNeeded) ;
158
159
  }.observes('value'),
159
160
 
160
161
  /** @private
@@ -34,7 +34,7 @@ SC.ToolbarView = SC.View.extend(
34
34
  //
35
35
 
36
36
  /** @private */
37
- layout: { left: 0, height: 36, right: 0 },
37
+ layout: { left: 0, height: 32, right: 0 },
38
38
 
39
39
  /** @private */
40
40
  init: function() {
@@ -9,150 +9,95 @@ require('mixins/selection_support');
9
9
 
10
10
  /**
11
11
  @class
12
+
13
+ An ArrayController provides a way for you to publish an array of objects
14
+ for CollectionView or other controllers to work with. To work with an
15
+ ArrayController, set the content property to the array you want the
16
+ controller to manage. Then work directly with the controller object as if
17
+ it were the array itself.
12
18
 
13
- An Array Controller provides a way to project the contents of an array
14
- out to a view. You can use this object any place you might use an
15
- array. Changes to the array will not propogate to the content array
16
- until you call commitChanges().
17
-
19
+ When you want to display an array of objects in a CollectionView, bind the
20
+ "arrangedObjects" of the array controller to the CollectionView's "content"
21
+ property. This will automatically display the array in the collection view.
22
+
18
23
  @extends SC.Controller
19
24
  @extends SC.Array
20
25
  @extends SC.SelectionSupport
21
26
  @author Charles Jolley
22
- @author Erich Ocean
23
- @version 1.0
24
27
  @since SproutCore 1.0
25
28
  */
26
29
  SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
27
30
  /** @scope SC.ArrayController.prototype */ {
28
-
29
- /**
30
- If YES the will return controllers for content objects.
31
-
32
- If you want to use an array controller to edit an array contents directly
33
- but you do not want to wrap the values of the array in controller objects
34
- then you should set this property to NO.
35
-
36
- @type Boolean
37
- */
38
- useControllersForContent: NO,
39
-
40
- /**
41
- Provides compatibility with collection controllers.
42
-
43
- @property
44
- @type SC.ArrayController
45
- */
46
- arrangedObjects: function() { return this; }.property('content'),
31
+
32
+ // ..........................................................
33
+ // PROPERTIES
34
+ //
47
35
 
48
36
  /**
49
37
  The content array managed by this controller.
50
38
 
51
- In general you can treat an instance of ArrayController as if it were
52
- the array held in this property. Any changes you make to the controller
53
- that are not specifically implemented in the controller will pass through
54
- to the Array.
39
+ You can set the content of the ArrayController to any object that
40
+ implements SC.Array or SC.Enumerable. If you set the content to an object
41
+ that implements SC.Enumerable only, you must also set the orderBy property
42
+ so that the ArrayController can order the enumerable for you.
55
43
 
56
- Also if you set commitsChangesImmediately to NO, the controller will
57
- buffer changes against this.
44
+ If you set the content to a non-enumerable and non-array object, then the
45
+ ArrayController will wrap the item in an array in an attempt to normalize
46
+ the result.
58
47
 
59
48
  @type SC.Array
60
49
  */
61
50
  content: null,
62
-
63
- /** @private */
64
- contentBindingDefault: SC.Binding.multiple(),
65
-
51
+
66
52
  /**
67
- Set to YES if the controller has any content, even an empty array.
53
+ Makes the array editable or not. If this is set to NO, then any attempts
54
+ at changing the array content itself will throw an exception.
68
55
 
69
56
  @property
70
57
  @type Boolean
71
58
  */
72
- hasContent: function() {
73
- return !SC.none(this.get('content')) ;
74
- }.property('content'),
59
+ isEditable: YES,
75
60
 
76
61
  /**
77
- Property key to use to group objects.
62
+ Used to sort the array.
78
63
 
79
- If groupBy is set to a non-null value, then the array controller will
80
- automatically partion the content array into groups based on the value of
81
- the passed property key. The exampleGroup will be used to create the
82
- objects in the groups array.
64
+ If you set this property to a key name, array of key names, or a function,
65
+ then then ArrayController will automatically reorder your content array
66
+ to match the sort order. (If you set a function, the function will be
67
+ used to sort).
68
+
69
+ Normally, you should only use this property if you set the content of the
70
+ controller to an unordered enumerable such as SC.Set or SC.SelectionSet.
71
+ In this case the orderBy property is required in order for the controller
72
+ to property order the content for display.
83
73
 
84
- If this property is set, you MUST ensure the items in the content array
85
- are already sorted by the group key. Otherwise groups might appear more
86
- than once.
74
+ If you set the content to an array, it is usually best to maintain the
75
+ array in the proper order that you want to display things rather than
76
+ using this method to order the array since it requires an extra processing
77
+ step. You can use this orderBy property, however, for displaying smaller
78
+ arrays of content.
87
79
 
88
- @type String
89
- */
90
- groupByKey: null,
91
-
92
- /**
93
- When grouping, create objects using this class. SC.ArrayController will
94
- set 'value' to the value of the groupByKey, and 'itemRange' to an
95
- SC.Range of the item indexes in the group, and 'owner' to this array
96
- controller.
80
+ Note that you can only to use addObject() to insert new objects into an
81
+ array that is ordered. You cannot manually reorder or insert new objects
82
+ into specific locations because the order is managed by this property
83
+ instead.
97
84
 
98
- @type Class
99
- */
100
- exampleGroup: SC.Object,
101
-
102
- /**
103
- The groups, if any, for the current content array.
85
+ If you pass a function, it should be suitable for use in compare().
104
86
 
105
- @readOnly
106
87
  @property
107
- @type SC.Array
88
+ @type String|Array|Function
108
89
  */
109
- groups: function(key, val) {
110
- if (val) throw "The SC.ArrayController groups property is read-only." ;
111
-
112
- var groupByKey = this.get('groupByKey') ;
113
- if (!groupByKey) return SC.EMPTY_ARRAY ; // no groups
114
-
115
- var content = this.get('content') ;
116
- if (!content || content.get('length') === 0) {
117
- return SC.EMPTY_ARRAY ; // no groups...
118
- }
119
-
120
- // okay, calculate the groups...
121
- var previousGroup, currentGroup, groupStart = 0 ;
122
- var obj, groups = [], GroupClass = this.get('exampleGroup') ;
123
-
124
- // initialize the discover groups loop
125
- previousGroup = content.objectAt(0).get(groupByKey) ;
126
-
127
- // discover groups...
128
- for (var idx=0, len=content.get('length'); idx<len; ++idx) {
129
- obj = content.objectAt(idx) ;
130
- currentGroup = obj.get(groupByKey) ;
131
-
132
- // did our group change?
133
- if (previousGroup !== currentGroup) {
134
- // save the current group
135
- groups.push(GroupClass.create({
136
- value: previousGroup,
137
- itemRange: { start: groupStart, length: idx - groupStart },
138
- owner: this
139
- }));
140
-
141
- // and move on to the next group
142
- previousGroup = currentGroup ;
143
- groupStart = idx ;
144
- }
145
- }
90
+ orderBy: null,
146
91
 
147
- // close the last and final group
148
- groups.push(GroupClass.create({
149
- value: previousGroup,
150
- itemRange: { start: groupStart, length: idx - groupStart },
151
- owner: this
152
- }));
92
+ /**
93
+ Set to YES if you want the controller to wrap non-enumerable content
94
+ in an array and publish it. Otherwise, it will treat single content like
95
+ null content.
153
96
 
154
- return groups ;
155
- }.property('content', 'groupByKey').cacheable(),
97
+ @property
98
+ @type Boolean
99
+ */
100
+ allowsSingleContent: YES,
156
101
 
157
102
  /**
158
103
  Set to YES if you want objects removed from the array to also be
@@ -166,325 +111,399 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
166
111
  @type {Boolean}
167
112
  */
168
113
  destroyOnRemoval: NO,
114
+
115
+ /**
116
+ Returns an SC.Array object suitable for use in a CollectionView.
117
+ Depending on how you have your ArrayController configured, this property
118
+ may be one of several different values.
119
+
120
+ @property
121
+ @type SC.Array
122
+ */
123
+ arrangedObjects: function() {
124
+ return this;
125
+ }.property().cacheable(),
169
126
 
170
127
  /**
171
- Defines the default class to use when creating new content.
128
+ Computed property indicates whether or not the array controller can
129
+ remove content. You can delete content only if the content is not single
130
+ content and isEditable is YES.
172
131
 
173
- This property should either contains a class or a string that resolves
174
- to a class that responds to the newRecord() method.
132
+ @property
133
+ @type Boolean
134
+ */
135
+ canRemoveContent: function() {
136
+ var content = this.get('content'), ret;
137
+ ret = !!content && this.get('isEditable') && this.get('hasContent');
138
+ if (ret) {
139
+ return !content.isEnumerable ||
140
+ (SC.typeOf(content.removeObject) === SC.T_FUNCTION);
141
+ } else return NO ;
142
+ }.property('content', 'isEditable', 'hasContent'),
143
+
144
+ /**
145
+ Computed property indicates whether you can reorder content. You can
146
+ reorder content as long a the controller isEditable and the content is a
147
+ real SC.Array-like object. You cannot reorder content when orderBy is
148
+ non-null.
175
149
 
176
- @type {Class}
150
+ @property
151
+ @type Boolean
177
152
  */
178
- exampleContentObject: null,
153
+ canReorderContent: function() {
154
+ var content = this.get('content'), ret;
155
+ ret = !!content && this.get('isEditable') && !this.get('orderBy');
156
+ return ret && !!content.isSCArray;
157
+ }.property('content', 'isEditable', 'orderBy'),
179
158
 
180
159
  /**
181
- Creates a new record instance and adds it to the end of the current array.
160
+ Computed property insides whether you can add content. You can add
161
+ content as long as the controller isEditable and the content is not a
162
+ single object.
182
163
 
183
- This method works just like insertNewObjectAt() but always appends.
164
+ Note that the only way to simply add object to an ArrayController is to
165
+ use the addObject() or pushObject() methods. All other methods imply
166
+ reordering and will fail.
184
167
 
185
- @param attributes {Hash} optional hash of attributes to pass to the new obejct.
186
- @param objectType {Class} optional class of object to create.
187
- @returns {Object} the newly created object (also added to the array)
168
+ @property
169
+ @type Boolean
188
170
  */
189
- newObject: function(attributes, objectType) {
190
- return this.insertNewObjectAt(null, attributes, objectType) ;
191
- },
171
+ canAddContent: function() {
172
+ var content = this.get('content'), ret ;
173
+ ret = content && this.get('isEditable') && content.isEnumerable;
174
+ if (ret) {
175
+ return (SC.typeOf(content.addObject) === SC.T_FUNCTION) ||
176
+ (SC.typeOf(content.pushObject) === SC.T_FUNCTION);
177
+ } else return NO ;
178
+ }.property('content', 'isEditable'),
192
179
 
193
180
  /**
194
- Creates a new content object and inserts it at the passed index or appends
195
- it at the end of the array if you pass null.
196
-
197
- This method takes an optional hash of attributes which will be set on
198
- the new record. You can also pass an optional objectType. If you do
199
- not pass the objectType, you must instead set the exampleContentObject to
200
- the class of the object you want to use. The object can be of any type
201
- but it must respond to the newRecord() method.
202
-
203
- Objects created using this method will be destroyed automatically if you
204
- have set commitsChangesImmediately to false and call discardChanges().
205
-
206
- @param index {Number} the index to insert at or null to append.
207
- @param attributes {Hash} optional hash of attributes to pass to the new obejct.
208
- @param objectType {Class} optional class of object to create.
209
- @returns {Object} the newly created object (also added to the array)
210
- */
211
- insertNewObjectAt: function(index, attributes, objectType) {
181
+ Set to YES if the controller has valid content that can be displayed,
182
+ even an empty array. Returns NO if the content is null or not enumerable
183
+ and allowsSingleContent is NO.
212
184
 
213
- // compute the objectType
214
- if (!objectType) objectType = this.get('exampleContentObject') ;
215
- if (SC.typeOf(objectType) === SC.T_STRING) {
216
- objectType = SC.objectForPropertyPath(objectType) ;
217
- }
218
- if (SC.none(objectType)) {
219
- throw "Invalid object type was provided" ;
220
- }
185
+ @property
186
+ @type Boolean
187
+ */
188
+ hasContent: function() {
189
+ var content = this.get('content');
190
+ return !!content &&
191
+ (!!content.isEnumerable || !!this.get('allowsSingleContent'));
192
+ }.property('content', 'allowSingleContent'),
193
+
194
+ /**
195
+ The current load state of the RecordArray. If the storeKeys has a state
196
+ property, then this property will return that value. Otherwise it returns
197
+ SC.Record.READY.
198
+ */
199
+ state: function() {
200
+ var content = this.get('content'),
201
+ ret = content ? content.get('state') : null;
202
+ return ret ? ret : SC.Record.READY;
203
+ }.property().cacheable(),
204
+
205
+ // ..........................................................
206
+ // METHODS
207
+ //
208
+
209
+ /**
210
+ Adds an object to the array. If the content is ordered, this will add the
211
+ object to the end of the content array. The content is not ordered, the
212
+ location depends on the implementation of the content.
221
213
 
222
- if (SC.typeOf(objectType.newObject) !== SC.T_FUNCTION) {
223
- throw "content object type does not support newRecord()" ;
224
- }
214
+ If the source content does not support adding an object, then this method
215
+ will throw an exception.
225
216
 
226
- // Create a new object...
227
- var obj = objectType.newObject(attributes) ;
228
- if (!this._createdObjects) this._createdObjects = [] ;
229
- this._createdObjects.push(obj) ; // save for discard...
217
+ @param {Object} object the object to add
218
+ @returns {SC.ArrayController} receiver
219
+ */
220
+ addObject: function(object) {
221
+ if (!this.get('canAddContent')) throw "%@ cannot add content".fmt(this);
230
222
 
231
- // Add to array.
232
- if (index) {
233
- this.insertAt(index, obj) ;
234
- } else this.pushObject(obj) ;
223
+ var content = this.get('content');
224
+ if (content.isSCArray) content.pushObject(object);
225
+ else if (content.addObject) content.addObject(object);
226
+ else throw "%@.content does not support addObject".fmt(this);
235
227
 
236
- return obj ;
228
+ return this;
237
229
  },
238
230
 
239
- /** @private
240
- Watches changes to the content property updates the contentClone.
241
-
242
- @observes content
243
- */
244
- _contentDidChange: function() {
245
- var content = this.get('content') ;
246
- if (SC.isEqual(content, this._content)) return ; // nothing to do
247
-
248
- var func = this._contentPropertyDidChange ;
231
+ /**
232
+ Removes the passed object from the array. If the underyling content
233
+ is a single object, then this simply sets the content to null. Otherwise
234
+ it will call removeObject() on the content.
249
235
 
250
- // remove old observer, add new observer, and trigger content property change
251
- if (this._content && this._content.removeObserver) {
252
- this._content.removeObserver('[]', this, func) ;
253
- }
236
+ Also, if destroyOnRemoval is YES, this will actually destroy the object.
254
237
 
255
- if (content && content.addObserver) {
256
- content.addObserver('[]', this, func) ;
238
+ @param {Object} object the object to remove
239
+ @returns {SC.ArrayController} receiver
240
+ */
241
+ removeObject: function(object) {
242
+ if (!this.get('canRemoveContent')) {
243
+ throw "%@ cannot remove content".fmt(this);
257
244
  }
258
245
 
259
- this._content = content; //cache
260
- this._contentPropertyRevision = null ;
261
-
262
- var rev = (content) ? content.propertyRevision : -1 ;
263
- this._contentPropertyDidChange(content, '[]', content, rev) ;
264
- }.observes('content'),
265
-
266
- _contentPropertyDidChange: function(target, key, value, rev) {
267
- if (!this._updatingContent && (!rev || (rev != this._contentPropertyRevision))) {
268
- this._contentPropertyRevision = rev ;
269
-
270
- this._updatingContent = true ;
271
-
272
- this.beginPropertyChanges();
273
- this.contentCloneReset();
274
- this.enumerableContentDidChange() ;
275
- this.notifyPropertyChange('length') ;
276
- this.updateSelectionAfterContentChange();
277
- this.endPropertyChanges() ;
278
-
279
- this._updatingContent = false ;
246
+ var content = this.get('content');
247
+ if (content.isEnumerable) content.removeObject(object);
248
+ else {
249
+ this.set('content', null);
250
+ this.enumerableContentDidChange();
280
251
  }
252
+
253
+ if (this.get('destroyOnRemoval') && object.destroy) object.destroy();
254
+ return this;
281
255
  },
282
256
 
257
+ // ..........................................................
258
+ // SC.ARRAY SUPPORT
259
+ //
260
+
283
261
  /**
284
- The array content that (when committed) will be merged back into the
285
- content property. All array methods will take place on this object.
286
-
287
- @property
288
- @type SC.Array
262
+ Compute the length of the array based on the observable content
289
263
  */
290
- contentClone: null,
291
-
292
- /** @private
293
- Clones the content property into the contentClone property.
264
+ length: function() {
265
+ var content = this._scac_observableContent();
266
+ return content ? content.get('length') : 0;
267
+ }.property().cacheable(),
268
+
269
+ /**
270
+ Returns the object at the specified index based on the observable content
294
271
  */
295
- contentCloneReset: function() {
296
- this._changelog = [];
297
- this.set('contentClone', null);
272
+ objectAt: function(idx) {
273
+ var content = this._scac_observableContent();
274
+ return content ? content.objectAt(idx) : undefined ;
298
275
  },
299
-
276
+
300
277
  /**
301
- SC.Array interface implementation.
302
-
303
- @param idx {Number} Starting index in the array to replace. If idx >=
304
- length, then append to the end of the array.
305
-
306
- @param amt {Number} Number of elements that should be removed from the
307
- array, starting at *idx*.
308
-
309
- @param objects {Array} An array of zero or more objects that should be
310
- inserted into the array at *idx*
278
+ Forwards a replace on to the content, but only if reordering is allowed.
311
279
  */
312
- replace: function(idx, amt, objects) {
313
- var content = this.get('content') ;
314
-
315
- // in case the passed objects are controllers, convert to source objects.
316
- var copyIdx = objects.length ;
317
- var sourceObjects = objects ;
318
- if (copyIdx > 0) {
319
- sourceObjects = [] ;
320
- while(--copyIdx >= 0) {
321
- sourceObjects[copyIdx] = this._sourceObjectFor(objects[copyIdx]) ;
280
+ replace: function(start, amt, objects) {
281
+ // check for various conditions before a replace is allowed
282
+ if (!objects || objects.get('length')===0) {
283
+ if (!this.get('canRemoveContent')) {
284
+ throw "%@ cannot remove objects from the current content".fmt(this);
322
285
  }
323
- }
324
-
325
- // create clone of content array if needed
326
- var contentClone = this.get('contentClone') ;
327
- if (!contentClone) {
328
- this.set('contentClone', contentClone = SC.$A(content)) ;
329
- }
330
-
331
- // now, record the removed objects. This may be used later.
332
- if (this.get('destroyOnRemoval')) {
333
- if (!this._deletions) this._deletions = [] ;
334
- for (var i=0; i < amt; i++) {
335
- this._deletions.push(content.objectAt(idx + i));
286
+ } else if (!this.get('canReorderContent')) {
287
+ throw "%@ cannot add or reorder the current content".fmt(this);
288
+ }
289
+
290
+ // if we can do this, then just forward the change. This should fire
291
+ // updates back up the stack, updating rangeObservers, etc.
292
+ var content = this.get('content'); // note: use content, not observable
293
+ var objsToDestroy = [], i;
294
+ if (this.get('destroyOnRemoval')){
295
+ for(i=0; i<amt; i++){
296
+ objsToDestroy.push(content.objectAt(i+start));
336
297
  }
337
298
  }
338
299
 
339
- // and record additions
340
- if (!this._changelog) this._changelog = [];
341
- this._changelog.push({ idx: idx, amt: amt, objects: sourceObjects });
342
-
343
- // then actually perform the edit on the contentClone
344
- contentClone.replace(idx, amt, sourceObjects);
345
-
346
- this.editorDidChange() ;
347
- this.enumerableContentDidChange();
348
- this.updateSelectionAfterContentChange();
300
+ if (content) content.replace(start, amt, objects);
301
+ for(i=0; i<objsToDestroy.length; i++){
302
+
303
+ objsToDestroy[i].destroy();
304
+ }
305
+ objsToDestroy = null;
349
306
 
350
- return this;
307
+ return this;
351
308
  },
352
309
 
353
- /**
354
- SC.Array interface implimentation.
355
- @param idx {Number} The index of the item to return. If idx exceeds the
356
- current length, return null.
357
- */
358
- objectAt: function(idx) {
359
- var obj = this._getSourceContent() ;
360
- obj = (obj && obj.objectAt) ? obj.objectAt(idx) : null;
361
- return this._objectControllerFor(obj) ;
310
+ // ..........................................................
311
+ // INTERNAL SUPPORT
312
+ //
313
+
314
+ init: function() {
315
+ sc_super();
316
+ this._scac_contentDidChange();
362
317
  },
363
- /**
364
- SC.Array interface implimentation.
365
- @property
366
- @type {integer}
318
+
319
+ /** @private
320
+ Cached observable content property. Set to NO to indicate cache is
321
+ invalid.
367
322
  */
368
- length: function( key, value ) {
369
- var ret = this._getSourceContent() ;
370
- return (ret && ret.get) ? (ret.get('length') || 0) : 0 ;
371
- }.property(),
323
+ _scac_cached: NO,
372
324
 
373
325
  /**
374
- Returns the index in the array of the specified object.
326
+ @private
375
327
 
376
- This can handle both controller wrapper objects and source content objects.
377
- */
378
- indexOf: function(obj) {
379
- return this._getSourceContent().indexOf(this._sourceObjectFor(obj)) ;
380
- },
381
-
382
- _getSourceContent: function() {
383
- return this.get('contentClone') || this.get('content') || [];
384
- },
328
+ Returns the current array this controller is actually managing. Usually
329
+ this should be the same as the content property, but sometimes we need to
330
+ generate something different because the content is not a regular array.
331
+
332
+ Passing YES to the force parameter will force this value to be recomputed.
385
333
 
386
- /** @private */
387
- performCommitChanges: function() {
388
- var content = this.get('content');
389
- var ret = true;
390
- var idx ;
334
+ @returns {SC.Array} observable or null
335
+ */
336
+ _scac_observableContent: function() {
337
+ var ret = this._scac_cached;
338
+ if (ret !== NO) return ret;
391
339
 
392
- // cannot commit changes to null content. Return an error.
393
- if (!content) {
394
- return SC.$error("No Content");
395
- }
340
+ var content = this.get('content'),
341
+ orderBy, func, t, len;
396
342
 
397
- if (content.beginPropertyChanges) content.beginPropertyChanges();
343
+ // empty content
344
+ if (SC.none(content)) return this._scac_cached = [];
345
+
346
+ // wrap non-enumerables
347
+ if (!content.isEnumerable) {
348
+ ret = this.get('allowsSingleContent') ? [content] : [];
349
+ return (this._scac_cached = ret);
350
+ }
398
351
 
399
- // apply all the changes made to the clone
400
- if (this._changelog) {
401
- var changelog = this._changelog ;
402
- var max = changelog.length;
403
- for(idx=0;idx<max;idx++) {
404
- var change = changelog[idx];
405
- content.replace(change.idx, change.amt, change.objects) ;
406
- }
407
- this._changelog.length = 0 ; // reset changelog
352
+ // no-wrap
353
+ orderBy = this.get('orderBy');
354
+ if (!orderBy) {
355
+ if (content.isSCArray) return (this._scac_cached = content) ;
356
+ else throw "%@.orderBy is required for unordered content".fmt(this);
408
357
  }
409
358
 
410
- // finally, destroy any removed objects if necessary. Make
411
- // sure the objects have not been re-added before doing this.
412
- if (this.get('destroyOnRemoval') && this._deletions && this._deletions.length>0) {
413
- idx = this._deletions.length;
414
- while(--idx >= 0) {
415
- var obj = this._deletions[idx] ;
416
- if (obj && obj.destroy && (content.indexOf(obj) < 0)) {
417
- obj.destroy() ;
418
- }
419
- }
420
- this._deletions.length = 0; // clear array
359
+ // all remaining enumerables must be sorted.
360
+
361
+ // build array - then sort it
362
+ switch(SC.typeOf(orderBy)) {
363
+ case SC.T_STRING:
364
+ orderBy = [orderBy];
365
+ break;
366
+ case SC.T_FUNCTION:
367
+ func = orderBy ;
368
+ break;
369
+ case SC.T_ARRAY:
370
+ break;
371
+ default:
372
+ throw "%@.orderBy must be Array, String, or Function".fmt(this);
421
373
  }
422
374
 
423
- // changes commited, clear any created objects from the internal array
424
- if (this._createdObjects) this._createdObjects.length = 0 ;
425
-
426
- // finish commiting changes.
427
- if (content.endPropertyChanges) content.endPropertyChanges();
428
- if (content.commitChanges) ret = content.commitChanges();
375
+ len = orderBy.get('length');
429
376
 
430
- if (SC.$ok(ret)) {
431
- this.contentCloneReset();
432
- this.editorDidClearChanges();
377
+ // generate comparison function if needed - use orderBy
378
+ if (!func) {
379
+ func = function(a,b) {
380
+ var idx=0, status=0, key, aValue, bValue;
381
+ for(idx=0;(idx<len)&&(status===0);idx++) {
382
+ key = orderBy.objectAt(idx);
383
+
384
+ if (!a) aValue = a ;
385
+ else if (a.isObservable) aValue = a.get(key);
386
+ else aValue = a[key];
387
+
388
+ if (!b) bValue = b ;
389
+ else if (b.isObservable) bValue = b.get(key);
390
+ else bValue = b[key];
391
+
392
+ status = SC.compare(aValue, bValue);
393
+ }
394
+ return status ;
395
+ };
433
396
  }
397
+
398
+ ret = [];
399
+ content.forEach(function(o) { ret.push(o); });
400
+ ret.sort(func);
434
401
 
435
- return ret;
402
+ func = null ; // avoid memory leaks
403
+ return (this._scac_cached = ret) ;
436
404
  },
437
405
 
438
- /** @private */
439
- performDiscardChanges: function() {
440
- this.contentCloneReset();
441
- this.editorDidClearChanges();
442
-
443
- // if any objects were created before the commit, destroy the objects
444
- // and reset the array.
445
- if (this._createdObjects && this._createdObjects.length > 0) {
446
- var idx = this._createdObjects.length ;
447
- while(--idx >= 0) {
448
- var obj = this._createdObjects[idx] ;
449
- if (SC.typeOf(obj.destroy) === SC.T_FUNCTION) obj.destroy() ;
450
- }
451
- this._createdObjects.length = 0 ;
406
+ /**
407
+ Whenever content changes, setup and teardown observers on the content
408
+ as needed.
409
+ */
410
+ _scac_contentDidChange: function() {
411
+
412
+ this._scac_cached = NO; // invalidate observable content
413
+
414
+ var cur = this.get('content'),
415
+ orders = !!this.get('orderBy'),
416
+ last = this._scac_content,
417
+ oldlen = this._scac_length || 0,
418
+ ro = this._scac_rangeObserver,
419
+ func = this._scac_rangeDidChange,
420
+ efunc = this._scac_enumerableDidChange,
421
+ sfunc = this._scac_contentStateDidChange,
422
+ newlen;
423
+
424
+ if (last === cur) return this; // nothing to do
425
+
426
+ // teardown old observer
427
+ if (last) {
428
+ if (ro && last.isSCArray) last.removeRangeObserver(ro);
429
+ else if (last.isEnumerable) last.removeObserver('[]', this, efunc);
430
+ last.removeObserver('state', this, sfunc);
452
431
  }
453
432
 
454
- return true;
455
- },
433
+ ro = null;
434
+
435
+ // save new cached values
436
+ this._scac_cached = NO;
437
+ this._scac_content = cur ;
438
+
439
+ // setup new observers
440
+ // also, calculate new length. do it manually instead of using
441
+ // get(length) because we want to avoid computed an ordered array.
442
+ if (cur) {
443
+ if (!orders && cur.isSCArray) ro = cur.addRangeObserver(null,this,func);
444
+ else if (cur.isEnumerable) cur.addObserver('[]', this, efunc);
445
+ newlen = cur.isEnumerable ? cur.get('length') : 1;
446
+ cur.addObserver('state', this, sfunc);
447
+
448
+ } else newlen = SC.none(cur) ? 0 : 1;
449
+
450
+ this._scac_rangeObserver = ro;
451
+
452
+
453
+ // finally, notify enumerable content has changed.
454
+ this._scac_length = newlen;
455
+ this._scac_contentStateDidChange();
456
+ this.enumerableContentDidChange(0, newlen, newlen - oldlen);
457
+ this.updateSelectionAfterContentChange();
458
+ }.observes('content'),
456
459
 
457
- /** @private
458
- Returns the object controller for a source value.
460
+ /**
461
+ Whenever enumerable content changes, need to regenerate the
462
+ observableContent and notify that the range has changed.
463
+
464
+ IMPORTANT: Assumes content is not null and is enumerable
459
465
  */
460
- _objectControllerFor: function(obj) {
461
- if (!this.useControllersForContent) return obj;
462
-
463
- var controllers = (this._objControllers = this._objControllers || {}) ;
464
- var guid = SC.guidFor(obj) ;
465
- var ret = controllers[guid] ;
466
- if (!ret) {
467
- ret = controllers[guid] = this.controllerForValue(obj) ;
468
- if (ret) ret.__isArrayController = true ;
469
- }
470
- return ret ;
466
+ _scac_enumerableDidChange: function() {
467
+ var content = this.get('content'), // use content directly
468
+ newlen = content.get('length'),
469
+ oldlen = this._scac_length;
470
+
471
+ this._scac_length = newlen;
472
+ this.beginPropertyChanges();
473
+ this._scac_cached = NO; // invalidate
474
+ this.enumerableContentDidChange(0, newlen, newlen-oldlen);
475
+ this.endPropertyChanges();
476
+ this.updateSelectionAfterContentChange();
471
477
  },
472
478
 
473
- /** @private
474
- Returns the source object for the passed value. If the passed value is a
475
- controller, this will map back to the sourceo object. Otherwise the
476
- object itself will be returned.
479
+ /**
480
+ Whenever array content changes, need to simply forward notification.
481
+
482
+ Assumes that content is not null and is SC.Array.
477
483
  */
478
- _sourceObjectFor: function(obj) {
479
- return (obj && obj.kindOf && obj.kindOf(SC.Controller)) ?
480
- obj.get('content') :
481
- obj ;
484
+ _scac_rangeDidChange: function(array, objects, key, indexes) {
485
+ if (key !== '[]') return ; // nothing to do
486
+
487
+ var content = this.get('content');
488
+ this._scac_length = content.get('length');
489
+ this._scac_cached = NO; // invalidate
490
+
491
+ // if array length has changed, just notify every index from min up
492
+ if (indexes) {
493
+ this.beginPropertyChanges();
494
+ indexes.forEachRange(function(start, length) {
495
+ this.enumerableContentDidChange(start, length, 0);
496
+ }, this);
497
+ this.endPropertyChanges();
498
+ this.updateSelectionAfterContentChange();
499
+ }
482
500
  },
483
501
 
484
- /** @private */
485
- init: function() {
486
- sc_super() ;
487
- if (this.get('content')) this._contentDidChange() ;
502
+ /**
503
+ Whenver the content "state" property changes, relay out.
504
+ */
505
+ _scac_contentStateDidChange: function() {
506
+ this.notifyPropertyChange('state');
488
507
  }
489
508
 
490
509
  });