sproutit-sproutcore 1.0.0.20090407205609 → 1.0.0.20090408130025

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 (574) hide show
  1. data/frameworks/sproutcore/Buildfile +63 -0
  2. data/frameworks/sproutcore/HISTORY +682 -0
  3. data/frameworks/sproutcore/README +22 -0
  4. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +149 -0
  5. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +16 -0
  6. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +17 -0
  7. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +99 -0
  8. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  9. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/strings.js +15 -0
  10. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +27 -0
  11. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +21 -0
  12. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +209 -0
  13. data/frameworks/sproutcore/apps/sc_qunit/core.js +16 -0
  14. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +17 -0
  15. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +107 -0
  16. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  17. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +15 -0
  18. data/frameworks/sproutcore/apps/sc_qunit/main.js +18 -0
  19. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +24 -0
  20. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +52 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +47 -0
  22. data/frameworks/sproutcore/apps/tests/controllers/test.js +20 -0
  23. data/frameworks/sproutcore/apps/tests/controllers/tests.js +38 -0
  24. data/frameworks/sproutcore/apps/tests/core.js +35 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/loading.rhtml +9 -0
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +19 -0
  27. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +86 -0
  28. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +17 -0
  29. data/frameworks/sproutcore/apps/tests/fixtures/target.js +43 -0
  30. data/frameworks/sproutcore/apps/tests/fixtures/test.js +43 -0
  31. data/frameworks/sproutcore/apps/tests/main.js +39 -0
  32. data/frameworks/sproutcore/apps/tests/models/target.js +49 -0
  33. data/frameworks/sproutcore/apps/tests/models/test.js +20 -0
  34. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +15 -0
  35. data/frameworks/sproutcore/apps/tests/tests/controllers/test.js +15 -0
  36. data/frameworks/sproutcore/apps/tests/tests/controllers/tests.js +15 -0
  37. data/frameworks/sproutcore/apps/tests/tests/models/target.js +15 -0
  38. data/frameworks/sproutcore/apps/tests/tests/models/test.js +15 -0
  39. data/frameworks/sproutcore/apps/welcome/core.js +23 -0
  40. data/frameworks/sproutcore/apps/welcome/english.lproj/loading.rhtml +8 -0
  41. data/frameworks/sproutcore/apps/welcome/english.lproj/main_page.js +43 -0
  42. data/frameworks/sproutcore/apps/welcome/english.lproj/strings.js +15 -0
  43. data/frameworks/sproutcore/apps/welcome/main.js +36 -0
  44. data/frameworks/sproutcore/design/Design Charts.graffle +15819 -0
  45. data/frameworks/sproutcore/design/Record State Table.numbers +0 -0
  46. data/frameworks/sproutcore/frameworks/datastore/core.js +14 -0
  47. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +113 -0
  48. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +256 -0
  49. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +196 -0
  50. data/frameworks/sproutcore/frameworks/datastore/debug/json.js +71 -0
  51. data/frameworks/sproutcore/frameworks/datastore/debug/standard_setup.js +96 -0
  52. data/frameworks/sproutcore/frameworks/datastore/fixtures/author_fixtures.js +2503 -0
  53. data/frameworks/sproutcore/frameworks/datastore/fixtures/sample.js +17 -0
  54. data/frameworks/sproutcore/frameworks/datastore/models/fetched_attribute.js +92 -0
  55. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +38 -0
  56. data/frameworks/sproutcore/frameworks/datastore/models/record.js +430 -0
  57. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +361 -0
  58. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +305 -0
  59. data/frameworks/sproutcore/frameworks/datastore/system/query.js +128 -0
  60. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +149 -0
  61. data/frameworks/sproutcore/frameworks/datastore/system/store.js +1689 -0
  62. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +86 -0
  63. data/frameworks/sproutcore/frameworks/datastore/tests/integration/contact_model.js +114 -0
  64. data/frameworks/sproutcore/frameworks/datastore/tests/integration/mail_model.js +91 -0
  65. data/frameworks/sproutcore/frameworks/datastore/tests/integration/test_runner_model.js +56 -0
  66. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +73 -0
  67. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/readAttribute.js +48 -0
  68. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +42 -0
  69. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +138 -0
  70. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/unknownProperty.js +46 -0
  71. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +71 -0
  72. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +115 -0
  73. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +40 -0
  74. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +116 -0
  75. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +135 -0
  76. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +110 -0
  77. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +99 -0
  78. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +180 -0
  79. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +126 -0
  80. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +163 -0
  81. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +166 -0
  82. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +175 -0
  83. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +54 -0
  84. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +126 -0
  85. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +127 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +57 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataHashDidChange.js +78 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +247 -0
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +106 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/init.js +21 -0
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +61 -0
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +74 -0
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/readEditableDataHash.js +74 -0
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +74 -0
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/removeDataHash.js +144 -0
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +137 -0
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +130 -0
  98. data/frameworks/sproutcore/frameworks/debug/core.js +1 -0
  99. data/frameworks/sproutcore/frameworks/deprecated/core.js +61 -0
  100. data/frameworks/sproutcore/frameworks/deprecated/lib/button_views.rb +330 -0
  101. data/frameworks/sproutcore/frameworks/deprecated/lib/collection_view.rb +83 -0
  102. data/frameworks/sproutcore/frameworks/deprecated/lib/core_views.rb +326 -0
  103. data/frameworks/sproutcore/frameworks/deprecated/lib/form_views.rb +253 -0
  104. data/frameworks/sproutcore/frameworks/deprecated/lib/index.rhtml +75 -0
  105. data/frameworks/sproutcore/frameworks/deprecated/lib/menu_views.rb +93 -0
  106. data/frameworks/sproutcore/frameworks/deprecated/server/rails_server.js +80 -0
  107. data/frameworks/sproutcore/frameworks/deprecated/server/rest_server.js +178 -0
  108. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +674 -0
  109. data/frameworks/sproutcore/frameworks/deprecated/system/animator.js +679 -0
  110. data/frameworks/sproutcore/frameworks/deprecated/system/binding.js +36 -0
  111. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +77 -0
  112. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +314 -0
  113. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +60 -0
  114. data/frameworks/sproutcore/frameworks/deprecated/system/globals.js +20 -0
  115. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +60 -0
  116. data/frameworks/sproutcore/frameworks/deprecated/system/node_descriptor.js +72 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +124 -0
  118. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +433 -0
  119. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +109 -0
  120. data/frameworks/sproutcore/frameworks/deprecated/tests/application/application.rhtml +125 -0
  121. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/clippingFrame.rhtml +401 -0
  122. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/frame.rhtml +357 -0
  123. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/isVisibleInWindow.rhtml +147 -0
  124. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/base.rhtml +298 -0
  125. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/incremental_rendering.rhtml +260 -0
  126. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/source_list_rendering.rhtml +143 -0
  127. data/frameworks/sproutcore/frameworks/deprecated/tests/views/popup_button.rhtml +128 -0
  128. data/frameworks/sproutcore/frameworks/deprecated/tests/views/text_field.rhtml +37 -0
  129. data/frameworks/sproutcore/frameworks/deprecated/views/collection.js +24 -0
  130. data/frameworks/sproutcore/frameworks/designer/coders/design.js +30 -0
  131. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +28 -0
  132. data/frameworks/sproutcore/frameworks/designer/coders/object.js +347 -0
  133. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +102 -0
  134. data/frameworks/sproutcore/frameworks/designer/css/css_rule.js +22 -0
  135. data/frameworks/sproutcore/frameworks/designer/css/css_style.js +29 -0
  136. data/frameworks/sproutcore/frameworks/designer/css/css_style_sheet.js +201 -0
  137. data/frameworks/sproutcore/frameworks/designer/ext/page.js +88 -0
  138. data/frameworks/sproutcore/frameworks/designer/ext/view.js +40 -0
  139. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +18 -0
  140. data/frameworks/sproutcore/frameworks/designer/views/designer.js +553 -0
  141. data/frameworks/sproutcore/frameworks/designer/views/label.js +17 -0
  142. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +13 -0
  143. data/frameworks/sproutcore/frameworks/designer/views/tab.js +17 -0
  144. data/frameworks/sproutcore/frameworks/desktop/core.js +6 -0
  145. data/frameworks/sproutcore/frameworks/desktop/debug/drag.js +41 -0
  146. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +56 -0
  147. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/a_sample_image.jpg +0 -0
  148. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/apple-logo1.jpeg +0 -0
  149. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/iframe.html +23 -0
  150. data/frameworks/sproutcore/frameworks/desktop/english.lproj/disclosure.css +71 -0
  151. data/frameworks/sproutcore/frameworks/desktop/english.lproj/icons.css +943 -0
  152. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  153. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_222222.png +0 -0
  154. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_454545.png +0 -0
  155. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_888888.png +0 -0
  156. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_ffffff.png +0 -0
  157. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/shared.png +0 -0
  158. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/indicator.gif +0 -0
  159. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/panels/sprite-x.png +0 -0
  160. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/panels/sprite-y.png +0 -0
  161. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/sc-theme-sprite.png +0 -0
  162. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/000000.png +0 -0
  163. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/ffffff.png +0 -0
  164. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/sticky-note.png +0 -0
  165. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +156 -0
  166. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +83 -0
  167. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +99 -0
  168. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +3 -0
  169. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +94 -0
  170. data/frameworks/sproutcore/frameworks/desktop/english.lproj/picker.css +39 -0
  171. data/frameworks/sproutcore/frameworks/desktop/english.lproj/progress.css +31 -0
  172. data/frameworks/sproutcore/frameworks/desktop/english.lproj/radio.css +10 -0
  173. data/frameworks/sproutcore/frameworks/desktop/english.lproj/scroller.css +26 -0
  174. data/frameworks/sproutcore/frameworks/desktop/english.lproj/segmented.css +141 -0
  175. data/frameworks/sproutcore/frameworks/desktop/english.lproj/separator.css +19 -0
  176. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +57 -0
  177. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split.css +70 -0
  178. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +8 -0
  179. data/frameworks/sproutcore/frameworks/desktop/english.lproj/strings.js +14 -0
  180. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +12 -0
  181. data/frameworks/sproutcore/frameworks/desktop/english.lproj/text_field.css +29 -0
  182. data/frameworks/sproutcore/frameworks/desktop/english.lproj/toolbar.css +6 -0
  183. data/frameworks/sproutcore/frameworks/desktop/mixins/border.js +53 -0
  184. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_group.js +22 -0
  185. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_item.js +22 -0
  186. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +226 -0
  187. data/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +247 -0
  188. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +377 -0
  189. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +504 -0
  190. data/frameworks/sproutcore/frameworks/desktop/panes/modal.js +68 -0
  191. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +63 -0
  192. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +184 -0
  193. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +402 -0
  194. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +46 -0
  195. data/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +39 -0
  196. data/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +81 -0
  197. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +175 -0
  198. data/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +280 -0
  199. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +721 -0
  200. data/frameworks/sproutcore/frameworks/desktop/system/key_bindings.js +40 -0
  201. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +641 -0
  202. data/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +187 -0
  203. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +43 -0
  204. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/methods.js +10 -0
  205. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +152 -0
  206. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +10 -0
  207. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +57 -0
  208. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/methods.js +10 -0
  209. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +36 -0
  210. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +10 -0
  211. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +40 -0
  212. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +10 -0
  213. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +80 -0
  214. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/methods.js +10 -0
  215. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +38 -0
  216. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +45 -0
  217. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +140 -0
  218. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +145 -0
  219. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +99 -0
  220. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +10 -0
  221. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +39 -0
  222. data/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/methods.js +10 -0
  223. data/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +64 -0
  224. data/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +10 -0
  225. data/frameworks/sproutcore/frameworks/desktop/tests/views/grid/ui.js +10 -0
  226. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +10 -0
  227. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +110 -0
  228. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +255 -0
  229. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/methods.js +10 -0
  230. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +44 -0
  231. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/methods.js +128 -0
  232. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +240 -0
  233. data/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +113 -0
  234. data/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +202 -0
  235. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +139 -0
  236. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +111 -0
  237. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +63 -0
  238. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/ui.js +70 -0
  239. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +94 -0
  240. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +206 -0
  241. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +81 -0
  242. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +85 -0
  243. data/frameworks/sproutcore/frameworks/desktop/tests/views/separator.js +37 -0
  244. data/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/methods.js +10 -0
  245. data/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/ui.js +10 -0
  246. data/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +50 -0
  247. data/frameworks/sproutcore/frameworks/desktop/tests/views/split/ui.js +52 -0
  248. data/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +54 -0
  249. data/frameworks/sproutcore/frameworks/desktop/tests/views/tab/ui.js +88 -0
  250. data/frameworks/sproutcore/frameworks/desktop/tests/views/text_field/methods.js +76 -0
  251. data/frameworks/sproutcore/frameworks/desktop/tests/views/text_field/ui.js +198 -0
  252. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/methods.js +10 -0
  253. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +110 -0
  254. data/frameworks/sproutcore/frameworks/desktop/views/button.js +320 -0
  255. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +98 -0
  256. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +2141 -0
  257. data/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +44 -0
  258. data/frameworks/sproutcore/frameworks/desktop/views/form.js +595 -0
  259. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +199 -0
  260. data/frameworks/sproutcore/frameworks/desktop/views/list.js +706 -0
  261. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +523 -0
  262. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +437 -0
  263. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +62 -0
  264. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +207 -0
  265. data/frameworks/sproutcore/frameworks/desktop/views/radio.js +332 -0
  266. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +56 -0
  267. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +648 -0
  268. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +203 -0
  269. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +509 -0
  270. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +292 -0
  271. data/frameworks/sproutcore/frameworks/desktop/views/separator.js +37 -0
  272. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +178 -0
  273. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +1117 -0
  274. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +169 -0
  275. data/frameworks/sproutcore/frameworks/desktop/views/split.js +651 -0
  276. data/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +55 -0
  277. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +190 -0
  278. data/frameworks/sproutcore/frameworks/desktop/views/text_field.js +233 -0
  279. data/frameworks/sproutcore/frameworks/desktop/views/thumb.js +49 -0
  280. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +49 -0
  281. data/frameworks/sproutcore/frameworks/desktop/views/web.js +86 -0
  282. data/frameworks/sproutcore/frameworks/foundation/TESTING +46 -0
  283. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +490 -0
  284. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +317 -0
  285. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +421 -0
  286. data/frameworks/sproutcore/frameworks/foundation/core.js +111 -0
  287. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +172 -0
  288. data/frameworks/sproutcore/frameworks/foundation/english.lproj/blank.gif +0 -0
  289. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +53 -0
  290. data/frameworks/sproutcore/frameworks/foundation/english.lproj/button_view.css +55 -0
  291. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +5 -0
  292. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +8 -0
  293. data/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-logo.png +0 -0
  294. data/frameworks/sproutcore/frameworks/foundation/english.lproj/static_layout.css +5 -0
  295. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +40 -0
  296. data/frameworks/sproutcore/frameworks/foundation/ext/object.js +81 -0
  297. data/frameworks/sproutcore/frameworks/foundation/ext/run_loop.js +158 -0
  298. data/frameworks/sproutcore/frameworks/foundation/fixtures/file_exists.json +1 -0
  299. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +291 -0
  300. data/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +88 -0
  301. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +352 -0
  302. data/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +146 -0
  303. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +156 -0
  304. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +154 -0
  305. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +101 -0
  306. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +237 -0
  307. data/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +176 -0
  308. data/frameworks/sproutcore/frameworks/foundation/panes/main.js +47 -0
  309. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +555 -0
  310. data/frameworks/sproutcore/frameworks/foundation/protocols/inline_editor_delegate.js +84 -0
  311. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +244 -0
  312. data/frameworks/sproutcore/frameworks/foundation/system/browser.js +64 -0
  313. data/frameworks/sproutcore/frameworks/foundation/system/builder.js +210 -0
  314. data/frameworks/sproutcore/frameworks/foundation/system/core_query.js +2015 -0
  315. data/frameworks/sproutcore/frameworks/foundation/system/cursor.js +129 -0
  316. data/frameworks/sproutcore/frameworks/foundation/system/error.js +93 -0
  317. data/frameworks/sproutcore/frameworks/foundation/system/event.js +817 -0
  318. data/frameworks/sproutcore/frameworks/foundation/system/image_cache.js +433 -0
  319. data/frameworks/sproutcore/frameworks/foundation/system/json.js +440 -0
  320. data/frameworks/sproutcore/frameworks/foundation/system/locale.js +288 -0
  321. data/frameworks/sproutcore/frameworks/foundation/system/page.js +106 -0
  322. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +189 -0
  323. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +865 -0
  324. data/frameworks/sproutcore/frameworks/foundation/system/request.js +255 -0
  325. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +368 -0
  326. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +446 -0
  327. data/frameworks/sproutcore/frameworks/foundation/system/time.js +478 -0
  328. data/frameworks/sproutcore/frameworks/foundation/system/timer.js +549 -0
  329. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +158 -0
  330. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +330 -0
  331. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +118 -0
  332. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +268 -0
  333. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +433 -0
  334. data/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/methods.js +10 -0
  335. data/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/ui.js +113 -0
  336. data/frameworks/sproutcore/frameworks/foundation/tests/integration/creating_views.js +113 -0
  337. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/content.js +195 -0
  338. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/displayProperties.js +89 -0
  339. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/content.js +168 -0
  340. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/displayProperties.js +89 -0
  341. data/frameworks/sproutcore/frameworks/foundation/tests/system/builder.js +42 -0
  342. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +1323 -0
  343. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_dimensions.js +387 -0
  344. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +405 -0
  345. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/setClass.js +49 -0
  346. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/within.js +66 -0
  347. data/frameworks/sproutcore/frameworks/foundation/tests/system/error.js +41 -0
  348. data/frameworks/sproutcore/frameworks/foundation/tests/system/json.js +14 -0
  349. data/frameworks/sproutcore/frameworks/foundation/tests/system/locale.js +128 -0
  350. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/begin.js +47 -0
  351. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/element.js +44 -0
  352. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/end.js +119 -0
  353. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +51 -0
  354. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +50 -0
  355. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +28 -0
  356. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +179 -0
  357. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +100 -0
  358. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/init.js +55 -0
  359. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/join.js +28 -0
  360. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/push_text.js +74 -0
  361. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/tag.js +45 -0
  362. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/update.js +205 -0
  363. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +89 -0
  364. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeKeyPane.js +124 -0
  365. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeMainPane.js +68 -0
  366. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +97 -0
  367. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/targetForAction.js +238 -0
  368. data/frameworks/sproutcore/frameworks/foundation/tests/system/routes.js +33 -0
  369. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invalidate.js +38 -0
  370. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invokeLater.js +201 -0
  371. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/isPaused.js +71 -0
  372. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/performAction.js +67 -0
  373. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +170 -0
  374. data/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +27 -0
  375. data/frameworks/sproutcore/frameworks/foundation/tests/system/utils/normalizeURL.js +18 -0
  376. data/frameworks/sproutcore/frameworks/foundation/tests/system/utils/range.js +62 -0
  377. data/frameworks/sproutcore/frameworks/foundation/tests/validators/credit_card.js +35 -0
  378. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +21 -0
  379. data/frameworks/sproutcore/frameworks/foundation/tests/validators/number.js +47 -0
  380. data/frameworks/sproutcore/frameworks/foundation/tests/validators/password.js +13 -0
  381. data/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +10 -0
  382. data/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +83 -0
  383. data/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +39 -0
  384. data/frameworks/sproutcore/frameworks/foundation/tests/views/main_pane.js +31 -0
  385. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +89 -0
  386. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/firstResponder.js +148 -0
  387. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/keyPane.js +133 -0
  388. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/sendEvent.js +165 -0
  389. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +132 -0
  390. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +246 -0
  391. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +87 -0
  392. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createLayer.js +97 -0
  393. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/destroyLayer.js +85 -0
  394. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +52 -0
  395. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/init.js +50 -0
  396. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/insertBefore.js +200 -0
  397. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +102 -0
  398. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layer.js +150 -0
  399. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutChildViews.js +162 -0
  400. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutDidChange.js +127 -0
  401. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +248 -0
  402. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/parentViewDidChange.js +67 -0
  403. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +166 -0
  404. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/removeChild.js +189 -0
  405. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/render.js +83 -0
  406. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/replaceChild.js +29 -0
  407. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +142 -0
  408. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayerLocation.js +194 -0
  409. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/viewDidResize.js +185 -0
  410. data/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +125 -0
  411. data/frameworks/sproutcore/frameworks/foundation/validators/date.js +52 -0
  412. data/frameworks/sproutcore/frameworks/foundation/validators/email.js +45 -0
  413. data/frameworks/sproutcore/frameworks/foundation/validators/not_empty.js +33 -0
  414. data/frameworks/sproutcore/frameworks/foundation/validators/number.js +82 -0
  415. data/frameworks/sproutcore/frameworks/foundation/validators/password.js +86 -0
  416. data/frameworks/sproutcore/frameworks/foundation/validators/validator.js +311 -0
  417. data/frameworks/sproutcore/frameworks/foundation/views/container.js +136 -0
  418. data/frameworks/sproutcore/frameworks/foundation/views/field.js +276 -0
  419. data/frameworks/sproutcore/frameworks/foundation/views/image.js +158 -0
  420. data/frameworks/sproutcore/frameworks/foundation/views/label.js +261 -0
  421. data/frameworks/sproutcore/frameworks/foundation/views/view.js +2160 -0
  422. data/frameworks/sproutcore/frameworks/mobile/english.lproj/core.css +12 -0
  423. data/frameworks/sproutcore/frameworks/mobile/lib/index.rhtml +126 -0
  424. data/frameworks/sproutcore/frameworks/mobile/system/root_responder.js +109 -0
  425. data/frameworks/sproutcore/frameworks/mobile/tests/views/button/ui.js +9 -0
  426. data/frameworks/sproutcore/frameworks/mobile/views/button.js +190 -0
  427. data/frameworks/sproutcore/frameworks/runtime/README +11 -0
  428. data/frameworks/sproutcore/frameworks/runtime/core.js +777 -0
  429. data/frameworks/sproutcore/frameworks/runtime/license.js +28 -0
  430. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +403 -0
  431. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +70 -0
  432. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1193 -0
  433. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +1149 -0
  434. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +135 -0
  435. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +108 -0
  436. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +128 -0
  437. data/frameworks/sproutcore/frameworks/runtime/protocols/sparse_array_delegate.js +131 -0
  438. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +891 -0
  439. data/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +107 -0
  440. data/frameworks/sproutcore/frameworks/runtime/system/object.js +783 -0
  441. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +99 -0
  442. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +214 -0
  443. data/frameworks/sproutcore/frameworks/runtime/system/set.js +246 -0
  444. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +286 -0
  445. data/frameworks/sproutcore/frameworks/runtime/tests/core/IsEqual.js +56 -0
  446. data/frameworks/sproutcore/frameworks/runtime/tests/core/beget.js +23 -0
  447. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +66 -0
  448. data/frameworks/sproutcore/frameworks/runtime/tests/core/guidFor.js +147 -0
  449. data/frameworks/sproutcore/frameworks/runtime/tests/core/inspect.js +27 -0
  450. data/frameworks/sproutcore/frameworks/runtime/tests/core/isArray.js +25 -0
  451. data/frameworks/sproutcore/frameworks/runtime/tests/core/itemType.js +38 -0
  452. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +20 -0
  453. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +30 -0
  454. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +19 -0
  455. data/frameworks/sproutcore/frameworks/runtime/tests/core/tupleForPropertyPath.js +37 -0
  456. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +592 -0
  457. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +467 -0
  458. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +123 -0
  459. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/registerDependentKeys.js +79 -0
  460. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/propertyChanges.js +80 -0
  461. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +263 -0
  462. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +190 -0
  463. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +135 -0
  464. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/bindings.js +339 -0
  465. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +120 -0
  466. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +313 -0
  467. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +84 -0
  468. data/frameworks/sproutcore/frameworks/testing/core.js +13 -0
  469. data/frameworks/sproutcore/frameworks/testing/english.lproj/additions.css +8 -0
  470. data/frameworks/sproutcore/frameworks/testing/english.lproj/testsuite.css +131 -0
  471. data/frameworks/sproutcore/frameworks/testing/extras.js +43 -0
  472. data/frameworks/sproutcore/frameworks/testing/jquery.js +3559 -0
  473. data/frameworks/sproutcore/frameworks/testing/qunit.js +819 -0
  474. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +25 -0
  475. data/frameworks/sproutcore/frameworks/testing/utils.js +55 -0
  476. data/frameworks/sproutcore/lib/index.rhtml +118 -0
  477. data/frameworks/sproutcore/license.js +28 -0
  478. data/frameworks/sproutcore/themes/empty_theme/tests/mini_icons.rhtml +69 -0
  479. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/button.css +41 -0
  480. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +8 -0
  481. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/backButton.png +0 -0
  482. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/blueButton.png +0 -0
  483. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/cancel.png +0 -0
  484. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/grayButton.png +0 -0
  485. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/leftButton.png +0 -0
  486. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrow.png +0 -0
  487. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrowSel.png +0 -0
  488. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listGroup.png +0 -0
  489. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/loading.gif +0 -0
  490. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/pinstripes.png +0 -0
  491. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/rightButton.png +0 -0
  492. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/selection.png +0 -0
  493. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/thumb.png +0 -0
  494. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggle.png +0 -0
  495. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggleOn.png +0 -0
  496. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolButton.png +0 -0
  497. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolbar.png +0 -0
  498. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/whiteButton.png +0 -0
  499. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/strings.js +15 -0
  500. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/Data +0 -0
  501. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Preview.jpg +0 -0
  502. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Thumbnail.jpg +0 -0
  503. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/Data +0 -0
  504. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Preview.jpg +0 -0
  505. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Thumbnail.jpg +0 -0
  506. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/Data +0 -0
  507. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Preview.jpg +0 -0
  508. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Thumbnail.jpg +0 -0
  509. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/Data +0 -0
  510. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Preview.jpg +0 -0
  511. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Thumbnail.jpg +0 -0
  512. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +333 -0
  513. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +90 -0
  514. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +53 -0
  515. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +47 -0
  516. data/frameworks/sproutcore/themes/standard_theme/english.lproj/disclosure.css +55 -0
  517. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-sprite.png +0 -0
  518. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-ysprite.png +0 -0
  519. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-toolbar-view.png +0 -0
  520. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +37 -0
  521. data/frameworks/sproutcore/themes/standard_theme/english.lproj/pane.css +8 -0
  522. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/background-fat.jpg +0 -0
  523. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/background-thin.jpg +0 -0
  524. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-edge.png +0 -0
  525. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-left-corner.png +0 -0
  526. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-right-corner.png +0 -0
  527. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/left-edge.png +0 -0
  528. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/overlay.png +0 -0
  529. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/right-edge.png +0 -0
  530. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-edge.png +0 -0
  531. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-left-corner.png +0 -0
  532. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-right-corner.png +0 -0
  533. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +23 -0
  534. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +113 -0
  535. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +141 -0
  536. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +62 -0
  537. data/frameworks/sproutcore/themes/standard_theme/english.lproj/split_view.css +27 -0
  538. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +12 -0
  539. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +13 -0
  540. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -0
  541. data/lib/thor/.autotest +7 -0
  542. data/lib/thor/CHANGELOG.rdoc +52 -0
  543. data/lib/thor/LICENSE +20 -0
  544. data/lib/thor/README.markdown +76 -0
  545. data/lib/thor/Rakefile +6 -0
  546. data/lib/thor/Thorfile +45 -0
  547. data/lib/thor/bin/rake2thor +83 -0
  548. data/lib/thor/bin/thor +7 -0
  549. data/lib/thor/lib/thor/error.rb +3 -0
  550. data/lib/thor/lib/thor/options.rb +267 -0
  551. data/lib/thor/lib/thor/ordered_hash.rb +64 -0
  552. data/lib/thor/lib/thor/runner.rb +305 -0
  553. data/lib/thor/lib/thor/task.rb +83 -0
  554. data/lib/thor/lib/thor/task_hash.rb +22 -0
  555. data/lib/thor/lib/thor/tasks/package.rb +18 -0
  556. data/lib/thor/lib/thor/tasks.rb +77 -0
  557. data/lib/thor/lib/thor/util.rb +75 -0
  558. data/lib/thor/lib/thor.rb +170 -0
  559. data/lib/thor/script/destroy +14 -0
  560. data/lib/thor/script/generate +14 -0
  561. data/lib/thor/spec/fixtures/task.thor +10 -0
  562. data/lib/thor/spec/options_spec.rb +271 -0
  563. data/lib/thor/spec/ordered_hash_spec.rb +84 -0
  564. data/lib/thor/spec/spec.opts +1 -0
  565. data/lib/thor/spec/spec_helper.rb +30 -0
  566. data/lib/thor/spec/task_spec.rb +11 -0
  567. data/lib/thor/spec/tasks_spec.rb +28 -0
  568. data/lib/thor/spec/thor_runner_spec.rb +194 -0
  569. data/lib/thor/spec/thor_spec.rb +206 -0
  570. data/lib/thor/spec/util_spec.rb +99 -0
  571. data/lib/thor/task.thor +15 -0
  572. data/lib/thor/thor.gemspec +29 -0
  573. metadata +3 -4
  574. data/sproutcore.gemspec +0 -47
@@ -0,0 +1,1117 @@
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/list') ;
9
+ sc_require('views/source_list_group');
10
+
11
+ SC.BENCHMARK_SOURCE_LIST_VIEW = YES ;
12
+
13
+ /** @class
14
+
15
+ Displays a source list like the source list in iTunes.
16
+
17
+ @extends SC.ListView
18
+ @author Charles Jolley
19
+ @author Erich Ocean
20
+ @version 1.0
21
+ @since 0.9
22
+ */
23
+ SC.SourceListView = SC.ListView.extend(
24
+ /** @scope SC.SourceListView.prototype */ {
25
+
26
+ /**
27
+ The view class to use when displaying item views in groups.
28
+
29
+ If the groupBy property is not null, then the collection view will create
30
+ an instance of this view class with the item views that belong to the
31
+ group as child nodes for each distinct group value it encounters.
32
+
33
+ If groupBy is null, then this property will not be used. The default
34
+ class provided here simply displays the group value in an H1 tag.
35
+
36
+ @property {SC.View}
37
+ */
38
+ exampleGroupView: SC.SourceListGroupView,
39
+
40
+ // ..........................................................
41
+ // GROUP HEIGHT SUPPORT
42
+ //
43
+
44
+ /**
45
+ Set to YES if your list view should have uniform group heights. This will
46
+ enable an optimization that avoids inspecting actual group objects
47
+ when calculating the size of the view.
48
+
49
+ The default version of this property is set to YES unless you set a
50
+ delegate or a rowHeightKey.
51
+ */
52
+ hasUniformGroupHeights: YES,
53
+
54
+ /**
55
+ The common group height for source list group views.
56
+
57
+ If you set this property, then the ListView will be able to use this
58
+ property to perform absolute layout of its children and to minimize t
59
+ number of actual views it has to create.
60
+
61
+ The value should be an integer expressed in pixels.
62
+
63
+ You can alternatively set either the groupHeightKey or implement
64
+ the collectionViewHeightForGroupAtGroupIndex() delegate method.
65
+ */
66
+ groupHeight: 32,
67
+
68
+ /**
69
+ If set, this key will be used to calculate the row height for a given
70
+ content object.
71
+ */
72
+ groupHeightKey: null,
73
+
74
+ /**
75
+ This optional delegate method will be called for each group in your
76
+ content groups, giving you a chance to decide what group height to use for
77
+ the group at the named groupIndex.
78
+
79
+ The default version will return either the fixed groupHeight you
80
+ specified or will lookup the group height on the content's groups object
81
+ using the groupHeightKey.
82
+
83
+ @params {SC.CollectionView} the requesting collection view
84
+ @params {Number} groupIndex the index into the group array
85
+ @returns {Number} groupHeight
86
+ */
87
+ collectionViewHeightForGroupAtIndex: function(collectionView, groupIndex) {
88
+ // console.log('%@.collectionViewHeightForGroupAtIndex(collectionView=%@, groupIndex=%@)'.fmt(this, collectionView, groupIndex));
89
+ if (!this.groupHeightKey) return this.get('groupHeight') ;
90
+
91
+ var group, groups = this.getPath('content.groups') ;
92
+ if (groups) group = groups.objectAt(groupIndex) ;
93
+
94
+ return group ?
95
+ group.get(this.get('groupHeightKey')) :
96
+ this.get('groupHeight') ;
97
+ },
98
+
99
+ /**
100
+ Calculates the offset for the row at the specified index, taking into
101
+ account the height of the groupView for that contentIndex. Based on the
102
+ current setting this may compute the group heights of groups for previous
103
+ items or it will simply do some math...
104
+ */
105
+ offsetForRowAtContentIndex: function(contentIndex) {
106
+ // get normal contentIndex offset
107
+ var ret = sc_super() ;
108
+
109
+ // now account for group view heights, using simple math if possible...
110
+ if (this.get('hasUniformGroupHeights')) {
111
+ var groupHeight = this.get('groupHeight') ;
112
+
113
+ var groups = this.getPath('content.groups') || [] ;
114
+ var group, itemRange, len = groups.get('length') ;
115
+ for (var idx=0; idx<len; ++idx) {
116
+ group = groups.objectAt(idx) ;
117
+ ret += groupHeight ;
118
+ if (SC.valueInRange(contentIndex, group.itemRange)) break ;
119
+ }
120
+
121
+ // otherwise, use the groupOffsets cache...
122
+ } else {
123
+ // find the index of the group for contentIndex
124
+ var groupIndex = -1 ;
125
+ var groups = this.getPath('content.groups') || [] ;
126
+ var group, itemRange, len = groups.get('length') ;
127
+ for (var idx=0; idx<len; ++idx) {
128
+ group = groups.objectAt(idx) ;
129
+ if (SC.valueInRange(contentIndex, group.itemRange)) {
130
+ groupIndex = idx ;
131
+ break ;
132
+ }
133
+ }
134
+
135
+ // if we can't find the group, assume all groups
136
+ // (this resuts in the correct height when the offset of one-past-the-
137
+ // last-contentIndex is requested)
138
+ if (groupIndex === -1) groupIndex = len ;
139
+
140
+ // get caches
141
+ var offsets = this._source_list_groupOffsets;
142
+ if (!offsets) offsets = this._source_list_groupOffsets = [] ;
143
+
144
+ // OK, now try the fast path...if undefined, loop backwards until we
145
+ // find an offset that IS cached...
146
+ var len2 = offsets.length, cur = groupIndex, height, ret2;
147
+
148
+ // get the cached offset. Note that if the requested index is longer
149
+ // than the length of the offsets cache, then just assume the value is
150
+ // undefined. We don't want to accidentally read an old value...
151
+ if (groupIndex < len2) {
152
+ ret2 = offsets[cur];
153
+ } else {
154
+ ret2 = undefined ;
155
+ cur = len2; // start search at current end of offsets...
156
+ }
157
+
158
+ // if the cached value was undefined, loop backwards through the offsets
159
+ // hash looking for a cached value to start from
160
+ while ((cur>0) && (ret2===undefined)) ret2 = offsets[--cur] ;
161
+
162
+ // now, work our way forward, building the cache of offsets. Use
163
+ // cached heights...
164
+ if (ret2===undefined) ret2 = offsets[cur] = 0 ;
165
+ while (cur < groupIndex) {
166
+ // get height...recache if needed....
167
+ height = this._source_list_heightForGroupAtIndex(cur) ;
168
+
169
+ // console.log('index %@ has height %@'.fmt(cur, height));
170
+
171
+ // add to ret2 and save in cache
172
+ ret2 = ret2 + height ;
173
+
174
+ cur++; // go to next offset
175
+ offsets[cur] = ret2 ;
176
+ }
177
+
178
+ // now update contentIndex offset
179
+ ret += ret2 ;
180
+
181
+ // also add in the offset for the contentIndex's own group as well,
182
+ // if it really has a group...
183
+ if (groupIndex != len) {
184
+ ret += this._source_list_heightForGroupAtIndex(groupIndex) ;
185
+ }
186
+ }
187
+
188
+ return ret ;
189
+ },
190
+
191
+ /**
192
+ Calculates the height for the group at groupIndex. This method will
193
+ perform some simple math if hasUniformGroupHeights is YES. Otherwise,
194
+ it will consult the collection view delegate to compute the group heights.
195
+ */
196
+ heightForGroupAtIndex: function(groupIndex) {
197
+ if (this.get('hasUniformGroupHeights')) {
198
+ return this.get('groupHeight') ;
199
+ } else return this._source_list_heightForGroupAtIndex(groupIndex) ;
200
+ },
201
+
202
+ /** @private
203
+ By-passes the uniform row heights check. Makes offsetForRow... a little
204
+ faster.
205
+ */
206
+ _source_list_heightForGroupAtIndex: function(groupIndex) {
207
+ // console.log('%@._source_list_heightForGroupAtIndex(groupIndex=%@)'.fmt(this, groupIndex)) ;
208
+ var heights = this._source_list_groupHeights;
209
+ if (!heights) heights = this._source_list_groupHeights = [] ;
210
+
211
+ var height = (groupIndex < heights.length) ?
212
+ heights[groupIndex] :
213
+ undefined ;
214
+ if (height===undefined) {
215
+ height = heights[groupIndex] = this.invokeDelegateMethod(this.delegate, 'collectionViewHeightForGroupAtIndex', this, groupIndex) || 0 ;
216
+ }
217
+
218
+ // console.log('groupIndex=%@, height=%@'.fmt(groupIndex, height));
219
+
220
+ return height ;
221
+ },
222
+
223
+ // ..........................................................
224
+ // RENDERING
225
+ //
226
+
227
+ createExampleGroupView: function() {
228
+ var ExampleGroupView = this.get('exampleGroupView') ;
229
+
230
+ if (ExampleGroupView) {
231
+ return ExampleGroupView.create({
232
+ classNames: ['sc-collection-group'],
233
+ owner: this,
234
+ displayDelegate: this,
235
+ parentView: this,
236
+ isVisible: YES,
237
+ isMaterialized: YES
238
+ });
239
+ } else throw "You must define an exampleGroupView class to render collection groups with" ;
240
+ },
241
+
242
+ render: function(context, firstTime) {
243
+ var isDirty = this.get('isDirty') ; // sc_super() will clear this...
244
+ sc_super() ; // render content items
245
+
246
+ // render groups
247
+ if (SC.BENCHMARK_RENDER) {
248
+ var bkey = '%@.render(groups)'.fmt(this) ;
249
+ SC.Benchmark.start(bkey);
250
+ }
251
+ this.beginPropertyChanges() ; // avoid sending notifications
252
+
253
+ var content = SC.makeArray(this.get('content')) ;
254
+ var groups = content.get('groups') || [] ;
255
+ var oldRange = this._oldNowShowingGroupRange ;
256
+ var range = SC.cloneRange(this.get('nowShowingRange')) ;
257
+ this._oldNowShowingGroupRange = SC.cloneRange(range) ;
258
+ var key, groupView = this.createExampleGroupView(), c, g ;
259
+ var range2 ; // only used if the old range fits inside the new range
260
+ var idx, end, groupId, groupIndex ;
261
+
262
+ // keep track of groups we've got rendered
263
+ var groupSet = this._groupSet ;
264
+ if (!groupSet) groupSet = this._groupSet = [] ;
265
+
266
+ // figure out which groups should be rendered
267
+ var newGroupSet = [] ;
268
+ idx = range.start ;
269
+ end = range.start + range.length ;
270
+ while (idx < end) {
271
+ // is the group for this contentIndex currently being rendered?
272
+ groupIndex = this.groupIndexForContentIndex(idx) ;
273
+ if (groupIndex >= 0) {
274
+ newGroupSet.push(groupIndex) ;
275
+ }
276
+ ++idx ;
277
+ }
278
+
279
+ if (SC.ENABLE_COLLECTION_PARTIAL_RENDER) {
280
+ // used for santity checks during debugging
281
+ if (SC.SANITY_CHECK_PARTIAL_RENDER) var maxLen = range.length ;
282
+
283
+ if (SC.DEBUG_PARTIAL_RENDER) {
284
+ console.log('oldRange = ') ;
285
+ console.log(oldRange) ;
286
+ console.log('range = ') ;
287
+ console.log(range) ;
288
+ }
289
+
290
+ // if we're dirty, redraw everything visible
291
+ // (selection changed, content changed, etc.)
292
+ if (isDirty) {
293
+ // console.log('doing a full render') ;
294
+ groupSet.length = 0 ; // full render
295
+
296
+ // else, only redaw objects we haven't previously drawn
297
+ } else if (oldRange) {
298
+ // ignore ranges that don't overlap above..
299
+ if (range.start >= oldRange.start + oldRange.length) {
300
+ // console.log('doing a full render') ;
301
+ groupSet.length = 0 ; // full render
302
+
303
+ // and below...
304
+ } else if (range.start + range.length <= oldRange.start) {
305
+ // console.log('doing a full render') ;
306
+ groupSet.length = 0 ; // full render
307
+
308
+ // okay, the ranges do overlap. are they equal?
309
+ } else if (SC.rangesEqual(oldRange, range)) {
310
+ range = SC.EMPTY_RANGE ; // nothing to render
311
+
312
+ // nope, is the old range inside the new range?
313
+ } else if (range.start <= oldRange.start && range.start + range.length >= oldRange.start + oldRange.length) {
314
+ // need to render two ranges...all pre-existing views are valid
315
+ context.partialUpdate = YES ;
316
+ range2 = { start: oldRange.start + oldRange.length, length: (range.start + range.length) - (oldRange.start + oldRange.length) } ;
317
+ range.length = oldRange.start - range.start ;
318
+
319
+ // nope, is the new range inside the old range?
320
+ } else if (range.start >= oldRange.start && range.start + range.length <= oldRange.start + oldRange.length) {
321
+ // need to remove unused childNodes at both ends, start with bottom...
322
+ idx = oldRange.start ;
323
+ end = range.start ;
324
+ while (idx < end) {
325
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('looping on bottom range');
326
+ // is the group for this contentIndex currently being rendered?
327
+ groupIndex = this.groupIndexForContentIndex(idx) ;
328
+ if (groupIndex >= 0 && (newGroupSet.indexOf(groupIndex) === -1)) {
329
+ groupId = groupSet[groupIndex] ;
330
+ if (groupId) context.remove(groupId) ;
331
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('deleting group at index %@'.fmt(groupIndex));
332
+ delete groupSet[groupIndex] ;
333
+ }
334
+ ++idx ;
335
+ }
336
+
337
+ // now remove unused childNodes at the top of the range...
338
+ idx = range.start + range.length ;
339
+ end = oldRange.start + oldRange.length ;
340
+ while (idx < end) {
341
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('looping on top range');
342
+ // is the group for this contentIndex currently being rendered?
343
+ groupIndex = this.groupIndexForContentIndex(idx) ;
344
+ if (groupIndex >= 0 && (newGroupSet.indexOf(groupIndex) === -1)) {
345
+ groupId = groupSet[groupIndex] ;
346
+ if (groupId) context.remove(groupId) ;
347
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('deleting group at index %@'.fmt(groupIndex));
348
+ delete groupSet[groupIndex] ;
349
+ }
350
+ ++idx ;
351
+ }
352
+
353
+ range = SC.EMPTY_RANGE ; // nothing to render
354
+
355
+ // nope, is the new range lower than the old range?
356
+ } else if (range.start < oldRange.start) {
357
+ context.partialUpdate = YES ;
358
+
359
+ // need to remove unused childNodes at the top of the old range
360
+ idx = range.start + range.length ;
361
+ end = oldRange.start + oldRange.length ;
362
+ while (idx < end) {
363
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('looping on top only');
364
+ // is the group for this contentIndex currently being rendered?
365
+ groupIndex = this.groupIndexForContentIndex(idx) ;
366
+ if (groupIndex >= 0 && (newGroupSet.indexOf(groupIndex) === -1)) {
367
+ groupId = groupSet[groupIndex] ;
368
+ if (groupId) context.remove(groupId) ;
369
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('deleting group at index %@'.fmt(groupIndex));
370
+ delete groupSet[groupIndex] ;
371
+ }
372
+ ++idx ;
373
+ }
374
+
375
+ range.length = Math.min(range.length, oldRange.start - range.start) ;
376
+
377
+ // nope, so the new range is higher than the old range
378
+ } else {
379
+ context.partialUpdate = YES ;
380
+
381
+ // need to remove unused childNodes at the bottom of the old range
382
+ idx = oldRange.start ;
383
+ end = range.start ;
384
+ while (idx < end) {
385
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('looping on bottom only');
386
+ // is the group for this contentIndex currently being rendered?
387
+ groupIndex = this.groupIndexForContentIndex(idx) ;
388
+ if (groupIndex >= 0 && (newGroupSet.indexOf(groupIndex) === -1)) {
389
+ groupId = groupSet[groupIndex] ;
390
+ if (groupId) context.remove(groupId) ;
391
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('deleting group at index %@'.fmt(groupIndex));
392
+ delete groupSet[groupIndex] ;
393
+ }
394
+ ++idx ;
395
+ }
396
+
397
+ end = range.start + range.length ;
398
+ range.start = oldRange.start + oldRange.length ;
399
+ range.length = end - range.start ;
400
+ }
401
+ }
402
+
403
+ if (SC.SANITY_CHECK_PARTIAL_RENDER) {
404
+ if (range.length < 0) throw "range.length is " + range.length ;
405
+ if (range.length > maxLen) throw "range.length is " + range.length + ', max length is ' + maxLen ;
406
+ if (range.start < 0) throw "range.start is " + range.start ;
407
+ if (range2) {
408
+ if (range2.length < 0) throw "range2.length is " + range2.length ;
409
+ if (range2.length > maxLen) throw "range2.length is " + range2.length + ', max length is ' + maxLen ;
410
+ if (range2.start < 0) throw "range2.start is " + range2.start ;
411
+ }
412
+ }
413
+
414
+ if (SC.DEBUG_PARTIAL_RENDER) {
415
+ console.log('rendering = ') ;
416
+ console.log(range) ;
417
+ if (range2) {
418
+ console.log('also rendering = ') ;
419
+ console.log(range2) ;
420
+ }
421
+ }
422
+ }
423
+
424
+ idx = SC.maxRange(range) ;
425
+
426
+ var baseKey = SC.guidFor(this) + '_' ;
427
+ var guids = this._groupViewGuids, guid;
428
+ if (!guids) this._groupViewGuids = guids = {};
429
+
430
+ // TODO: Use SC.IndexSet, not separate ranges, once it's ready.
431
+ // This will also make it possible to do partial updates during content
432
+ // and selection changes. Now we always do a full update.
433
+
434
+ var groupLayout ;
435
+ while (--idx >= range.start) {
436
+ groupIndex = this.groupIndexForContentIndex(idx) ;
437
+
438
+ if (groupIndex == -1) continue ;
439
+ // don't re-render already rendered group views
440
+ if (groupSet[groupIndex]) continue ;
441
+
442
+ g = groups.objectAt(groupIndex) ;
443
+
444
+ // use cache of group view guids to avoid creating temporary objects
445
+ guid = SC.guidFor(g);
446
+ if (!(key = guids[guid])) key = guids[guid] = baseKey+guid;
447
+
448
+ // console.log('groupSet[groupIndex]=%@'.fmt(groupSet[groupIndex])) ;
449
+
450
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('rendering group(%@) at index %@'.fmt(g.get('value'), idx));
451
+
452
+ groupSet[groupIndex] = key ;
453
+ groupView.set('content', g) ;
454
+ groupView.layerId = key ; // cannot use .set, layerId is RO
455
+
456
+ // get the layout for the group's first itemView
457
+ groupLayout = this.itemViewLayoutAtContentIndex(g.get('itemRange').start) ;
458
+
459
+ // derive the correct groupView layout
460
+ groupLayout.height = this.heightForGroupAtIndex(groupIndex) ;
461
+ groupLayout.top -= groupLayout.height ;
462
+
463
+ // console.log(groupLayout) ;
464
+
465
+ groupView.adjust(groupLayout) ;
466
+ context = context.begin(groupView.get('tagName')) ;
467
+ groupView.prepareContext(context, YES) ;
468
+ context = context.end() ;
469
+ }
470
+
471
+ if (range2) {
472
+ idx = SC.maxRange(range2) ;
473
+ while (--idx >= range2.start) {
474
+ groupIndex = this.groupIndexForContentIndex(idx) ;
475
+ if (groupIndex == -1) continue ;
476
+
477
+ g = groups.objectAt(groupIndex) ;
478
+
479
+ // use cache of group view guids to avoid creating temporary objects
480
+ guid = SC.guidFor(g);
481
+ if (!(key = guids[guid])) key = guids[guid] = baseKey+guid;
482
+
483
+ // don't re-render already rendered group views
484
+ if (groupSet[groupIndex]) continue ;
485
+
486
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('rendering group(%@) at index %@'.fmt(g.get('value'), idx));
487
+
488
+ groupSet[groupIndex] = key ;
489
+ groupView.set('content', g) ;
490
+ groupView.layerId = key ; // cannot use .set, layerId is RO
491
+
492
+ // get the layout for the group's first itemView
493
+ groupLayout = this.itemViewLayoutAtContentIndex(g.get('itemRange').start) ;
494
+
495
+ // derive the correct groupView layout
496
+ groupLayout.height = this.heightForGroupAtIndex(groupIndex) ;
497
+ groupLayout.top -= groupLayout.height ;
498
+ groupView.adjust(groupLayout) ;
499
+ context = context.begin(groupView.get('tagName')) ;
500
+ groupView.prepareContext(context, YES) ;
501
+ context = context.end() ;
502
+ }
503
+ }
504
+
505
+ if (SC.DEBUG_PARTIAL_RENDER) console.log('******************************') ;
506
+
507
+ this.endPropertyChanges() ;
508
+ if (SC.BENCHMARK_RENDER) SC.Benchmark.end(bkey);
509
+ },
510
+
511
+ /** @private
512
+ Calculates the visible content range in the specified frame. If
513
+ uniform rows are set, this will use some simple math. Otherwise it will
514
+ compute all row offsets leading up to the frame.
515
+ */
516
+ contentRangeInFrame: function(frame) {
517
+ // console.log('contentRangeInFrame invoked on %@ with frame {%@, %@, %@, %@}'.fmt(this, frame.x, frame.y, frame.width, frame.height));
518
+ var min, max, ret, rowHeight ;
519
+ var minY = SC.minY(frame), maxY = SC.maxY(frame);
520
+ // use some simple math...
521
+ // if (this.get('hasUniformRowHeights') && this.get('hasUniformGroupHeights')) {
522
+ // rowHeight = this.get('rowHeight') || 20 ;
523
+ // min = Math.max(0,Math.floor(minY / rowHeight)-1) ;
524
+ // max = Math.ceil(maxY / rowHeight) ;
525
+ //
526
+ // // now take into acccount the groups...
527
+ //
528
+ // var content = this.get('content') ;
529
+ // min = Math.min(min, content.get('length')) ;
530
+ // max = Math.min(max, content.get('length')) ;
531
+ //
532
+ // // convert to range...
533
+ // ret = { start: min, length: max - min } ;
534
+ //
535
+ // // otherwise, get the cached row offsets...
536
+ // } else {
537
+ var content = this.get('content');
538
+ var len = (content ? content.get('length') : 0), offset = 0;
539
+
540
+ // console.log('contentRangeInFrame content length is %@'.fmt(len));
541
+
542
+ // console.log('minY = ' + minY) ;
543
+ // console.log('maxY = ' + maxY) ;
544
+
545
+ min = null;
546
+ max = 0;
547
+ do {
548
+ offset = this.offsetForRowAtContentIndex(max); // add offset.
549
+ // console.log('offset is now %@'.fmt(offset));
550
+ if ((min===null) && (offset >= minY)) min = max; // set min
551
+ max++ ;
552
+ } while (max<len && offset < maxY);
553
+
554
+ // console.log('min = ' + min) ;
555
+ // console.log('max = ' + max) ;
556
+
557
+ // convert to range...
558
+ ret = { start: Math.max(min-1, 0), length: Math.min(max - min + 2, len) } ;
559
+ // }
560
+ //
561
+ // var contentIdx = ret.start ;
562
+ // var group, groups = this.getPath('content.groups') || [] ;
563
+ // for (var idx=0, len=groups.length; idx<len: ++idx) {
564
+ // group = groups[idx] ;
565
+ // if (SC.valueInRange(contentIdx, group.get('itemRange'))) {
566
+ //
567
+ // }
568
+ // }
569
+
570
+ // console.log('contentRangeInFrame is {%@, %@}'.fmt(ret.start, ret.length));
571
+ return ret ;
572
+ },
573
+
574
+ // /**
575
+ // An array containing the contracted groups, if any, by ground index for the
576
+ // current content array.
577
+ //
578
+ // @readOnly
579
+ // @property
580
+ // @type SC.Array
581
+ // */
582
+ // contractedGroups: function(key, val) {
583
+ // if (val) {
584
+ // throw "The SC.SourceListView contractedGroups property is read-only." ;
585
+ // }
586
+ //
587
+ // var ary = this._contractedGroups ;
588
+ // if (!ary) ary = this._contractedGroups = [] ;
589
+ //
590
+ // // All groups default to "expanded", so an empty array reflects this.
591
+ // return ary ;
592
+ // }.property(),
593
+ //
594
+ // /** @private
595
+ // Called by groups when their expansion property changes.
596
+ // */
597
+ // groupDidChangeExpansion: function(group, isExpanded) {
598
+ // if (!group) return ;
599
+ //
600
+ // var groups = this.getPath('content.groups') || [] ;
601
+ // var groupIndex = groups.indexOf(group) ;
602
+ //
603
+ // if (groupIndex >= 0) {
604
+ // var ary = this._contractedGroups ;
605
+ // if (!ary) ary = this._contractedGroups = [] ;
606
+ //
607
+ // // only change our display if isExpanded changes
608
+ // if (isExpanded && ary[groupIndex]) {
609
+ // delete ary[groupIndex] ; // saves memory vs. storing NO
610
+ // this.displayDidChange() ;
611
+ // } else if (!ary[groupIndex]) {
612
+ // ary[groupIndex] = YES ;
613
+ // this.displayDidChange() ;
614
+ // }
615
+ // }
616
+ // },
617
+
618
+ /**
619
+ Expands the index into a range of content objects that have the same
620
+ group value.
621
+
622
+ This method searches backward and forward through your content array for
623
+ objects that have the same group value as the object at the index you
624
+ pass in. You can use this method when implementing layoutGroupView to
625
+ determine the range of the content that belongs to the group.
626
+
627
+ Since this method simply searches through the content array, it is really
628
+ only suitable for content arrays of a few hundred items or less. If you
629
+ expect to have a larger size of content array, then you may need to do
630
+ something custom in your data model to calculate this range in less time.
631
+
632
+ @param {Number} contentIndex index of a content object
633
+ @returns {Range} a range of objects
634
+ */
635
+ groupRangeForContentIndex: function(contentIndex) {
636
+ // var content = SC.makeArray(this.get('content')) ; // assume an array
637
+ // var len = content.get('length') ;
638
+ // var groupBy = this.get('groupBy') ;
639
+ // if (!groupBy) return { start: 0, length: len } ;
640
+ //
641
+ // var min = contentIndex, max = contentIndex ;
642
+ // var cur = content.objectAt(contentIndex) ;
643
+ // var groupValue = (cur) ? cur.get(groupBy) : null ;
644
+ // var curGroupValue ;
645
+ //
646
+ // // find first item at bottom that does not match. add one to get start
647
+ // while(--min >= 0) {
648
+ // cur = content.objectAt(min) ;
649
+ // curGroupValue = (cur) ? cur.get(groupBy) : null ;
650
+ // if (curGroupValue !== groupValue) break ;
651
+ // }
652
+ // min++ ;
653
+ //
654
+ // // find first item at top that does not match. keep value to calc range
655
+ // while(++max < len) {
656
+ // cur = content.objectAt(max) ;
657
+ // curGroupValue = (cur) ? cur.get(groupBy) : null ;
658
+ // if (curGroupValue !== groupValue) break ;
659
+ // }
660
+ //
661
+ // return { start: min, length: max-min } ;
662
+ },
663
+
664
+ /**
665
+ Determines the group value at the specified content index. Returns null
666
+ if grouping is disabled.
667
+
668
+ @param {Number} contentIndex
669
+ @returns {Number} group index.
670
+ */
671
+ groupIndexForContentIndex: function(contentIndex) {
672
+ var groupIndex = -1 ;
673
+ var groups = this.getPath('content.groups') || [] ;
674
+ var group, itemRange, len = groups.get('length') ;
675
+ for (var idx=0; idx<len; ++idx) {
676
+ group = groups.objectAt(idx) ;
677
+ if (SC.valueInRange(contentIndex, group.itemRange)) {
678
+ groupIndex = idx ;
679
+ break ;
680
+ }
681
+ }
682
+ return groupIndex ;
683
+ },
684
+
685
+ // emptyElement: '<div class="sc-source-list-view"></div>',
686
+ //
687
+ // /**
688
+ // name of property on the content object to use for the source list text.
689
+ // */
690
+ // contentValueKey: null,
691
+ //
692
+ // /**
693
+ // Set to YES if you want the content value to be editable.
694
+ // */
695
+ // contentValueIsEditable: NO,
696
+ //
697
+ // /**
698
+ // Allows reordering without modifiying the selection
699
+ // */
700
+ //
701
+ // selectOnMouseDown: NO,
702
+ //
703
+ // /**
704
+ // Set to YES if you want source list items to display an icon.
705
+ //
706
+ // If this property is set, list items will leave space for a display
707
+ // icon to the left of the text label. To actually display an icon in that
708
+ // space, you will also need to set the contenIconUrlProperty or the
709
+ // contentIconClassNameProperty or both.
710
+ // */
711
+ // hasContentIcon: NO,
712
+ //
713
+ // /**
714
+ // Set if YES if you want the source list to display a branch arrow.
715
+ //
716
+ // If this property is set, list items will leave space on the right edge
717
+ // to display a branch arrow, indicating the user can click on the item to
718
+ // reveal a menu or another level of content.
719
+ //
720
+ // To actually display a branch arrow, you must also set the
721
+ // contentIsBranchKey.
722
+ // */
723
+ // hasContentBranch: NO,
724
+ //
725
+ // /**
726
+ // Name of the content object property that contains the icon .
727
+ //
728
+ // This is the *name* of the property you want the list items to inspect
729
+ // on content objects to retrieve an icon image URL. For example, if you
730
+ // set this property to 'icon', then the icon displayed for each item will
731
+ // be the URL returned by content.get('icon').
732
+ //
733
+ // The value of this property must be either a URL or a CSS class name. If
734
+ // you use a CSS class name, then the image src will be set to a blank
735
+ // image and the class name will be applied automatically so you can use
736
+ // spriting. If a URL is returned it will be set as the src property on
737
+ // the image tag.
738
+ // */
739
+ // contentIconKey: null,
740
+ //
741
+ // /**
742
+ // Name of content object property that contains the unread count.
743
+ //
744
+ // The unread count is used to indicate to a user when an item in the
745
+ // source list contains items that need their attention. If the unread
746
+ // count on a content object is a non-zero number, it will be displayed on
747
+ // the right side of the list item.
748
+ //
749
+ // This is the *name* of the property you want the list item to inspect
750
+ // on content objects to receive the unread count for the item. For example,
751
+ // if you set this property to "unread", then the unread count will be
752
+ // the value returned by content.get('unread').
753
+ //
754
+ // If you do not want to use unread counts, leave this property to null.
755
+ // */
756
+ // contentUnreadCountKey: null,
757
+ //
758
+ // /**
759
+ // Name of the content object property that contains the branch state.
760
+ //
761
+ // If an item is a branch, then a branch arrow will be displayed at the
762
+ // right edge indicating that clicking on the item will reveal another
763
+ // level or content or possibly a popup menu.
764
+ //
765
+ // To display the branch, you must also set hasContentBranch to YES.
766
+ //
767
+ // This is the *name* of the property you want the list item to inspect
768
+ // on the content objects to retrieve the branch state. For example, if
769
+ // you set this property to "isBranch", then the branch state will be the
770
+ // value returned by content.get('isBranch').
771
+ // */
772
+ // contentIsBranchKey: null,
773
+ //
774
+ // /**
775
+ // Key that contains the group name.
776
+ //
777
+ // If set, the title shown in the group label will be the value returned
778
+ // by this property on the group object.
779
+ // */
780
+ // groupTitleKey: null,
781
+ //
782
+ // /**
783
+ // Key that contains group visibility.
784
+ //
785
+ // If set, the group label will display a disclosure triangle matching the
786
+ // value of this property.
787
+ // */
788
+ // groupVisibleKey: null,
789
+
790
+ /**
791
+ The common row height for list view items.
792
+
793
+ The value should be an integer expressed in pixels.
794
+ */
795
+ rowHeight: 32,
796
+
797
+ // /**
798
+ // Source list view items are usually list item views. You can override
799
+ // this if you wish.
800
+ // */
801
+ // exampleView: SC.ListItemView,
802
+ //
803
+ // /**
804
+ // The standard group view provided by source list view generally
805
+ // provides all the functionality you need.
806
+ // */
807
+ // exampleGroupView: SC.SourceListGroupView,
808
+ //
809
+ //
810
+ // // .......................................
811
+ // // LAYOUT METHODS
812
+ // //
813
+ //
814
+ // // whenever updateChildren is called with a deep method, flush the
815
+ // // cached group rows to make sure we get an accurate count.
816
+ // updateChildren: function(deep) {
817
+ // if (deep) this._groupRows = null ;
818
+ // return sc_super() ;
819
+ // },
820
+ //
821
+ // // determines if the group at the specified content index is visible or
822
+ // // not. This will look either at a property on the group or on the
823
+ // // SourceListGroupView.
824
+ // groupAtContentIndexIsVisible: function(contentIndex) {
825
+ //
826
+ // if (!this.get('groupBy')) return YES; // no grouping
827
+ //
828
+ // // get the group value and try to find a matching view, which may
829
+ // // or may not exist yet.
830
+ // var groupValue = this.groupValueAtContentIndex(contentIndex) ;
831
+ // var groupView = this.groupViewForGroupValue(groupValue) ;
832
+ //
833
+ // // if the groupView exists, use that. The visible state is stored here
834
+ // // in case the group does not actually support storing its own visibility.
835
+ // // ignore groupView if it does not support isGroupVisible
836
+ // var ret = YES ;
837
+ // if (groupView) ret = groupView.get('isGroupVisible') ;
838
+ //
839
+ // // otherwise try to get from the group itself.
840
+ // if (((ret === undefined) || (ret === null) || !groupView) && groupValue && groupValue.get) {
841
+ // var key = this.get('groupVisibleKey') ;
842
+ // if (key) ret = !!groupValue.get(key) ;
843
+ // }
844
+ //
845
+ // // if the above methods failed for some reason, just leave the group visible
846
+ // if ((ret === undefined) || (ret === null)) ret = YES ;
847
+ //
848
+ // return ret ;
849
+ // },
850
+ //
851
+ // // calculates the number of rows consumed by each group. stores a hash of
852
+ // // contentIndexes and rows.
853
+ // computedGroupRows: function() {
854
+ // if (this._groupRows) return this._groupRows;
855
+ //
856
+ // var loc = 0 ;
857
+ // var content = Array.from(this.get('content')) ;
858
+ // var max = content.get('length') ;
859
+ //
860
+ // var ret = {} ;
861
+ // while(loc < max) {
862
+ // var range = this.groupRangeForContentIndex(loc) ;
863
+ // var isVisible = this.groupAtContentIndexIsVisible(range.start) ;
864
+ // ret[range.start] = (isVisible) ? range.length : 0 ;
865
+ //
866
+ // // add a header row space if neede
867
+ // var groupValue = this.groupValueAtContentIndex(range.start) ;
868
+ // if (groupValue != null) ret[range.start]++ ;
869
+ //
870
+ // loc = (range.length <= 0) ? max : SC.maxRange(range) ;
871
+ // }
872
+ //
873
+ // return this._groupRows = ret ;
874
+ // },
875
+ //
876
+ // // Returns the number of rows in the specified range.
877
+ // countRowsInRange: function(range) {
878
+ // var groupRows = this.computedGroupRows() ;
879
+ // var max = SC.maxRange(range) ;
880
+ // var loc = SC.minRange(range) ;
881
+ // var ret = 0 ;
882
+ //
883
+ // while(loc < max) {
884
+ // var range = this.groupRangeForContentIndex(loc) ;
885
+ // loc = (range.length <= 0) ? max : SC.maxRange(range) ;
886
+ // ret += groupRows[range.start] || (range+1);
887
+ // }
888
+ // return ret ;
889
+ // },
890
+ //
891
+ // computeFrame: function() {
892
+ // var content = this.get('content') ;
893
+ // var rowHeight = this.get('rowHeight') || 20 ;
894
+ //
895
+ // // find number of groups.
896
+ // var rows = this.countRowsInRange({ start: 0, length: content.get('length') });
897
+ // if (rows <= 0) rows = 0 ;
898
+ //
899
+ // // get parent width
900
+ // var parent = this.get('parentNode') ;
901
+ // var f = (parent) ? parent.get('innerFrame') : { width: 100, height: 100 };
902
+ // f.x = f.y = 0;
903
+ // f.height = Math.max(f.height, rows * rowHeight) ;
904
+ // return f ;
905
+ // },
906
+ //
907
+ // // disable incremental rendering for now
908
+ // contentRangeInFrame: function(frame) {
909
+ // var content =this.get('content') ;
910
+ // var len = (content) ? content.get('length') : 0 ;
911
+ // var ret = { start: 0, length: len } ;
912
+ // return ret ;
913
+ // },
914
+ //
915
+ // /** @private */
916
+ // adjustItemViewLayoutAtContentIndex: function(itemView, contentIndex, firstLayout) {
917
+ // if (SC.BENCHMARK_SOURCE_LIST_VIEW) {
918
+ // SC.Benchmark.start('SC.SourceListView.adjustItemViewLayoutAtContentIndex') ;
919
+ // }
920
+ //
921
+ // // if itemView's group is not visible, then just set to invisible.
922
+ // if (!this.groupAtContentIndexIsVisible(contentIndex)) {
923
+ // itemView.set('isVisible', false) ;
924
+ // } else {
925
+ //
926
+ // // if item was not visible, make it visible. Also force layout.
927
+ // if (!itemView.get('isVisible')) {
928
+ // firstLayout = YES ;
929
+ // itemView.set('isVisible', true) ;
930
+ // }
931
+ //
932
+ // var rowHeight = this.get('rowHeight') || 0 ;
933
+ //
934
+ // // layout relative to top of group. Leave open row for title
935
+ // if(this.get("groupBy"))
936
+ // {
937
+ //
938
+ // var range = this.groupRangeForContentIndex(contentIndex) ;
939
+ // contentIndex = (contentIndex - range.start) ;
940
+ //
941
+ // var groupValue = this.groupValueAtContentIndex(range.start) ;
942
+ // if (groupValue != null) contentIndex++ ;
943
+ // }
944
+ //
945
+ // var f = {
946
+ // x: 0,
947
+ // y: contentIndex*rowHeight,
948
+ // height: rowHeight,
949
+ // width: this.get('innerFrame').width
950
+ // } ;
951
+ //
952
+ // if (firstLayout || !SC.rectsEqual(itemView.get('frame'), f)) {
953
+ // itemView.set('frame', f) ;
954
+ // }
955
+ //
956
+ // }
957
+ //
958
+ // if (SC.BENCHMARK_SOURCE_LIST_VIEW) {
959
+ // SC.Benchmark.end('SC.SourceListView.layoutItemViewsFor') ;
960
+ // }
961
+ // },
962
+ //
963
+ // layoutGroupView: function(groupView, groupValue, contentIndexHint, firstLayout) {
964
+ //
965
+ // if (SC.BENCHMARK_SOURCE_LIST_VIEW) {
966
+ // SC.Benchmark.start('SC.SourceListView.adjustItemViewLayoutAtContentIndex') ;
967
+ // }
968
+ //
969
+ // //console.log('layoutGroupView', groupValue) ;
970
+ //
971
+ // // find the range this group will belong to
972
+ // var range = this.groupRangeForContentIndex(contentIndexHint) ;
973
+ // var isVisible = this.groupAtContentIndexIsVisible(range.start) ;
974
+ //
975
+ // var priorRows = this.countRowsInRange({ start: 0, length: range.start }) ;
976
+ // var rowHeight = this.get('rowHeight') || 0 ;
977
+ // var parentView = groupView.get('parentView') || this ;
978
+ // var rows = (isVisible) ? range.length : 0 ;
979
+ // if (groupValue != null) rows++ ;
980
+ //
981
+ // var f = {
982
+ // x: 0,
983
+ // y: priorRows*rowHeight,
984
+ // height: rowHeight * rows,
985
+ // width: (parentView || this).get('innerFrame').width
986
+ // } ;
987
+ //
988
+ // if (firstLayout || !SC.rectsEqual(groupView.get('frame'), f)) {
989
+ // groupView.set('frame', f) ;
990
+ // }
991
+ //
992
+ // if (SC.BENCHMARK_SOURCE_LIST_VIEW) {
993
+ // SC.Benchmark.end('SC.SourceListView.layoutGroupView') ;
994
+ // }
995
+ // },
996
+ //
997
+ // // .......................................
998
+ // // INSERTION POINT METHODS
999
+ // //
1000
+ //
1001
+ // insertionOrientation: SC.VERTICAL_ORIENTATION,
1002
+ //
1003
+ // insertionPointClass: SC.View.extend({
1004
+ // emptyElement: '<div class="list-insertion-point"><span class="anchor"></span></div>'
1005
+ // }),
1006
+ //
1007
+ // showInsertionPoint: function(itemView, dropOperation) {
1008
+ // if (!itemView) return ;
1009
+ //
1010
+ // // if drop on, then just add a class...
1011
+ // if (dropOperation === SC.DROP_ON) {
1012
+ // if (itemView !== this._dropOnInsertionPoint) {
1013
+ // this.hideInsertionPoint() ;
1014
+ // itemView.addClassName('drop-target') ;
1015
+ // this._dropOnInsertionPoint = itemView ;
1016
+ // }
1017
+ //
1018
+ // } else {
1019
+ //
1020
+ // if (this._dropOnInsertionPoint) {
1021
+ // this._dropOnInsertionPoint.removeClassName('drop-target') ;
1022
+ // this._dropOnInsertionPoint = null ;
1023
+ // }
1024
+ //
1025
+ // if (!this._insertionPointView) {
1026
+ // this._insertionPointView = this.insertionPointClass.create() ;
1027
+ // }
1028
+ //
1029
+ // var insertionPoint = this._insertionPointView ;
1030
+ // var f = this.calculateInsertionPointFrame(itemView);
1031
+ // insertionPoint.set('frame', f) ;
1032
+ //
1033
+ // if (insertionPoint.parentNode != itemView.parentNode) {
1034
+ // itemView.parentNode.appendChild(insertionPoint) ;
1035
+ // }
1036
+ // }
1037
+ //
1038
+ // },
1039
+ //
1040
+ // /**
1041
+ // This is the default frame for the insertion point. Override this method
1042
+ // if your insertion point's styling needs to be customized, or if you need
1043
+ // more control of the insertion point's positioning (i.e., heirarchical
1044
+ // placement)
1045
+ // */
1046
+ // calculateInsertionPointFrame: function(itemView) {
1047
+ // return { height: 0, x: 8, y: itemView.get('frame').y, width: itemView.owner.get('frame').width };
1048
+ // },
1049
+ //
1050
+ // hideInsertionPoint: function() {
1051
+ // var insertionPoint = this._insertionPointView ;
1052
+ // if (insertionPoint) insertionPoint.removeFromParent() ;
1053
+ //
1054
+ // if (this._dropOnInsertionPoint) {
1055
+ // this._dropOnInsertionPoint.removeClassName('drop-target') ;
1056
+ // this._dropOnInsertionPoint = null ;
1057
+ // }
1058
+ // },
1059
+ //
1060
+ // // We can do this much faster programatically using the rowHeight
1061
+ // insertionIndexForLocation: function(loc, dropOperation) {
1062
+ // var f = this.get('innerFrame') ;
1063
+ // var sf = this.get('scrollFrame') ;
1064
+ // var rowHeight = this.get('rowHeight') || 0 ;
1065
+ // var headerRowCount = (this.get("groupBy")) ? 1 : 0;
1066
+ //
1067
+ // // find the offset to work with.
1068
+ // var offset = loc.y - f.y - sf.y ;
1069
+ //
1070
+ // var ret = -1; // the return value
1071
+ // var retOp = SC.DROP_BEFORE ;
1072
+ //
1073
+ // // search groups until we find one that matches
1074
+ // var top = 0 ;
1075
+ // var idx = 0 ;
1076
+ // while((ret<0) && (range = this.groupRangeForContentIndex(idx)).length>0){
1077
+ // var max = top + ((range.length+headerRowCount) * rowHeight) ;
1078
+ //
1079
+ // // the offset is within the group, find the row in the group. Remember
1080
+ // // that the top row is actually the label, so we should return -1 if
1081
+ // // we hit there.
1082
+ // if (max >= offset) {
1083
+ // offset -= top ;
1084
+ //
1085
+ // ret = Math.floor(offset / rowHeight) ;
1086
+ //
1087
+ // // find the percent through the row...
1088
+ // var percentage = (offset / rowHeight) - ret ;
1089
+ //
1090
+ // // if the dropOperation is SC.DROP_ON and we are in the center 60%
1091
+ // // then return the current item.
1092
+ // if (dropOperation === SC.DROP_ON) {
1093
+ // if (percentage > 0.80) ret++ ;
1094
+ // if ((percentage >= 0.20) && (percentage <= 0.80)) {
1095
+ // retOp = SC.DROP_ON;
1096
+ // }
1097
+ // } else {
1098
+ // if (percentage > 0.45) ret++ ;
1099
+ // }
1100
+ //
1101
+ // // handle dropping on top row...
1102
+ // if (ret < headerRowCount) return [-1, SC.DROP_BEFORE] ; // top row!
1103
+ //
1104
+ // // convert to index
1105
+ // ret = (ret - headerRowCount) + idx ;
1106
+ //
1107
+ // // we are not yet within the group, go on to the next group.
1108
+ // } else {
1109
+ // idx += range.length ;
1110
+ // top = max ;
1111
+ // }
1112
+ // }
1113
+ //
1114
+ // return [ret, retOp] ;
1115
+ // }
1116
+
1117
+ });