sproutcore 1.4.0-java

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 (1650) hide show
  1. data/DISTRIBUTION.yml +20 -0
  2. data/Gemfile +3 -0
  3. data/History.txt +54 -0
  4. data/README.txt +104 -0
  5. data/Rakefile +446 -0
  6. data/Todo.txt +1 -0
  7. data/VERSION.yml +7 -0
  8. data/bin/sc-build +18 -0
  9. data/bin/sc-build-number +18 -0
  10. data/bin/sc-docs +19 -0
  11. data/bin/sc-gen +18 -0
  12. data/bin/sc-init +18 -0
  13. data/bin/sc-manifest +18 -0
  14. data/bin/sc-server +18 -0
  15. data/bin/sproutcore +18 -0
  16. data/design/Technical Notes.graffle/QuickLook/Preview.pdf +0 -0
  17. data/design/Technical Notes.graffle/QuickLook/Thumbnail.tiff +0 -0
  18. data/design/Technical Notes.graffle/data.plist +5534 -0
  19. data/design/Technical Notes.graffle/image8.png +0 -0
  20. data/lib/Buildfile +140 -0
  21. data/lib/buildtasks/build.rake +103 -0
  22. data/lib/buildtasks/entry.rake +68 -0
  23. data/lib/buildtasks/manifest.rake +615 -0
  24. data/lib/buildtasks/render.rake +21 -0
  25. data/lib/buildtasks/target.rake +65 -0
  26. data/lib/doc_templates/jsdoc/allclasses.tmpl +17 -0
  27. data/lib/doc_templates/jsdoc/allfiles.tmpl +56 -0
  28. data/lib/doc_templates/jsdoc/class.tmpl +487 -0
  29. data/lib/doc_templates/jsdoc/index.tmpl +38 -0
  30. data/lib/doc_templates/jsdoc/publish.js +170 -0
  31. data/lib/doc_templates/jsdoc/static/default.css +162 -0
  32. data/lib/doc_templates/jsdoc/static/header.html +2 -0
  33. data/lib/doc_templates/jsdoc/static/index.html +19 -0
  34. data/lib/doc_templates/jsdoc/symbol.tmpl +35 -0
  35. data/lib/doc_templates/sproutcore/allclasses.tmpl +0 -0
  36. data/lib/doc_templates/sproutcore/allfiles.tmpl +56 -0
  37. data/lib/doc_templates/sproutcore/class.tmpl +674 -0
  38. data/lib/doc_templates/sproutcore/classes-json.tmpl +55 -0
  39. data/lib/doc_templates/sproutcore/index.tmpl +48 -0
  40. data/lib/doc_templates/sproutcore/publish.js +346 -0
  41. data/lib/doc_templates/sproutcore/static/default.css +258 -0
  42. data/lib/doc_templates/sproutcore/static/header.html +2 -0
  43. data/lib/doc_templates/sproutcore/static/index.html +19 -0
  44. data/lib/doc_templates/sproutcore/symbol.tmpl +35 -0
  45. data/lib/frameworks/sproutcore/Buildfile +101 -0
  46. data/lib/frameworks/sproutcore/CHANGELOG.md +170 -0
  47. data/lib/frameworks/sproutcore/HISTORY +697 -0
  48. data/lib/frameworks/sproutcore/README.md +68 -0
  49. data/lib/frameworks/sproutcore/apps/docs/core.js +27 -0
  50. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
  51. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
  52. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
  53. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
  54. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
  55. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
  56. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
  57. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
  58. data/lib/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
  59. data/lib/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
  60. data/lib/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
  61. data/lib/frameworks/sproutcore/apps/docs/english.lproj/strings.js +15 -0
  62. data/lib/frameworks/sproutcore/apps/docs/main.js +30 -0
  63. data/lib/frameworks/sproutcore/apps/greenhouse/README +25 -0
  64. data/lib/frameworks/sproutcore/apps/greenhouse/TODO +72 -0
  65. data/lib/frameworks/sproutcore/apps/greenhouse/beautify.js +1058 -0
  66. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/design.js +20 -0
  67. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/file.js +75 -0
  68. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/files.js +40 -0
  69. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/layout.js +53 -0
  70. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/library.js +201 -0
  71. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/page.js +18 -0
  72. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/property.js +19 -0
  73. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/property_editor.js +17 -0
  74. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/target.js +20 -0
  75. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/targets.js +43 -0
  76. data/lib/frameworks/sproutcore/apps/greenhouse/controllers/view_configs.js +100 -0
  77. data/lib/frameworks/sproutcore/apps/greenhouse/core.js +67 -0
  78. data/lib/frameworks/sproutcore/apps/greenhouse/core_file.js +124 -0
  79. data/lib/frameworks/sproutcore/apps/greenhouse/data_source.js +250 -0
  80. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/app_page.js +377 -0
  81. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/app-selector.css +111 -0
  82. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/button.css +310 -0
  83. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/dock.css +85 -0
  84. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/general.css +52 -0
  85. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/main-page.css +120 -0
  86. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/menu.css +52 -0
  87. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/modal.css +40 -0
  88. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/picker.css +188 -0
  89. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/search.css +60 -0
  90. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/tabbed.css +68 -0
  91. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/css/text-field.css +67 -0
  92. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/dialogs.js +302 -0
  93. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.eot +0 -0
  94. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.otf +0 -0
  95. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500.woff +0 -0
  96. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.eot +0 -0
  97. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.otf +0 -0
  98. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/fonts/museosans_500_italic.woff +0 -0
  99. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/app-selector/choose-app.png +0 -0
  100. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/app-selector/list-item-sel.png +0 -0
  101. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-l.png +0 -0
  102. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-m.png +0 -0
  103. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/active-r.png +0 -0
  104. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-l.png +0 -0
  105. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-m.png +0 -0
  106. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule-xl/regular-r.png +0 -0
  107. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/active-l.png +0 -0
  108. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/active-r.png +0 -0
  109. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/disabled-l.png +0 -0
  110. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/disabled-r.png +0 -0
  111. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/regular-l.png +0 -0
  112. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/regular-r.png +0 -0
  113. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-active-l.png +0 -0
  114. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-active-r.png +0 -0
  115. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-disabled-l.png +0 -0
  116. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-disabled-r.png +0 -0
  117. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-l.png +0 -0
  118. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/capsule/sel-r.png +0 -0
  119. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-l.png +0 -0
  120. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-m.png +0 -0
  121. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/active-r.png +0 -0
  122. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-active-l.png +0 -0
  123. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-active-r.png +0 -0
  124. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-l.png +0 -0
  125. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-r.png +0 -0
  126. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-active-l.png +0 -0
  127. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-active-r.png +0 -0
  128. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-l.png +0 -0
  129. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/cap-sel-r.png +0 -0
  130. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-l.png +0 -0
  131. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-m.png +0 -0
  132. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/disabled-r.png +0 -0
  133. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-l.png +0 -0
  134. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-m.png +0 -0
  135. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/regular-r.png +0 -0
  136. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-l.png +0 -0
  137. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-m.png +0 -0
  138. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-active-r.png +0 -0
  139. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-l.png +0 -0
  140. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-m.png +0 -0
  141. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-disabled-r.png +0 -0
  142. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-l.png +0 -0
  143. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-m.png +0 -0
  144. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/dark/sel-r.png +0 -0
  145. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/active-m.png +0 -0
  146. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/disabled-m.png +0 -0
  147. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/regular-m.png +0 -0
  148. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-active-m.png +0 -0
  149. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-disabled-m.png +0 -0
  150. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/shared/sel-m.png +0 -0
  151. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/active-l.png +0 -0
  152. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/active-r.png +0 -0
  153. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/disabled-l.png +0 -0
  154. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/disabled-r.png +0 -0
  155. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/regular-l.png +0 -0
  156. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/regular-r.png +0 -0
  157. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-active-l.png +0 -0
  158. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-active-r.png +0 -0
  159. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-disabled-l.png +0 -0
  160. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-disabled-r.png +0 -0
  161. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-l.png +0 -0
  162. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/buttons/square/sel-r.png +0 -0
  163. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/actions-active.png +0 -0
  164. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/actions.png +0 -0
  165. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/inspector-active.png +0 -0
  166. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/inspector.png +0 -0
  167. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/library-active.png +0 -0
  168. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/library.png +0 -0
  169. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/projects-active.png +0 -0
  170. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/projects.png +0 -0
  171. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/run-active.png +0 -0
  172. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/run.png +0 -0
  173. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/save-active.png +0 -0
  174. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/icons/save.png +0 -0
  175. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/logos/greenhouse-l.png +0 -0
  176. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/logos/greenhouse-s.png +0 -0
  177. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/logos/sproutcore.png +0 -0
  178. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/main-bg.png +0 -0
  179. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom-left.png +0 -0
  180. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom-right.png +0 -0
  181. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/bottom.png +0 -0
  182. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/close-active.png +0 -0
  183. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/close.png +0 -0
  184. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/left.png +0 -0
  185. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-bottom.png +0 -0
  186. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-left.png +0 -0
  187. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-right.png +0 -0
  188. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/pointer-top.png +0 -0
  189. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/right.png +0 -0
  190. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/search-active.png +0 -0
  191. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/search.png +0 -0
  192. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/top-left.png +0 -0
  193. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/top-right.png +0 -0
  194. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/picker/top.png +0 -0
  195. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/images/toolbar-bg.png +0 -0
  196. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/inspectors.js +365 -0
  197. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/loading.rhtml +9 -0
  198. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/main_page.js +95 -0
  199. data/lib/frameworks/sproutcore/apps/greenhouse/english.lproj/strings.js +87 -0
  200. data/lib/frameworks/sproutcore/apps/greenhouse/fixtures/file.js +35 -0
  201. data/lib/frameworks/sproutcore/apps/greenhouse/main.js +28 -0
  202. data/lib/frameworks/sproutcore/apps/greenhouse/mixins/drop_down.js +97 -0
  203. data/lib/frameworks/sproutcore/apps/greenhouse/models/design.js +22 -0
  204. data/lib/frameworks/sproutcore/apps/greenhouse/models/dir.js +92 -0
  205. data/lib/frameworks/sproutcore/apps/greenhouse/models/file.js +51 -0
  206. data/lib/frameworks/sproutcore/apps/greenhouse/models/target.js +82 -0
  207. data/lib/frameworks/sproutcore/apps/greenhouse/models/view_config.js +49 -0
  208. data/lib/frameworks/sproutcore/apps/greenhouse/resources/test_page.js +37 -0
  209. data/lib/frameworks/sproutcore/apps/greenhouse/states/inspector.js +144 -0
  210. data/lib/frameworks/sproutcore/apps/greenhouse/states/library.js +133 -0
  211. data/lib/frameworks/sproutcore/apps/greenhouse/states/main.js +224 -0
  212. data/lib/frameworks/sproutcore/apps/greenhouse/states/modals.js +291 -0
  213. data/lib/frameworks/sproutcore/apps/greenhouse/states/ready.js +197 -0
  214. data/lib/frameworks/sproutcore/apps/greenhouse/tests/controllers/design.js +15 -0
  215. data/lib/frameworks/sproutcore/apps/greenhouse/tests/controllers/designs.js +15 -0
  216. data/lib/frameworks/sproutcore/apps/greenhouse/tests/controllers/file.js +15 -0
  217. data/lib/frameworks/sproutcore/apps/greenhouse/tests/controllers/files.js +15 -0
  218. data/lib/frameworks/sproutcore/apps/greenhouse/tests/models/file.js +15 -0
  219. data/lib/frameworks/sproutcore/apps/greenhouse/tests/models/view_config.js +15 -0
  220. data/lib/frameworks/sproutcore/apps/greenhouse/tests/views/list_item.js +15 -0
  221. data/lib/frameworks/sproutcore/apps/greenhouse/views/anchor.js +277 -0
  222. data/lib/frameworks/sproutcore/apps/greenhouse/views/application_list_item.js +19 -0
  223. data/lib/frameworks/sproutcore/apps/greenhouse/views/event_blocker.js +32 -0
  224. data/lib/frameworks/sproutcore/apps/greenhouse/views/label_designer.js +16 -0
  225. data/lib/frameworks/sproutcore/apps/greenhouse/views/list_item.js +42 -0
  226. data/lib/frameworks/sproutcore/apps/greenhouse/views/plist_item.js +39 -0
  227. data/lib/frameworks/sproutcore/apps/greenhouse/views/simple_button.js +157 -0
  228. data/lib/frameworks/sproutcore/apps/greenhouse/views/tear_off_picker.js +56 -0
  229. data/lib/frameworks/sproutcore/apps/greenhouse/views/web.js +44 -0
  230. data/lib/frameworks/sproutcore/apps/tests/controllers/detail.js +25 -0
  231. data/lib/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
  232. data/lib/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
  233. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +86 -0
  234. data/lib/frameworks/sproutcore/apps/tests/controllers/tests.js +33 -0
  235. data/lib/frameworks/sproutcore/apps/tests/core.js +133 -0
  236. data/lib/frameworks/sproutcore/apps/tests/english.lproj/loading.rhtml +9 -0
  237. data/lib/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +48 -0
  238. data/lib/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +233 -0
  239. data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +26 -0
  240. data/lib/frameworks/sproutcore/apps/tests/main.js +27 -0
  241. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +26 -0
  242. data/lib/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
  243. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
  244. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
  245. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
  246. data/lib/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
  247. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
  248. data/lib/frameworks/sproutcore/apps/tests/states/start.js +39 -0
  249. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/detail.js +15 -0
  250. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
  251. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
  252. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +15 -0
  253. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/tests.js +15 -0
  254. data/lib/frameworks/sproutcore/apps/tests/tests/models/target.js +15 -0
  255. data/lib/frameworks/sproutcore/apps/tests/tests/models/test.js +15 -0
  256. data/lib/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
  257. data/lib/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
  258. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +49 -0
  259. data/lib/frameworks/sproutcore/apps/welcome/core.js +30 -0
  260. data/lib/frameworks/sproutcore/apps/welcome/english.lproj/loading.rhtml +10 -0
  261. data/lib/frameworks/sproutcore/apps/welcome/english.lproj/main_page.css +7 -0
  262. data/lib/frameworks/sproutcore/apps/welcome/english.lproj/main_page.js +77 -0
  263. data/lib/frameworks/sproutcore/apps/welcome/english.lproj/strings.js +15 -0
  264. data/lib/frameworks/sproutcore/apps/welcome/main.js +19 -0
  265. data/lib/frameworks/sproutcore/apps/welcome/tests/controllers/targets.js +15 -0
  266. data/lib/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
  267. data/lib/frameworks/sproutcore/design/Design Charts.graffle +16845 -0
  268. data/lib/frameworks/sproutcore/design/Record State Table.numbers +0 -0
  269. data/lib/frameworks/sproutcore/design/SproutCore Datastore Design.graffle/QuickLook/Preview.pdf +0 -0
  270. data/lib/frameworks/sproutcore/design/SproutCore Datastore Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  271. data/lib/frameworks/sproutcore/design/SproutCore Datastore Design.graffle/data.plist +19588 -0
  272. data/lib/frameworks/sproutcore/design/SproutCore Datastore Design.graffle/image8.png +0 -0
  273. data/lib/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
  274. data/lib/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
  275. data/lib/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
  276. data/lib/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
  277. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
  278. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
  279. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
  280. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
  281. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
  282. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
  283. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
  284. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
  285. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
  286. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
  287. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
  288. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
  289. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
  290. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
  291. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
  292. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
  293. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
  294. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
  295. data/lib/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
  296. data/lib/frameworks/sproutcore/design/greenhouse-statechart.graffle +9025 -0
  297. data/lib/frameworks/sproutcore/design/greenhouse-statechart.pdf +0 -0
  298. data/lib/frameworks/sproutcore/design/iphone-webapp-loading.psd +0 -0
  299. data/lib/frameworks/sproutcore/frameworks/animation/Buildfile +3 -0
  300. data/lib/frameworks/sproutcore/frameworks/animation/LICENSE +25 -0
  301. data/lib/frameworks/sproutcore/frameworks/animation/README.md +79 -0
  302. data/lib/frameworks/sproutcore/frameworks/animation/core.js +1192 -0
  303. data/lib/frameworks/sproutcore/frameworks/animation/tests/core.js +147 -0
  304. data/lib/frameworks/sproutcore/frameworks/bootstrap/README +9 -0
  305. data/lib/frameworks/sproutcore/frameworks/bootstrap/core.js +7 -0
  306. data/lib/frameworks/sproutcore/frameworks/bootstrap/setup_body_class_names.js +10 -0
  307. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +29 -0
  308. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +49 -0
  309. data/lib/frameworks/sproutcore/frameworks/core_tools/core.js +20 -0
  310. data/lib/frameworks/sproutcore/frameworks/core_tools/data_source.js +99 -0
  311. data/lib/frameworks/sproutcore/frameworks/core_tools/english.lproj/strings.js +15 -0
  312. data/lib/frameworks/sproutcore/frameworks/core_tools/fixtures/target.js +87 -0
  313. data/lib/frameworks/sproutcore/frameworks/core_tools/fixtures/test.js +44 -0
  314. data/lib/frameworks/sproutcore/frameworks/core_tools/models/target.js +108 -0
  315. data/lib/frameworks/sproutcore/frameworks/core_tools/models/test.js +48 -0
  316. data/lib/frameworks/sproutcore/frameworks/datastore/core.js +8 -0
  317. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +180 -0
  318. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +340 -0
  319. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +393 -0
  320. data/lib/frameworks/sproutcore/frameworks/datastore/debug/json.js +71 -0
  321. data/lib/frameworks/sproutcore/frameworks/datastore/debug/standard_setup.js +96 -0
  322. data/lib/frameworks/sproutcore/frameworks/datastore/fixtures/author_fixtures.js +2503 -0
  323. data/lib/frameworks/sproutcore/frameworks/datastore/fixtures/sample.js +17 -0
  324. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +122 -0
  325. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_record.js +105 -0
  326. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +81 -0
  327. data/lib/frameworks/sproutcore/frameworks/datastore/models/fetched_attribute.js +100 -0
  328. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +153 -0
  329. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +1201 -0
  330. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +494 -0
  331. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +159 -0
  332. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +242 -0
  333. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +415 -0
  334. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +588 -0
  335. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1600 -0
  336. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +651 -0
  337. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +2666 -0
  338. data/lib/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +117 -0
  339. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/contact_model.js +131 -0
  340. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/cyclical_relationship.js +119 -0
  341. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/mail_model.js +91 -0
  342. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/test_runner_model.js +56 -0
  343. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +73 -0
  344. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +423 -0
  345. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +235 -0
  346. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +337 -0
  347. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +421 -0
  348. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +304 -0
  349. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/parentless.js +134 -0
  350. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +55 -0
  351. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +92 -0
  352. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +56 -0
  353. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +273 -0
  354. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/readAttribute.js +53 -0
  355. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +48 -0
  356. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +170 -0
  357. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/unknownProperty.js +66 -0
  358. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +112 -0
  359. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +252 -0
  360. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +284 -0
  361. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +204 -0
  362. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +180 -0
  363. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +171 -0
  364. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +154 -0
  365. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/core_methods.js +70 -0
  366. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +113 -0
  367. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +99 -0
  368. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +180 -0
  369. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +126 -0
  370. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +163 -0
  371. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +166 -0
  372. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +219 -0
  373. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +144 -0
  374. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/contains.js +131 -0
  375. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/containsRecordTypes.js +81 -0
  376. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/copy.js +30 -0
  377. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +197 -0
  378. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +92 -0
  379. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/expandedRecordTypes.js +64 -0
  380. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +216 -0
  381. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/queryWithScope.js +57 -0
  382. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
  383. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +66 -0
  384. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
  385. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +177 -0
  386. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +50 -0
  387. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +177 -0
  388. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +54 -0
  389. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +133 -0
  390. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +211 -0
  391. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +156 -0
  392. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +72 -0
  393. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataHashDidChange.js +157 -0
  394. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +278 -0
  395. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +106 -0
  396. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/error_methods.js +62 -0
  397. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +530 -0
  398. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/init.js +23 -0
  399. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +61 -0
  400. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +74 -0
  401. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readEditableDataHash.js +74 -0
  402. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +73 -0
  403. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/removeDataHash.js +144 -0
  404. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +184 -0
  405. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +125 -0
  406. data/lib/frameworks/sproutcore/frameworks/datejs/core.js +865 -0
  407. data/lib/frameworks/sproutcore/frameworks/datejs/english.lproj/en-US.js +186 -0
  408. data/lib/frameworks/sproutcore/frameworks/datejs/extras.js +332 -0
  409. data/lib/frameworks/sproutcore/frameworks/datejs/license.js +25 -0
  410. data/lib/frameworks/sproutcore/frameworks/datejs/parser.js +1116 -0
  411. data/lib/frameworks/sproutcore/frameworks/datejs/spanish.lproj/es-CO.js +186 -0
  412. data/lib/frameworks/sproutcore/frameworks/datejs/sugarpak.js +475 -0
  413. data/lib/frameworks/sproutcore/frameworks/datejs/time.js +269 -0
  414. data/lib/frameworks/sproutcore/frameworks/datejs/validators/datejs.js +34 -0
  415. data/lib/frameworks/sproutcore/frameworks/debug/core.js +114 -0
  416. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +265 -0
  417. data/lib/frameworks/sproutcore/frameworks/designer/coders/design.js +20 -0
  418. data/lib/frameworks/sproutcore/frameworks/designer/coders/localization.js +19 -0
  419. data/lib/frameworks/sproutcore/frameworks/designer/coders/object.js +347 -0
  420. data/lib/frameworks/sproutcore/frameworks/designer/controllers/controllers.js +16 -0
  421. data/lib/frameworks/sproutcore/frameworks/designer/controllers/design.js +37 -0
  422. data/lib/frameworks/sproutcore/frameworks/designer/controllers/designs.js +134 -0
  423. data/lib/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +170 -0
  424. data/lib/frameworks/sproutcore/frameworks/designer/controllers/page_files.js +22 -0
  425. data/lib/frameworks/sproutcore/frameworks/designer/core.js +26 -0
  426. data/lib/frameworks/sproutcore/frameworks/designer/css/css_rule.js +22 -0
  427. data/lib/frameworks/sproutcore/frameworks/designer/css/css_style.js +29 -0
  428. data/lib/frameworks/sproutcore/frameworks/designer/css/css_style_sheet.js +201 -0
  429. data/lib/frameworks/sproutcore/frameworks/designer/designers/button.js +21 -0
  430. data/lib/frameworks/sproutcore/frameworks/designer/designers/label.js +16 -0
  431. data/lib/frameworks/sproutcore/frameworks/designer/designers/object_designer.js +296 -0
  432. data/lib/frameworks/sproutcore/frameworks/designer/designers/tab.js +18 -0
  433. data/lib/frameworks/sproutcore/frameworks/designer/designers/text_field.js +15 -0
  434. data/lib/frameworks/sproutcore/frameworks/designer/designers/view_designer.js +1259 -0
  435. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/css/designer.css +96 -0
  436. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/design_page.js +55 -0
  437. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/high_light.css +10 -0
  438. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/controller.png +0 -0
  439. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/dock-bg.png +0 -0
  440. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/dock-item-bg.png +0 -0
  441. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/dock-item-divider.png +0 -0
  442. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/dock-item-sel-bg.png +0 -0
  443. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/dock-item-sel-divider.png +0 -0
  444. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/main-bg.png +0 -0
  445. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/page.png +0 -0
  446. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/pane.png +0 -0
  447. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/images/view.png +0 -0
  448. data/lib/frameworks/sproutcore/frameworks/designer/english.lproj/selection_handles.css +58 -0
  449. data/lib/frameworks/sproutcore/frameworks/designer/ext/object.js +26 -0
  450. data/lib/frameworks/sproutcore/frameworks/designer/ext/page.js +86 -0
  451. data/lib/frameworks/sproutcore/frameworks/designer/ext/view.js +54 -0
  452. data/lib/frameworks/sproutcore/frameworks/designer/mixins/button.js +11 -0
  453. data/lib/frameworks/sproutcore/frameworks/designer/mixins/snap_lines.js +221 -0
  454. data/lib/frameworks/sproutcore/frameworks/designer/views/designer_drop_target.js +138 -0
  455. data/lib/frameworks/sproutcore/frameworks/designer/views/drawing.js +219 -0
  456. data/lib/frameworks/sproutcore/frameworks/designer/views/high_light.js +66 -0
  457. data/lib/frameworks/sproutcore/frameworks/designer/views/page_item_view.js +130 -0
  458. data/lib/frameworks/sproutcore/frameworks/designer/views/selection_handles.js +78 -0
  459. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +18 -0
  460. data/lib/frameworks/sproutcore/frameworks/desktop/debug/drag.js +41 -0
  461. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +56 -0
  462. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/a_sample_image.jpg +0 -0
  463. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/apple-logo1.jpeg +0 -0
  464. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/iframe.html +23 -0
  465. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/disclosure.css +74 -0
  466. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +7 -0
  467. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/icons.css +943 -0
  468. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/cap.png +0 -0
  469. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/downbutton.png +0 -0
  470. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/shared.png +0 -0
  471. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/thumb-bottom.png +0 -0
  472. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/thumb-center.png +0 -0
  473. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/thumb-top.png +0 -0
  474. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/track.png +0 -0
  475. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/images/upbutton.png +0 -0
  476. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +161 -0
  477. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +12 -0
  478. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +109 -0
  479. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +9 -0
  480. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +91 -0
  481. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/picker.css +35 -0
  482. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/progress.css +33 -0
  483. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/radio.css +10 -0
  484. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/segmented.css +134 -0
  485. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/separator.css +19 -0
  486. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +66 -0
  487. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/split.css +0 -0
  488. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +6 -0
  489. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/strings.js +14 -0
  490. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +7 -0
  491. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/toolbar.css +5 -0
  492. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/touch-scroller.css +196 -0
  493. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/video.css +3 -0
  494. data/lib/frameworks/sproutcore/frameworks/desktop/english.lproj/well.css +71 -0
  495. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +138 -0
  496. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +694 -0
  497. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_group.js +22 -0
  498. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
  499. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +295 -0
  500. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +253 -0
  501. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +410 -0
  502. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +1115 -0
  503. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +71 -0
  504. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +74 -0
  505. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +180 -0
  506. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +696 -0
  507. data/lib/frameworks/sproutcore/frameworks/desktop/panes/select_button.js +849 -0
  508. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +214 -0
  509. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +39 -0
  510. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +81 -0
  511. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +175 -0
  512. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +299 -0
  513. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +923 -0
  514. data/lib/frameworks/sproutcore/frameworks/desktop/system/key_bindings.js +40 -0
  515. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +187 -0
  516. data/lib/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +43 -0
  517. data/lib/frameworks/sproutcore/frameworks/desktop/tests/mixins/border.js +96 -0
  518. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/methods.js +10 -0
  519. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +152 -0
  520. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +135 -0
  521. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +223 -0
  522. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/methods.js +10 -0
  523. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +35 -0
  524. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/pane_page.js +41 -0
  525. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +10 -0
  526. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +40 -0
  527. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +10 -0
  528. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +86 -0
  529. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/select_button/methods.js +194 -0
  530. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/select_button/ui.js +212 -0
  531. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/methods.js +10 -0
  532. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +44 -0
  533. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +124 -0
  534. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +163 -0
  535. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +142 -0
  536. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +95 -0
  537. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
  538. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
  539. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +215 -0
  540. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/displayProperties.js +31 -0
  541. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +300 -0
  542. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
  543. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
  544. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +240 -0
  545. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
  546. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
  547. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
  548. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +205 -0
  549. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +211 -0
  550. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
  551. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
  552. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +76 -0
  553. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +456 -0
  554. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/methods.js +10 -0
  555. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +64 -0
  556. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +10 -0
  557. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/ui.js +10 -0
  558. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/render.js +92 -0
  559. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
  560. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
  561. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +131 -0
  562. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_alternatingrows.js +130 -0
  563. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
  564. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +205 -0
  565. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
  566. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +288 -0
  567. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/methods.js +10 -0
  568. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +46 -0
  569. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/methods.js +128 -0
  570. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +287 -0
  571. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +119 -0
  572. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +232 -0
  573. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +143 -0
  574. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +150 -0
  575. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +90 -0
  576. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +119 -0
  577. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +226 -0
  578. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +144 -0
  579. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +216 -0
  580. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +132 -0
  581. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +110 -0
  582. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/separator.js +37 -0
  583. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/methods.js +10 -0
  584. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/ui.js +10 -0
  585. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +60 -0
  586. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/ui.js +52 -0
  587. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
  588. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/static_content.js +46 -0
  589. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +54 -0
  590. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/ui.js +88 -0
  591. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/web/methods.js +10 -0
  592. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +110 -0
  593. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/well/ui.js +54 -0
  594. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +619 -0
  595. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +112 -0
  596. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +3073 -0
  597. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +319 -0
  598. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +77 -0
  599. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +207 -0
  600. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +631 -0
  601. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +836 -0
  602. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +681 -0
  603. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +588 -0
  604. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +298 -0
  605. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +250 -0
  606. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +376 -0
  607. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +204 -0
  608. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +1790 -0
  609. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +884 -0
  610. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +678 -0
  611. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +673 -0
  612. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +324 -0
  613. data/lib/frameworks/sproutcore/frameworks/desktop/views/separator.js +36 -0
  614. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +286 -0
  615. data/lib/frameworks/sproutcore/frameworks/desktop/views/source_list.js +47 -0
  616. data/lib/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +169 -0
  617. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +781 -0
  618. data/lib/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +57 -0
  619. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +110 -0
  620. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +134 -0
  621. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +184 -0
  622. data/lib/frameworks/sproutcore/frameworks/desktop/views/thumb.js +53 -0
  623. data/lib/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +49 -0
  624. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +87 -0
  625. data/lib/frameworks/sproutcore/frameworks/desktop/views/well.js +85 -0
  626. data/lib/frameworks/sproutcore/frameworks/foundation/TESTING +46 -0
  627. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/array.js +518 -0
  628. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +44 -0
  629. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/object.js +342 -0
  630. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +124 -0
  631. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +150 -0
  632. data/lib/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +193 -0
  633. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/blank.gif +0 -0
  634. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +79 -0
  635. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/button_view.css +40 -0
  636. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +474 -0
  637. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +9 -0
  638. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-logo.png +0 -0
  639. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-landscape.jpg +0 -0
  640. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-landscape.png +0 -0
  641. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-portrait.jpg +0 -0
  642. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup-portrait.png +0 -0
  643. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-startup.png +0 -0
  644. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/inline_editor.css +12 -0
  645. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +42 -0
  646. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/static_layout.css +5 -0
  647. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
  648. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/text_field.css +148 -0
  649. data/lib/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +57 -0
  650. data/lib/frameworks/sproutcore/frameworks/foundation/ext/object.js +83 -0
  651. data/lib/frameworks/sproutcore/frameworks/foundation/ext/run_loop.js +162 -0
  652. data/lib/frameworks/sproutcore/frameworks/foundation/fixtures/file_exists.json +1 -0
  653. data/lib/frameworks/sproutcore/frameworks/foundation/fixtures/malformed.json +11 -0
  654. data/lib/frameworks/sproutcore/frameworks/foundation/license.js +30 -0
  655. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +360 -0
  656. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +179 -0
  657. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +96 -0
  658. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/control.js +377 -0
  659. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +152 -0
  660. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +580 -0
  661. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/responder_context.js +269 -0
  662. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +250 -0
  663. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +77 -0
  664. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/string.js +543 -0
  665. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +160 -0
  666. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +189 -0
  667. data/lib/frameworks/sproutcore/frameworks/foundation/panes/main.js +51 -0
  668. data/lib/frameworks/sproutcore/frameworks/foundation/panes/pane.js +848 -0
  669. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +907 -0
  670. data/lib/frameworks/sproutcore/frameworks/foundation/protocols/inline_editor_delegate.js +84 -0
  671. data/lib/frameworks/sproutcore/frameworks/foundation/system/application.js +37 -0
  672. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +514 -0
  673. data/lib/frameworks/sproutcore/frameworks/foundation/system/browser.js +59 -0
  674. data/lib/frameworks/sproutcore/frameworks/foundation/system/builder.js +210 -0
  675. data/lib/frameworks/sproutcore/frameworks/foundation/system/bundle.js +337 -0
  676. data/lib/frameworks/sproutcore/frameworks/foundation/system/core_query.js +2049 -0
  677. data/lib/frameworks/sproutcore/frameworks/foundation/system/cursor.js +131 -0
  678. data/lib/frameworks/sproutcore/frameworks/foundation/system/datetime.js +1129 -0
  679. data/lib/frameworks/sproutcore/frameworks/foundation/system/device.js +143 -0
  680. data/lib/frameworks/sproutcore/frameworks/foundation/system/event.js +894 -0
  681. data/lib/frameworks/sproutcore/frameworks/foundation/system/exception_handler.js +85 -0
  682. data/lib/frameworks/sproutcore/frameworks/foundation/system/image_cache.js +432 -0
  683. data/lib/frameworks/sproutcore/frameworks/foundation/system/json.js +515 -0
  684. data/lib/frameworks/sproutcore/frameworks/foundation/system/locale.js +293 -0
  685. data/lib/frameworks/sproutcore/frameworks/foundation/system/math.js +57 -0
  686. data/lib/frameworks/sproutcore/frameworks/foundation/system/page.js +108 -0
  687. data/lib/frameworks/sproutcore/frameworks/foundation/system/platform.js +297 -0
  688. data/lib/frameworks/sproutcore/frameworks/foundation/system/ready.js +197 -0
  689. data/lib/frameworks/sproutcore/frameworks/foundation/system/render_context.js +988 -0
  690. data/lib/frameworks/sproutcore/frameworks/foundation/system/request.js +599 -0
  691. data/lib/frameworks/sproutcore/frameworks/foundation/system/responder.js +124 -0
  692. data/lib/frameworks/sproutcore/frameworks/foundation/system/response.js +538 -0
  693. data/lib/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +2060 -0
  694. data/lib/frameworks/sproutcore/frameworks/foundation/system/routes.js +420 -0
  695. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +150 -0
  696. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +103 -0
  697. data/lib/frameworks/sproutcore/frameworks/foundation/system/time.js +473 -0
  698. data/lib/frameworks/sproutcore/frameworks/foundation/system/timer.js +551 -0
  699. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +397 -0
  700. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils.js +710 -0
  701. data/lib/frameworks/sproutcore/frameworks/foundation/tasks/preload_bundle.js +41 -0
  702. data/lib/frameworks/sproutcore/frameworks/foundation/tasks/task.js +17 -0
  703. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +218 -0
  704. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +206 -0
  705. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
  706. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/selection_support.js +318 -0
  707. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
  708. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
  709. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
  710. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
  711. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +265 -0
  712. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
  713. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/selection_support.js +340 -0
  714. data/lib/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/methods.js +10 -0
  715. data/lib/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/ui.js +113 -0
  716. data/lib/frameworks/sproutcore/frameworks/foundation/tests/integration/creating_views.js +113 -0
  717. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/content.js +195 -0
  718. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/displayProperties.js +89 -0
  719. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +57 -0
  720. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/ui.js +68 -0
  721. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/content.js +168 -0
  722. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/displayProperties.js +89 -0
  723. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/api.js +52 -0
  724. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +227 -0
  725. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/responder_context.js +75 -0
  726. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +142 -0
  727. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +83 -0
  728. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/validatable/ui.js +74 -0
  729. data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
  730. data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
  731. data/lib/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
  732. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/builder.js +42 -0
  733. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +1334 -0
  734. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_dimensions.js +387 -0
  735. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +405 -0
  736. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/setClass.js +49 -0
  737. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/within.js +66 -0
  738. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +348 -0
  739. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/json.js +14 -0
  740. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/locale.js +134 -0
  741. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/math.js +39 -0
  742. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/begin.js +47 -0
  743. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/element.js +44 -0
  744. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/end.js +124 -0
  745. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +51 -0
  746. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +50 -0
  747. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +28 -0
  748. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +179 -0
  749. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +101 -0
  750. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/init.js +55 -0
  751. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/join.js +28 -0
  752. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/push_text.js +74 -0
  753. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/tag.js +46 -0
  754. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/update.js +218 -0
  755. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +223 -0
  756. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeKeyPane.js +124 -0
  757. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeMainPane.js +68 -0
  758. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeMenuPane.js +48 -0
  759. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +101 -0
  760. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/targetForAction.js +238 -0
  761. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/routes.js +352 -0
  762. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/task_queue.js +43 -0
  763. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invalidate.js +38 -0
  764. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invokeLater.js +201 -0
  765. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/timer/isPaused.js +71 -0
  766. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/timer/performAction.js +69 -0
  767. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +170 -0
  768. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +24 -0
  769. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/normalizeURL.js +18 -0
  770. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/range.js +62 -0
  771. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/rect.js +99 -0
  772. data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/credit_card.js +35 -0
  773. data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +26 -0
  774. data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/number.js +47 -0
  775. data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/password.js +13 -0
  776. data/lib/frameworks/sproutcore/frameworks/foundation/tests/validators/validator.js +20 -0
  777. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +10 -0
  778. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +115 -0
  779. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +59 -0
  780. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
  781. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/main_pane.js +31 -0
  782. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +124 -0
  783. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/pane/firstResponder.js +148 -0
  784. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/pane/keyPane.js +133 -0
  785. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/pane/layout.js +31 -0
  786. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/pane/sendEvent.js +206 -0
  787. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +87 -0
  788. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +530 -0
  789. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +133 -0
  790. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +246 -0
  791. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertLayouts.js +145 -0
  792. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +122 -0
  793. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/createLayer.js +97 -0
  794. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/destroyLayer.js +83 -0
  795. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/didAppendToDocument.js +48 -0
  796. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +50 -0
  797. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/init.js +50 -0
  798. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/insertBefore.js +200 -0
  799. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
  800. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +116 -0
  801. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/layer.js +150 -0
  802. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutChildViews.js +162 -0
  803. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutDidChange.js +127 -0
  804. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +531 -0
  805. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/nextValidKeyView.js +110 -0
  806. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/parentViewDidChange.js +67 -0
  807. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +180 -0
  808. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/removeChild.js +189 -0
  809. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/render.js +83 -0
  810. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/replaceChild.js +29 -0
  811. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +146 -0
  812. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayerLocation.js +194 -0
  813. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/view/viewDidResize.js +202 -0
  814. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +125 -0
  815. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +52 -0
  816. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +48 -0
  817. data/lib/frameworks/sproutcore/frameworks/foundation/validators/email.js +45 -0
  818. data/lib/frameworks/sproutcore/frameworks/foundation/validators/not_empty.js +33 -0
  819. data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +98 -0
  820. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +86 -0
  821. data/lib/frameworks/sproutcore/frameworks/foundation/validators/positive_integer.js +84 -0
  822. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +326 -0
  823. data/lib/frameworks/sproutcore/frameworks/foundation/views/container.js +139 -0
  824. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +320 -0
  825. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +180 -0
  826. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +339 -0
  827. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +946 -0
  828. data/lib/frameworks/sproutcore/frameworks/foundation/views/view.js +3313 -0
  829. data/lib/frameworks/sproutcore/frameworks/media/resources/controls.png +0 -0
  830. data/lib/frameworks/sproutcore/frameworks/media/resources/playeras3.fla +0 -0
  831. data/lib/frameworks/sproutcore/frameworks/media/resources/video.css +120 -0
  832. data/lib/frameworks/sproutcore/frameworks/media/resources/videoCanvas.swf +0 -0
  833. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +739 -0
  834. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +90 -0
  835. data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +243 -0
  836. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +63 -0
  837. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +55 -0
  838. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +832 -0
  839. data/lib/frameworks/sproutcore/frameworks/mini/license.js +28 -0
  840. data/lib/frameworks/sproutcore/frameworks/runtime/README +12 -0
  841. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +1061 -0
  842. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
  843. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
  844. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
  845. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
  846. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
  847. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
  848. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
  849. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
  850. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
  851. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
  852. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
  853. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
  854. data/lib/frameworks/sproutcore/frameworks/runtime/license.js +28 -0
  855. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +643 -0
  856. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/comparable.js +45 -0
  857. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
  858. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +110 -0
  859. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1298 -0
  860. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +110 -0
  861. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +1347 -0
  862. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +141 -0
  863. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +173 -0
  864. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +180 -0
  865. data/lib/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
  866. data/lib/frameworks/sproutcore/frameworks/runtime/protocols/sparse_array_delegate.js +131 -0
  867. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +1000 -0
  868. data/lib/frameworks/sproutcore/frameworks/runtime/system/cookie.js +160 -0
  869. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +107 -0
  870. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +157 -0
  871. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1199 -0
  872. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +452 -0
  873. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +888 -0
  874. data/lib/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +271 -0
  875. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +295 -0
  876. data/lib/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +697 -0
  877. data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +532 -0
  878. data/lib/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +379 -0
  879. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/IsEqual.js +60 -0
  880. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/beget.js +23 -0
  881. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +84 -0
  882. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
  883. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
  884. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/guidFor.js +182 -0
  885. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/inspect.js +27 -0
  886. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/isArray.js +25 -0
  887. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/itemType.js +39 -0
  888. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +20 -0
  889. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +30 -0
  890. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +19 -0
  891. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/tupleForPropertyPath.js +37 -0
  892. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
  893. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/comparable.js +44 -0
  894. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +622 -0
  895. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +667 -0
  896. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +155 -0
  897. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/registerDependentKeys.js +79 -0
  898. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/propertyChanges.js +81 -0
  899. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
  900. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +395 -0
  901. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/cookie.js +163 -0
  902. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/error.js +53 -0
  903. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +212 -0
  904. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/addEach.js +49 -0
  905. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
  906. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
  907. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
  908. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
  909. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
  910. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
  911. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
  912. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +50 -0
  913. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
  914. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
  915. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/removeEach.js +49 -0
  916. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
  917. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +177 -0
  918. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +195 -0
  919. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/bindings.js +360 -0
  920. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
  921. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
  922. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
  923. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
  924. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
  925. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +120 -0
  926. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
  927. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
  928. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +98 -0
  929. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
  930. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +111 -0
  931. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +292 -0
  932. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +194 -0
  933. data/lib/frameworks/sproutcore/frameworks/statechart/core.js +11 -0
  934. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart.js +336 -0
  935. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +176 -0
  936. data/lib/frameworks/sproutcore/frameworks/statechart/tests/basic.js +90 -0
  937. data/lib/frameworks/sproutcore/frameworks/statechart/tests/history.js +71 -0
  938. data/lib/frameworks/sproutcore/frameworks/statechart/tests/nested.js +59 -0
  939. data/lib/frameworks/sproutcore/frameworks/statechart/tests/transient.js +148 -0
  940. data/lib/frameworks/sproutcore/frameworks/table/mixins/table_delegate.js +41 -0
  941. data/lib/frameworks/sproutcore/frameworks/table/system/table_column.js +125 -0
  942. data/lib/frameworks/sproutcore/frameworks/table/views/table.js +439 -0
  943. data/lib/frameworks/sproutcore/frameworks/table/views/table_cell.js +62 -0
  944. data/lib/frameworks/sproutcore/frameworks/table/views/table_head.js +158 -0
  945. data/lib/frameworks/sproutcore/frameworks/table/views/table_header.js +212 -0
  946. data/lib/frameworks/sproutcore/frameworks/table/views/table_row.js +155 -0
  947. data/lib/frameworks/sproutcore/frameworks/testing/core.js +196 -0
  948. data/lib/frameworks/sproutcore/frameworks/testing/english.lproj/additions.css +8 -0
  949. data/lib/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +128 -0
  950. data/lib/frameworks/sproutcore/frameworks/testing/english.lproj/testsuite.css +136 -0
  951. data/lib/frameworks/sproutcore/frameworks/testing/extras.js +17 -0
  952. data/lib/frameworks/sproutcore/frameworks/testing/jquery.js +3559 -0
  953. data/lib/frameworks/sproutcore/frameworks/testing/qunit.js +827 -0
  954. data/lib/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
  955. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
  956. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +695 -0
  957. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
  958. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
  959. data/lib/frameworks/sproutcore/frameworks/testing/utils.js +62 -0
  960. data/lib/frameworks/sproutcore/lib/index.rhtml +119 -0
  961. data/lib/frameworks/sproutcore/license.js +30 -0
  962. data/lib/frameworks/sproutcore/themes/empty_theme/tests/mini_icons.rhtml +69 -0
  963. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/button.css +41 -0
  964. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +8 -0
  965. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/backButton.png +0 -0
  966. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/blueButton.png +0 -0
  967. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/cancel.png +0 -0
  968. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/grayButton.png +0 -0
  969. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/leftButton.png +0 -0
  970. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrow.png +0 -0
  971. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrowSel.png +0 -0
  972. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listGroup.png +0 -0
  973. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/loading.gif +0 -0
  974. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/pinstripes.png +0 -0
  975. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/rightButton.png +0 -0
  976. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/selection.png +0 -0
  977. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/thumb.png +0 -0
  978. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggle.png +0 -0
  979. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggleOn.png +0 -0
  980. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolButton.png +0 -0
  981. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolbar.png +0 -0
  982. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/whiteButton.png +0 -0
  983. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/strings.js +15 -0
  984. data/lib/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/Data +0 -0
  985. data/lib/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Preview.jpg +0 -0
  986. data/lib/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Thumbnail.jpg +0 -0
  987. data/lib/frameworks/sproutcore/themes/standard_theme/Source/SproutCore Theme Buttons.psd +0 -0
  988. data/lib/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/Data +0 -0
  989. data/lib/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Preview.jpg +0 -0
  990. data/lib/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Thumbnail.jpg +0 -0
  991. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
  992. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
  993. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
  994. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
  995. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
  996. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
  997. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
  998. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
  999. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
  1000. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
  1001. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
  1002. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
  1003. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
  1004. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
  1005. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
  1006. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
  1007. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
  1008. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
  1009. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
  1010. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
  1011. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
  1012. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
  1013. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
  1014. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
  1015. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
  1016. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
  1017. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
  1018. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
  1019. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
  1020. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
  1021. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
  1022. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
  1023. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
  1024. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
  1025. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
  1026. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
  1027. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
  1028. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
  1029. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
  1030. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
  1031. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
  1032. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
  1033. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
  1034. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
  1035. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
  1036. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
  1037. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
  1038. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
  1039. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
  1040. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
  1041. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
  1042. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
  1043. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
  1044. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
  1045. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
  1046. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
  1047. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
  1048. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
  1049. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
  1050. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
  1051. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
  1052. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
  1053. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
  1054. data/lib/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
  1055. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/Data +0 -0
  1056. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Preview.jpg +0 -0
  1057. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Thumbnail.jpg +0 -0
  1058. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/Data +0 -0
  1059. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Preview.jpg +0 -0
  1060. data/lib/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Thumbnail.jpg +0 -0
  1061. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
  1062. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
  1063. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
  1064. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
  1065. data/lib/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
  1066. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
  1067. data/lib/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
  1068. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +399 -0
  1069. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +78 -0
  1070. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +135 -0
  1071. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +76 -0
  1072. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/disclosure.css +57 -0
  1073. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_222222.png +0 -0
  1074. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_454545.png +0 -0
  1075. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_888888.png +0 -0
  1076. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/icons/mini_ffffff.png +0 -0
  1077. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/panels/sprite-x.png +0 -0
  1078. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/panels/sprite-y.png +0 -0
  1079. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-repeat-x.png +0 -0
  1080. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-repeat-y.png +0 -0
  1081. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-scroller-sprite.png +0 -0
  1082. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
  1083. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-ysprite.png +0 -0
  1084. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-toolbar-view.png +0 -0
  1085. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +11 -0
  1086. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +82 -0
  1087. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/menu.css +20 -0
  1088. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/menu_item_view.css +36 -0
  1089. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/pane.css +18 -0
  1090. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/panel.css +33 -0
  1091. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/picker.css +17 -0
  1092. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +27 -0
  1093. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +125 -0
  1094. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/scroller.css +159 -0
  1095. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +275 -0
  1096. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +94 -0
  1097. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/split_view.css +11 -0
  1098. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +14 -0
  1099. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/table.css +14 -0
  1100. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +5 -0
  1101. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +7 -0
  1102. data/lib/frameworks/sproutcore/themes/standard_theme/english.lproj/well.css +36 -0
  1103. data/lib/gen/Buildfile +16 -0
  1104. data/lib/gen/app/Buildfile +36 -0
  1105. data/lib/gen/app/README +1 -0
  1106. data/lib/gen/app/USAGE +13 -0
  1107. data/lib/gen/app/templates/apps/@target_name@/core.js +27 -0
  1108. data/lib/gen/app/templates/apps/@target_name@/main.js +30 -0
  1109. data/lib/gen/app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  1110. data/lib/gen/app/templates/apps/@target_name@/resources/main_page.js +24 -0
  1111. data/lib/gen/controller/Buildfile +18 -0
  1112. data/lib/gen/controller/README +1 -0
  1113. data/lib/gen/controller/USAGE +13 -0
  1114. data/lib/gen/controller/templates/controllers/@filename@.js +18 -0
  1115. data/lib/gen/controller/templates/tests/controllers/@filename@.js +15 -0
  1116. data/lib/gen/data-source/Buildfile +18 -0
  1117. data/lib/gen/data-source/README +1 -0
  1118. data/lib/gen/data-source/USAGE +15 -0
  1119. data/lib/gen/data-source/templates/data_sources/@filename@.js +64 -0
  1120. data/lib/gen/design/Buildfile +23 -0
  1121. data/lib/gen/design/README +1 -0
  1122. data/lib/gen/design/USAGE +10 -0
  1123. data/lib/gen/design/templates/resources/@filename@.js +16 -0
  1124. data/lib/gen/framework/Buildfile +36 -0
  1125. data/lib/gen/framework/README +1 -0
  1126. data/lib/gen/framework/USAGE +13 -0
  1127. data/lib/gen/framework/templates/frameworks/@target_name@/core.js +21 -0
  1128. data/lib/gen/framework/templates/frameworks/@target_name@/english.lproj/strings.js +15 -0
  1129. data/lib/gen/language/Buildfile +26 -0
  1130. data/lib/gen/language/README +1 -0
  1131. data/lib/gen/language/USAGE +13 -0
  1132. data/lib/gen/language/templates/@filename@/strings.js +14 -0
  1133. data/lib/gen/model/Buildfile +16 -0
  1134. data/lib/gen/model/README +1 -0
  1135. data/lib/gen/model/USAGE +15 -0
  1136. data/lib/gen/model/templates/fixtures/@filename@.js +35 -0
  1137. data/lib/gen/model/templates/models/@filename@.js +19 -0
  1138. data/lib/gen/model/templates/tests/models/@filename@.js +15 -0
  1139. data/lib/gen/page/Buildfile +36 -0
  1140. data/lib/gen/page/README +1 -0
  1141. data/lib/gen/page/USAGE +15 -0
  1142. data/lib/gen/page/templates/pages/@target_name@/Buildfile +16 -0
  1143. data/lib/gen/page/templates/pages/@target_name@/core.js +22 -0
  1144. data/lib/gen/page/templates/pages/@target_name@/en.lproj/strings.js +14 -0
  1145. data/lib/gen/page/templates/pages/@target_name@/resources/body.css +1 -0
  1146. data/lib/gen/page/templates/pages/@target_name@/resources/body.rhtml +7 -0
  1147. data/lib/gen/project/Buildfile +45 -0
  1148. data/lib/gen/project/INIT +3 -0
  1149. data/lib/gen/project/README +1 -0
  1150. data/lib/gen/project/USAGE +2 -0
  1151. data/lib/gen/project/templates/@filename@/Buildfile +7 -0
  1152. data/lib/gen/project/templates/@filename@/README +7 -0
  1153. data/lib/gen/responder/Buildfile +18 -0
  1154. data/lib/gen/responder/README +1 -0
  1155. data/lib/gen/responder/USAGE +15 -0
  1156. data/lib/gen/responder/templates/states/@filename@.js +39 -0
  1157. data/lib/gen/test/Buildfile +25 -0
  1158. data/lib/gen/test/README +1 -0
  1159. data/lib/gen/test/USAGE +12 -0
  1160. data/lib/gen/test/templates/tests/@filename@.js +15 -0
  1161. data/lib/gen/theme/Buildfile +36 -0
  1162. data/lib/gen/theme/README +1 -0
  1163. data/lib/gen/theme/USAGE +13 -0
  1164. data/lib/gen/theme/templates/themes/@target_name@/resources/theme_styles.css +11 -0
  1165. data/lib/gen/view/Buildfile +18 -0
  1166. data/lib/gen/view/README +1 -0
  1167. data/lib/gen/view/USAGE +13 -0
  1168. data/lib/gen/view/templates/tests/views/@filename@.js +15 -0
  1169. data/lib/gen/view/templates/views/@filename@.js +18 -0
  1170. data/lib/sproutcore.rb +167 -0
  1171. data/lib/sproutcore/builders.rb +13 -0
  1172. data/lib/sproutcore/builders/base.rb +90 -0
  1173. data/lib/sproutcore/builders/bundle.rb +63 -0
  1174. data/lib/sproutcore/builders/combine.rb +60 -0
  1175. data/lib/sproutcore/builders/html.rb +211 -0
  1176. data/lib/sproutcore/builders/javascript.rb +101 -0
  1177. data/lib/sproutcore/builders/less.rb +41 -0
  1178. data/lib/sproutcore/builders/minify.rb +159 -0
  1179. data/lib/sproutcore/builders/sass.rb +65 -0
  1180. data/lib/sproutcore/builders/strings.rb +45 -0
  1181. data/lib/sproutcore/builders/stylesheet.rb +56 -0
  1182. data/lib/sproutcore/builders/test.rb +59 -0
  1183. data/lib/sproutcore/builders/test_index.rb +26 -0
  1184. data/lib/sproutcore/buildfile.rb +490 -0
  1185. data/lib/sproutcore/buildfile/build_task.rb +33 -0
  1186. data/lib/sproutcore/buildfile/buildfile_dsl.rb +169 -0
  1187. data/lib/sproutcore/buildfile/cloneable.rb +34 -0
  1188. data/lib/sproutcore/buildfile/early_time.rb +30 -0
  1189. data/lib/sproutcore/buildfile/invocation_chain.rb +64 -0
  1190. data/lib/sproutcore/buildfile/namespace.rb +33 -0
  1191. data/lib/sproutcore/buildfile/string_ext.rb +202 -0
  1192. data/lib/sproutcore/buildfile/task.rb +333 -0
  1193. data/lib/sproutcore/buildfile/task_arguments.rb +106 -0
  1194. data/lib/sproutcore/buildfile/task_manager.rb +195 -0
  1195. data/lib/sproutcore/deprecated/view_helper.rb +662 -0
  1196. data/lib/sproutcore/helpers.rb +11 -0
  1197. data/lib/sproutcore/helpers/capture_helper.rb +30 -0
  1198. data/lib/sproutcore/helpers/cssmin.rb +202 -0
  1199. data/lib/sproutcore/helpers/dom_id_helper.rb +21 -0
  1200. data/lib/sproutcore/helpers/entry_sorter.rb +128 -0
  1201. data/lib/sproutcore/helpers/html5_manifest.rb +88 -0
  1202. data/lib/sproutcore/helpers/packed_optimizer.rb +102 -0
  1203. data/lib/sproutcore/helpers/static_helper.rb +376 -0
  1204. data/lib/sproutcore/helpers/tag_helper.rb +182 -0
  1205. data/lib/sproutcore/helpers/text_helper.rb +303 -0
  1206. data/lib/sproutcore/models.rb +8 -0
  1207. data/lib/sproutcore/models/generator.rb +493 -0
  1208. data/lib/sproutcore/models/hash_struct.rb +124 -0
  1209. data/lib/sproutcore/models/manifest.rb +385 -0
  1210. data/lib/sproutcore/models/manifest_entry.rb +355 -0
  1211. data/lib/sproutcore/models/project.rb +267 -0
  1212. data/lib/sproutcore/models/target.rb +758 -0
  1213. data/lib/sproutcore/rack.rb +7 -0
  1214. data/lib/sproutcore/rack/builder.rb +344 -0
  1215. data/lib/sproutcore/rack/dev.rb +92 -0
  1216. data/lib/sproutcore/rack/docs.rb +24 -0
  1217. data/lib/sproutcore/rack/filesystem.rb +324 -0
  1218. data/lib/sproutcore/rack/proxy.rb +149 -0
  1219. data/lib/sproutcore/rack/service.rb +153 -0
  1220. data/lib/sproutcore/rack/test_runner.rb +24 -0
  1221. data/lib/sproutcore/render_engines/erubis.rb +55 -0
  1222. data/lib/sproutcore/render_engines/haml.rb +39 -0
  1223. data/lib/sproutcore/tools.rb +360 -0
  1224. data/lib/sproutcore/tools/build.rb +106 -0
  1225. data/lib/sproutcore/tools/build_number.rb +23 -0
  1226. data/lib/sproutcore/tools/docs.rb +53 -0
  1227. data/lib/sproutcore/tools/gen.rb +101 -0
  1228. data/lib/sproutcore/tools/init.rb +40 -0
  1229. data/lib/sproutcore/tools/manifest.rb +85 -0
  1230. data/lib/sproutcore/tools/server.rb +48 -0
  1231. data/lib/sproutcore/vendor/github_gem_lint.rb +22 -0
  1232. data/lib/sproutcore/vendor/jsdoc/README.txt +151 -0
  1233. data/lib/sproutcore/vendor/jsdoc/app/frame.js +33 -0
  1234. data/lib/sproutcore/vendor/jsdoc/app/frame/Chain.js +102 -0
  1235. data/lib/sproutcore/vendor/jsdoc/app/frame/Dumper.js +144 -0
  1236. data/lib/sproutcore/vendor/jsdoc/app/frame/Hash.js +47 -0
  1237. data/lib/sproutcore/vendor/jsdoc/app/frame/Link.js +142 -0
  1238. data/lib/sproutcore/vendor/jsdoc/app/frame/Namespace.js +10 -0
  1239. data/lib/sproutcore/vendor/jsdoc/app/frame/Opt.js +134 -0
  1240. data/lib/sproutcore/vendor/jsdoc/app/frame/Reflection.js +26 -0
  1241. data/lib/sproutcore/vendor/jsdoc/app/frame/String.js +93 -0
  1242. data/lib/sproutcore/vendor/jsdoc/app/frame/Testrun.js +129 -0
  1243. data/lib/sproutcore/vendor/jsdoc/app/handlers/FOODOC.js +26 -0
  1244. data/lib/sproutcore/vendor/jsdoc/app/handlers/XMLDOC.js +26 -0
  1245. data/lib/sproutcore/vendor/jsdoc/app/handlers/XMLDOC/DomReader.js +159 -0
  1246. data/lib/sproutcore/vendor/jsdoc/app/handlers/XMLDOC/XMLDoc.js +16 -0
  1247. data/lib/sproutcore/vendor/jsdoc/app/handlers/XMLDOC/XMLParse.js +292 -0
  1248. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC.js +98 -0
  1249. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/DocComment.js +200 -0
  1250. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/DocTag.js +294 -0
  1251. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/JsDoc.js +162 -0
  1252. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/JsPlate.js +100 -0
  1253. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Lang.js +144 -0
  1254. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Parser.js +109 -0
  1255. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/PluginManager.js +33 -0
  1256. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Symbol.js +681 -0
  1257. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/SymbolSet.js +226 -0
  1258. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/TextStream.js +41 -0
  1259. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Token.js +18 -0
  1260. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/TokenReader.js +332 -0
  1261. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/TokenStream.js +133 -0
  1262. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Util.js +32 -0
  1263. data/lib/sproutcore/vendor/jsdoc/app/lib/JSDOC/Walker.js +453 -0
  1264. data/lib/sproutcore/vendor/jsdoc/app/main.js +74 -0
  1265. data/lib/sproutcore/vendor/jsdoc/app/plugins/commentSrcJson.js +19 -0
  1266. data/lib/sproutcore/vendor/jsdoc/app/plugins/frameworkPrototype.js +16 -0
  1267. data/lib/sproutcore/vendor/jsdoc/app/plugins/functionCall.js +10 -0
  1268. data/lib/sproutcore/vendor/jsdoc/app/plugins/publishSrcHilite.js +62 -0
  1269. data/lib/sproutcore/vendor/jsdoc/app/plugins/sproutcoreTags.js +26 -0
  1270. data/lib/sproutcore/vendor/jsdoc/app/plugins/symbolLink.js +9 -0
  1271. data/lib/sproutcore/vendor/jsdoc/app/plugins/tagParamConfig.js +31 -0
  1272. data/lib/sproutcore/vendor/jsdoc/app/plugins/tagSynonyms.js +43 -0
  1273. data/lib/sproutcore/vendor/jsdoc/app/run.js +346 -0
  1274. data/lib/sproutcore/vendor/jsdoc/app/t/TestDoc.js +144 -0
  1275. data/lib/sproutcore/vendor/jsdoc/app/t/runner.js +13 -0
  1276. data/lib/sproutcore/vendor/jsdoc/app/test.js +304 -0
  1277. data/lib/sproutcore/vendor/jsdoc/app/test/addon.js +24 -0
  1278. data/lib/sproutcore/vendor/jsdoc/app/test/anon_inner.js +14 -0
  1279. data/lib/sproutcore/vendor/jsdoc/app/test/augments.js +31 -0
  1280. data/lib/sproutcore/vendor/jsdoc/app/test/augments2.js +26 -0
  1281. data/lib/sproutcore/vendor/jsdoc/app/test/borrows.js +41 -0
  1282. data/lib/sproutcore/vendor/jsdoc/app/test/borrows2.js +23 -0
  1283. data/lib/sproutcore/vendor/jsdoc/app/test/config.js +22 -0
  1284. data/lib/sproutcore/vendor/jsdoc/app/test/constructs.js +18 -0
  1285. data/lib/sproutcore/vendor/jsdoc/app/test/encoding.js +10 -0
  1286. data/lib/sproutcore/vendor/jsdoc/app/test/encoding_other.js +12 -0
  1287. data/lib/sproutcore/vendor/jsdoc/app/test/functions_anon.js +39 -0
  1288. data/lib/sproutcore/vendor/jsdoc/app/test/functions_nested.js +33 -0
  1289. data/lib/sproutcore/vendor/jsdoc/app/test/global.js +13 -0
  1290. data/lib/sproutcore/vendor/jsdoc/app/test/globals.js +25 -0
  1291. data/lib/sproutcore/vendor/jsdoc/app/test/ignore.js +10 -0
  1292. data/lib/sproutcore/vendor/jsdoc/app/test/inner.js +16 -0
  1293. data/lib/sproutcore/vendor/jsdoc/app/test/jsdoc_test.js +477 -0
  1294. data/lib/sproutcore/vendor/jsdoc/app/test/lend.js +33 -0
  1295. data/lib/sproutcore/vendor/jsdoc/app/test/memberof.js +20 -0
  1296. data/lib/sproutcore/vendor/jsdoc/app/test/memberof_constructor.js +15 -0
  1297. data/lib/sproutcore/vendor/jsdoc/app/test/name.js +19 -0
  1298. data/lib/sproutcore/vendor/jsdoc/app/test/namespace_nested.js +23 -0
  1299. data/lib/sproutcore/vendor/jsdoc/app/test/nocode.js +13 -0
  1300. data/lib/sproutcore/vendor/jsdoc/app/test/oblit_anon.js +20 -0
  1301. data/lib/sproutcore/vendor/jsdoc/app/test/overview.js +20 -0
  1302. data/lib/sproutcore/vendor/jsdoc/app/test/param_inline.js +37 -0
  1303. data/lib/sproutcore/vendor/jsdoc/app/test/params_optional.js +8 -0
  1304. data/lib/sproutcore/vendor/jsdoc/app/test/prototype.js +17 -0
  1305. data/lib/sproutcore/vendor/jsdoc/app/test/prototype_nested.js +9 -0
  1306. data/lib/sproutcore/vendor/jsdoc/app/test/prototype_oblit.js +13 -0
  1307. data/lib/sproutcore/vendor/jsdoc/app/test/prototype_oblit_constructor.js +24 -0
  1308. data/lib/sproutcore/vendor/jsdoc/app/test/public.js +10 -0
  1309. data/lib/sproutcore/vendor/jsdoc/app/test/shared.js +42 -0
  1310. data/lib/sproutcore/vendor/jsdoc/app/test/shared2.js +2 -0
  1311. data/lib/sproutcore/vendor/jsdoc/app/test/shortcuts.js +22 -0
  1312. data/lib/sproutcore/vendor/jsdoc/app/test/static_this.js +13 -0
  1313. data/lib/sproutcore/vendor/jsdoc/app/test/synonyms.js +23 -0
  1314. data/lib/sproutcore/vendor/jsdoc/app/test/tosource.js +23 -0
  1315. data/lib/sproutcore/vendor/jsdoc/app/test/variable_redefine.js +14 -0
  1316. data/lib/sproutcore/vendor/jsdoc/changes.txt +47 -0
  1317. data/lib/sproutcore/vendor/jsdoc/conf/sample.conf +31 -0
  1318. data/lib/sproutcore/vendor/jsdoc/java/build.xml +36 -0
  1319. data/lib/sproutcore/vendor/jsdoc/java/build_1.4.xml +36 -0
  1320. data/lib/sproutcore/vendor/jsdoc/java/classes/js.jar +0 -0
  1321. data/lib/sproutcore/vendor/jsdoc/java/src/JsDebugRun.java +21 -0
  1322. data/lib/sproutcore/vendor/jsdoc/java/src/JsRun.java +21 -0
  1323. data/lib/sproutcore/vendor/jsdoc/jsdebug.jar +0 -0
  1324. data/lib/sproutcore/vendor/jsdoc/jsrun.jar +0 -0
  1325. data/lib/sproutcore/vendor/jsdoc/t/TestDoc.js +144 -0
  1326. data/lib/sproutcore/vendor/jsdoc/t/runner.js +13 -0
  1327. data/lib/sproutcore/vendor/jsdoc/test.js +304 -0
  1328. data/lib/sproutcore/vendor/jsdoc/test/addon.js +24 -0
  1329. data/lib/sproutcore/vendor/jsdoc/test/anon_inner.js +14 -0
  1330. data/lib/sproutcore/vendor/jsdoc/test/augments.js +31 -0
  1331. data/lib/sproutcore/vendor/jsdoc/test/augments2.js +26 -0
  1332. data/lib/sproutcore/vendor/jsdoc/test/borrows.js +41 -0
  1333. data/lib/sproutcore/vendor/jsdoc/test/borrows2.js +23 -0
  1334. data/lib/sproutcore/vendor/jsdoc/test/config.js +22 -0
  1335. data/lib/sproutcore/vendor/jsdoc/test/constructs.js +18 -0
  1336. data/lib/sproutcore/vendor/jsdoc/test/encoding.js +10 -0
  1337. data/lib/sproutcore/vendor/jsdoc/test/encoding_other.js +12 -0
  1338. data/lib/sproutcore/vendor/jsdoc/test/functions_anon.js +39 -0
  1339. data/lib/sproutcore/vendor/jsdoc/test/functions_nested.js +33 -0
  1340. data/lib/sproutcore/vendor/jsdoc/test/global.js +13 -0
  1341. data/lib/sproutcore/vendor/jsdoc/test/globals.js +25 -0
  1342. data/lib/sproutcore/vendor/jsdoc/test/ignore.js +10 -0
  1343. data/lib/sproutcore/vendor/jsdoc/test/inner.js +16 -0
  1344. data/lib/sproutcore/vendor/jsdoc/test/jsdoc_test.js +477 -0
  1345. data/lib/sproutcore/vendor/jsdoc/test/lend.js +33 -0
  1346. data/lib/sproutcore/vendor/jsdoc/test/memberof.js +20 -0
  1347. data/lib/sproutcore/vendor/jsdoc/test/memberof_constructor.js +15 -0
  1348. data/lib/sproutcore/vendor/jsdoc/test/name.js +19 -0
  1349. data/lib/sproutcore/vendor/jsdoc/test/namespace_nested.js +23 -0
  1350. data/lib/sproutcore/vendor/jsdoc/test/nocode.js +13 -0
  1351. data/lib/sproutcore/vendor/jsdoc/test/oblit_anon.js +20 -0
  1352. data/lib/sproutcore/vendor/jsdoc/test/overview.js +20 -0
  1353. data/lib/sproutcore/vendor/jsdoc/test/param_inline.js +37 -0
  1354. data/lib/sproutcore/vendor/jsdoc/test/params_optional.js +8 -0
  1355. data/lib/sproutcore/vendor/jsdoc/test/prototype.js +17 -0
  1356. data/lib/sproutcore/vendor/jsdoc/test/prototype_nested.js +9 -0
  1357. data/lib/sproutcore/vendor/jsdoc/test/prototype_oblit.js +13 -0
  1358. data/lib/sproutcore/vendor/jsdoc/test/prototype_oblit_constructor.js +24 -0
  1359. data/lib/sproutcore/vendor/jsdoc/test/public.js +10 -0
  1360. data/lib/sproutcore/vendor/jsdoc/test/shared.js +42 -0
  1361. data/lib/sproutcore/vendor/jsdoc/test/shared2.js +2 -0
  1362. data/lib/sproutcore/vendor/jsdoc/test/shortcuts.js +22 -0
  1363. data/lib/sproutcore/vendor/jsdoc/test/static_this.js +13 -0
  1364. data/lib/sproutcore/vendor/jsdoc/test/synonyms.js +23 -0
  1365. data/lib/sproutcore/vendor/jsdoc/test/tosource.js +23 -0
  1366. data/lib/sproutcore/vendor/jsdoc/test/variable_redefine.js +14 -0
  1367. data/lib/sproutcore/vendor/yui-compressor/SCyuicompressor-2.4.2.jar +0 -0
  1368. data/lib/sproutcore/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
  1369. data/lib/sproutcore/version.rb +11 -0
  1370. data/spec/buildtasks/build/copy_spec.rb +60 -0
  1371. data/spec/buildtasks/build/spec_helper.rb +36 -0
  1372. data/spec/buildtasks/manifest/catalog_spec.rb +48 -0
  1373. data/spec/buildtasks/manifest/hide_buildfiles_spec.rb +126 -0
  1374. data/spec/buildtasks/manifest/localize_spec.rb +97 -0
  1375. data/spec/buildtasks/manifest/prepare_build_tasks/bundle_spec.rb +254 -0
  1376. data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +254 -0
  1377. data/spec/buildtasks/manifest/prepare_build_tasks/css_spec.rb +87 -0
  1378. data/spec/buildtasks/manifest/prepare_build_tasks/html_spec.rb +175 -0
  1379. data/spec/buildtasks/manifest/prepare_build_tasks/javascript_spec.rb +65 -0
  1380. data/spec/buildtasks/manifest/prepare_build_tasks/minify_spec.rb +70 -0
  1381. data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +152 -0
  1382. data/spec/buildtasks/manifest/prepare_build_tasks/sass_spec.rb +98 -0
  1383. data/spec/buildtasks/manifest/prepare_build_tasks/strings_spec.rb +64 -0
  1384. data/spec/buildtasks/manifest/prepare_build_tasks/tests_spec.rb +163 -0
  1385. data/spec/buildtasks/manifest/prepare_spec.rb +43 -0
  1386. data/spec/buildtasks/manifest/spec_helper.rb +35 -0
  1387. data/spec/buildtasks/target_spec.rb +270 -0
  1388. data/spec/fixtures/builder_tests/Buildfile +20 -0
  1389. data/spec/fixtures/builder_tests/apps/bundle_test/bundle.js +1 -0
  1390. data/spec/fixtures/builder_tests/apps/combine_test/a.js +1 -0
  1391. data/spec/fixtures/builder_tests/apps/combine_test/b.js +1 -0
  1392. data/spec/fixtures/builder_tests/apps/combine_test/c.js +1 -0
  1393. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +1 -0
  1394. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +1 -0
  1395. data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +1 -0
  1396. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +2 -0
  1397. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +1 -0
  1398. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
  1399. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
  1400. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +1 -0
  1401. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +4 -0
  1402. data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
  1403. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
  1404. data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +4 -0
  1405. data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +1 -0
  1406. data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
  1407. data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +15 -0
  1408. data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +4 -0
  1409. data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +7 -0
  1410. data/spec/fixtures/builder_tests/apps/less_test/sample.less +4 -0
  1411. data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +4 -0
  1412. data/spec/fixtures/builder_tests/apps/sass_test/sample.scss +4 -0
  1413. data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +8 -0
  1414. data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +9 -0
  1415. data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +12 -0
  1416. data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +1 -0
  1417. data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +3 -0
  1418. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +1 -0
  1419. data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +1 -0
  1420. data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +4 -0
  1421. data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
  1422. data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
  1423. data/spec/fixtures/builder_tests/frameworks/dynamic_req_target_1/dynamic_req_js_1.js +0 -0
  1424. data/spec/fixtures/builder_tests/frameworks/dynamic_req_target_1/english.lproj/dynamic_req_style_1.css +0 -0
  1425. data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
  1426. data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
  1427. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
  1428. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +4 -0
  1429. data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +1 -0
  1430. data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
  1431. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
  1432. data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +1 -0
  1433. data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +1 -0
  1434. data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
  1435. data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
  1436. data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +1 -0
  1437. data/spec/fixtures/buildfiles/basic/Buildfile +11 -0
  1438. data/spec/fixtures/buildfiles/basic/task_module.rake +6 -0
  1439. data/spec/fixtures/buildfiles/installed/Buildfile +5 -0
  1440. data/spec/fixtures/buildfiles/installed/Buildfile2 +5 -0
  1441. data/spec/fixtures/buildfiles/project_test/Buildfile +4 -0
  1442. data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +2 -0
  1443. data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
  1444. data/spec/fixtures/entry_for_project/Buildfile +1 -0
  1445. data/spec/fixtures/entry_for_project/apps/test_app/entry.txt +0 -0
  1446. data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
  1447. data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
  1448. data/spec/fixtures/entry_for_project/frameworks/unrelated/PLACEHOLDER +0 -0
  1449. data/spec/fixtures/find_targets/custom/Buildfile +8 -0
  1450. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
  1451. data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
  1452. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
  1453. data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
  1454. data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +5 -0
  1455. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
  1456. data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
  1457. data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
  1458. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
  1459. data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
  1460. data/spec/fixtures/find_targets/nested/Buildfile +8 -0
  1461. data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +1 -0
  1462. data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
  1463. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
  1464. data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
  1465. data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
  1466. data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
  1467. data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
  1468. data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
  1469. data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
  1470. data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
  1471. data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
  1472. data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
  1473. data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
  1474. data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
  1475. data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
  1476. data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
  1477. data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
  1478. data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
  1479. data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
  1480. data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
  1481. data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
  1482. data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
  1483. data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
  1484. data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
  1485. data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
  1486. data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
  1487. data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
  1488. data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
  1489. data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
  1490. data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
  1491. data/spec/fixtures/ordered_entries/apps/no_requires/1.js +1 -0
  1492. data/spec/fixtures/ordered_entries/apps/no_requires/B.js +1 -0
  1493. data/spec/fixtures/ordered_entries/apps/no_requires/a.js +1 -0
  1494. data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +1 -0
  1495. data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +1 -0
  1496. data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +1 -0
  1497. data/spec/fixtures/ordered_entries/apps/no_requires/c.js +1 -0
  1498. data/spec/fixtures/ordered_entries/apps/no_requires/core.js +1 -0
  1499. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
  1500. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
  1501. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
  1502. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
  1503. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
  1504. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
  1505. data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/strings.js +1 -0
  1506. data/spec/fixtures/ordered_entries/apps/no_requires/main.js +1 -0
  1507. data/spec/fixtures/ordered_entries/apps/no_requires/resources/main_page.js +1 -0
  1508. data/spec/fixtures/ordered_entries/apps/no_requires/t.js +1 -0
  1509. data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +1 -0
  1510. data/spec/fixtures/ordered_entries/apps/with_requires/a.js +2 -0
  1511. data/spec/fixtures/ordered_entries/apps/with_requires/b.js +3 -0
  1512. data/spec/fixtures/ordered_entries/apps/with_requires/c.js +2 -0
  1513. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +2 -0
  1514. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +2 -0
  1515. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +2 -0
  1516. data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +1 -0
  1517. data/spec/fixtures/real_world/Buildfile +12 -0
  1518. data/spec/fixtures/real_world/apps/account/README +1 -0
  1519. data/spec/fixtures/real_world/apps/calendar/README +1 -0
  1520. data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +1 -0
  1521. data/spec/fixtures/real_world/apps/files/README +1 -0
  1522. data/spec/fixtures/real_world/apps/mail/README +1 -0
  1523. data/spec/fixtures/real_world/apps/mobile_photos/README +1 -0
  1524. data/spec/fixtures/real_world/apps/photos/README +1 -0
  1525. data/spec/fixtures/real_world/apps/uploader/README +1 -0
  1526. data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
  1527. data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
  1528. data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
  1529. data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +26 -0
  1530. data/spec/fixtures/real_world/frameworks/sproutcore/README +1 -0
  1531. data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
  1532. data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
  1533. data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
  1534. data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
  1535. data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
  1536. data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
  1537. data/spec/fixtures/real_world/frameworks/sproutcore/demo3.scss +0 -0
  1538. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
  1539. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +4 -0
  1540. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +1 -0
  1541. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
  1542. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo3.scss +0 -0
  1543. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo4.less +0 -0
  1544. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
  1545. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +1 -0
  1546. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
  1547. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
  1548. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +4 -0
  1549. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +1 -0
  1550. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +1 -0
  1551. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
  1552. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +6 -0
  1553. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +3 -0
  1554. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +1 -0
  1555. data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
  1556. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +1 -0
  1557. data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
  1558. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
  1559. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
  1560. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
  1561. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
  1562. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
  1563. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
  1564. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
  1565. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
  1566. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
  1567. data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
  1568. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
  1569. data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +1 -0
  1570. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
  1571. data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
  1572. data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +4 -0
  1573. data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +1 -0
  1574. data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +1 -0
  1575. data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
  1576. data/spec/fixtures/real_world/frameworks/sproutcore/resources/boo.png +0 -0
  1577. data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +6 -0
  1578. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
  1579. data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
  1580. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
  1581. data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +1 -0
  1582. data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
  1583. data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +1 -0
  1584. data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
  1585. data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +1 -0
  1586. data/spec/fixtures/recursive_project/Buildfile +8 -0
  1587. data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
  1588. data/spec/lib/builders/bundle_spec.rb +295 -0
  1589. data/spec/lib/builders/combine_spec.rb +67 -0
  1590. data/spec/lib/builders/html_spec.rb +580 -0
  1591. data/spec/lib/builders/javascript_spec.rb +82 -0
  1592. data/spec/lib/builders/less_spec.rb +51 -0
  1593. data/spec/lib/builders/sass_spec.rb +72 -0
  1594. data/spec/lib/builders/spec_helper.rb +30 -0
  1595. data/spec/lib/builders/strings_spec.rb +55 -0
  1596. data/spec/lib/builders/stylesheet_spec.rb +64 -0
  1597. data/spec/lib/builders/test_index_spec.rb +45 -0
  1598. data/spec/lib/builders/test_spec.rb +137 -0
  1599. data/spec/lib/buildfile/config_for_spec.rb +81 -0
  1600. data/spec/lib/buildfile/define_spec.rb +59 -0
  1601. data/spec/lib/buildfile/dup_spec.rb +65 -0
  1602. data/spec/lib/buildfile/invoke_spec.rb +135 -0
  1603. data/spec/lib/buildfile/load_spec.rb +51 -0
  1604. data/spec/lib/buildfile/task/dup_spec.rb +55 -0
  1605. data/spec/lib/buildfile/task_defined_spec.rb +17 -0
  1606. data/spec/lib/buildfile_commands/build_task_spec.rb +19 -0
  1607. data/spec/lib/buildfile_commands/config_spec.rb +97 -0
  1608. data/spec/lib/buildfile_commands/import_spec.rb +17 -0
  1609. data/spec/lib/buildfile_commands/namespace_spec.rb +18 -0
  1610. data/spec/lib/buildfile_commands/proxies_spec.rb +38 -0
  1611. data/spec/lib/buildfile_commands/replace_task_spec.rb +29 -0
  1612. data/spec/lib/buildfile_commands/task_spec.rb +36 -0
  1613. data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +26 -0
  1614. data/spec/lib/models/hash_struct/deep_clone_spec.rb +27 -0
  1615. data/spec/lib/models/hash_struct/has_options_spec.rb +32 -0
  1616. data/spec/lib/models/hash_struct/hash_spec.rb +29 -0
  1617. data/spec/lib/models/hash_struct/merge_spec.rb +19 -0
  1618. data/spec/lib/models/hash_struct/method_missing.rb +41 -0
  1619. data/spec/lib/models/manifest/add_entry_spec.rb +36 -0
  1620. data/spec/lib/models/manifest/add_transform_spec.rb +93 -0
  1621. data/spec/lib/models/manifest/build_spec.rb +78 -0
  1622. data/spec/lib/models/manifest/entry_for_spec.rb +94 -0
  1623. data/spec/lib/models/manifest/find_entry.rb +109 -0
  1624. data/spec/lib/models/manifest/prepare_spec.rb +62 -0
  1625. data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +31 -0
  1626. data/spec/lib/models/manifest_entry/hyperdomain_prefix.rb +34 -0
  1627. data/spec/lib/models/manifest_entry/prepare_spec.rb +54 -0
  1628. data/spec/lib/models/project/add_target_spec.rb +44 -0
  1629. data/spec/lib/models/project/buildfile_spec.rb +35 -0
  1630. data/spec/lib/models/project/find_targets_for_spec.rb +78 -0
  1631. data/spec/lib/models/project/load_nearest_project_spec.rb +23 -0
  1632. data/spec/lib/models/project/target_for_spec.rb +33 -0
  1633. data/spec/lib/models/project/targets_spec.rb +62 -0
  1634. data/spec/lib/models/target/compute_build_number_spec.rb +126 -0
  1635. data/spec/lib/models/target/config_spec.rb +30 -0
  1636. data/spec/lib/models/target/expand_required_targets_spec.rb +48 -0
  1637. data/spec/lib/models/target/installed_languages_spec.rb +47 -0
  1638. data/spec/lib/models/target/lproj_for_spec.rb +38 -0
  1639. data/spec/lib/models/target/manifest_for_spec.rb +42 -0
  1640. data/spec/lib/models/target/parent_target_spec.rb +21 -0
  1641. data/spec/lib/models/target/prepare_spec.rb +53 -0
  1642. data/spec/lib/models/target/required_targets_spec.rb +129 -0
  1643. data/spec/lib/models/target/target_for_spec.rb +56 -0
  1644. data/spec/lib/tools/build_number_spec.rb +35 -0
  1645. data/spec/lib/tools/gen_spec.rb +209 -0
  1646. data/spec/lib/tools/tools_spec.rb +96 -0
  1647. data/spec/spec.opts +4 -0
  1648. data/spec/spec_helper.rb +138 -0
  1649. data/sproutcore.gemspec +51 -0
  1650. metadata +1897 -0
@@ -0,0 +1,112 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2010 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /** @class
9
+
10
+ Renders a checkbox button view specifically.
11
+
12
+ This view is basically a button view preconfigured to generate the correct
13
+ HTML and to set to use a TOGGLE_BEHAVIOR for its buttons.
14
+
15
+ This view renders a simulated checkbox that can display a mixed state and
16
+ has other features not found in platform-native controls.
17
+
18
+ @extends SC.FieldView
19
+ @since SproutCore 1.0
20
+ */
21
+ SC.CheckboxView = SC.ButtonView.extend(SC.StaticLayout, SC.Button,
22
+ /** @scope SC.CheckboxView.prototype */ {
23
+
24
+ classNames: ['sc-checkbox-view'],
25
+ tagName: 'label',
26
+
27
+ /* Ellipsis is disabled by default to allow multiline text */
28
+ needsEllipsis: NO,
29
+
30
+ render: function(context, firstTime) {
31
+ var dt, elem,
32
+ value = this.get('value'),
33
+ ariaValue = value === SC.MIXED_MODE ?
34
+ 'mixed' : (value === this.get('toggleOnValue') ?
35
+ 'true': 'false');
36
+
37
+ // add checkbox -- set name to view guid to separate it from others
38
+ if (firstTime) {
39
+ var blank = SC.BLANK_IMAGE_URL,
40
+ disabled = this.get('isEnabled') ? '' : 'disabled="disabled"',
41
+ guid = SC.guidFor(this);
42
+
43
+ context.attr('role', 'checkbox');
44
+ dt = this._field_currentDisplayTitle = this.get('displayTitle');
45
+
46
+ if(SC.browser.msie) context.attr('for', guid);
47
+ context.push('<span class="button" ></span>');
48
+ if(this.get('needsEllipsis')){
49
+ context.push('<span class="label ellipsis">', dt, '</span>');
50
+ }else{
51
+ context.push('<span class="label">', dt, '</span>');
52
+ }
53
+ context.attr('name', guid);
54
+
55
+ // since we don't want to regenerate the contents each time
56
+ // actually search for and update the displayTitle.
57
+ } else {
58
+
59
+ dt = this.get('displayTitle');
60
+ if (dt !== this._field_currentDisplayTitle) {
61
+ this._field_currentDisplayTitle = dt;
62
+ this.$('span.label').text(dt);
63
+ }
64
+ }
65
+ context.attr('aria-checked', ariaValue);
66
+ },
67
+
68
+ acceptsFirstResponder: function() {
69
+ if(!SC.SAFARI_FOCUS_BEHAVIOR) return this.get('isEnabled');
70
+ else return NO;
71
+ }.property('isEnabled'),
72
+
73
+
74
+ mouseDown: function(evt) {
75
+ if(!this.get('isEnabled')) return YES;
76
+ this.set('isActive', YES);
77
+ this._isMouseDown = YES;
78
+ // even if radiobuttons are not set to get firstResponder, allow default
79
+ // action, that way textfields loose focus as expected.
80
+ if (evt) evt.allowDefault();
81
+ return YES;
82
+ },
83
+
84
+ mouseUp: function(evt) {
85
+ if(!this.get('isEnabled') ||
86
+ (evt && evt.target && !this.$().within(evt.target))) {
87
+ return YES;
88
+ }
89
+ var val = this.get('value');
90
+ if (val === this.get('toggleOnValue')) {
91
+ this.$().attr('aria-checked', 'false');
92
+ this.set('value', this.get('toggleOffValue'));
93
+ }
94
+ else {
95
+ this.$().attr('aria-checked', 'true');
96
+ this.set('value', this.get('toggleOnValue'));
97
+ }
98
+ this.set('isActive', NO);
99
+ this._isMouseDown = NO;
100
+ return YES;
101
+ },
102
+
103
+
104
+ touchStart: function(evt) {
105
+ return this.mouseDown(evt);
106
+ },
107
+
108
+ touchEnd: function(evt) {
109
+ return this.mouseUp(evt);
110
+ }
111
+
112
+ }) ;
@@ -0,0 +1,3073 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2010 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2010 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ sc_require('mixins/collection_view_delegate') ;
9
+ sc_require('views/list_item');
10
+
11
+ /**
12
+ Special drag operation passed to delegate if the collection view proposes
13
+ to perform a reorder event.
14
+ */
15
+ SC.DRAG_REORDER = 0x0010 ;
16
+
17
+ /** Indicates that selection points should be selected using horizontal
18
+ orientation.
19
+ */
20
+ SC.HORIZONTAL_ORIENTATION = 'horizontal';
21
+
22
+ /** Selection points should be selected using vertical orientation. */
23
+ SC.VERTICAL_ORIENTATION = 'vertical' ;
24
+
25
+ SC.BENCHMARK_RELOAD = NO ;
26
+
27
+ /**
28
+ @class
29
+
30
+ TODO: Document SC.CollectionView
31
+
32
+ Renders a collection of views from a source array of model objects.
33
+
34
+ The CollectionView is the root view class for rendering collections of
35
+ views based on a source array of objects. It can automatically create the
36
+ and layout the views, including displaying them in groups. It also
37
+ handles event input for the entire collection.
38
+
39
+ To use CollectionView, just create the view and set the 'content' property
40
+ to an array of objects. (Note that if you setup a binding, it will
41
+ always transform content to an array.) The view will create instances of
42
+ exampleView to render the array. You can also bind to the selection
43
+ property if you want to monitor selection. (be sure to set the isEnabled
44
+ property to allow selection.)
45
+
46
+ @extends SC.View
47
+ @extends SC.CollectionViewDelegate
48
+ @extends SC.CollectionContent
49
+ @since SproutCore 0.9
50
+ */
51
+ SC.CollectionView = SC.View.extend(
52
+ SC.CollectionViewDelegate,
53
+ SC.CollectionContent,
54
+ /** @scope SC.CollectionView.prototype */ {
55
+
56
+ classNames: ['sc-collection-view'],
57
+
58
+ ACTION_DELAY: 200,
59
+
60
+ // ......................................
61
+ // PROPERTIES
62
+ //
63
+
64
+ /**
65
+ If YES, uses the VERY EXPERIMENTAL fast CollectionView path.
66
+ */
67
+ useFastPath: NO,
68
+
69
+ /**
70
+ An array of content objects
71
+
72
+ This array should contain the content objects you want the collection view
73
+ to display. An item view (based on the exampleView view class) will be
74
+ created for each content object, in the order the content objects appear
75
+ in this array.
76
+
77
+ If you make the collection editable, the collection view will also modify
78
+ this array using the observable array methods of SC.Array.
79
+
80
+ Usually you will want to bind this property to a controller property
81
+ that actually contains the array of objects you to display.
82
+
83
+ @type {SC.Array}
84
+ */
85
+ content: null,
86
+
87
+ /** @private */
88
+ contentBindingDefault: SC.Binding.multiple(),
89
+
90
+ /**
91
+ The current length of the content.
92
+
93
+ @property
94
+ @type {Numer}
95
+ */
96
+ length: 0,
97
+
98
+ /**
99
+ The set of indexes that are currently tracked by the collection view.
100
+ This property is used to determine the range of items the collection view
101
+ should monitor for changes.
102
+
103
+ The default implementation of this property returns an index set covering
104
+ the entire range of the content. It changes automatically whenever the
105
+ length changes.
106
+
107
+ Note that the returned index set for this property will always be frozen.
108
+ To change the nowShowing index set, you must create a new index set and
109
+ apply it.
110
+
111
+ @property
112
+ @type {SC.IndexSet}
113
+ */
114
+ nowShowing: function() {
115
+ return this.computeNowShowing();
116
+ }.property('length', 'clippingFrame').cacheable(),
117
+
118
+ /**
119
+ Indexes of selected content objects. This SC.SelectionSet is modified
120
+ automatically by the collection view when the user changes the selection
121
+ on the collection.
122
+
123
+ Any item views representing content objects in this set will have their
124
+ isSelected property set to YES automatically.
125
+
126
+ @type {SC.SelectionSet}
127
+ */
128
+ selection: null,
129
+
130
+ /**
131
+ Allow user to select content using the mouse and keyboard.
132
+
133
+ Set this property to NO to disallow the user from selecting items. If you
134
+ have items in your selectedIndexes property, they will still be reflected
135
+ visually.
136
+
137
+ @type {Boolean}
138
+ */
139
+ isSelectable: YES,
140
+
141
+ /** @private */
142
+ isSelectableBindingDefault: SC.Binding.bool(),
143
+
144
+ /**
145
+ Enable or disable the view.
146
+
147
+ The collection view will set the isEnabled property of its item views to
148
+ reflect the same view of this property. Whenever isEnabled is false,
149
+ the collection view will also be not selectable or editable, regardless of
150
+ the settings for isEditable & isSelectable.
151
+
152
+ @type {Boolean}
153
+ */
154
+ isEnabled: YES,
155
+
156
+ /** @private */
157
+ isEnabledBindingDefault: SC.Binding.bool(),
158
+
159
+ /**
160
+ Allow user to edit content views.
161
+
162
+ The collection view will set the isEditable property on its item views to
163
+ reflect the same value of this property. Whenever isEditable is false,
164
+ the user will not be able to reorder, add, or delete items regardless of
165
+ the canReorderContent and canDeleteContent and isDropTarget properties.
166
+
167
+ @type {Boolean}
168
+ */
169
+ isEditable: YES,
170
+
171
+ /** @private */
172
+ isEditableBindingDefault: SC.Binding.bool(),
173
+
174
+ /**
175
+ Allow user to reorder items using drag and drop.
176
+
177
+ If true, the user will can use drag and drop to reorder items in the list.
178
+ If you also accept drops, this will allow the user to drop items into
179
+ specific points in the list. Otherwise items will be added to the end.
180
+
181
+ @type {Boolean}
182
+ */
183
+ canReorderContent: NO,
184
+
185
+ /** @private */
186
+ canReorderContentBindingDefault: SC.Binding.bool(),
187
+
188
+ /**
189
+ Allow the user to delete items using the delete key
190
+
191
+ If true the user will be allowed to delete selected items using the delete
192
+ key. Otherwise deletes will not be permitted.
193
+
194
+ @type {Boolean}
195
+ */
196
+ canDeleteContent: NO,
197
+
198
+ /** @private */
199
+ canDeleteContentBindingDefault: SC.Binding.bool(),
200
+
201
+ /**
202
+ Allow user to edit the content by double clicking on it or hitting return.
203
+ This will only work if isEditable is YES and the item view implements
204
+ the beginEditing() method.
205
+
206
+ @type {Boolean}
207
+ */
208
+ canEditContent: NO,
209
+
210
+ /** @private */
211
+ canEditContentBindingDefault: SC.Binding.bool(),
212
+
213
+ /**
214
+ Accept drops for data other than reordering.
215
+
216
+ Setting this property to return true when the view is instantiated will
217
+ cause it to be registered as a drop target, activating the other drop
218
+ machinery.
219
+
220
+ @type {Boolean}
221
+ */
222
+ isDropTarget: NO,
223
+
224
+ /**
225
+ Use toggle selection instead of normal click behavior.
226
+
227
+ If set to true, then selection will use a toggle instead of the normal
228
+ click behavior. Command modifiers will be ignored and instead clicking
229
+ once will select an item and clicking on it again will deselect it.
230
+
231
+ @type {Boolean}
232
+ */
233
+ useToggleSelection: NO,
234
+
235
+ /**
236
+ Trigger the action method on a single click.
237
+
238
+ Normally, clicking on an item view in a collection will select the content
239
+ object and double clicking will trigger the action method on the
240
+ collection view.
241
+
242
+ If you set this property to YES, then clicking on a view will both select
243
+ it (if isSelected is true) and trigger the action method.
244
+
245
+ Use this if you are using the collection view as a menu of items.
246
+
247
+ @property {Boolean}
248
+ */
249
+ actOnSelect: NO,
250
+
251
+
252
+ /**
253
+ Select an item immediately on mouse down
254
+
255
+ Normally as soon as you begin a click the item will be selected.
256
+
257
+ In some UI scenarios, you might want to prevent selection until
258
+ the mouse is released, so you can perform, for instance, a drag operation
259
+ without actually selecting the target item.
260
+
261
+ @property {Boolean}
262
+ */
263
+ selectOnMouseDown: YES,
264
+
265
+ /**
266
+ The view class to use when creating new item views.
267
+
268
+ The collection view will automatically create an instance of the view
269
+ class you set here for each item in its content array. You should provide
270
+ your own subclass for this property to display the type of content you
271
+ want.
272
+
273
+ For best results, the view you set here should understand the following
274
+ properties:
275
+
276
+ - *content* The content object from the content array your view should display
277
+ - *isEnabled* True if the view should appear enabled
278
+ - *isSelected* True if the view should appear selected
279
+
280
+ In general you do not want your child views to actually respond to mouse
281
+ and keyboard events themselves. It is better to let the collection view
282
+ do that.
283
+
284
+ If you do implement your own event handlers such as mouseDown or mouseUp,
285
+ you should be sure to actually call the same method on the collection view
286
+ to give it the chance to perform its own selection housekeeping.
287
+
288
+ @property {SC.View}
289
+ */
290
+ exampleView: SC.ListItemView,
291
+
292
+ /**
293
+ If set, this key will be used to get the example view for a given
294
+ content object. The exampleView property will be ignored.
295
+
296
+ @property {String}
297
+ */
298
+ contentExampleViewKey: null,
299
+
300
+ /**
301
+ The view class to use when creating new group item views.
302
+
303
+ The collection view will automatically create an instance of the view
304
+ class you set here for each item in its content array. You should provide
305
+ your own subclass for this property to display the type of content you
306
+ want.
307
+
308
+ If you leave this set to null then the regular example view will be used
309
+ with the isGroupView property set to YES on the item view.
310
+
311
+ @property {SC.View}
312
+ */
313
+ groupExampleView: null,
314
+
315
+ /**
316
+ If set, this key will be used to get the example view for a given
317
+ content object. The groupExampleView property will be ignored.
318
+
319
+ @property {String}
320
+ */
321
+ contentGroupExampleViewKey: null,
322
+
323
+ /**
324
+ Invoked when the user double clicks on an item (or single clicks of
325
+ actOnSelect is true)
326
+
327
+ Set this to the name of the action you want to send down the
328
+ responder chain when the user double clicks on an item (or single clicks
329
+ if actOnSelect is true). You can optionally specify a specific target as
330
+ well using the target property.
331
+
332
+ If you do not specify an action, then the collection view will also try to
333
+ invoke the action named on the target item view.
334
+
335
+ Older versions of SproutCore expected the action property to contain an
336
+ actual function that would be run. This format is still supported but is
337
+ deprecated for future use. You should generally use the responder chain
338
+ to handle your action for you.
339
+
340
+ @property {String}
341
+ */
342
+ action: null,
343
+
344
+ /**
345
+ Optional target to send the action to when the user double clicks.
346
+
347
+ If you set the action property to the name of an action, you can
348
+ optionally specify the target object you want the action to be sent to.
349
+ This can be either an actual object or a property path that will resolve
350
+ to an object at the time that the action is invoked.
351
+
352
+ This property is ignored if you use the deprecated approach of making the
353
+ action property a function.
354
+
355
+ @property {String|Object}
356
+ */
357
+ target: null,
358
+
359
+ /**
360
+ Property on content items to use for display.
361
+
362
+ Built-in item views such as the LabelViews and ImageViews will use the
363
+ value of this property as a key on the content object to determine the
364
+ value they should display.
365
+
366
+ For example, if you set contentValueKey to 'name' and set the
367
+ exampleView to an SC.LabelView, then the label views created by the
368
+ colleciton view will display the value of the content.name.
369
+
370
+ If you are writing your own custom item view for a collection, you can
371
+ get this behavior automatically by including the SC.Control mixin on your
372
+ view. You can also ignore this property if you like. The collection view
373
+ itself does not use this property to impact rendering.
374
+
375
+ @property {String}
376
+ */
377
+ contentValueKey: null,
378
+
379
+ /**
380
+ Enables keyboard-based navigate, deletion, etc. if set to true.
381
+ */
382
+ acceptsFirstResponder: NO,
383
+
384
+ /**
385
+ Changing this property value by default will cause the CollectionView to
386
+ add/remove an 'active' class name to the root element.
387
+
388
+ @type Boolean
389
+ */
390
+ isActive: NO,
391
+
392
+
393
+ /**
394
+ This property is used to store the calculated height to have
395
+ a consistent scrolling behavior due to the issues generated by using top
396
+ instead of scrollTop. We could look at the min-height set in the view, but
397
+ to avoid perf hits we simply store it and the scrollView will use it if
398
+ different than 0.
399
+
400
+ @type Number
401
+ */
402
+ calculatedHeight: 0,
403
+
404
+ /**
405
+ This property is used to store the calculated width to have
406
+ a consistent scrolling behavior due to the issues generated by using left
407
+ instead of scrollLeft. We could look at the min-width set in the view, but
408
+ to avoid perf hits we simply store it and the scrollView will use it if
409
+ different than 0.
410
+
411
+ @type Number
412
+ */
413
+ calculatedWidth: 0,
414
+
415
+
416
+ // ..........................................................
417
+ // SUBCLASS METHODS
418
+ //
419
+
420
+ /**
421
+ Override to return the computed layout dimensions of the collection view.
422
+ You can omit any dimensions you don't care about setting in your
423
+ computed value.
424
+
425
+ This layout is automatically applied whenever the content changes.
426
+
427
+ If you don't care about computing the layout at all, you can return null.
428
+
429
+ @returns {Hash} layout properties
430
+ */
431
+ computeLayout: function() { return null; },
432
+
433
+ /**
434
+ Override to compute the layout of the itemView for the content at the
435
+ specified index. This layout will be applied to the view just before it
436
+ is rendered.
437
+
438
+ @param {Number} contentIndex the index of content being rendered by
439
+ itemView
440
+ @returns {Hash} a view layout
441
+ */
442
+ layoutForContentIndex: function(contentIndex) {
443
+ return null ;
444
+ },
445
+
446
+ /**
447
+ This computed property returns an index set selecting all content indexes.
448
+ It will recompute anytime the length of the collection view changes.
449
+
450
+ This is used by the default contentIndexesInRect() implementation.
451
+
452
+ @property {SC.Range}
453
+ */
454
+ allContentIndexes: function() {
455
+ return SC.IndexSet.create(0, this.get('length')).freeze();
456
+ }.property('length').cacheable(),
457
+
458
+ /**
459
+ Override to return an IndexSet with the indexes that are at least
460
+ partially visible in the passed rectangle. This method is used by the
461
+ default implementation of computeNowShowing() to determine the new
462
+ nowShowing range after a scroll.
463
+
464
+ Override this method to implement incremental rendering.
465
+
466
+ The default simply returns the current content length.
467
+
468
+ @param {Rect} rect the visible rect
469
+ @returns {SC.IndexSet} now showing indexes
470
+ */
471
+ contentIndexesInRect: function(rect) {
472
+ return null; // select all
473
+ },
474
+
475
+ /**
476
+ Compute the nowShowing index set. The default implementation simply
477
+ returns the full range. Override to implement incremental rendering.
478
+
479
+ You should not normally call this method yourself. Instead get the
480
+ nowShowing property.
481
+
482
+ @returns {SC.IndexSet} new now showing range
483
+ */
484
+ computeNowShowing: function() {
485
+ var r = this.contentIndexesInRect(this.get('clippingFrame'));
486
+ if (!r) r = this.get('allContentIndexes'); // default show all
487
+
488
+ // make sure the index set doesn't contain any indexes greater than the
489
+ // actual content.
490
+ else {
491
+ var len = this.get('length'),
492
+ max = r.get('max');
493
+ if (max > len) r = r.copy().remove(len, max-len).freeze();
494
+ }
495
+
496
+ return r ;
497
+ },
498
+
499
+ /**
500
+ Override to show the insertion point during a drag.
501
+
502
+ Called during a drag to show the insertion point. Passed value is the
503
+ item view that you should display the insertion point before. If the
504
+ passed value is null, then you should show the insertion point AFTER that
505
+ last item view returned by the itemViews property.
506
+
507
+ Once this method is called, you are guaranteed to also recieve a call to
508
+ hideInsertionPoint() at some point in the future.
509
+
510
+ The default implementation of this method does nothing.
511
+
512
+ @param itemView {SC.ClassicView} view the insertion point should appear directly before. If null, show insertion point at end.
513
+ @param dropOperation {Number} the drop operation. will be SC.DROP_BEFORE, SC.DROP_AFTER, or SC.DROP_ON
514
+
515
+ @returns {void}
516
+ */
517
+ showInsertionPoint: function(itemView, dropOperation) {
518
+ },
519
+
520
+ /**
521
+ Override to hide the insertion point when a drag ends.
522
+
523
+ Called during a drag to hide the insertion point. This will be called
524
+ when the user exits the view, cancels the drag or completes the drag. It
525
+ will not be called when the insertion point changes during a drag.
526
+
527
+ You should expect to receive one or more calls to
528
+ showInsertionPointBefore() during a drag followed by at least one call to
529
+ this method at the end. Your method should not raise an error if it is
530
+ called more than once.
531
+
532
+ @returns {void}
533
+ */
534
+ hideInsertionPoint: function() {
535
+ },
536
+
537
+ // ..........................................................
538
+ // DELEGATE SUPPORT
539
+ //
540
+
541
+
542
+ /**
543
+ Delegate used to implement fine-grained control over collection view
544
+ behaviors.
545
+
546
+ You can assign a delegate object to this property that will be consulted
547
+ for various decisions regarding drag and drop, selection behavior, and
548
+ even rendering. The object you place here must implement some or all of
549
+ the SC.CollectionViewDelegate mixin.
550
+
551
+ If you do not supply a delegate but the content object you set implements
552
+ the SC.CollectionViewDelegate mixin, then the content will be
553
+ automatically set as the delegate. Usually you will work with a
554
+ CollectionView in this way rather than setting a delegate explicitly.
555
+
556
+ @type {SC.CollectionViewDelegate}
557
+ */
558
+ delegate: null,
559
+
560
+ /**
561
+ The delegate responsible for handling selection changes. This property
562
+ will be either the delegate, content, or the collection view itself,
563
+ whichever implements the SC.CollectionViewDelegate mixin.
564
+
565
+ @property
566
+ @type {Object}
567
+ */
568
+ selectionDelegate: function() {
569
+ var del = this.get('delegate'), content = this.get('content');
570
+ return this.delegateFor('isCollectionViewDelegate', del, content);
571
+ }.property('delegate', 'content').cacheable(),
572
+
573
+ /**
574
+ The delegate responsible for providing additional display information
575
+ about the content. If you bind a collection view to a controller, this
576
+ the content will usually also be the content delegate, though you
577
+ could implement your own delegate if you prefer.
578
+
579
+ @property
580
+ @type {Object}
581
+ */
582
+ contentDelegate: function() {
583
+ var del = this.get('delegate'), content = this.get('content');
584
+ return this.delegateFor('isCollectionContent', del, content);
585
+ }.property('delegate', 'content').cacheable(),
586
+
587
+
588
+ /** @private
589
+ A cache of the contentGroupIndexes value returned by the delegate. This
590
+ is frequently accessed and usually involves creating an SC.IndexSet
591
+ object, so it's worthwhile to cache.
592
+ */
593
+ _contentGroupIndexes: function() {
594
+ return this.get('contentDelegate').contentGroupIndexes(this, this.get('content'));
595
+ }.property('contentDelegate', 'content').cacheable(),
596
+
597
+ // ..........................................................
598
+ // CONTENT CHANGES
599
+ //
600
+
601
+ /**
602
+ Called whenever the content array or an item in the content array or a
603
+ property on an item in the content array changes. Reloads the appropriate
604
+ item view when the content array itself changes or calls
605
+ contentPropertyDidChange() if a property changes.
606
+
607
+ Normally you will not call this method directly though you may override
608
+ it if you need to change the way changes to observed ranges are handled.
609
+
610
+ @param {SC.Array} content the content array generating the change
611
+ @param {Object} object the changed object
612
+ @param {String} key the changed property or '[]' or an array change
613
+ @param {SC.IndexSet} indexes affected indexes or null for all items
614
+ @returns {void}
615
+ */
616
+ contentRangeDidChange: function(content, object, key, indexes) {
617
+ if (!object && (key === '[]')) {
618
+ this.notifyPropertyChange('_contentGroupIndexes');
619
+ this.reload(indexes); // note: if indexes == null, reloads all
620
+ } else {
621
+ this.contentPropertyDidChange(object, key, indexes);
622
+ }
623
+ },
624
+
625
+ /**
626
+ Called whenever a property on an item in the content array changes. This
627
+ is only called if you have set observesContentProperties to YES.
628
+
629
+ Override this property if you want to do some custom work whenever a
630
+ property on a content object changes.
631
+
632
+ The default implementation does nothing.
633
+
634
+ @param {Object} target the object that changed
635
+ @param {String} key the property that changed value
636
+ @param {SC.IndexSet} indexes the indexes in the content array affected
637
+ @returns {void}
638
+ */
639
+ contentPropertyDidChange: function(target, key, indexes) {
640
+ // Default Does Nothing
641
+ },
642
+
643
+ /**
644
+ Called whenever the view needs to updates it's contentRangeObserver to
645
+ reflect the current nowShowing index set. You will not usually call this
646
+ method yourself but you may override it if you need to provide some
647
+ custom range observer behavior.
648
+
649
+ Note that if you do implement this method, you are expected to maintain
650
+ the range observer object yourself. If a range observer has not been
651
+ created yet, this method should create it. If an observer already exists
652
+ this method should udpate it.
653
+
654
+ When you create a new range observer, the oberver must eventually call
655
+ contentRangeDidChange() for the collection view to function properly.
656
+
657
+ If you override this method you probably also need to override
658
+ destroyRangeObserver() to cleanup any existing range observer.
659
+
660
+ @returns {void}
661
+ */
662
+ updateContentRangeObserver: function() {
663
+ var nowShowing = this.get('nowShowing'),
664
+ observer = this._cv_contentRangeObserver,
665
+ content = this.get('content');
666
+
667
+ if (!content) return ; // nothing to do
668
+
669
+ if (observer) {
670
+ content.updateRangeObserver(observer, nowShowing);
671
+ } else {
672
+ var func = this.contentRangeDidChange;
673
+ observer = content.addRangeObserver(nowShowing, this, func, null);
674
+ this._cv_contentRangeObserver = observer ;
675
+ }
676
+
677
+ },
678
+
679
+ /**
680
+ Called whever the view needs to invalidate the current content range
681
+ observer. This is called whenever the content array changes. You will
682
+ not usually call this method yourself but you may override it if you
683
+ provide your own range observer behavior.
684
+
685
+ Note that if you override this method you should probably also override
686
+ updateRangeObserver() to create or update a range oberver as needed.
687
+
688
+ @returns {void}
689
+ */
690
+ removeContentRangeObserver: function() {
691
+ var content = this.get('content'),
692
+ observer = this._cv_contentRangeObserver ;
693
+
694
+ if (observer) {
695
+ if (content) content.removeRangeObserver(observer);
696
+ this._cv_contentRangeObserver = null ;
697
+ }
698
+ },
699
+
700
+ /**
701
+ Called whenever the content length changes. This will invalidate the
702
+ length property of the view itself causing the nowShowing to recompute
703
+ which will in turn update the UI accordingly.
704
+
705
+ @returns {void}
706
+ */
707
+ contentLengthDidChange: function() {
708
+ var content = this.get('content');
709
+ this.set('length', content ? content.get('length') : 0);
710
+ },
711
+
712
+ /** @private
713
+ Whenever content property changes to a new value:
714
+
715
+ - remove any old observers
716
+ - setup new observers (maybe wait until end of runloop to do this?)
717
+ - recalc height/reload content
718
+ - set content as delegate if delegate was old content
719
+ - reset selection
720
+
721
+ Whenever content array mutates:
722
+
723
+ - possibly stop observing property changes on objects, observe new objs
724
+ - reload effected item views
725
+ - update layout for receiver
726
+ */
727
+ _cv_contentDidChange: function() {
728
+ var content = this.get('content'),
729
+ lfunc = this.contentLengthDidChange ;
730
+
731
+ if (content === this._content) return; // nothing to do
732
+
733
+ // cleanup old content
734
+ this.removeContentRangeObserver();
735
+ if (this._content) {
736
+ this._content.removeObserver('length', this, lfunc);
737
+ }
738
+
739
+ // cache
740
+ this._content = content;
741
+
742
+ // add new observers - range observer will be added lazily
743
+ if (content) {
744
+ content.addObserver('length', this, lfunc);
745
+ }
746
+
747
+ // notify all items changed
748
+ this.contentLengthDidChange();
749
+ this.contentRangeDidChange(content, null, '[]', null);
750
+
751
+ }.observes('content'),
752
+
753
+ // ..........................................................
754
+ // ITEM VIEWS
755
+ //
756
+
757
+ /** @private
758
+
759
+ The indexes that need to be reloaded. Must be one of YES, NO, or an
760
+ SC.IndexSet.
761
+
762
+ */
763
+ _invalidIndexes: NO,
764
+
765
+ /**
766
+ Regenerates the item views for the content items at the specified indexes.
767
+ If you pass null instead of an index set, regenerates all item views.
768
+
769
+ This method is called automatically whenever the content array changes in
770
+ an observable way, but you can call its yourself also if you need to
771
+ refresh the collection view for some reason.
772
+
773
+ Note that if the length of the content is shorter than the child views
774
+ and you call this method, then the child views will be removed no matter
775
+ what the index.
776
+
777
+ @param {SC.IndexSet} indexes
778
+ @returns {SC.CollectionView} receiver
779
+ */
780
+ reload: function(indexes) {
781
+ var invalid = this._invalidIndexes ;
782
+ if (indexes && invalid !== YES) {
783
+ if (invalid) invalid.add(indexes);
784
+ else invalid = this._invalidIndexes = indexes.clone();
785
+
786
+ }
787
+ else {
788
+ this._invalidIndexes = YES ; // force a total reload
789
+ }
790
+
791
+ if (this.get('isVisibleInWindow')) this.invokeOnce(this.reloadIfNeeded);
792
+
793
+ return this ;
794
+ },
795
+
796
+ /**
797
+ Invoked once per runloop to actually reload any needed item views.
798
+ You can call this method at any time to actually force the reload to
799
+ happen immediately if any item views need to be reloaded.
800
+
801
+ Note that this method will also invoke two other callback methods if you
802
+ define them on your subclass:
803
+
804
+ - *willReload()* is called just before the items are reloaded
805
+ - *didReload()* is called jsut after items are reloaded
806
+
807
+ You can use these two methods to setup and teardown caching, which may
808
+ reduce overall cost of a reload. Each method will be passed an index set
809
+ of items that are reloaded or null if all items are reloaded.
810
+
811
+ @returns {SC.CollectionView} receiver
812
+ */
813
+ reloadIfNeeded: function() {
814
+ var invalid = this._invalidIndexes;
815
+ if (!invalid || !this.get('isVisibleInWindow')) return this ; // delay
816
+ this._invalidIndexes = NO ;
817
+
818
+ var content = this.get('content'),
819
+ i, len, existing,
820
+ layout = this.computeLayout(),
821
+ bench = SC.BENCHMARK_RELOAD,
822
+ nowShowing = this.get('nowShowing'),
823
+ itemViews = this._sc_itemViews,
824
+ containerView = this.get('containerView') || this,
825
+ exampleView, groupExampleView,
826
+ shouldReuseViews, shouldReuseGroupViews, shouldReuse,
827
+ viewsToRemove, viewsToRedraw, viewsToCreate,
828
+ views, idx, view, layer, parentNode, viewPool,
829
+ del, groupIndexes, isGroupView;
830
+
831
+ // if the set is defined but it contains the entire nowShowing range, just
832
+ // replace
833
+ if (invalid.isIndexSet && invalid.contains(nowShowing)) invalid = YES ;
834
+ if (this.willReload) this.willReload(invalid === YES ? null : invalid);
835
+
836
+
837
+ // Up-front, figure out whether the view class (and, if applicable,
838
+ // group view class) is re-usable. If so, it's beneficial for us to
839
+ // first return all no-longer-needed views to the pool before allocating
840
+ // new ones, because that will maximize the potential for re-use.
841
+ exampleView = this.get('exampleView');
842
+ shouldReuseViews = exampleView ? exampleView.isReusableInCollections : NO;
843
+ groupExampleView = this.get('groupExampleView');
844
+ shouldReuseGroupViews = groupExampleView ? groupExampleView.isReusableInCollections : NO;
845
+
846
+ // if an index set, just update indexes
847
+ if (invalid.isIndexSet) {
848
+ if (bench) {
849
+ SC.Benchmark.start(bench="%@#reloadIfNeeded (Partial)".fmt(this),YES);
850
+ }
851
+
852
+ // Each of these arrays holds indexes.
853
+ viewsToRemove = [];
854
+ viewsToRedraw = [];
855
+ viewsToCreate = [];
856
+
857
+ invalid.forEach(function(idx) {
858
+ // get the existing item view, if there is one
859
+ existing = itemViews ? itemViews[idx] : null;
860
+
861
+ // if nowShowing, then reload the item view.
862
+ if (nowShowing.contains(idx)) {
863
+ if (existing && existing.parentView === containerView) {
864
+ viewsToRedraw.push(idx);
865
+
866
+ } else {
867
+ viewsToCreate.push(idx);
868
+ }
869
+
870
+ // if not nowShowing, then remove the item view if needed
871
+ } else if (existing && existing.parentView === containerView) {
872
+ viewsToRemove.push(idx);
873
+ }
874
+ },this);
875
+
876
+
877
+ // Now that we know what operations we need to perform, let's perform
878
+ // all the removals first…
879
+ for (i = 0, len = viewsToRemove.length; i < len; ++i) {
880
+ idx = viewsToRemove[i];
881
+ existing = itemViews ? itemViews[idx] : null;
882
+ delete itemViews[idx];
883
+
884
+ // If this view class is reusable, then add it back to the pool.
885
+ del = this.get('contentDelegate');
886
+ groupIndexes = this.get('_contentGroupIndexes');
887
+ isGroupView = groupIndexes && groupIndexes.contains(idx);
888
+ if (isGroupView) isGroupView = del.contentIndexIsGroup(this, content, idx);
889
+ shouldReuse = isGroupView ? shouldReuseGroupViews : shouldReuseViews;
890
+ if (shouldReuse) {
891
+ viewPool = isGroupView ? this._GROUP_VIEW_POOL : this._VIEW_POOL;
892
+
893
+ viewPool.push(existing);
894
+
895
+ // Because it's possible that we'll return this view to the pool
896
+ // and then immediately re-use it, there's the potential that the
897
+ // layer will not be correctly destroyed, because that support
898
+ // (built into removeChild) is coalesced at the runloop, and we
899
+ // will likely change the layerId when re-using the view. So
900
+ // we'll destroy the layer now.
901
+ existing.destroyLayer();
902
+ }
903
+
904
+ // We don't want the old layer hanging around, even if we are going
905
+ // to reuse it.
906
+ // (Charles Jolley personally guarantees this code)
907
+ layer = existing.get('layer');
908
+ layer.parentNode.removeChild(layer);
909
+
910
+ containerView.removeChild(existing);
911
+ }
912
+
913
+ // …then the redraws…
914
+ for (i = 0, len = viewsToRedraw.length; i < len; ++i) {
915
+ idx = viewsToRedraw[i];
916
+ existing = itemViews ? itemViews[idx] : null;
917
+ view = this.itemViewForContentIndex(idx, YES);
918
+
919
+ // if the existing view has a layer, remove it immediately from
920
+ // the parent. This is necessary because the old and new views
921
+ // will use the same layerId
922
+ existing.destroyLayer();
923
+ containerView.replaceChild(view, existing);
924
+ }
925
+
926
+ // …and finally the creations.
927
+ for (i = 0, len = viewsToCreate.length; i < len; ++i) {
928
+ idx = viewsToCreate[i];
929
+ view = this.itemViewForContentIndex(idx, YES);
930
+ containerView.insertBefore(view, null); // Equivalent to 'append()', but avoids one more function call
931
+ }
932
+
933
+
934
+ if (bench) SC.Benchmark.end(bench);
935
+
936
+ // if set is NOT defined, replace entire content with nowShowing
937
+ } else {
938
+ if (bench) {
939
+ SC.Benchmark.start(bench="%@#reloadIfNeeded (Full)".fmt(this),YES);
940
+ }
941
+
942
+ // truncate cached item views since they will all be removed from the
943
+ // container anyway.
944
+ if (itemViews) itemViews.length = 0 ;
945
+
946
+ views = containerView.get('childViews');
947
+ if (views) views = views.copy();
948
+
949
+ // below is an optimized version of:
950
+ //this.replaceAllChildren(views);
951
+ containerView.beginPropertyChanges();
952
+ // views = containerView.get('views');
953
+ if (this.willRemoveAllChildren) this.willRemoveAllChildren() ;
954
+ containerView.destroyLayer().removeAllChildren();
955
+
956
+ // For all previous views that can be re-used, return them to the pool.
957
+ if (views) {
958
+ for (i = 0, len = views.length; i < len; ++i) {
959
+ view = views[i];
960
+ isGroupView = view.get('isGroupView');
961
+ shouldReuse = isGroupView ? shouldReuseGroupViews : shouldReuseViews;
962
+ if (shouldReuse) {
963
+ viewPool = isGroupView ? this._GROUP_VIEW_POOL : this._VIEW_POOL;
964
+
965
+ viewPool.push(view);
966
+
967
+ // Because it's possible that we'll return this view to the pool
968
+ // and then immediately re-use it, there's the potential that the
969
+ // layer will not be correctly destroyed, because that support
970
+ // (built into removeChild) is coalesced at the runloop, and we
971
+ // will likely change the layerId when re-using the view. So
972
+ // we'll destroy the layer now.
973
+ view.destroyLayer();
974
+ }
975
+ }
976
+ }
977
+
978
+
979
+ // Only after the children are removed should we create the new views.
980
+ // We do this in order to maximize the change of re-use should the view
981
+ // be marked as such.
982
+ views = [];
983
+ nowShowing.forEach(function(idx) {
984
+ views.push(this.itemViewForContentIndex(idx, YES));
985
+ }, this);
986
+
987
+
988
+ containerView.set('childViews', views); // quick swap
989
+ containerView.replaceLayer();
990
+ containerView.endPropertyChanges();
991
+
992
+ if (bench) SC.Benchmark.end(bench);
993
+
994
+ }
995
+
996
+ // adjust my own layout if computed
997
+ if (layout) this.adjust(layout);
998
+ if (this.didReload) this.didReload(invalid === YES ? null : invalid);
999
+
1000
+ return this ;
1001
+ },
1002
+
1003
+ displayProperties: 'isFirstResponder isEnabled isActive'.w(),
1004
+
1005
+ /** @private
1006
+ If we're asked to render the receiver view for the first time but the
1007
+ child views still need to be added, go ahead and add them.
1008
+ */
1009
+ render: function(context, firstTime) {
1010
+ // add classes for other state.
1011
+ context.setClass('focus', this.get('isFirstResponder'));
1012
+ context.setClass('disabled', !this.get('isEnabled'));
1013
+ context.setClass('active', this.get('isActive'));
1014
+
1015
+ return sc_super();
1016
+ },
1017
+
1018
+
1019
+ _TMP_ATTRS: {},
1020
+ _COLLECTION_CLASS_NAMES: 'sc-collection-item'.w(),
1021
+ _GROUP_COLLECTION_CLASS_NAMES: 'sc-collection-item sc-group-item'.w(),
1022
+ _VIEW_POOL: null,
1023
+ _GROUP_VIEW_POOL: null,
1024
+
1025
+ /**
1026
+ Returns the item view for the content object at the specified index. Call
1027
+ this method instead of accessing child views directly whenever you need
1028
+ to get the view associated with a content index.
1029
+
1030
+ Although this method take two parameters, you should almost always call
1031
+ it with just the content index. The other two parameters are used
1032
+ internally by the CollectionView.
1033
+
1034
+ If you need to change the way the collection view manages item views
1035
+ you can override this method as well. If you just want to change the
1036
+ default options used when creating item views, override createItemView()
1037
+ instead.
1038
+
1039
+ Note that if you override this method, then be sure to implement this
1040
+ method so that it uses a cache to return the same item view for a given
1041
+ index unless "force" is YES. In that case, generate a new item view and
1042
+ replace the old item view in your cache with the new item view.
1043
+
1044
+ @param {Number} idx the content index
1045
+ @param {Boolean} rebuild internal use only
1046
+ @returns {SC.View} instantiated view
1047
+ */
1048
+ itemViewForContentIndex: function(idx, rebuild) {
1049
+ var ret;
1050
+
1051
+ // Use the cached view for this index, if we have it. We'll do this up-
1052
+ // front to avoid
1053
+ var itemViews = this._sc_itemViews;
1054
+ if (!itemViews) {
1055
+ itemViews = this._sc_itemViews = [] ;
1056
+ }
1057
+ else if (!rebuild && (ret = itemViews[idx])) {
1058
+ return ret ;
1059
+ }
1060
+
1061
+ // return from cache if possible
1062
+ var content = this.get('content'),
1063
+ item = content.objectAt(idx),
1064
+ del = this.get('contentDelegate'),
1065
+ groupIndexes = this.get('_contentGroupIndexes'),
1066
+ isGroupView = NO,
1067
+ key, E, layout, layerId,
1068
+ viewPoolKey, viewPool, reuseFunc, parentView, isEnabled, isSelected,
1069
+ outlineLevel, disclosureState, isVisibleInWindow;
1070
+
1071
+ // otherwise generate...
1072
+
1073
+ // first, determine the class to use
1074
+ isGroupView = groupIndexes && groupIndexes.contains(idx);
1075
+ if (isGroupView) isGroupView = del.contentIndexIsGroup(this, content,idx);
1076
+ if (isGroupView) {
1077
+ key = this.get('contentGroupExampleViewKey');
1078
+ if (key && item) E = item.get(key);
1079
+ if (!E) E = this.get('groupExampleView') || this.get('exampleView');
1080
+ viewPoolKey = '_GROUP_VIEW_POOL';
1081
+ } else {
1082
+ key = this.get('contentExampleViewKey');
1083
+ if (key && item) E = item.get(key);
1084
+ if (!E) E = this.get('exampleView');
1085
+ viewPoolKey = '_VIEW_POOL';
1086
+ }
1087
+
1088
+
1089
+ // Collect other state that we'll need whether we're re-using a previous
1090
+ // view or creating a new view.
1091
+ parentView = this.get('containerView') || this;
1092
+ layerId = this.layerIdFor(idx);
1093
+ isEnabled = del.contentIndexIsEnabled(this, content, idx);
1094
+ isSelected = del.contentIndexIsSelected(this, content, idx);
1095
+ outlineLevel = del.contentIndexOutlineLevel(this, content, idx);
1096
+ disclosureState = del.contentIndexDisclosureState(this, content, idx);
1097
+ isVisibleInWindow = this.isVisibleInWindow;
1098
+ layout = this.layoutForContentIndex(idx);
1099
+
1100
+
1101
+ // If the view is reusable and there is an appropriate view inside the
1102
+ // pool, simply reuse it to avoid having to create a new view.
1103
+ if (E && E.isReusableInCollections) {
1104
+ // Lazily create the view pool.
1105
+ viewPool = this[viewPoolKey];
1106
+ if (!viewPool) viewPool = this[viewPoolKey] = [];
1107
+
1108
+ // Is there a view we can re-use?
1109
+ if (viewPool.length > 0) {
1110
+ ret = viewPool.pop();
1111
+
1112
+ // Tell the view it's about to be re-used.
1113
+ reuseFunc = ret.prepareForReuse;
1114
+ if (reuseFunc) reuseFunc.call(ret);
1115
+
1116
+ // Set the new state. We'll set content last, because it's the most
1117
+ // likely to have observers.
1118
+ ret.beginPropertyChanges();
1119
+ ret.set('contentIndex', idx);
1120
+ ret.set('layerId', layerId);
1121
+ ret.set('isEnabled', isEnabled);
1122
+ ret.set('isSelected', isSelected);
1123
+ ret.set('outlineLevel', outlineLevel);
1124
+ ret.set('disclosureState', disclosureState);
1125
+ ret.set('isVisibleInWindow', isVisibleInWindow);
1126
+
1127
+ // TODO: In theory this shouldn't be needed, but without it, we
1128
+ // sometimes get errors when doing a full reload, because
1129
+ // 'childViews' contains the view but the parent is not set.
1130
+ // This implies a timing issue with the general flow of
1131
+ // collection view.
1132
+ ret.set('parentView', parentView);
1133
+
1134
+ // Since we re-use layerIds, we need to reset SproutCore's internal
1135
+ // mapping table.
1136
+ SC.View.views[layerId] = ret;
1137
+
1138
+ if (layout) {
1139
+ ret.set('layout', layout);
1140
+ }
1141
+ else {
1142
+ ret.set('layout', E.prototype.layout);
1143
+ }
1144
+ ret.set('content', item);
1145
+ ret.endPropertyChanges();
1146
+ }
1147
+ }
1148
+
1149
+ // If we weren't able to re-use a view, then create a new one.
1150
+ if (!ret) {
1151
+ // collect some other state
1152
+ var attrs = this._TMP_ATTRS;
1153
+ attrs.contentIndex = idx;
1154
+ attrs.content = item;
1155
+ attrs.owner = attrs.displayDelegate = this;
1156
+ attrs.parentView = parentView; // Same here; shouldn't be needed
1157
+ attrs.page = this.page;
1158
+ attrs.layerId = layerId;
1159
+ attrs.isEnabled = isEnabled;
1160
+ attrs.isSelected = isSelected;
1161
+ attrs.outlineLevel = outlineLevel;
1162
+ attrs.disclosureState = disclosureState;
1163
+ attrs.isGroupView = isGroupView;
1164
+ attrs.isVisibleInWindow = isVisibleInWindow;
1165
+ if (isGroupView) attrs.classNames = this._GROUP_COLLECTION_CLASS_NAMES;
1166
+ else attrs.classNames = this._COLLECTION_CLASS_NAMES;
1167
+
1168
+ if (layout) {
1169
+ attrs.layout = layout;
1170
+ } else {
1171
+ delete attrs.layout ;
1172
+ }
1173
+
1174
+ ret = this.createItemView(E, idx, attrs);
1175
+ }
1176
+
1177
+ itemViews[idx] = ret ;
1178
+ return ret ;
1179
+ },
1180
+
1181
+ /**
1182
+ Helper method for getting the item view of a specific content object
1183
+
1184
+ @param {Object} object
1185
+ */
1186
+ itemViewForContentObject: function(object) {
1187
+ return this.itemViewForContentIndex(this.get('content').indexOf(object));
1188
+ },
1189
+
1190
+ _TMP_LAYERID: [],
1191
+
1192
+ /**
1193
+ Primitive to instantiate an item view. You will be passed the class
1194
+ and a content index. You can override this method to perform any other
1195
+ one time setup.
1196
+
1197
+ Note that item views may be created somewhat frequently so keep this fast.
1198
+
1199
+ *IMPORTANT:* The attrs hash passed is reused each time this method is
1200
+ called. If you add properties to this hash be sure to delete them before
1201
+ returning from this method.
1202
+
1203
+ @param {Class} exampleClass example view class
1204
+ @param {Number} idx the content index
1205
+ @param {Hash} attrs expected attributes
1206
+ @returns {SC.View} item view instance
1207
+ */
1208
+ createItemView: function(exampleClass, idx, attrs) {
1209
+ return exampleClass.create(attrs);
1210
+ },
1211
+
1212
+ /**
1213
+ Generates a layerId for the passed index and item. Usually the default
1214
+ implementation is suitable.
1215
+
1216
+ @param {Number} idx the content index
1217
+ @returns {String} layer id, must be suitable for use in HTML id attribute
1218
+ */
1219
+ layerIdFor: function(idx) {
1220
+ var ret = this._TMP_LAYERID;
1221
+ ret[0] = SC.guidFor(this);
1222
+ ret[1] = idx;
1223
+ return ret.join('-');
1224
+ },
1225
+
1226
+ /**
1227
+ Extracts the content index from the passed layerID. If the layer id does
1228
+ not belong to the receiver or if no value could be extracted, returns NO.
1229
+
1230
+ @param {String} id the layer id
1231
+ */
1232
+ contentIndexForLayerId: function(id) {
1233
+ if (!id || !(id = id.toString())) return null ; // nothing to do
1234
+
1235
+ var base = this._baseLayerId;
1236
+ if (!base) base = this._baseLayerId = SC.guidFor(this)+"-";
1237
+
1238
+ // no match
1239
+ if ((id.length <= base.length) || (id.indexOf(base) !== 0)) return null ;
1240
+ var ret = Number(id.slice(id.lastIndexOf('-')+1));
1241
+ return isNaN(ret) ? null : ret ;
1242
+ },
1243
+
1244
+
1245
+ /**
1246
+ Find the first content item view for the passed event.
1247
+
1248
+ This method will go up the view chain, starting with the view that was the
1249
+ target of the passed event, looking for a child item. This will become
1250
+ the view that is selected by the mouse event.
1251
+
1252
+ This method only works for mouseDown & mouseUp events. mouseMoved events
1253
+ do not have a target.
1254
+
1255
+ @param {SC.Event} evt An event
1256
+ @returns {SC.View} the item view or null
1257
+ */
1258
+ itemViewForEvent: function(evt) {
1259
+ var responder = this.getPath('pane.rootResponder') ;
1260
+ if (!responder) return null ; // fast path
1261
+
1262
+ var base = SC.guidFor(this) + '-',
1263
+ baseLen = base.length,
1264
+ element = evt.target,
1265
+ layer = this.get('layer'),
1266
+ contentIndex = null,
1267
+ id, itemView, ret ;
1268
+
1269
+ // walk up the element hierarchy until we find this or an element with an
1270
+ // id matching the base guid (i.e. a collection item)
1271
+ while (element && element !== document && element !== layer) {
1272
+ id = element ? SC.$(element).attr('id') : null ;
1273
+ if (id && (contentIndex = this.contentIndexForLayerId(id)) !== null) {
1274
+ break;
1275
+ }
1276
+ element = element.parentNode ;
1277
+ }
1278
+
1279
+ // no matching element found?
1280
+ if (contentIndex===null || (element === layer)) {
1281
+ element = layer = null; // avoid memory leaks
1282
+ return null;
1283
+ }
1284
+
1285
+ // okay, found the DOM node for the view, go ahead and create it
1286
+ // first, find the contentIndex
1287
+ if (contentIndex >= this.get('length')) {
1288
+ throw "layout for item view %@ was found when item view does not exist (%@)".fmt(id, this);
1289
+ }
1290
+
1291
+ return this.itemViewForContentIndex(contentIndex);
1292
+ },
1293
+
1294
+ // ..........................................................
1295
+ // DISCLOSURE SUPPORT
1296
+ //
1297
+
1298
+ /**
1299
+ Expands any items in the passed selection array that have a disclosure
1300
+ state.
1301
+
1302
+ @param {SC.IndexSet} indexes the indexes to expand
1303
+ @returns {SC.CollectionView} receiver
1304
+ */
1305
+ expand: function(indexes) {
1306
+ if (!indexes) return this; // nothing to do
1307
+ var del = this.get('contentDelegate'),
1308
+ content = this.get('content');
1309
+
1310
+ indexes.forEach(function(i) {
1311
+ var state = del.contentIndexDisclosureState(this, content, i);
1312
+ if (state === SC.BRANCH_CLOSED) del.contentIndexExpand(this,content,i);
1313
+ }, this);
1314
+ return this;
1315
+ },
1316
+
1317
+ /**
1318
+ Collapses any items in the passed selection array that have a disclosure
1319
+ state.
1320
+
1321
+ @param {SC.IndexSet} indexes the indexes to expand
1322
+ @returns {SC.CollectionView} receiver
1323
+ */
1324
+ collapse: function(indexes) {
1325
+ if (!indexes) return this; // nothing to do
1326
+ var del = this.get('contentDelegate'),
1327
+ content = this.get('content');
1328
+
1329
+ indexes.forEach(function(i) {
1330
+ var state = del.contentIndexDisclosureState(this, content, i);
1331
+ if (state === SC.BRANCH_OPEN) del.contentIndexCollapse(this,content,i);
1332
+ }, this);
1333
+ return this;
1334
+ },
1335
+
1336
+ // ..........................................................
1337
+ // SELECTION SUPPORT
1338
+ //
1339
+
1340
+ /** @private
1341
+
1342
+ Called whenever the selection object is changed to a new value. Begins
1343
+ observing the selection for changes.
1344
+
1345
+ */
1346
+ _cv_selectionDidChange: function() {
1347
+ var sel = this.get('selection'),
1348
+ last = this._cv_selection,
1349
+ func = this._cv_selectionContentDidChange;
1350
+
1351
+ if (sel === last) return; // nothing to do
1352
+ if (last) last.removeObserver('[]', this, func);
1353
+ if (sel) sel.addObserver('[]', this, func);
1354
+
1355
+ this._cv_selection = sel ;
1356
+ this._cv_selectionContentDidChange();
1357
+ }.observes('selection'),
1358
+
1359
+ /** @private
1360
+
1361
+ Called whenever the selection object or its content changes. This will
1362
+ repaint any items that changed their selection state.
1363
+
1364
+ */
1365
+ _cv_selectionContentDidChange: function() {
1366
+ var sel = this.get('selection'),
1367
+ last = this._cv_selindexes, // clone of last known indexes
1368
+ content = this.get('content'),
1369
+ diff ;
1370
+
1371
+ // save new last
1372
+ this._cv_selindexes = sel ? sel.frozenCopy() : null;
1373
+
1374
+ // determine which indexes are now invalid
1375
+ if (last) last = last.indexSetForSource(content);
1376
+ if (sel) sel = sel.indexSetForSource(content);
1377
+
1378
+ if (sel && last) diff = sel.without(last).add(last.without(sel));
1379
+ else diff = sel || last;
1380
+
1381
+ if (diff && diff.get('length')>0) this.reloadSelectionIndexes(diff);
1382
+ },
1383
+
1384
+ /** @private
1385
+ Contains the current item views that need their selection to be repainted.
1386
+ This may be either NO, YES, or an IndexSet.
1387
+ */
1388
+ _invalidSelection: NO,
1389
+
1390
+ /**
1391
+ Called whenever the selection changes. The passed index set will contain
1392
+ any affected indexes including those indexes that were previously
1393
+ selected and now should be deselected.
1394
+
1395
+ Pass null to reload the selection state for all items.
1396
+
1397
+ @param {SC.IndexSet} indexes affected indexes
1398
+ @returns {SC.CollectionView} reciever
1399
+ */
1400
+ reloadSelectionIndexes: function(indexes) {
1401
+ var invalid = this._invalidSelection ;
1402
+ if (indexes && (invalid !== YES)) {
1403
+ if (invalid) { invalid.add(indexes) ; }
1404
+ else { invalid = this._invalidSelection = indexes.copy(); }
1405
+
1406
+ } else this._invalidSelection = YES ; // force a total reload
1407
+
1408
+ if (this.get('isVisibleInWindow')) {
1409
+ this.invokeOnce(this.reloadSelectionIndexesIfNeeded);
1410
+ }
1411
+
1412
+ return this ;
1413
+ },
1414
+
1415
+ /**
1416
+ Reloads the selection state if needed on any dirty indexes. Normally this
1417
+ will run once at the end of the runloop, but you can force the item views
1418
+ to reload their selection immediately by calling this method.
1419
+
1420
+ You can also override this method if needed to change the way the
1421
+ selection is reloaded on item views. The default behavior will simply
1422
+ find any item views in the nowShowing range that are affected and
1423
+ modify them.
1424
+
1425
+ @returns {SC.CollectionView} receiver
1426
+ */
1427
+ reloadSelectionIndexesIfNeeded: function() {
1428
+ var invalid = this._invalidSelection;
1429
+ if (!invalid || !this.get('isVisibleInWindow')) return this ;
1430
+
1431
+ var nowShowing = this.get('nowShowing'),
1432
+ reload = this._invalidIndexes,
1433
+ content = this.get('content'),
1434
+ sel = this.get('selection');
1435
+
1436
+ this._invalidSelection = NO; // reset invalid
1437
+
1438
+ // fast path. if we are going to reload everything anyway, just forget
1439
+ // about it. Also if we don't have a nowShowing, nothing to do.
1440
+ if (reload === YES || !nowShowing) return this ;
1441
+
1442
+ // if invalid is YES instead of index set, just reload everything
1443
+ if (invalid === YES) invalid = nowShowing;
1444
+
1445
+ // if we will reload some items anyway, don't bother
1446
+ if (reload && reload.isIndexSet) invalid = invalid.without(reload);
1447
+
1448
+ // iterate through each item and set the isSelected state.
1449
+ invalid.forEach(function(idx) {
1450
+ if (!nowShowing.contains(idx)) return; // not showing
1451
+ var view = this.itemViewForContentIndex(idx, NO);
1452
+ if (view) view.set('isSelected', sel ? sel.contains(content, idx) : NO);
1453
+ },this);
1454
+
1455
+ return this ;
1456
+ },
1457
+
1458
+ /**
1459
+ Selection primitive. Selects the passed IndexSet of items, optionally
1460
+ extending the current selection. If extend is NO or not passed then this
1461
+ will replace the selection with the passed value. Otherwise the indexes
1462
+ will be added to the current selection.
1463
+
1464
+ @param {Number|SC.IndexSet} indexes index or indexes to select
1465
+ @param extend {Boolean} optionally extend the selection
1466
+ @returns {SC.CollectionView} receiver
1467
+ */
1468
+ select: function(indexes, extend) {
1469
+
1470
+ var content = this.get('content'),
1471
+ del = this.get('selectionDelegate'),
1472
+ groupIndexes = this.get('_contentGroupIndexes'),
1473
+ sel;
1474
+
1475
+ if(!this.get('isSelectable')) return this;
1476
+
1477
+ // normalize
1478
+ if (SC.typeOf(indexes) === SC.T_NUMBER) {
1479
+ indexes = SC.IndexSet.create(indexes, 1);
1480
+ }
1481
+
1482
+ // if we are passed an empty index set or null, clear the selection.
1483
+ if (indexes && indexes.get('length')>0) {
1484
+
1485
+ // first remove any group indexes - these can never be selected
1486
+ if (groupIndexes && groupIndexes.get('length')>0) {
1487
+ indexes = indexes.copy().remove(groupIndexes);
1488
+ }
1489
+
1490
+ // give the delegate a chance to alter the items
1491
+ indexes = del.collectionViewShouldSelectIndexes(this, indexes, extend);
1492
+ if (!indexes || indexes.get('length')===0) return this; // nothing to do
1493
+
1494
+ } else indexes = null;
1495
+
1496
+ // build the selection object, merging if needed
1497
+ if (extend && (sel = this.get('selection'))) sel = sel.copy();
1498
+ else sel = SC.SelectionSet.create();
1499
+
1500
+ if (indexes && indexes.get('length')>0) {
1501
+
1502
+ // when selecting only one item, always select by content
1503
+ if (indexes.get('length')===1) {
1504
+ sel.addObject(content.objectAt(indexes.get('firstObject')));
1505
+
1506
+ // otherwise select an index range
1507
+ } else sel.add(content, indexes);
1508
+
1509
+ }
1510
+
1511
+ // give delegate one last chance
1512
+ sel = del.collectionViewSelectionForProposedSelection(this, sel);
1513
+ if (!sel) sel = SC.SelectionSet.create(); // empty
1514
+
1515
+ // if we're not extending the selection, clear the selection anchor
1516
+ this._selectionAnchor = null ;
1517
+ this.set('selection', sel.freeze()) ;
1518
+ return this;
1519
+ },
1520
+
1521
+ /**
1522
+ Primtive to remove the indexes from the selection.
1523
+
1524
+ @param {Number|SC.IndexSet} indexes index or indexes to select
1525
+ @returns {SC.CollectionView} receiver
1526
+ */
1527
+ deselect: function(indexes) {
1528
+
1529
+ var sel = this.get('selection'),
1530
+ content = this.get('content'),
1531
+ del = this.get('selectionDelegate');
1532
+
1533
+ if(!this.get('isSelectable')) return this;
1534
+ if (!sel || sel.get('length')===0) return this; // nothing to do
1535
+
1536
+ // normalize
1537
+ if (SC.typeOf(indexes) === SC.T_NUMBER) {
1538
+ indexes = SC.IndexSet.create(indexes, 1);
1539
+ }
1540
+
1541
+ // give the delegate a chance to alter the items
1542
+ indexes = del.collectionViewShouldDeselectIndexes(this, indexes) ;
1543
+ if (!indexes || indexes.get('length')===0) return this; // nothing to do
1544
+
1545
+ // now merge change - note we expect sel && indexes to not be null
1546
+ sel = sel.copy().remove(content, indexes);
1547
+ sel = del.collectionViewSelectionForProposedSelection(this, sel);
1548
+ if (!sel) sel = SC.SelectionSet.create(); // empty
1549
+
1550
+ this.set('selection', sel.freeze()) ;
1551
+ return this ;
1552
+ },
1553
+
1554
+ /** @private
1555
+ Finds the next selectable item, up to content length, by asking the
1556
+ delegate. If a non-selectable item is found, the index is skipped. If
1557
+ no item is found, selection index is returned unmodified.
1558
+
1559
+ Return value will always be in the range of the bottom of the current
1560
+ selection index and the proposed index.
1561
+
1562
+ @param {Number} proposedIndex the desired index to select
1563
+ @param {Number} bottom optional bottom of selection use as fallback
1564
+ @returns {Number} next selectable index.
1565
+ */
1566
+ _findNextSelectableItemFromIndex: function(proposedIndex, bottom) {
1567
+
1568
+ var lim = this.get('length'),
1569
+ range = SC.IndexSet.create(),
1570
+ content = this.get('content'),
1571
+ del = this.get('selectionDelegate'),
1572
+ groupIndexes = this.get('_contentGroupIndexes'),
1573
+ ret, sel ;
1574
+
1575
+ // fast path
1576
+ if (!groupIndexes && (del.collectionViewShouldSelectIndexes === this.collectionViewShouldSelectIndexes)) {
1577
+ return proposedIndex;
1578
+ }
1579
+
1580
+ // loop forwards looking for an index that is allowed by delegate
1581
+ // we could alternatively just pass the whole range but this might be
1582
+ // slow for the delegate
1583
+ while (proposedIndex < lim) {
1584
+ if (!groupIndexes || !groupIndexes.contains(proposedIndex)) {
1585
+ range.add(proposedIndex);
1586
+ ret = del.collectionViewShouldSelectIndexes(this, range);
1587
+ if (ret && ret.get('length') >= 1) return proposedIndex ;
1588
+ range.remove(proposedIndex);
1589
+ }
1590
+ proposedIndex++;
1591
+ }
1592
+
1593
+ // if nothing was found, return top of selection
1594
+ if (bottom === undefined) {
1595
+ sel = this.get('selection');
1596
+ bottom = sel ? sel.get('max') : -1 ;
1597
+ }
1598
+ return bottom ;
1599
+ },
1600
+
1601
+ /** @private
1602
+ Finds the previous selectable item, up to the first item, by asking the
1603
+ delegate. If a non-selectable item is found, the index is skipped. If
1604
+ no item is found, selection index is returned unmodified.
1605
+
1606
+ @param {Integer} proposedIndex the desired index to select
1607
+ @returns {Integer} the previous selectable index. This will always be in the range of the top of the current selection index and the proposed index.
1608
+ @private
1609
+ */
1610
+ _findPreviousSelectableItemFromIndex: function(proposedIndex, top) {
1611
+ var range = SC.IndexSet.create(),
1612
+ content = this.get('content'),
1613
+ del = this.get('selectionDelegate'),
1614
+ groupIndexes = this.get('_contentGroupIndexes'),
1615
+ ret ;
1616
+
1617
+ if (SC.none(proposedIndex)) proposedIndex = -1;
1618
+
1619
+ // fast path
1620
+ if (!groupIndexes && (del.collectionViewShouldSelectIndexes === this.collectionViewShouldSelectIndexes)) {
1621
+ return proposedIndex;
1622
+ }
1623
+
1624
+ // loop backwards looking for an index that is allowed by delegate
1625
+ // we could alternatively just pass the whole range but this might be
1626
+ // slow for the delegate
1627
+ while (proposedIndex >= 0) {
1628
+ if (!groupIndexes || !groupIndexes.contains(proposedIndex)) {
1629
+ range.add(proposedIndex);
1630
+ ret = del.collectionViewShouldSelectIndexes(this, range);
1631
+ if (ret && ret.get('length') >= 1) return proposedIndex ;
1632
+ range.remove(proposedIndex);
1633
+ }
1634
+ proposedIndex--;
1635
+ }
1636
+
1637
+ // if nothing was found, return top of selection
1638
+ if (top === undefined) {
1639
+ var sel = this.get('selection');
1640
+ top = sel ? sel.get('min') : -1 ;
1641
+ }
1642
+ if (SC.none(top)) top = -1;
1643
+ return top ;
1644
+ },
1645
+
1646
+ /**
1647
+ Select one or more items before the current selection, optionally
1648
+ extending the current selection. Also scrolls the selected item into
1649
+ view.
1650
+
1651
+ Selection does not wrap around.
1652
+
1653
+ @param extend {Boolean} (Optional) If true, the selection will be extended
1654
+ instead of replaced. Defaults to false.
1655
+ @param numberOfItems {Integer} (Optional) The number of previous to be
1656
+ selected. Defaults to 1
1657
+ @returns {SC.CollectionView} receiver
1658
+ */
1659
+ selectPreviousItem: function(extend, numberOfItems) {
1660
+ if (SC.none(numberOfItems)) numberOfItems = 1 ;
1661
+ if (SC.none(extend)) extend = false ;
1662
+
1663
+ var sel = this.get('selection'),
1664
+ content = this.get('content');
1665
+ if (sel) sel = sel.indexSetForSource(content);
1666
+
1667
+ var selTop = sel ? sel.get('min') : -1,
1668
+ selBottom = sel ? sel.get('max')-1 : -1,
1669
+ anchor = this._selectionAnchor;
1670
+ if (SC.none(anchor)) anchor = selTop;
1671
+
1672
+ // if extending, then we need to do some fun stuff to build the array
1673
+ if (extend) {
1674
+
1675
+ // If the selBottom is after the anchor, then reduce the selection
1676
+ if (selBottom > anchor) {
1677
+ selBottom = selBottom - numberOfItems ;
1678
+
1679
+ // otherwise, select the previous item from the top
1680
+ } else {
1681
+ selTop = this._findPreviousSelectableItemFromIndex(selTop - numberOfItems);
1682
+ }
1683
+
1684
+ // Ensure we are not out of bounds
1685
+ if (SC.none(selTop) || (selTop < 0)) selTop = 0 ;
1686
+ if (!content.objectAt(selTop)) selTop = sel ? sel.get('min') : -1;
1687
+ if (selBottom < selTop) selBottom = selTop ;
1688
+
1689
+ // if not extending, just select the item previous to the selTop
1690
+ } else {
1691
+ selTop = this._findPreviousSelectableItemFromIndex(selTop - numberOfItems);
1692
+ if (SC.none(selTop) || (selTop < 0)) selTop = 0 ;
1693
+ if (!content.objectAt(selTop)) selTop = sel ? sel.get('min') : -1;
1694
+ selBottom = selTop ;
1695
+ anchor = null ;
1696
+ }
1697
+
1698
+ var scrollToIndex = selTop ;
1699
+
1700
+ // now build new selection
1701
+ sel = SC.IndexSet.create(selTop, selBottom+1-selTop);
1702
+
1703
+ // ensure that the item is visible and set the selection
1704
+ this.scrollToContentIndex(scrollToIndex) ;
1705
+ this.select(sel) ;
1706
+ this._selectionAnchor = anchor ;
1707
+ return this ;
1708
+ },
1709
+
1710
+ /**
1711
+ Select one or more items following the current selection, optionally
1712
+ extending the current selection. Also scrolls to selected item.
1713
+
1714
+ Selection does not wrap around.
1715
+
1716
+ @param extend {Boolean} (Optional) If true, the selection will be extended
1717
+ instead of replaced. Defaults to false.
1718
+ @param numberOfItems {Integer} (Optional) The number of items to be
1719
+ selected. Defaults to 1.
1720
+ @returns {SC.CollectionView} receiver
1721
+ */
1722
+ selectNextItem: function(extend, numberOfItems) {
1723
+ if (SC.none(numberOfItems)) numberOfItems = 1 ;
1724
+ if (SC.none(extend)) extend = false ;
1725
+
1726
+ var sel = this.get('selection'),
1727
+ content = this.get('content');
1728
+ if (sel) sel = sel.indexSetForSource(content);
1729
+
1730
+ var selTop = sel ? sel.get('min') : -1,
1731
+ selBottom = sel ? sel.get('max')-1 : -1,
1732
+ anchor = this._selectionAnchor,
1733
+ lim = this.get('length');
1734
+
1735
+ if (SC.none(anchor)) anchor = selTop;
1736
+
1737
+ // if extending, then we need to do some fun stuff to build the array
1738
+ if (extend) {
1739
+
1740
+ // If the selTop is before the anchor, then reduce the selection
1741
+ if (selTop < anchor) {
1742
+ selTop = selTop + numberOfItems ;
1743
+
1744
+ // otherwise, select the next item after the bottom
1745
+ } else {
1746
+ selBottom = this._findNextSelectableItemFromIndex(selBottom + numberOfItems, selBottom);
1747
+ }
1748
+
1749
+ // Ensure we are not out of bounds
1750
+ if (selBottom >= lim) selBottom = lim-1;
1751
+
1752
+ // we also need to check that the item exists
1753
+ if (!content.objectAt(selBottom)) selBottom = sel ? sel.get('max') - 1 : -1;
1754
+
1755
+ // and if top has eclipsed bottom, handle that too.
1756
+ if (selTop > selBottom) selTop = selBottom ;
1757
+
1758
+ // if not extending, just select the item next to the selBottom
1759
+ } else {
1760
+ selBottom = this._findNextSelectableItemFromIndex(selBottom + numberOfItems, selBottom);
1761
+
1762
+ if (selBottom >= lim) selBottom = lim-1;
1763
+ if (!content.objectAt(selBottom)) selBottom = sel ? sel.get('max') - 1 : -1;
1764
+ selTop = selBottom ;
1765
+ anchor = null ;
1766
+ }
1767
+
1768
+ var scrollToIndex = selBottom ;
1769
+
1770
+ // now build new selection
1771
+ sel = SC.IndexSet.create(selTop, selBottom-selTop+1);
1772
+
1773
+ // ensure that the item is visible and set the selection
1774
+ this.scrollToContentIndex(scrollToIndex) ;
1775
+ this.select(sel) ;
1776
+ this._selectionAnchor = anchor ;
1777
+ return this ;
1778
+ },
1779
+
1780
+ /**
1781
+ Deletes the selected content if canDeleteContent is YES. This will invoke
1782
+ delegate methods to provide fine-grained control. Returns YES if the
1783
+ deletion was possible, even if none actually occurred.
1784
+
1785
+ @returns {Boolean} YES if deletion is possible.
1786
+ */
1787
+ deleteSelection: function() {
1788
+ // perform some basic checks...
1789
+ if (!this.get('canDeleteContent')) return NO;
1790
+
1791
+ var sel = this.get('selection'),
1792
+ content = this.get('content'),
1793
+ del = this.get('selectionDelegate'),
1794
+ indexes = sel&&content ? sel.indexSetForSource(content) : null;
1795
+
1796
+ if (!content || !indexes || indexes.get('length') === 0) return NO ;
1797
+
1798
+ // let the delegate decide what to actually delete. If this returns an
1799
+ // empty index set or null, just do nothing.
1800
+ indexes = del.collectionViewShouldDeleteIndexes(this, indexes);
1801
+ if (!indexes || indexes.get('length') === 0) return NO ;
1802
+
1803
+ // now have the delegate (or us) perform the deletion. The default
1804
+ // delegate implementation just uses standard SC.Array methods to do the
1805
+ // right thing.
1806
+ del.collectionViewDeleteContent(this, this.get('content'), indexes);
1807
+
1808
+ return YES ;
1809
+ },
1810
+
1811
+ // ..........................................................
1812
+ // SCROLLING
1813
+ //
1814
+
1815
+ /**
1816
+ Scroll the rootElement (if needed) to ensure that the item is visible.
1817
+
1818
+ @param {Number} contentIndex The index of the item to scroll to
1819
+ @returns {SC.CollectionView} receiver
1820
+ */
1821
+ scrollToContentIndex: function(contentIndex) {
1822
+ var itemView = this.itemViewForContentIndex(contentIndex) ;
1823
+ if (itemView) this.scrollToItemView(itemView) ;
1824
+ return this;
1825
+ },
1826
+
1827
+ /**
1828
+ Scroll to the passed item view. If the item view is not visible on screen
1829
+ this method will not work.
1830
+
1831
+ @param {SC.View} view The item view to scroll to
1832
+ @returns {SC.CollectionView} receiver
1833
+ */
1834
+ scrollToItemView: function(view) {
1835
+ if (view) view.scrollToVisible();
1836
+ return this ;
1837
+ },
1838
+
1839
+ // ..........................................................
1840
+ // KEYBOARD EVENTS
1841
+ //
1842
+
1843
+ /** @private */
1844
+ keyDown: function(evt) {
1845
+ var ret = this.interpretKeyEvents(evt) ;
1846
+ return !ret ? NO : ret ;
1847
+ },
1848
+
1849
+ /** @private */
1850
+ keyUp: function() { return true; },
1851
+
1852
+ /** @private
1853
+ Handle space key event. Do action
1854
+ */
1855
+ insertText: function(chr, evt) {
1856
+ if (chr === ' ') {
1857
+ var sel = this.get('selection');
1858
+ if (sel && sel.get('length')>0) {
1859
+ this.invokeLater(this._cv_action, 0, null, evt);
1860
+ }
1861
+ return YES ;
1862
+ } else return NO ;
1863
+ },
1864
+
1865
+ /** @private
1866
+ Handle select all keyboard event.
1867
+ */
1868
+ selectAll: function(evt) {
1869
+ var content = this.get('content'),
1870
+ sel = content ? SC.IndexSet.create(0, content.get('length')) : null;
1871
+ this.select(sel, NO) ;
1872
+ return YES ;
1873
+ },
1874
+
1875
+ /** @private
1876
+ Handle delete keyboard event.
1877
+ */
1878
+ deleteBackward: function(evt) {
1879
+ return this.deleteSelection() ;
1880
+ },
1881
+
1882
+ /** @private
1883
+ Handle delete keyboard event.
1884
+ */
1885
+ deleteForward: function(evt) {
1886
+ return this.deleteSelection() ;
1887
+ },
1888
+
1889
+ /** @private
1890
+ Selects the same item on the next row or moves down one if itemsPerRow = 1
1891
+ */
1892
+ moveDown: function(sender, evt) {
1893
+ this.selectNextItem(false, this.get('itemsPerRow') || 1) ;
1894
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
1895
+ return true ;
1896
+ },
1897
+
1898
+ /** @private
1899
+ Selects the same item on the next row or moves up one if itemsPerRow = 1
1900
+ */
1901
+ moveUp: function(sender, evt) {
1902
+ this.selectPreviousItem(false, this.get('itemsPerRow') || 1) ;
1903
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
1904
+ return true ;
1905
+ },
1906
+
1907
+ /** @private
1908
+ Selects the previous item if itemsPerRow > 1. Otherwise does nothing.
1909
+ If item is expandable, will collapse.
1910
+ */
1911
+ moveLeft: function(evt) {
1912
+ // If the control key is down, this may be a browser shortcut and
1913
+ // we should not handle the arrow key.
1914
+ if (evt.ctrlKey || evt.metaKey) return NO;
1915
+
1916
+ if ((this.get('itemsPerRow') || 1) > 1) {
1917
+ this.selectPreviousItem(false, 1);
1918
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
1919
+
1920
+ } else {
1921
+ var sel = this.get('selection'),
1922
+ content = this.get('content'),
1923
+ indexes = sel ? sel.indexSetForSource(content) : null;
1924
+
1925
+ // Collapse the element if it is expanded. However, if there is exactly
1926
+ // one item selected and the item is already collapsed or is a leaf
1927
+ // node, then select the (expanded) parent element instead as a
1928
+ // convenience to the user.
1929
+ if ( indexes ) {
1930
+ var del = undefined, // We'll load it lazily
1931
+ selectParent = false,
1932
+ index = undefined;
1933
+
1934
+ if ( indexes.get('length') === 1 ) {
1935
+ index = indexes.get('firstObject');
1936
+ del = this.get('contentDelegate');
1937
+ var state = del.contentIndexDisclosureState(this, content, index);
1938
+ if (state !== SC.BRANCH_OPEN) selectParent = true;
1939
+ }
1940
+
1941
+ if ( selectParent ) {
1942
+ // TODO: PERFORMANCE: It would be great to have a function like
1943
+ // SC.CollectionView.selectParentItem() or something similar
1944
+ // for performance reasons. But since we don't currently
1945
+ // have such a function, let's just iterate through the
1946
+ // previous items until we find the first one with a outline
1947
+ // level of one less than the selected item.
1948
+ var desiredOutlineLevel = del.contentIndexOutlineLevel(this, content, index) - 1;
1949
+ if ( desiredOutlineLevel >= 0 ) {
1950
+ var parentIndex = -1;
1951
+ while ( parentIndex < 0 ) {
1952
+ var previousItemIndex = this._findPreviousSelectableItemFromIndex(index - 1);
1953
+ if (previousItemIndex < 0 ) return false; // Sanity-check.
1954
+ index = previousItemIndex;
1955
+ var outlineLevel = del.contentIndexOutlineLevel(this, content, index);
1956
+ if ( outlineLevel === desiredOutlineLevel ) {
1957
+ parentIndex = previousItemIndex;
1958
+ }
1959
+ }
1960
+
1961
+ // If we found the parent, select it now.
1962
+ if ( parentIndex !== -1 ) {
1963
+ this.select(index);
1964
+ }
1965
+ }
1966
+ }
1967
+ else {
1968
+ this.collapse(indexes);
1969
+ }
1970
+ }
1971
+ }
1972
+
1973
+ return true ;
1974
+ },
1975
+
1976
+ /** @private
1977
+ Selects the next item if itemsPerRow > 1. Otherwise does nothing.
1978
+ */
1979
+ moveRight: function(evt) {
1980
+ // If the control key is down, this may be a browser shortcut and
1981
+ // we should not handle the arrow key.
1982
+ if (evt.ctrlKey || evt.metaKey) return NO;
1983
+
1984
+ if ((this.get('itemsPerRow') || 1) > 1) {
1985
+ this.selectNextItem(false, 1) ;
1986
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
1987
+ } else {
1988
+ var sel = this.get('selection'),
1989
+ content = this.get('content'),
1990
+ indexes = sel ? sel.indexSetForSource(content) : null;
1991
+ if (indexes) this.expand(indexes);
1992
+ }
1993
+
1994
+ return true ;
1995
+ },
1996
+
1997
+ /** @private */
1998
+ moveDownAndModifySelection: function(sender, evt) {
1999
+ this.selectNextItem(true, this.get('itemsPerRow') || 1) ;
2000
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
2001
+ return true ;
2002
+ },
2003
+
2004
+ /** @private */
2005
+ moveUpAndModifySelection: function(sender, evt) {
2006
+ this.selectPreviousItem(true, this.get('itemsPerRow') || 1) ;
2007
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
2008
+ return true ;
2009
+ },
2010
+
2011
+ /** @private
2012
+ Selects the previous item if itemsPerRow > 1. Otherwise does nothing.
2013
+ */
2014
+ moveLeftAndModifySelection: function(sender, evt) {
2015
+ if ((this.get('itemsPerRow') || 1) > 1) {
2016
+ this.selectPreviousItem(true, 1) ;
2017
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
2018
+ }
2019
+ return true ;
2020
+ },
2021
+
2022
+ /** @private
2023
+ Selects the next item if itemsPerRow > 1. Otherwise does nothing.
2024
+ */
2025
+ moveRightAndModifySelection: function(sender, evt) {
2026
+ if ((this.get('itemsPerRow') || 1) > 1) {
2027
+ this.selectNextItem(true, 1) ;
2028
+ this._cv_performSelectAction(null, evt, this.ACTION_DELAY);
2029
+ }
2030
+ return true ;
2031
+ },
2032
+
2033
+
2034
+
2035
+ /** @private
2036
+ if content value is editable and we have one item selected, then edit.
2037
+ otherwise, invoke action.
2038
+ */
2039
+ insertNewline: function(sender, evt) {
2040
+ var canEdit = this.get('isEditable') && this.get('canEditContent'),
2041
+ sel, content, set, idx, itemView;
2042
+
2043
+ // first make sure we have a single item selected; get idx
2044
+ if (canEdit) {
2045
+ sel = this.get('selection') ;
2046
+ content = this.get('content');
2047
+ if (sel && sel.get('length') === 1) {
2048
+ set = sel.indexSetForSource(content);
2049
+ idx = set ? set.get('min') : -1;
2050
+ canEdit = idx>=0;
2051
+ }
2052
+ }
2053
+
2054
+ // next find itemView and ensure it supports editing
2055
+ if (canEdit) {
2056
+ itemView = this.itemViewForContentIndex(idx);
2057
+ canEdit = itemView && SC.typeOf(itemView.beginEditing)===SC.T_FUNCTION;
2058
+ }
2059
+
2060
+ // ok, we can edit..
2061
+ if (canEdit) {
2062
+ this.scrollToContentIndex(idx);
2063
+ itemView = this.itemViewForContentIndex(idx); // just in case
2064
+ itemView.beginEditing();
2065
+
2066
+ // invoke action
2067
+ } else {
2068
+ this.invokeLater(this._cv_action, 0, itemView, null) ;
2069
+ }
2070
+
2071
+ return YES ; // always handle
2072
+ },
2073
+
2074
+ // ..........................................................
2075
+ // MOUSE EVENTS
2076
+ //
2077
+
2078
+ /** @private
2079
+ Handles mouse down events on the collection view or on any of its
2080
+ children.
2081
+
2082
+ The default implementation of this method can handle a wide variety
2083
+ of user behaviors depending on how you have configured the various
2084
+ options for the collection view.
2085
+
2086
+ @param ev {Event} the mouse down event
2087
+ @returns {Boolean} Usually YES.
2088
+ */
2089
+ mouseDown: function(ev) {
2090
+
2091
+ // When the user presses the mouse down, we don't do much just yet.
2092
+ // Instead, we just need to save a bunch of state about the mouse down
2093
+ // so we can choose the right thing to do later.
2094
+
2095
+
2096
+ // find the actual view the mouse was pressed down on. This will call
2097
+ // hitTest() on item views so they can implement non-square detection
2098
+ // modes. -- once we have an item view, get its content object as well.
2099
+ var itemView = this.itemViewForEvent(ev),
2100
+ content = this.get('content'),
2101
+ contentIndex = itemView ? itemView.get('contentIndex') : -1,
2102
+ info, anchor, sel, isSelected, modifierKeyPressed,
2103
+ allowsMultipleSel = content.get('allowsMultipleSelection');
2104
+
2105
+ info = this.mouseDownInfo = {
2106
+ event: ev,
2107
+ itemView: itemView,
2108
+ contentIndex: contentIndex,
2109
+ at: Date.now()
2110
+ };
2111
+
2112
+ // become first responder if possible.
2113
+ this.becomeFirstResponder() ;
2114
+
2115
+ // Toggle the selection if selectOnMouseDown is true
2116
+ if (this.get('useToggleSelection')) {
2117
+ if (this.get('selectOnMouseDown')) {
2118
+ if (!itemView) return ; // do nothing when clicked outside of elements
2119
+
2120
+ // determine if item is selected. If so, then go on.
2121
+ sel = this.get('selection') ;
2122
+ isSelected = sel && sel.containsObject(itemView.get('content')) ;
2123
+
2124
+ if (isSelected) {
2125
+ this.deselect(contentIndex) ;
2126
+ } else if (!allowsMultipleSel) {
2127
+ this.select(contentIndex, NO) ;
2128
+ } else {
2129
+ this.select(contentIndex, YES) ;
2130
+ }
2131
+ }
2132
+
2133
+ return YES;
2134
+ }
2135
+
2136
+ // recieved a mouseDown on the collection element, but not on one of the
2137
+ // childItems... unless we do not allow empty selections, set it to empty.
2138
+ if (!itemView) {
2139
+ if (this.get('allowDeselectAll')) this.select(null, false);
2140
+ return YES ;
2141
+ }
2142
+
2143
+ // collection some basic setup info
2144
+ sel = this.get('selection');
2145
+ if (sel) sel = sel.indexSetForSource(content);
2146
+
2147
+ isSelected = sel ? sel.contains(contentIndex) : NO;
2148
+ info.modifierKeyPressed = modifierKeyPressed = ev.ctrlKey || ev.metaKey ;
2149
+
2150
+
2151
+ // holding down a modifier key while clicking a selected item should
2152
+ // deselect that item...deselect and bail.
2153
+ if (modifierKeyPressed && isSelected) {
2154
+ info.shouldDeselect = contentIndex >= 0;
2155
+
2156
+ // if the shiftKey was pressed, then we want to extend the selection
2157
+ // from the last selected item
2158
+ } else if (ev.shiftKey && sel && sel.get('length') > 0 && allowsMultipleSel) {
2159
+ sel = this._findSelectionExtendedByShift(sel, contentIndex);
2160
+ anchor = this._selectionAnchor ;
2161
+ this.select(sel) ;
2162
+ this._selectionAnchor = anchor; //save the anchor
2163
+
2164
+ // If no modifier key was pressed, then clicking on the selected item
2165
+ // should clear the selection and reselect only the clicked on item.
2166
+ } else if (!modifierKeyPressed && isSelected) {
2167
+ info.shouldReselect = contentIndex >= 0;
2168
+
2169
+ // Otherwise, if selecting on mouse down, simply select the clicked on
2170
+ // item, adding it to the current selection if a modifier key was pressed.
2171
+ } else {
2172
+
2173
+ if((ev.shiftKey || modifierKeyPressed) && !allowsMultipleSel){
2174
+ this.select(null, false);
2175
+ }
2176
+
2177
+ if (this.get("selectOnMouseDown")) {
2178
+ this.select(contentIndex, modifierKeyPressed);
2179
+ } else {
2180
+ info.shouldSelect = contentIndex >= 0 ;
2181
+ }
2182
+ }
2183
+
2184
+ // saved for extend by shift ops.
2185
+ info.previousContentIndex = contentIndex;
2186
+
2187
+ return YES;
2188
+ },
2189
+
2190
+ /** @private */
2191
+ mouseUp: function(ev) {
2192
+
2193
+ var view = this.itemViewForEvent(ev),
2194
+ info = this.mouseDownInfo,
2195
+ content = this.get('content'),
2196
+ contentIndex, sel, isSelected, canEdit, itemView, idx,
2197
+ allowsMultipleSel = content.get('allowsMultipleSelection');
2198
+
2199
+ if (this.get('useToggleSelection')) {
2200
+ // Return if clicked outside of elements or if toggle was handled by mouseDown
2201
+ if (!view || this.get('selectOnMouseDown')) return NO;
2202
+
2203
+ // determine if item is selected. If so, then go on.
2204
+ sel = this.get('selection') ;
2205
+ contentIndex = (view) ? view.get('contentIndex') : -1 ;
2206
+ isSelected = sel && sel.containsObject(view.get('content')) ;
2207
+
2208
+ if (isSelected) {
2209
+ this.deselect(contentIndex) ;
2210
+ } else if (!allowsMultipleSel) {
2211
+ this.select(contentIndex, NO) ;
2212
+ } else {
2213
+ this.select(contentIndex, YES) ;
2214
+ }
2215
+
2216
+ } else if(info) {
2217
+ idx = info.contentIndex;
2218
+ contentIndex = (view) ? view.get('contentIndex') : -1 ;
2219
+
2220
+ // this will be set if the user simply clicked on an unselected item and
2221
+ // selectOnMouseDown was NO.
2222
+ if (info.shouldSelect) this.select(idx, info.modifierKeyPressed);
2223
+
2224
+ // This is true if the user clicked on a selected item with a modifier
2225
+ // key pressed.
2226
+ if (info.shouldDeselect) this.deselect(idx);
2227
+
2228
+ // This is true if the user clicked on a selected item without a
2229
+ // modifier-key pressed. When this happens we try to begin editing
2230
+ // on the content. If that is not allowed, then simply clear the
2231
+ // selection and reselect the clicked on item.
2232
+ if (info.shouldReselect) {
2233
+
2234
+ // - contentValueIsEditable is true
2235
+ canEdit = this.get('isEditable') && this.get('canEditContent') ;
2236
+
2237
+ // - the user clicked on an item that was already selected
2238
+ // ^ this is the only way shouldReset is set to YES
2239
+
2240
+ // - is the only item selected
2241
+ if (canEdit) {
2242
+ sel = this.get('selection') ;
2243
+ canEdit = sel && (sel.get('length') === 1);
2244
+ }
2245
+
2246
+ // - the item view responds to contentHitTest() and returns YES.
2247
+ // - the item view responds to beginEditing and returns YES.
2248
+ if (canEdit) {
2249
+ itemView = this.itemViewForContentIndex(idx) ;
2250
+ canEdit = itemView && (!itemView.contentHitTest || itemView.contentHitTest(ev)) ;
2251
+ canEdit = (canEdit && itemView.beginEditing) ? itemView.beginEditing() : NO ;
2252
+ }
2253
+
2254
+ // if cannot edit, schedule a reselect (but give doubleClick a chance)
2255
+ if (!canEdit) {
2256
+ if (this._cv_reselectTimer) this._cv_reselectTimer.invalidate() ;
2257
+ this._cv_reselectTimer = this.invokeLater(this.select, 300, idx, false) ;
2258
+ }
2259
+ }
2260
+
2261
+ this._cleanupMouseDown() ;
2262
+ }
2263
+
2264
+ // handle actions on editing
2265
+ this._cv_performSelectAction(view, ev, 0, ev.clickCount);
2266
+
2267
+ return NO; // bubble event to allow didDoubleClick to be called...
2268
+ },
2269
+
2270
+ /** @private */
2271
+ _cleanupMouseDown: function() {
2272
+
2273
+ // delete items explicitly to avoid leaks on IE
2274
+ var info = this.mouseDownInfo, key;
2275
+ if (info) {
2276
+ for(key in info) {
2277
+ if (!info.hasOwnProperty(key)) continue;
2278
+ delete info[key];
2279
+ }
2280
+ }
2281
+ this.mouseDownInfo = null;
2282
+ },
2283
+
2284
+ /** @private */
2285
+ mouseMoved: function(ev) {
2286
+ var view = this.itemViewForEvent(ev),
2287
+ last = this._lastHoveredItem ;
2288
+
2289
+ // handle hover events.
2290
+ if (view !== last) {
2291
+ if (last && last.mouseOut) last.mouseOut(ev);
2292
+ if (view && view.mouseOver) view.mouseOver(ev);
2293
+ }
2294
+ this._lastHoveredItem = view ;
2295
+
2296
+ if (view && view.mouseMoved) view.mouseMoved(ev);
2297
+ return YES;
2298
+ },
2299
+
2300
+ /** @private */
2301
+ mouseOut: function(ev) {
2302
+ var view = this._lastHoveredItem ;
2303
+ this._lastHoveredItem = null ;
2304
+ if (view && view.mouseOut) view.mouseOut(ev) ;
2305
+ return YES ;
2306
+ },
2307
+
2308
+ // ..........................................................
2309
+ // TOUCH EVENTS
2310
+ //
2311
+
2312
+ touchStart: function(ev) {
2313
+
2314
+ // When the user presses the mouse down, we don't do much just yet.
2315
+ // Instead, we just need to save a bunch of state about the mouse down
2316
+ // so we can choose the right thing to do later.
2317
+
2318
+ // Toggle selection only triggers on mouse up. Do nothing.
2319
+ if (this.get('useToggleSelection')) return true;
2320
+
2321
+ // find the actual view the mouse was pressed down on. This will call
2322
+ // hitTest() on item views so they can implement non-square detection
2323
+ // modes. -- once we have an item view, get its content object as well.
2324
+ var itemView = this.itemViewForEvent(ev),
2325
+ content = this.get('content'),
2326
+ contentIndex = itemView ? itemView.get('contentIndex') : -1,
2327
+ info, anchor ;
2328
+
2329
+ // become first responder if possible.
2330
+ this.becomeFirstResponder() ;
2331
+ this.select(contentIndex, NO);
2332
+
2333
+ this._cv_performSelectAction(this, ev);
2334
+
2335
+ return YES;
2336
+ },
2337
+
2338
+ touchesDragged: function(evt, touches) {
2339
+ touches.forEach(function(touch){
2340
+ if (
2341
+ Math.abs(touch.pageX - touch.startX) > 5 ||
2342
+ Math.abs(touch.pageY - touch.startY) > 5
2343
+ ) {
2344
+ this.select(null, NO);
2345
+ touch.makeTouchResponder(touch.nextTouchResponder);
2346
+ }
2347
+ }, this);
2348
+
2349
+ },
2350
+
2351
+ touchCancelled: function(evt) {
2352
+ this.select(null, NO);
2353
+ },
2354
+
2355
+ /** @private */
2356
+ _findSelectionExtendedByShift: function(sel, contentIndex) {
2357
+
2358
+ // fast path. if we don't have a selection, just select index
2359
+ if (!sel || sel.get('length')===0) {
2360
+ return SC.IndexSet.create(contentIndex);
2361
+ }
2362
+
2363
+ // if we do have a selection, then figure out how to extend it.
2364
+ var content = this.get('content'),
2365
+ lim = content.get('length')-1,
2366
+ min = sel.get('min'),
2367
+ max = sel.get('max')-1,
2368
+ info = this.mouseDownInfo,
2369
+ anchor = this._selectionAnchor ;
2370
+ if (SC.none(anchor)) anchor = -1;
2371
+
2372
+ // clicked before the current selection set... extend it's beginning...
2373
+ if (contentIndex < min) {
2374
+ min = contentIndex;
2375
+ if (anchor<0) this._selectionAnchor = anchor = max; //anchor at end
2376
+
2377
+ // clicked after the current selection set... extend it's ending...
2378
+ } else if (contentIndex > max) {
2379
+ max = contentIndex;
2380
+ if (anchor<0) this._selectionAnchor = anchor = min; // anchor at start
2381
+
2382
+ // clicked inside the selection set... need to determine where the last
2383
+ // selection was and use that as an anchor.
2384
+ } else if (contentIndex >= min && contentIndex <= max) {
2385
+ if (anchor<0) this._selectionAnchor = anchor = min; //anchor at start
2386
+
2387
+ if (contentIndex === anchor) min = max = contentIndex ;
2388
+ else if (contentIndex > anchor) {
2389
+ min = anchor;
2390
+ max = contentIndex ;
2391
+ } else if (contentIndex < anchor) {
2392
+ min = contentIndex;
2393
+ max = anchor ;
2394
+ }
2395
+ }
2396
+
2397
+ return SC.IndexSet.create(min, max - min + 1);
2398
+ },
2399
+
2400
+ // ......................................
2401
+ // DRAG AND DROP SUPPORT
2402
+ //
2403
+
2404
+ /**
2405
+ When reordering its content, the collection view will store its reorder
2406
+ data using this special data type. The data type is unique to each
2407
+ collection view instance. You can use this data type to detect reorders
2408
+ if necessary.
2409
+
2410
+ @property
2411
+ @type String
2412
+ */
2413
+ reorderDataType: function() {
2414
+ return 'SC.CollectionView.Reorder.'+SC.guidFor(this) ;
2415
+ }.property().cacheable(),
2416
+
2417
+ /**
2418
+ This property is set to the IndexSet of content objects that are the
2419
+ subject of a drag whenever a drag is initiated on the collection view.
2420
+ You can consult this property when implementing your collection view
2421
+ delegate methods, but otherwise you should not use this property in your
2422
+ code.
2423
+
2424
+ @type SC.IndexSet
2425
+ */
2426
+ dragContent: null,
2427
+
2428
+ /**
2429
+ This property is set to the proposed insertion index during a call to
2430
+ collectionViewValidateDragOperation(). Your delegate implementations can
2431
+ change the value of this property to enforce a drop some in some other
2432
+ location.
2433
+
2434
+ @type Number
2435
+ */
2436
+ proposedInsertionIndex: null,
2437
+
2438
+ /**
2439
+ This property is set to the proposed drop operation during a call to
2440
+ collectionViewValidateDragOperation(). Your delegate implementations can
2441
+ change the value of this property to enforce a different type of drop
2442
+ operation.
2443
+
2444
+ @type Number
2445
+ @property
2446
+ */
2447
+ proposedDropOperation: null,
2448
+
2449
+ /** @private
2450
+ mouseDragged event handler. Initiates a drag if the following conditions
2451
+ are met:
2452
+
2453
+ - collectionViewShouldBeginDrag() returns YES *OR*
2454
+ - the above method is not implemented and canReorderContent is true.
2455
+ - the dragDataTypes property returns a non-empty array
2456
+ - a mouse down event was saved by the mouseDown method.
2457
+ */
2458
+ mouseDragged: function(ev) {
2459
+
2460
+ var del = this.get('selectionDelegate'),
2461
+ content = this.get('content'),
2462
+ sel = this.get('selection'),
2463
+ info = this.mouseDownInfo,
2464
+ groupIndexes = this.get('_contentGroupIndexes'),
2465
+ dragContent, dragDataTypes, dragView;
2466
+
2467
+ // if the mouse down event was cleared, there is nothing to do; return.
2468
+ if (!info || info.contentIndex<0) return YES ;
2469
+
2470
+ // Don't do anything unless the user has been dragging for 123msec
2471
+ if ((Date.now() - info.at) < 123) return YES ;
2472
+
2473
+ // OK, they must be serious, decide if a drag will be allowed.
2474
+ if (del.collectionViewShouldBeginDrag(this)) {
2475
+
2476
+ // First, get the selection to drag. Drag an array of selected
2477
+ // items appearing in this collection, in the order of the
2478
+ // collection.
2479
+ //
2480
+ // Compute the dragContent - the indexes we will be dragging.
2481
+ // if we don't select on mouse down, then the selection has not been
2482
+ // updated to whatever the user clicked. Instead use
2483
+ // mouse down content.
2484
+ if (!this.get("selectOnMouseDown")) {
2485
+ dragContent = SC.IndexSet.create(info.contentIndex);
2486
+ } else dragContent = sel ? sel.indexSetForSource(content) : null;
2487
+
2488
+ // remove any group indexes. groups cannot be dragged.
2489
+ if (dragContent && groupIndexes && groupIndexes.get('length')>0) {
2490
+ dragContent = dragContent.copy().remove(groupIndexes);
2491
+ if (dragContent.get('length')===0) dragContent = null;
2492
+ else dragContent.freeze();
2493
+ }
2494
+
2495
+ if (!dragContent) return YES; // nothing to drag
2496
+ else dragContent = dragContent.frozenCopy(); // so it doesn't change
2497
+
2498
+ dragContent = { content: content, indexes: dragContent };
2499
+ this.set('dragContent', dragContent) ;
2500
+
2501
+ // Get the set of data types supported by the delegate. If this returns
2502
+ // a null or empty array and reordering content is not also supported
2503
+ // then do not start the drag.
2504
+ dragDataTypes = this.get('dragDataTypes');
2505
+ if (dragDataTypes && dragDataTypes.get('length') > 0) {
2506
+
2507
+ // Build the drag view to use for the ghost drag. This
2508
+ // should essentially contain any visible drag items.
2509
+ dragView = del.collectionViewDragViewFor(this, dragContent.indexes);
2510
+ if (!dragView) dragView = this._cv_dragViewFor(dragContent.indexes);
2511
+
2512
+ // Make sure the dragView has created its layer.
2513
+ dragView.createLayer();
2514
+
2515
+ // Initiate the drag
2516
+ SC.Drag.start({
2517
+ event: info.event,
2518
+ source: this,
2519
+ dragView: dragView,
2520
+ ghost: NO,
2521
+ ghostActsLikeCursor: del.ghostActsLikeCursor,
2522
+ slideBack: YES,
2523
+ dataSource: this
2524
+ });
2525
+
2526
+ // Also use this opportunity to clean up since mouseUp won't
2527
+ // get called.
2528
+ this._cleanupMouseDown() ;
2529
+ this._lastInsertionIndex = null ;
2530
+
2531
+ // Drag was not allowed by the delegate, so bail.
2532
+ } else this.set('dragContent', null) ;
2533
+
2534
+ return YES ;
2535
+ }
2536
+ },
2537
+
2538
+ /** @private
2539
+ Compute a default drag view by grabbing the raw layers and inserting them
2540
+ into a drag view.
2541
+ */
2542
+ _cv_dragViewFor: function(dragContent) {
2543
+ // find only the indexes that are in both dragContent and nowShowing.
2544
+ var indexes = this.get('nowShowing').without(dragContent);
2545
+ indexes = this.get('nowShowing').without(indexes);
2546
+
2547
+ var dragLayer = this.get('layer').cloneNode(false);
2548
+ var view = SC.View.create({ layer: dragLayer, parentView: this });
2549
+
2550
+ // cleanup weird stuff that might make the drag look out of place
2551
+ SC.$(dragLayer).css('backgroundColor', 'transparent')
2552
+ .css('border', 'none')
2553
+ .css('top', 0).css('left', 0);
2554
+
2555
+ indexes.forEach(function(i) {
2556
+ var itemView = this.itemViewForContentIndex(i),
2557
+ isSelected, layer;
2558
+
2559
+ // render item view without isSelected state.
2560
+ if (itemView) {
2561
+ isSelected = itemView.get('isSelected');
2562
+ itemView.set('isSelected', NO);
2563
+
2564
+ itemView.updateLayerIfNeeded();
2565
+ layer = itemView.get('layer');
2566
+ if (layer) layer = layer.cloneNode(true);
2567
+
2568
+ itemView.set('isSelected', isSelected);
2569
+ itemView.updateLayerIfNeeded();
2570
+ }
2571
+
2572
+ if (layer) dragLayer.appendChild(layer);
2573
+ layer = null;
2574
+
2575
+ }, this);
2576
+
2577
+ dragLayer = null;
2578
+ return view ;
2579
+ },
2580
+
2581
+
2582
+ /**
2583
+ Implements the drag data source protocol for the collection view. This
2584
+ property will consult the collection view delegate if one is provided. It
2585
+ will also do the right thing if you have set canReorderContent to YES.
2586
+
2587
+ @property
2588
+ @type Array
2589
+ */
2590
+ dragDataTypes: function() {
2591
+ // consult delegate.
2592
+ var del = this.get('selectionDelegate'),
2593
+ ret = del.collectionViewDragDataTypes(this),
2594
+ key ;
2595
+
2596
+ if (this.get('canReorderContent')) {
2597
+ ret = ret ? ret.copy() : [];
2598
+ key = this.get('reorderDataType');
2599
+ if (ret.indexOf(key) < 0) ret.push(key);
2600
+ }
2601
+
2602
+ return ret ? ret : [];
2603
+ }.property(),
2604
+
2605
+ /**
2606
+ Implements the drag data source protocol method. The implementation of
2607
+ this method will consult the collection view delegate if one has been
2608
+ provided. It also respects the canReoderContent method.
2609
+ */
2610
+ dragDataForType: function(drag, dataType) {
2611
+
2612
+ // if this is a reorder, then return drag content.
2613
+ if (this.get('canReorderContent')) {
2614
+ if (dataType === this.get('reorderDataType')) {
2615
+ return this.get('dragContent') ;
2616
+ }
2617
+ }
2618
+
2619
+ // otherwise, just pass along to the delegate
2620
+ var del = this.get('selectionDelegate');
2621
+ return del.collectionViewDragDataForType(this, drag, dataType);
2622
+ },
2623
+
2624
+ /**
2625
+ Implements the SC.DropTarget interface. The default implementation will
2626
+ consult the collection view delegate, if you implement those methods.
2627
+
2628
+ This method is called once when the drag enters the view area. It's
2629
+ return value will be stored on the drag object as allowedDragOperations,
2630
+ possibly further constrained by the drag source.
2631
+
2632
+ @param {SC.Drag} drag the drag object
2633
+ @param {SC.Event} evt the event triggering this change, if available
2634
+ @returns {Number} logical OR'd mask of allowed drag operations.
2635
+ */
2636
+ computeDragOperations: function(drag, evt) {
2637
+
2638
+ // the proposed drag operation is DRAG_REORDER only if we can reorder
2639
+ // content and the drag contains reorder content.
2640
+ var op = SC.DRAG_NONE,
2641
+ del = this.get('selectionDelegate');
2642
+
2643
+ if (this.get('canReorderContent')) {
2644
+ if (drag.get('dataTypes').indexOf(this.get('reorderDataType')) >= 0) {
2645
+ op = SC.DRAG_REORDER ;
2646
+ }
2647
+ }
2648
+
2649
+ // Now pass this onto the delegate.
2650
+ op = del.collectionViewComputeDragOperations(this, drag, op);
2651
+ if (op & SC.DRAG_REORDER) op = SC.DRAG_MOVE ;
2652
+
2653
+ return op ;
2654
+ },
2655
+
2656
+ /** @private
2657
+ Determines the allowed drop operation insertion point, operation type,
2658
+ and the drag operation to be performed. Used by dragUpdated() and
2659
+ performDragOperation().
2660
+
2661
+ @param {SC.Drag} drag the drag object
2662
+ @param {SC.Event} evt source of this request, if available
2663
+ @param {Number} dragOp allowed drag operation mask
2664
+ Returns three params: [drop index, drop operation, allowed drag ops]
2665
+ */
2666
+ _computeDropOperationState: function(drag, evt, dragOp) {
2667
+
2668
+ // get the insertion index for this location. This can be computed
2669
+ // by a subclass using whatever method. This method is not expected to
2670
+ // do any data valdidation, just to map the location to an insertion
2671
+ // index.
2672
+ var loc = this.convertFrameFromView(drag.get('location'), null),
2673
+ dropOp = SC.DROP_BEFORE,
2674
+ del = this.get('selectionDelegate'),
2675
+ canReorder = this.get('canReorderContent'),
2676
+ objects, content, isPreviousInDrag, isNextInDrag, len, tmp;
2677
+
2678
+ // STEP 1: Try with a DROP_ON option -- send straight to delegate if
2679
+ // supported by view.
2680
+
2681
+ // get the computed insertion index and possibly drop operation.
2682
+ // prefer to drop ON.
2683
+ var idx = this.insertionIndexForLocation(loc, SC.DROP_ON) ;
2684
+ if (SC.typeOf(idx) === SC.T_ARRAY) {
2685
+ dropOp = idx[1] ; // order matters here
2686
+ idx = idx[0] ;
2687
+ }
2688
+
2689
+ // if the return drop operation is DROP_ON, then just check it with the
2690
+ // delegate method. If the delegate method does not support dropping on,
2691
+ // then it will return DRAG_NONE, in which case we will try again with
2692
+ // drop before.
2693
+ if (dropOp === SC.DROP_ON) {
2694
+
2695
+ // Now save the insertion index and the dropOp. This may be changed by
2696
+ // the collection delegate.
2697
+ this.set('proposedInsertionIndex', idx) ;
2698
+ this.set('proposedDropOperation', dropOp) ;
2699
+ tmp = del.collectionViewValidateDragOperation(this, drag, dragOp, idx, dropOp) ;
2700
+ idx = this.get('proposedInsertionIndex') ;
2701
+ dropOp = this.get('proposedDropOperation') ;
2702
+ this._dropInsertionIndex = this._dropOperation = null ;
2703
+
2704
+ // The delegate is OK with a drop on also, so just return.
2705
+ if (tmp !== SC.DRAG_NONE) return [idx, dropOp, tmp] ;
2706
+
2707
+ // The delegate is NOT OK with a drop on, try to get the insertion
2708
+ // index again, but this time prefer SC.DROP_BEFORE, then let the
2709
+ // rest of the method run...
2710
+ else {
2711
+ dropOp = SC.DROP_BEFORE ;
2712
+ idx = this.insertionIndexForLocation(loc, SC.DROP_BEFORE) ;
2713
+ if (SC.typeOf(idx) === SC.T_ARRAY) {
2714
+ dropOp = idx[1] ; // order matters here
2715
+ idx = idx[0] ;
2716
+ }
2717
+ }
2718
+ }
2719
+
2720
+ // if this is a reorder drag, set the proposed op to SC.DRAG_REORDER and
2721
+ // validate the insertion point. This only works if the insertion point
2722
+ // is DROP_BEFORE or DROP_AFTER. DROP_ON is not handled by reordering
2723
+ // content.
2724
+ if ((idx >= 0) && canReorder && (dropOp !== SC.DROP_ON)) {
2725
+
2726
+ objects = drag.dataForType(this.get('reorderDataType')) ;
2727
+ if (objects) {
2728
+ content = this.get('content') ;
2729
+
2730
+ // if the insertion index is in between two items in the drag itself,
2731
+ // then this is not allowed. Either use the last insertion index or
2732
+ // find the first index that is not in between selections. Stop when
2733
+ // we get to the beginning.
2734
+ if (dropOp === SC.DROP_BEFORE) {
2735
+ isPreviousInDrag = objects.indexes.contains(idx-1);
2736
+ isNextInDrag = objects.indexes.contains(idx);
2737
+ } else {
2738
+ isPreviousInDrag = objects.indexes.contains(idx);
2739
+ isNextInDrag = objects.indexes.contains(idx-1);
2740
+ }
2741
+
2742
+ if (isPreviousInDrag && isNextInDrag) {
2743
+ if (SC.none(this._lastInsertionIndex)) {
2744
+ if (dropOp === SC.DROP_BEFORE) {
2745
+ while ((idx >= 0) && objects.indexes.contains(idx)) idx--;
2746
+ } else {
2747
+ len = content ? content.get('length') : 0;
2748
+ while ((idx < len) && objects.indexes.contains(idx)) idx++;
2749
+ }
2750
+ } else idx = this._lastInsertionIndex ;
2751
+ }
2752
+
2753
+ // If we found a valid insertion point to reorder at, then set the op
2754
+ // to custom DRAG_REORDER.
2755
+ if (idx >= 0) dragOp = SC.DRAG_REORDER ;
2756
+ }
2757
+ }
2758
+
2759
+ // Now save the insertion index and the dropOp. This may be changed by
2760
+ // the collection delegate.
2761
+ this.set('proposedInsertionIndex', idx) ;
2762
+ this.set('proposedDropOperation', dropOp) ;
2763
+ dragOp = del.collectionViewValidateDragOperation(this, drag, dragOp, idx, dropOp) ;
2764
+ idx = this.get('proposedInsertionIndex') ;
2765
+ dropOp = this.get('proposedDropOperation') ;
2766
+ this._dropInsertionIndex = this._dropOperation = null ;
2767
+
2768
+ // return generated state
2769
+ return [idx, dropOp, dragOp] ;
2770
+ },
2771
+
2772
+ /**
2773
+ Implements the SC.DropTarget interface. The default implementation will
2774
+ determine the drop location and then consult the collection view delegate
2775
+ if you implement those methods. Otherwise it will handle reordering
2776
+ content on its own.
2777
+ */
2778
+ dragUpdated: function(drag, evt) {
2779
+
2780
+ var op = drag.get('allowedDragOperations'),
2781
+ state = this._computeDropOperationState(drag, evt, op),
2782
+ idx = state[0], dropOp = state[1], dragOp = state[2];
2783
+
2784
+ // if the insertion index or dropOp have changed, update the insertion
2785
+ // point
2786
+ if (dragOp !== SC.DRAG_NONE) {
2787
+ if ((this._lastInsertionIndex !== idx) || (this._lastDropOperation !== dropOp)) {
2788
+ var itemView = this.itemViewForContentIndex(idx) ;
2789
+ this.showInsertionPoint(itemView, dropOp) ;
2790
+ }
2791
+
2792
+ this._lastInsertionIndex = idx ;
2793
+ this._lastDropOperation = dropOp ;
2794
+ } else {
2795
+ this.hideInsertionPoint() ;
2796
+ this._lastInsertionIndex = this._lastDropOperation = null ;
2797
+ }
2798
+
2799
+ // Normalize drag operation to the standard kinds accepted by the drag
2800
+ // system.
2801
+ return (dragOp & SC.DRAG_REORDER) ? SC.DRAG_MOVE : dragOp;
2802
+ },
2803
+
2804
+ /**
2805
+ Implements the SC.DropTarget protocol. Hides any visible insertion
2806
+ point and clears some cached values.
2807
+ */
2808
+ dragExited: function() {
2809
+ this.hideInsertionPoint() ;
2810
+ this._lastInsertionIndex = this._lastDropOperation = null ;
2811
+ },
2812
+
2813
+ /**
2814
+ Implements the SC.DropTarget protocol.
2815
+ */
2816
+ acceptDragOperation: function(drag, op) { return YES; },
2817
+
2818
+ /**
2819
+ Implements the SC.DropTarget protocol. Consults the collection view
2820
+ delegate to actually perform the operation unless the operation is
2821
+ reordering content.
2822
+ */
2823
+ performDragOperation: function(drag, op) {
2824
+
2825
+ // Get the correct insertion point, drop operation, etc.
2826
+ var state = this._computeDropOperationState(drag, null, op),
2827
+ idx = state[0], dropOp = state[1], dragOp = state[2],
2828
+ del = this.get('selectionDelegate'),
2829
+ performed, objects, data, content, shift, indexes;
2830
+
2831
+ // The dragOp is the kinds of ops allowed. The drag operation must
2832
+ // be included in that set.
2833
+ if (dragOp & SC.DRAG_REORDER) {
2834
+ op = (op & SC.DRAG_MOVE) ? SC.DRAG_REORDER : SC.DRAG_NONE ;
2835
+ } else op = op & dragOp ;
2836
+
2837
+ // If no allowed drag operation could be found, just return.
2838
+ if (op === SC.DRAG_NONE) return op;
2839
+
2840
+ // Some operation is allowed through, give the delegate a chance to
2841
+ // handle it.
2842
+ performed = del.collectionViewPerformDragOperation(this, drag, op, idx, dropOp) ;
2843
+
2844
+ // If the delegate did not handle the drag (i.e. returned SC.DRAG_NONE),
2845
+ // and the op type is REORDER, then do the reorder here.
2846
+ if ((performed === SC.DRAG_NONE) && (op & SC.DRAG_REORDER)) {
2847
+
2848
+ data = drag.dataForType(this.get('reorderDataType')) ;
2849
+ if (!data) return SC.DRAG_NONE ;
2850
+
2851
+ content = this.get('content') ;
2852
+
2853
+ // check for special case - inserting BEFORE ourself...
2854
+ // in this case just pretend the move happened since it's a no-op
2855
+ // anyway
2856
+ indexes = data.indexes;
2857
+ if (indexes.get('length')===1) {
2858
+ if (((dropOp === SC.DROP_BEFORE) || (dropOp === SC.DROP_AFTER)) &&
2859
+ (indexes.get('min')===idx)) return SC.DRAG_MOVE;
2860
+ }
2861
+
2862
+ content.beginPropertyChanges(); // suspend notifications
2863
+
2864
+ // get each object, then remove it from the content. they will be
2865
+ // added again later.
2866
+ objects = [];
2867
+ shift = 0;
2868
+ data.indexes.forEach(function(i) {
2869
+ objects.push(content.objectAt(i-shift));
2870
+ content.removeAt(i-shift);
2871
+ shift++;
2872
+ if (i < idx) idx--;
2873
+ }, this);
2874
+
2875
+ // now insert objects into new insertion locaiton
2876
+ if (dropOp === SC.DROP_AFTER) idx++;
2877
+ content.replace(idx, 0, objects, dropOp);
2878
+ this.select(SC.IndexSet.create(idx, objects.length));
2879
+ content.endPropertyChanges(); // restart notifications
2880
+
2881
+ // make the op into its actual value
2882
+ op = SC.DRAG_MOVE ;
2883
+ }
2884
+
2885
+ return op;
2886
+ },
2887
+
2888
+ /**
2889
+ Default delegate method implementation, returns YES if canReorderContent
2890
+ is also true.
2891
+ */
2892
+ collectionViewShouldBeginDrag: function(view) {
2893
+ return this.get('canReorderContent') ;
2894
+ },
2895
+
2896
+
2897
+ // ..........................................................
2898
+ // INSERTION POINT
2899
+ //
2900
+
2901
+
2902
+ /**
2903
+ Get the preferred insertion point for the given location, including
2904
+ an insertion preference of before, after or on the named index.
2905
+
2906
+ You can implement this method in a subclass if you like to perform a
2907
+ more efficient check. The default implementation will loop through the
2908
+ item views looking for the first view to "switch sides" in the orientation
2909
+ you specify.
2910
+
2911
+ This method should return an array with two values. The first value is
2912
+ the insertion point index and the second value is the drop operation,
2913
+ which should be one of SC.DROP_BEFORE, SC.DROP_AFTER, or SC.DROP_ON.
2914
+
2915
+ The preferred drop operation passed in should be used as a hint as to
2916
+ the type of operation the view would prefer to receive. If the
2917
+ dropOperation is SC.DROP_ON, then you should return a DROP_ON mode if
2918
+ possible. Otherwise, you should never return DROP_ON.
2919
+
2920
+ For compatibility, you can also return just the insertion index. If you
2921
+ do this, then the collction view will assume the drop operation is
2922
+ SC.DROP_BEFORE.
2923
+
2924
+ If an insertion is NOT allowed, you should return -1 as the insertion
2925
+ point. In this case, the drop operation will be ignored.
2926
+
2927
+ @param loc {Point} the mouse location.
2928
+ @param dropOperation {DropOp} the preferred drop operation.
2929
+ @returns {Array} [proposed drop index, drop operation]
2930
+ */
2931
+ insertionIndexForLocation: function(loc, dropOperation) {
2932
+ return -1;
2933
+ },
2934
+
2935
+ // ..........................................................
2936
+ // INTERNAL SUPPORT
2937
+ //
2938
+
2939
+ /** @private - when we become visible, reload if needed. */
2940
+ _cv_isVisibleInWindowDidChange: function() {
2941
+ if (this.get('isVisibleInWindow')) {
2942
+ if (this._invalidIndexes) this.invokeOnce(this.reloadIfNeeded);
2943
+ if (this._invalidSelection) {
2944
+ this.invokeOnce(this.reloadSelectionIndexesIfNeeded);
2945
+ }
2946
+ }
2947
+ }.observes('isVisibleInWindow'),
2948
+
2949
+
2950
+ /**
2951
+ Default delegate method implementation, returns YES if isSelectable
2952
+ is also true.
2953
+ */
2954
+ collectionViewShouldSelectItem: function(view, item) {
2955
+ return this.get('isSelectable') ;
2956
+ },
2957
+
2958
+ _TMP_DIFF1: SC.IndexSet.create(),
2959
+ _TMP_DIFF2: SC.IndexSet.create(),
2960
+
2961
+ /** @private
2962
+
2963
+ Whenever the nowShowing range changes, update the range observer on the
2964
+ content item and instruct the view to reload any indexes that are not in
2965
+ the previous nowShowing range.
2966
+
2967
+ */
2968
+ _cv_nowShowingDidChange: function() {
2969
+ var nowShowing = this.get('nowShowing'),
2970
+ last = this._sccv_lastNowShowing,
2971
+ diff, diff1, diff2;
2972
+
2973
+ // find the differences between the two
2974
+ // NOTE: reuse a TMP IndexSet object to avoid creating lots of objects
2975
+ // during scrolling
2976
+ if (last !== nowShowing) {
2977
+ if (last && nowShowing) {
2978
+ diff1 = this._TMP_DIFF1.add(last).remove(nowShowing);
2979
+ diff2 = this._TMP_DIFF2.add(nowShowing).remove(last);
2980
+ diff = diff1.add(diff2);
2981
+ } else diff = last || nowShowing ;
2982
+ }
2983
+
2984
+ // if nowShowing has actually changed, then update
2985
+ if (diff && diff.get('length') > 0) {
2986
+ this._sccv_lastNowShowing = nowShowing ? nowShowing.frozenCopy() : null;
2987
+ this.updateContentRangeObserver();
2988
+ this.reload(diff);
2989
+ }
2990
+
2991
+ // cleanup tmp objects
2992
+ if (diff1) diff1.clear();
2993
+ if (diff2) diff2.clear();
2994
+
2995
+ }.observes('nowShowing'),
2996
+
2997
+ init: function() {
2998
+ sc_super();
2999
+ if (this.useFastPath) this.mixin(SC.CollectionFastPath);
3000
+ if (this.get('canReorderContent')) this._cv_canReorderContentDidChange();
3001
+ this._sccv_lastNowShowing = this.get('nowShowing').clone();
3002
+ if (this.content) this._cv_contentDidChange();
3003
+ if (this.selection) this._cv_selectionDidChange();
3004
+ },
3005
+
3006
+ /** @private
3007
+ Become a drop target whenever reordering content is enabled.
3008
+ */
3009
+ _cv_canReorderContentDidChange: function() {
3010
+ if (this.get('canReorderContent')) {
3011
+ if (!this.get('isDropTarget')) this.set('isDropTarget', YES);
3012
+ SC.Drag.addDropTarget(this);
3013
+ }
3014
+ }.observes('canReorderContent'),
3015
+
3016
+ /** @private
3017
+ Fires an action after a selection if enabled.
3018
+
3019
+ if actOnSelect is YES, then try to invoke the action, passing the
3020
+ current selection (saved as a separate array so that a change in sel
3021
+ in the meantime will not be lost)
3022
+ */
3023
+ _cv_performSelectAction: function(view, ev, delay, clickCount) {
3024
+ var sel;
3025
+ if (delay === undefined) delay = 0 ;
3026
+ if (clickCount === undefined) clickCount = 1;
3027
+ if ((clickCount>1) || this.get('actOnSelect')) {
3028
+ if (this._cv_reselectTimer) this._cv_reselectTimer.invalidate() ;
3029
+ sel = this.get('selection');
3030
+ sel = sel ? sel.toArray() : [];
3031
+ if (this._cv_actionTimer) this._cv_actionTimer.invalidate();
3032
+ this._cv_actionTimer = this.invokeLater(this._cv_action, delay, view, ev, sel) ;
3033
+ }
3034
+ },
3035
+
3036
+ /** @private
3037
+ Perform the action. Supports legacy behavior as well as newer style
3038
+ action dispatch.
3039
+ */
3040
+ _cv_action: function(view, evt, context) {
3041
+ var action = this.get('action');
3042
+ var target = this.get('target') || null;
3043
+
3044
+ this._cv_actionTimer = null;
3045
+ if (action) {
3046
+ // if the action is a function, just call it
3047
+ if (SC.typeOf(action) === SC.T_FUNCTION) return this.action(view, evt) ;
3048
+
3049
+ // otherwise, use the new sendAction style
3050
+ var pane = this.get('pane') ;
3051
+ if (pane) {
3052
+ pane.rootResponder.sendAction(action, target, this, pane, context);
3053
+ }
3054
+ // SC.app.sendAction(action, target, this) ;
3055
+
3056
+ // if no action is specified, then trigger the support action,
3057
+ // if supported.
3058
+ } else if (!view) {
3059
+ return ; // nothing to do
3060
+
3061
+ // if the target view has its own internal action handler,
3062
+ // trigger that.
3063
+ } else if (SC.typeOf(view._action) == SC.T_FUNCTION) {
3064
+ return view._action(evt) ;
3065
+
3066
+ // otherwise call the action method to support older styles.
3067
+ } else if (SC.typeOf(view.action) == SC.T_FUNCTION) {
3068
+ return view.action(evt) ;
3069
+ }
3070
+ }
3071
+
3072
+
3073
+ });