sproutit-sproutcore 1.0.0.20090407205609 → 1.0.0.20090408130025

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. data/frameworks/sproutcore/Buildfile +63 -0
  2. data/frameworks/sproutcore/HISTORY +682 -0
  3. data/frameworks/sproutcore/README +22 -0
  4. data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +149 -0
  5. data/frameworks/sproutcore/apps/sc_jsdoc/core.js +16 -0
  6. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +17 -0
  7. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +99 -0
  8. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
  9. data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/strings.js +15 -0
  10. data/frameworks/sproutcore/apps/sc_jsdoc/main.js +27 -0
  11. data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +21 -0
  12. data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +209 -0
  13. data/frameworks/sproutcore/apps/sc_qunit/core.js +16 -0
  14. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +17 -0
  15. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +107 -0
  16. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
  17. data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +15 -0
  18. data/frameworks/sproutcore/apps/sc_qunit/main.js +18 -0
  19. data/frameworks/sproutcore/apps/sc_qunit/models/test.js +24 -0
  20. data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +52 -0
  21. data/frameworks/sproutcore/apps/tests/controllers/targets.js +47 -0
  22. data/frameworks/sproutcore/apps/tests/controllers/test.js +20 -0
  23. data/frameworks/sproutcore/apps/tests/controllers/tests.js +38 -0
  24. data/frameworks/sproutcore/apps/tests/core.js +35 -0
  25. data/frameworks/sproutcore/apps/tests/english.lproj/loading.rhtml +9 -0
  26. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +19 -0
  27. data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +86 -0
  28. data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +17 -0
  29. data/frameworks/sproutcore/apps/tests/fixtures/target.js +43 -0
  30. data/frameworks/sproutcore/apps/tests/fixtures/test.js +43 -0
  31. data/frameworks/sproutcore/apps/tests/main.js +39 -0
  32. data/frameworks/sproutcore/apps/tests/models/target.js +49 -0
  33. data/frameworks/sproutcore/apps/tests/models/test.js +20 -0
  34. data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +15 -0
  35. data/frameworks/sproutcore/apps/tests/tests/controllers/test.js +15 -0
  36. data/frameworks/sproutcore/apps/tests/tests/controllers/tests.js +15 -0
  37. data/frameworks/sproutcore/apps/tests/tests/models/target.js +15 -0
  38. data/frameworks/sproutcore/apps/tests/tests/models/test.js +15 -0
  39. data/frameworks/sproutcore/apps/welcome/core.js +23 -0
  40. data/frameworks/sproutcore/apps/welcome/english.lproj/loading.rhtml +8 -0
  41. data/frameworks/sproutcore/apps/welcome/english.lproj/main_page.js +43 -0
  42. data/frameworks/sproutcore/apps/welcome/english.lproj/strings.js +15 -0
  43. data/frameworks/sproutcore/apps/welcome/main.js +36 -0
  44. data/frameworks/sproutcore/design/Design Charts.graffle +15819 -0
  45. data/frameworks/sproutcore/design/Record State Table.numbers +0 -0
  46. data/frameworks/sproutcore/frameworks/datastore/core.js +14 -0
  47. data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +113 -0
  48. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +256 -0
  49. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +196 -0
  50. data/frameworks/sproutcore/frameworks/datastore/debug/json.js +71 -0
  51. data/frameworks/sproutcore/frameworks/datastore/debug/standard_setup.js +96 -0
  52. data/frameworks/sproutcore/frameworks/datastore/fixtures/author_fixtures.js +2503 -0
  53. data/frameworks/sproutcore/frameworks/datastore/fixtures/sample.js +17 -0
  54. data/frameworks/sproutcore/frameworks/datastore/models/fetched_attribute.js +92 -0
  55. data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +38 -0
  56. data/frameworks/sproutcore/frameworks/datastore/models/record.js +430 -0
  57. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +361 -0
  58. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +305 -0
  59. data/frameworks/sproutcore/frameworks/datastore/system/query.js +128 -0
  60. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +149 -0
  61. data/frameworks/sproutcore/frameworks/datastore/system/store.js +1689 -0
  62. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +86 -0
  63. data/frameworks/sproutcore/frameworks/datastore/tests/integration/contact_model.js +114 -0
  64. data/frameworks/sproutcore/frameworks/datastore/tests/integration/mail_model.js +91 -0
  65. data/frameworks/sproutcore/frameworks/datastore/tests/integration/test_runner_model.js +56 -0
  66. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +73 -0
  67. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/readAttribute.js +48 -0
  68. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +42 -0
  69. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +138 -0
  70. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/unknownProperty.js +46 -0
  71. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +71 -0
  72. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +115 -0
  73. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +40 -0
  74. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +116 -0
  75. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +135 -0
  76. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +110 -0
  77. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +99 -0
  78. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +180 -0
  79. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +126 -0
  80. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +163 -0
  81. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +166 -0
  82. data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +175 -0
  83. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +54 -0
  84. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +126 -0
  85. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +127 -0
  86. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +57 -0
  87. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataHashDidChange.js +78 -0
  88. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +247 -0
  89. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +106 -0
  90. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/init.js +21 -0
  91. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +61 -0
  92. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +74 -0
  93. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/readEditableDataHash.js +74 -0
  94. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +74 -0
  95. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/removeDataHash.js +144 -0
  96. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +137 -0
  97. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +130 -0
  98. data/frameworks/sproutcore/frameworks/debug/core.js +1 -0
  99. data/frameworks/sproutcore/frameworks/deprecated/core.js +61 -0
  100. data/frameworks/sproutcore/frameworks/deprecated/lib/button_views.rb +330 -0
  101. data/frameworks/sproutcore/frameworks/deprecated/lib/collection_view.rb +83 -0
  102. data/frameworks/sproutcore/frameworks/deprecated/lib/core_views.rb +326 -0
  103. data/frameworks/sproutcore/frameworks/deprecated/lib/form_views.rb +253 -0
  104. data/frameworks/sproutcore/frameworks/deprecated/lib/index.rhtml +75 -0
  105. data/frameworks/sproutcore/frameworks/deprecated/lib/menu_views.rb +93 -0
  106. data/frameworks/sproutcore/frameworks/deprecated/server/rails_server.js +80 -0
  107. data/frameworks/sproutcore/frameworks/deprecated/server/rest_server.js +178 -0
  108. data/frameworks/sproutcore/frameworks/deprecated/server/server.js +674 -0
  109. data/frameworks/sproutcore/frameworks/deprecated/system/animator.js +679 -0
  110. data/frameworks/sproutcore/frameworks/deprecated/system/binding.js +36 -0
  111. data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +77 -0
  112. data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +314 -0
  113. data/frameworks/sproutcore/frameworks/deprecated/system/event.js +60 -0
  114. data/frameworks/sproutcore/frameworks/deprecated/system/globals.js +20 -0
  115. data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +60 -0
  116. data/frameworks/sproutcore/frameworks/deprecated/system/node_descriptor.js +72 -0
  117. data/frameworks/sproutcore/frameworks/deprecated/system/object.js +124 -0
  118. data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +433 -0
  119. data/frameworks/sproutcore/frameworks/deprecated/system/string.js +109 -0
  120. data/frameworks/sproutcore/frameworks/deprecated/tests/application/application.rhtml +125 -0
  121. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/clippingFrame.rhtml +401 -0
  122. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/frame.rhtml +357 -0
  123. data/frameworks/sproutcore/frameworks/deprecated/tests/views/classic_view/isVisibleInWindow.rhtml +147 -0
  124. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/base.rhtml +298 -0
  125. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/incremental_rendering.rhtml +260 -0
  126. data/frameworks/sproutcore/frameworks/deprecated/tests/views/collection/source_list_rendering.rhtml +143 -0
  127. data/frameworks/sproutcore/frameworks/deprecated/tests/views/popup_button.rhtml +128 -0
  128. data/frameworks/sproutcore/frameworks/deprecated/tests/views/text_field.rhtml +37 -0
  129. data/frameworks/sproutcore/frameworks/deprecated/views/collection.js +24 -0
  130. data/frameworks/sproutcore/frameworks/designer/coders/design.js +30 -0
  131. data/frameworks/sproutcore/frameworks/designer/coders/localization.js +28 -0
  132. data/frameworks/sproutcore/frameworks/designer/coders/object.js +347 -0
  133. data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +102 -0
  134. data/frameworks/sproutcore/frameworks/designer/css/css_rule.js +22 -0
  135. data/frameworks/sproutcore/frameworks/designer/css/css_style.js +29 -0
  136. data/frameworks/sproutcore/frameworks/designer/css/css_style_sheet.js +201 -0
  137. data/frameworks/sproutcore/frameworks/designer/ext/page.js +88 -0
  138. data/frameworks/sproutcore/frameworks/designer/ext/view.js +40 -0
  139. data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +18 -0
  140. data/frameworks/sproutcore/frameworks/designer/views/designer.js +553 -0
  141. data/frameworks/sproutcore/frameworks/designer/views/label.js +17 -0
  142. data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +13 -0
  143. data/frameworks/sproutcore/frameworks/designer/views/tab.js +17 -0
  144. data/frameworks/sproutcore/frameworks/desktop/core.js +6 -0
  145. data/frameworks/sproutcore/frameworks/desktop/debug/drag.js +41 -0
  146. data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +56 -0
  147. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/a_sample_image.jpg +0 -0
  148. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/apple-logo1.jpeg +0 -0
  149. data/frameworks/sproutcore/frameworks/desktop/english.lproj/debug/iframe.html +23 -0
  150. data/frameworks/sproutcore/frameworks/desktop/english.lproj/disclosure.css +71 -0
  151. data/frameworks/sproutcore/frameworks/desktop/english.lproj/icons.css +943 -0
  152. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
  153. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_222222.png +0 -0
  154. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_454545.png +0 -0
  155. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_888888.png +0 -0
  156. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/mini_ffffff.png +0 -0
  157. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/icons/shared.png +0 -0
  158. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/indicator.gif +0 -0
  159. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/panels/sprite-x.png +0 -0
  160. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/panels/sprite-y.png +0 -0
  161. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/sc-theme-sprite.png +0 -0
  162. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/000000.png +0 -0
  163. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/standard_fade/ffffff.png +0 -0
  164. data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/sticky-note.png +0 -0
  165. data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +156 -0
  166. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +83 -0
  167. data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +99 -0
  168. data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +3 -0
  169. data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +94 -0
  170. data/frameworks/sproutcore/frameworks/desktop/english.lproj/picker.css +39 -0
  171. data/frameworks/sproutcore/frameworks/desktop/english.lproj/progress.css +31 -0
  172. data/frameworks/sproutcore/frameworks/desktop/english.lproj/radio.css +10 -0
  173. data/frameworks/sproutcore/frameworks/desktop/english.lproj/scroller.css +26 -0
  174. data/frameworks/sproutcore/frameworks/desktop/english.lproj/segmented.css +141 -0
  175. data/frameworks/sproutcore/frameworks/desktop/english.lproj/separator.css +19 -0
  176. data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +57 -0
  177. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split.css +70 -0
  178. data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +8 -0
  179. data/frameworks/sproutcore/frameworks/desktop/english.lproj/strings.js +14 -0
  180. data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +12 -0
  181. data/frameworks/sproutcore/frameworks/desktop/english.lproj/text_field.css +29 -0
  182. data/frameworks/sproutcore/frameworks/desktop/english.lproj/toolbar.css +6 -0
  183. data/frameworks/sproutcore/frameworks/desktop/mixins/border.js +53 -0
  184. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_group.js +22 -0
  185. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_item.js +22 -0
  186. data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +226 -0
  187. data/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +247 -0
  188. data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +377 -0
  189. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +504 -0
  190. data/frameworks/sproutcore/frameworks/desktop/panes/modal.js +68 -0
  191. data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +63 -0
  192. data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +184 -0
  193. data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +402 -0
  194. data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +46 -0
  195. data/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +39 -0
  196. data/frameworks/sproutcore/frameworks/desktop/protocols/drag_source.js +81 -0
  197. data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +175 -0
  198. data/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +280 -0
  199. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +721 -0
  200. data/frameworks/sproutcore/frameworks/desktop/system/key_bindings.js +40 -0
  201. data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +641 -0
  202. data/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +187 -0
  203. data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +43 -0
  204. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/methods.js +10 -0
  205. data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +152 -0
  206. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +10 -0
  207. data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +57 -0
  208. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/methods.js +10 -0
  209. data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +36 -0
  210. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +10 -0
  211. data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +40 -0
  212. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/methods.js +10 -0
  213. data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +80 -0
  214. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/methods.js +10 -0
  215. data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +38 -0
  216. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/methods.js +45 -0
  217. data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +140 -0
  218. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +145 -0
  219. data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/ui.js +99 -0
  220. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +10 -0
  221. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +39 -0
  222. data/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/methods.js +10 -0
  223. data/frameworks/sproutcore/frameworks/desktop/tests/views/disclosure/ui.js +64 -0
  224. data/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +10 -0
  225. data/frameworks/sproutcore/frameworks/desktop/tests/views/grid/ui.js +10 -0
  226. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +10 -0
  227. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +110 -0
  228. data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +255 -0
  229. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/methods.js +10 -0
  230. data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +44 -0
  231. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/methods.js +128 -0
  232. data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +240 -0
  233. data/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +113 -0
  234. data/frameworks/sproutcore/frameworks/desktop/tests/views/radio/ui.js +202 -0
  235. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/methods.js +139 -0
  236. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/ui.js +111 -0
  237. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +63 -0
  238. data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/ui.js +70 -0
  239. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +94 -0
  240. data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +206 -0
  241. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +81 -0
  242. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +85 -0
  243. data/frameworks/sproutcore/frameworks/desktop/tests/views/separator.js +37 -0
  244. data/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/methods.js +10 -0
  245. data/frameworks/sproutcore/frameworks/desktop/tests/views/source_list/ui.js +10 -0
  246. data/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +50 -0
  247. data/frameworks/sproutcore/frameworks/desktop/tests/views/split/ui.js +52 -0
  248. data/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +54 -0
  249. data/frameworks/sproutcore/frameworks/desktop/tests/views/tab/ui.js +88 -0
  250. data/frameworks/sproutcore/frameworks/desktop/tests/views/text_field/methods.js +76 -0
  251. data/frameworks/sproutcore/frameworks/desktop/tests/views/text_field/ui.js +198 -0
  252. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/methods.js +10 -0
  253. data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +110 -0
  254. data/frameworks/sproutcore/frameworks/desktop/views/button.js +320 -0
  255. data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +98 -0
  256. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +2141 -0
  257. data/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +44 -0
  258. data/frameworks/sproutcore/frameworks/desktop/views/form.js +595 -0
  259. data/frameworks/sproutcore/frameworks/desktop/views/grid.js +199 -0
  260. data/frameworks/sproutcore/frameworks/desktop/views/list.js +706 -0
  261. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +523 -0
  262. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +437 -0
  263. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +62 -0
  264. data/frameworks/sproutcore/frameworks/desktop/views/progress.js +207 -0
  265. data/frameworks/sproutcore/frameworks/desktop/views/radio.js +332 -0
  266. data/frameworks/sproutcore/frameworks/desktop/views/scene.js +56 -0
  267. data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +648 -0
  268. data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +203 -0
  269. data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +509 -0
  270. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +292 -0
  271. data/frameworks/sproutcore/frameworks/desktop/views/separator.js +37 -0
  272. data/frameworks/sproutcore/frameworks/desktop/views/slider.js +178 -0
  273. data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +1117 -0
  274. data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +169 -0
  275. data/frameworks/sproutcore/frameworks/desktop/views/split.js +651 -0
  276. data/frameworks/sproutcore/frameworks/desktop/views/split_divider.js +55 -0
  277. data/frameworks/sproutcore/frameworks/desktop/views/tab.js +190 -0
  278. data/frameworks/sproutcore/frameworks/desktop/views/text_field.js +233 -0
  279. data/frameworks/sproutcore/frameworks/desktop/views/thumb.js +49 -0
  280. data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +49 -0
  281. data/frameworks/sproutcore/frameworks/desktop/views/web.js +86 -0
  282. data/frameworks/sproutcore/frameworks/foundation/TESTING +46 -0
  283. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +490 -0
  284. data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +317 -0
  285. data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +421 -0
  286. data/frameworks/sproutcore/frameworks/foundation/core.js +111 -0
  287. data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +172 -0
  288. data/frameworks/sproutcore/frameworks/foundation/english.lproj/blank.gif +0 -0
  289. data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +53 -0
  290. data/frameworks/sproutcore/frameworks/foundation/english.lproj/button_view.css +55 -0
  291. data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +5 -0
  292. data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +8 -0
  293. data/frameworks/sproutcore/frameworks/foundation/english.lproj/images/sproutcore-logo.png +0 -0
  294. data/frameworks/sproutcore/frameworks/foundation/english.lproj/static_layout.css +5 -0
  295. data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +40 -0
  296. data/frameworks/sproutcore/frameworks/foundation/ext/object.js +81 -0
  297. data/frameworks/sproutcore/frameworks/foundation/ext/run_loop.js +158 -0
  298. data/frameworks/sproutcore/frameworks/foundation/fixtures/file_exists.json +1 -0
  299. data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +291 -0
  300. data/frameworks/sproutcore/frameworks/foundation/mixins/content_display.js +88 -0
  301. data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +352 -0
  302. data/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +146 -0
  303. data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +156 -0
  304. data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +154 -0
  305. data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +101 -0
  306. data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +237 -0
  307. data/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +176 -0
  308. data/frameworks/sproutcore/frameworks/foundation/panes/main.js +47 -0
  309. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +555 -0
  310. data/frameworks/sproutcore/frameworks/foundation/protocols/inline_editor_delegate.js +84 -0
  311. data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +244 -0
  312. data/frameworks/sproutcore/frameworks/foundation/system/browser.js +64 -0
  313. data/frameworks/sproutcore/frameworks/foundation/system/builder.js +210 -0
  314. data/frameworks/sproutcore/frameworks/foundation/system/core_query.js +2015 -0
  315. data/frameworks/sproutcore/frameworks/foundation/system/cursor.js +129 -0
  316. data/frameworks/sproutcore/frameworks/foundation/system/error.js +93 -0
  317. data/frameworks/sproutcore/frameworks/foundation/system/event.js +817 -0
  318. data/frameworks/sproutcore/frameworks/foundation/system/image_cache.js +433 -0
  319. data/frameworks/sproutcore/frameworks/foundation/system/json.js +440 -0
  320. data/frameworks/sproutcore/frameworks/foundation/system/locale.js +288 -0
  321. data/frameworks/sproutcore/frameworks/foundation/system/page.js +106 -0
  322. data/frameworks/sproutcore/frameworks/foundation/system/ready.js +189 -0
  323. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +865 -0
  324. data/frameworks/sproutcore/frameworks/foundation/system/request.js +255 -0
  325. data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +368 -0
  326. data/frameworks/sproutcore/frameworks/foundation/system/routes.js +446 -0
  327. data/frameworks/sproutcore/frameworks/foundation/system/time.js +478 -0
  328. data/frameworks/sproutcore/frameworks/foundation/system/timer.js +549 -0
  329. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +158 -0
  330. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +330 -0
  331. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +118 -0
  332. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +268 -0
  333. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +433 -0
  334. data/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/methods.js +10 -0
  335. data/frameworks/sproutcore/frameworks/foundation/tests/debug/control_test_pane/ui.js +113 -0
  336. data/frameworks/sproutcore/frameworks/foundation/tests/integration/creating_views.js +113 -0
  337. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/content.js +195 -0
  338. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/displayProperties.js +89 -0
  339. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/content.js +168 -0
  340. data/frameworks/sproutcore/frameworks/foundation/tests/mixins/control/displayProperties.js +89 -0
  341. data/frameworks/sproutcore/frameworks/foundation/tests/system/builder.js +42 -0
  342. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +1323 -0
  343. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_dimensions.js +387 -0
  344. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +405 -0
  345. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/setClass.js +49 -0
  346. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/within.js +66 -0
  347. data/frameworks/sproutcore/frameworks/foundation/tests/system/error.js +41 -0
  348. data/frameworks/sproutcore/frameworks/foundation/tests/system/json.js +14 -0
  349. data/frameworks/sproutcore/frameworks/foundation/tests/system/locale.js +128 -0
  350. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/begin.js +47 -0
  351. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/element.js +44 -0
  352. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/end.js +119 -0
  353. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +51 -0
  354. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +50 -0
  355. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +28 -0
  356. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +179 -0
  357. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +100 -0
  358. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/init.js +55 -0
  359. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/join.js +28 -0
  360. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/push_text.js +74 -0
  361. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/tag.js +45 -0
  362. data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/update.js +205 -0
  363. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +89 -0
  364. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeKeyPane.js +124 -0
  365. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/makeMainPane.js +68 -0
  366. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +97 -0
  367. data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/targetForAction.js +238 -0
  368. data/frameworks/sproutcore/frameworks/foundation/tests/system/routes.js +33 -0
  369. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invalidate.js +38 -0
  370. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/invokeLater.js +201 -0
  371. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/isPaused.js +71 -0
  372. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/performAction.js +67 -0
  373. data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +170 -0
  374. data/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +27 -0
  375. data/frameworks/sproutcore/frameworks/foundation/tests/system/utils/normalizeURL.js +18 -0
  376. data/frameworks/sproutcore/frameworks/foundation/tests/system/utils/range.js +62 -0
  377. data/frameworks/sproutcore/frameworks/foundation/tests/validators/credit_card.js +35 -0
  378. data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +21 -0
  379. data/frameworks/sproutcore/frameworks/foundation/tests/validators/number.js +47 -0
  380. data/frameworks/sproutcore/frameworks/foundation/tests/validators/password.js +13 -0
  381. data/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +10 -0
  382. data/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +83 -0
  383. data/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +39 -0
  384. data/frameworks/sproutcore/frameworks/foundation/tests/views/main_pane.js +31 -0
  385. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +89 -0
  386. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/firstResponder.js +148 -0
  387. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/keyPane.js +133 -0
  388. data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/sendEvent.js +165 -0
  389. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +132 -0
  390. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +246 -0
  391. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +87 -0
  392. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createLayer.js +97 -0
  393. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/destroyLayer.js +85 -0
  394. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +52 -0
  395. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/init.js +50 -0
  396. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/insertBefore.js +200 -0
  397. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +102 -0
  398. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layer.js +150 -0
  399. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutChildViews.js +162 -0
  400. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutDidChange.js +127 -0
  401. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +248 -0
  402. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/parentViewDidChange.js +67 -0
  403. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +166 -0
  404. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/removeChild.js +189 -0
  405. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/render.js +83 -0
  406. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/replaceChild.js +29 -0
  407. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +142 -0
  408. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayerLocation.js +194 -0
  409. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/viewDidResize.js +185 -0
  410. data/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +125 -0
  411. data/frameworks/sproutcore/frameworks/foundation/validators/date.js +52 -0
  412. data/frameworks/sproutcore/frameworks/foundation/validators/email.js +45 -0
  413. data/frameworks/sproutcore/frameworks/foundation/validators/not_empty.js +33 -0
  414. data/frameworks/sproutcore/frameworks/foundation/validators/number.js +82 -0
  415. data/frameworks/sproutcore/frameworks/foundation/validators/password.js +86 -0
  416. data/frameworks/sproutcore/frameworks/foundation/validators/validator.js +311 -0
  417. data/frameworks/sproutcore/frameworks/foundation/views/container.js +136 -0
  418. data/frameworks/sproutcore/frameworks/foundation/views/field.js +276 -0
  419. data/frameworks/sproutcore/frameworks/foundation/views/image.js +158 -0
  420. data/frameworks/sproutcore/frameworks/foundation/views/label.js +261 -0
  421. data/frameworks/sproutcore/frameworks/foundation/views/view.js +2160 -0
  422. data/frameworks/sproutcore/frameworks/mobile/english.lproj/core.css +12 -0
  423. data/frameworks/sproutcore/frameworks/mobile/lib/index.rhtml +126 -0
  424. data/frameworks/sproutcore/frameworks/mobile/system/root_responder.js +109 -0
  425. data/frameworks/sproutcore/frameworks/mobile/tests/views/button/ui.js +9 -0
  426. data/frameworks/sproutcore/frameworks/mobile/views/button.js +190 -0
  427. data/frameworks/sproutcore/frameworks/runtime/README +11 -0
  428. data/frameworks/sproutcore/frameworks/runtime/core.js +777 -0
  429. data/frameworks/sproutcore/frameworks/runtime/license.js +28 -0
  430. data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +403 -0
  431. data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +70 -0
  432. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1193 -0
  433. data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +1149 -0
  434. data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +135 -0
  435. data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +108 -0
  436. data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +128 -0
  437. data/frameworks/sproutcore/frameworks/runtime/protocols/sparse_array_delegate.js +131 -0
  438. data/frameworks/sproutcore/frameworks/runtime/system/binding.js +891 -0
  439. data/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +107 -0
  440. data/frameworks/sproutcore/frameworks/runtime/system/object.js +783 -0
  441. data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +99 -0
  442. data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +214 -0
  443. data/frameworks/sproutcore/frameworks/runtime/system/set.js +246 -0
  444. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +286 -0
  445. data/frameworks/sproutcore/frameworks/runtime/tests/core/IsEqual.js +56 -0
  446. data/frameworks/sproutcore/frameworks/runtime/tests/core/beget.js +23 -0
  447. data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +66 -0
  448. data/frameworks/sproutcore/frameworks/runtime/tests/core/guidFor.js +147 -0
  449. data/frameworks/sproutcore/frameworks/runtime/tests/core/inspect.js +27 -0
  450. data/frameworks/sproutcore/frameworks/runtime/tests/core/isArray.js +25 -0
  451. data/frameworks/sproutcore/frameworks/runtime/tests/core/itemType.js +38 -0
  452. data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +20 -0
  453. data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +30 -0
  454. data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +19 -0
  455. data/frameworks/sproutcore/frameworks/runtime/tests/core/tupleForPropertyPath.js +37 -0
  456. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +592 -0
  457. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +467 -0
  458. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +123 -0
  459. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/registerDependentKeys.js +79 -0
  460. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/propertyChanges.js +80 -0
  461. data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +263 -0
  462. data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +190 -0
  463. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +135 -0
  464. data/frameworks/sproutcore/frameworks/runtime/tests/system/object/bindings.js +339 -0
  465. data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +120 -0
  466. data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +313 -0
  467. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +84 -0
  468. data/frameworks/sproutcore/frameworks/testing/core.js +13 -0
  469. data/frameworks/sproutcore/frameworks/testing/english.lproj/additions.css +8 -0
  470. data/frameworks/sproutcore/frameworks/testing/english.lproj/testsuite.css +131 -0
  471. data/frameworks/sproutcore/frameworks/testing/extras.js +43 -0
  472. data/frameworks/sproutcore/frameworks/testing/jquery.js +3559 -0
  473. data/frameworks/sproutcore/frameworks/testing/qunit.js +819 -0
  474. data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +25 -0
  475. data/frameworks/sproutcore/frameworks/testing/utils.js +55 -0
  476. data/frameworks/sproutcore/lib/index.rhtml +118 -0
  477. data/frameworks/sproutcore/license.js +28 -0
  478. data/frameworks/sproutcore/themes/empty_theme/tests/mini_icons.rhtml +69 -0
  479. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/button.css +41 -0
  480. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +8 -0
  481. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/backButton.png +0 -0
  482. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/blueButton.png +0 -0
  483. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/cancel.png +0 -0
  484. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/grayButton.png +0 -0
  485. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/leftButton.png +0 -0
  486. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrow.png +0 -0
  487. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listArrowSel.png +0 -0
  488. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/listGroup.png +0 -0
  489. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/loading.gif +0 -0
  490. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/pinstripes.png +0 -0
  491. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/rightButton.png +0 -0
  492. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/selection.png +0 -0
  493. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/thumb.png +0 -0
  494. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggle.png +0 -0
  495. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toggleOn.png +0 -0
  496. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolButton.png +0 -0
  497. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/toolbar.png +0 -0
  498. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/images/whiteButton.png +0 -0
  499. data/frameworks/sproutcore/themes/iphone_theme/english.lproj/strings.js +15 -0
  500. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/Data +0 -0
  501. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Preview.jpg +0 -0
  502. data/frameworks/sproutcore/themes/standard_theme/Source/Panel.drawit/QuickLook/Thumbnail.jpg +0 -0
  503. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/Data +0 -0
  504. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Preview.jpg +0 -0
  505. data/frameworks/sproutcore/themes/standard_theme/Source/ToolbarView Pattern.drawit/QuickLook/Thumbnail.jpg +0 -0
  506. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/Data +0 -0
  507. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Preview.jpg +0 -0
  508. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-x.drawit/QuickLook/Thumbnail.jpg +0 -0
  509. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/Data +0 -0
  510. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Preview.jpg +0 -0
  511. data/frameworks/sproutcore/themes/standard_theme/Source/panel-sprite-y.drawit/QuickLook/Thumbnail.jpg +0 -0
  512. data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +333 -0
  513. data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +90 -0
  514. data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +53 -0
  515. data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +47 -0
  516. data/frameworks/sproutcore/themes/standard_theme/english.lproj/disclosure.css +55 -0
  517. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-sprite.png +0 -0
  518. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-ysprite.png +0 -0
  519. data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-toolbar-view.png +0 -0
  520. data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +37 -0
  521. data/frameworks/sproutcore/themes/standard_theme/english.lproj/pane.css +8 -0
  522. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/background-fat.jpg +0 -0
  523. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/background-thin.jpg +0 -0
  524. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-edge.png +0 -0
  525. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-left-corner.png +0 -0
  526. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/bottom-right-corner.png +0 -0
  527. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/left-edge.png +0 -0
  528. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/overlay.png +0 -0
  529. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/right-edge.png +0 -0
  530. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-edge.png +0 -0
  531. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-left-corner.png +0 -0
  532. data/frameworks/sproutcore/themes/standard_theme/english.lproj/panels/top-right-corner.png +0 -0
  533. data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +23 -0
  534. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +113 -0
  535. data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +141 -0
  536. data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +62 -0
  537. data/frameworks/sproutcore/themes/standard_theme/english.lproj/split_view.css +27 -0
  538. data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +12 -0
  539. data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +13 -0
  540. data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -0
  541. data/lib/thor/.autotest +7 -0
  542. data/lib/thor/CHANGELOG.rdoc +52 -0
  543. data/lib/thor/LICENSE +20 -0
  544. data/lib/thor/README.markdown +76 -0
  545. data/lib/thor/Rakefile +6 -0
  546. data/lib/thor/Thorfile +45 -0
  547. data/lib/thor/bin/rake2thor +83 -0
  548. data/lib/thor/bin/thor +7 -0
  549. data/lib/thor/lib/thor/error.rb +3 -0
  550. data/lib/thor/lib/thor/options.rb +267 -0
  551. data/lib/thor/lib/thor/ordered_hash.rb +64 -0
  552. data/lib/thor/lib/thor/runner.rb +305 -0
  553. data/lib/thor/lib/thor/task.rb +83 -0
  554. data/lib/thor/lib/thor/task_hash.rb +22 -0
  555. data/lib/thor/lib/thor/tasks/package.rb +18 -0
  556. data/lib/thor/lib/thor/tasks.rb +77 -0
  557. data/lib/thor/lib/thor/util.rb +75 -0
  558. data/lib/thor/lib/thor.rb +170 -0
  559. data/lib/thor/script/destroy +14 -0
  560. data/lib/thor/script/generate +14 -0
  561. data/lib/thor/spec/fixtures/task.thor +10 -0
  562. data/lib/thor/spec/options_spec.rb +271 -0
  563. data/lib/thor/spec/ordered_hash_spec.rb +84 -0
  564. data/lib/thor/spec/spec.opts +1 -0
  565. data/lib/thor/spec/spec_helper.rb +30 -0
  566. data/lib/thor/spec/task_spec.rb +11 -0
  567. data/lib/thor/spec/tasks_spec.rb +28 -0
  568. data/lib/thor/spec/thor_runner_spec.rb +194 -0
  569. data/lib/thor/spec/thor_spec.rb +206 -0
  570. data/lib/thor/spec/util_spec.rb +99 -0
  571. data/lib/thor/task.thor +15 -0
  572. data/lib/thor/thor.gemspec +29 -0
  573. metadata +3 -4
  574. data/sproutcore.gemspec +0 -47
@@ -0,0 +1,891 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore Costello - Property Observing Library
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // Portions ©2008-2009 Apple, Inc. All rights reserved.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ require('system/object') ;
9
+
10
+ /**
11
+ Debug parameter you can turn on. This will log all bindings that fire to
12
+ the console. This should be disabled in production code. Note that you
13
+ can also enable this from the console or temporarily.
14
+ */
15
+ SC.LOG_BINDING_NOTIFICATIONS = NO ;
16
+
17
+ /**
18
+ Performance paramter. This will benchmark the time spent firing each
19
+ binding.
20
+ */
21
+ SC.BENCHMARK_BINDING_NOTIFICATIONS = NO ;
22
+
23
+ /**
24
+ Performance parameter. This will benchmark the time spend configuring each
25
+ binding.
26
+ */
27
+ SC.BENCHMARK_BINDING_SETUP = NO;
28
+
29
+ /**
30
+ Default placeholder for multiple values in bindings.
31
+ */
32
+ SC.MULTIPLE_PLACEHOLDER = '@@MULT@@' ;
33
+
34
+ /**
35
+ Default placeholder for null values in bindings.
36
+ */
37
+ SC.NULL_PLACEHOLDER = '@@NULL@@' ;
38
+
39
+ /**
40
+ Default placeholder for empty values in bindings.
41
+ */
42
+ SC.EMPTY_PLACEHOLDER = '@@EMPTY@@' ;
43
+
44
+
45
+ /**
46
+ A binding simply connects the properties of two objects so that whenever the
47
+ value of one property changes, the other property will be changed also. You
48
+ do not usually work with Binding objects directly but instead describe
49
+ bindings in your class definition using something like:
50
+
51
+ valueBinding: "MyApp.someController.title"
52
+
53
+ This will create a binding from "MyApp.someController.title" to the "value"
54
+ property of your object instance automatically. Now the two values will be
55
+ kept in sync.
56
+
57
+ h2. Customizing Your Bindings
58
+
59
+ In addition to synchronizing values, bindings can also perform some basic
60
+ transforms on values. These transforms can help to make sure the data fed
61
+ into one object always meets the expectations of that object regardless of
62
+ what the other object outputs.
63
+
64
+ To customize a binding, you can use one of the many helper methods defined
65
+ on SC.Binding like so:
66
+
67
+ valueBinding: SC.Binding.single("MyApp.someController.title")
68
+
69
+ This will create a binding just like the example above, except that now the
70
+ binding will convert the value of MyApp.someController.title to a single
71
+ object (removing any arrays) before applying it to the "value" property of
72
+ your object.
73
+
74
+ You can also chain helper methods to build custom bindings like so:
75
+
76
+ valueBinding: SC.Binding.single("MyApp.someController.title").notEmpty("(EMPTY)")
77
+
78
+ This will force the value of MyApp.someController.title to be a single value
79
+ and then check to see if the value is "empty" (null, undefined, empty array,
80
+ or an empty string). If it is empty, the value will be set to the string
81
+ "(EMPTY)".
82
+
83
+ h2. One Way Bindings
84
+
85
+ One especially useful binding customization you can use is the oneWay()
86
+ helper. This helper tells SproutCore that you are only interested in
87
+ receiving changes on the object you are binding from. For example, if you
88
+ are binding to a preference and you want to be notified if the preference
89
+ has changed, but your object will not be changing the preference itself, you
90
+ could do:
91
+
92
+ bigTitlesBinding: SC.Binding.oneWay("MyApp.preferencesController.bigTitles")
93
+
94
+ This way if the value of MyApp.preferencesController.bigTitles changes the
95
+ "bigTitles" property of your object will change also. However, if you change
96
+ the value of your "bigTitles" property, it will not update the
97
+ preferencesController.
98
+
99
+ One way bindings are almost twice as fast to setup and twice as fast to
100
+ execute because the binding only has to worry about changes to one side.
101
+
102
+ You should consider using one way bindings anytime you have an object that
103
+ may be created frequently and you do not intend to change a property; only
104
+ to monitor it for changes. (such as in the example above).
105
+
106
+ h2. Adding Custom Transforms
107
+
108
+ In addition to using the standard helpers provided by SproutCore, you can
109
+ also defined your own custom transform functions which will be used to
110
+ convert the value. To do this, just define your transform function and add
111
+ it to the binding with the transform() helper. The following example will
112
+ not allow Integers less than ten. Note that it checks the value of the
113
+ bindings and allows all other values to pass:
114
+
115
+ {{{
116
+ valueBinding: SC.Binding.transform(function(value, binding) {
117
+ return ((SC.typeOf(value) === SC.T_NUMBER) && (value < 10)) ? 10 : value;
118
+ }).from("MyApp.someController.value")
119
+ }}}
120
+
121
+ If you would like to instead use this transform on a number of bindings,
122
+ you can also optionally add your own helper method to SC.Binding. This
123
+ method should simply return the value of this.transform(). The example
124
+ below adds a new helper called notLessThan() which will limit the value to
125
+ be not less than the passed minimum:
126
+
127
+ {{{
128
+ SC.Binding.notLessThan = function(minValue) {
129
+ return this.transform(function(value, binding) {
130
+ return ((SC.typeOf(value) === SC.T_NUMBER) && (value < minValue)) ? minValue : value ;
131
+ }) ;
132
+ } ;
133
+ }}}
134
+
135
+ You could specify this in your core.js file, for example. Then anywhere in
136
+ your application you can use it to define bindings like so:
137
+
138
+ {{{
139
+ valueBinding: SC.Binding.from("MyApp.someController.value").notLessThan(10)
140
+ }}}
141
+
142
+ Also, remember that helpers are chained so you can use your helper along with
143
+ any other helpers. The example below will create a one way binding that
144
+ does not allow empty values or values less than 10:
145
+
146
+ {{{
147
+ valueBinding: SC.Binding.oneWay("MyApp.someController.value").notEmpty().notLessThan(10)
148
+ }}}
149
+
150
+ Note that the built in helper methods all allow you to pass a "from" property
151
+ path so you don't have to use the from() helper to set the path. You can do
152
+ the same thing with your own helper methods if you like, but it is not
153
+ required.
154
+
155
+ h2. Creating Custom Binding Templates
156
+
157
+ Another way you can customize bindings is to create a binding template. A
158
+ template is simply a binding that is already partially or completely
159
+ configured. You can specify this template anywhere in your app and then use
160
+ it instead of designating your own custom bindings. This is a bit faster on
161
+ app startup but it is mostly useful in making your code less verbose.
162
+
163
+ For example, let's say you will be frequently creating one way, not empty
164
+ bindings that allow values greater than 10 throughout your app. You could
165
+ create a binding template in your core.js like this:
166
+
167
+ MyApp.LimitBinding = SC.Binding.oneWay().notEmpty().notLessThan(10);
168
+
169
+ Then anywhere you want to use this binding, just refer to the template like
170
+ so:
171
+
172
+ valueBinding: MyApp.LimitBinding.beget("MyApp.someController.value")
173
+
174
+ Note that when you use binding templates, it is very important that you always
175
+ start by using beget() to extend the template. If you do not do this, you
176
+ will end up using the same binding instance throughout your app which will
177
+ lead to erratic behavior.
178
+
179
+ h2. How to Manually Activate a Binding
180
+
181
+ All of the examples above show you how to configure a custom binding, but the
182
+ result of these customizations will be a binding template, not a fully active
183
+ binding. The binding will actually become active only when you instantiate
184
+ the object the binding belongs to. It is useful however, to understand what
185
+ actually happens when the binding is activated.
186
+
187
+ For a binding to function it must have at least a "from" property and a "to"
188
+ property. The from property path points to the object/key that you want to
189
+ bind from while the to path points to the object/key you want to bind to.
190
+
191
+ When you define a custom binding, you are usually describing the property
192
+ you want to bind from (such as "MyApp.someController.value" in the examples
193
+ above). When your object is created, it will automatically assign the value
194
+ you want to bind "to" based on the name of your binding key. In the examples
195
+ above, during init, SproutCore objects will effectively call something like
196
+ this on your binding:
197
+
198
+ binding = this.valueBinding.beget().to("value", this) ;
199
+
200
+ This creates a new binding instance based on the template you provide, and
201
+ sets the to path to the "value" property of the new object. Now that the
202
+ binding is fully configured with a "from" and a "to", it simply needs to be
203
+ connected to become active. This is done through the connect() method:
204
+
205
+ binding.connect() ;
206
+
207
+ Now that the binding is connected, it will observe both the from and to side
208
+ and relay changes.
209
+
210
+ If you ever needed to do so (you almost never will, but it is useful to
211
+ understand this anyway), you could manually create an active binding by
212
+ doing the following:
213
+
214
+ {{{
215
+ SC.Binding.from("MyApp.someController.value")
216
+ .to("MyApp.anotherObject.value")
217
+ .connect();
218
+ }}}
219
+
220
+ You could also use the bind() helper method provided by SC.Object. (This is
221
+ the same method used by SC.Object.init() to setup your bindings):
222
+
223
+ {{{
224
+ MyApp.anotherObject.bind("value", "MyApp.someController.value") ;
225
+ }}}
226
+
227
+ Both of these code fragments have the same effect as doing the most friendly
228
+ form of binding creation like so:
229
+
230
+ {{{
231
+ MyApp.anotherObject = SC.Object.create({
232
+ valueBinding: "MyApp.someController.value",
233
+
234
+ // OTHER CODE FOR THIS OBJECT...
235
+
236
+ }) ;
237
+ }}}
238
+
239
+ SproutCore's built in binding creation method make it easy to automatically
240
+ create bindings for you. You should always use the highest-level APIs
241
+ available, even if you understand how to it works underneath.
242
+
243
+
244
+ @extends Object
245
+
246
+ */
247
+ SC.Binding = {
248
+
249
+ /**
250
+ This is the core method you use to create a new binding instance. The
251
+ binding instance will have the receiver instance as its parent which means
252
+ any configuration you have there will be inherited.
253
+
254
+ The returned instance will also have its parentBinding property set to the
255
+ receiver.
256
+
257
+ @param fromPath {String} optional from path.
258
+ @returns {SC.Binding} new binding instance
259
+ */
260
+ beget: function(fromPath) {
261
+ var ret = SC.beget(this) ;
262
+ ret.parentBinding = this;
263
+ if (fromPath !== undefined) ret = ret.from(fromPath) ;
264
+ return ret ;
265
+ },
266
+
267
+ /**
268
+ Returns a builder function for compatibility.
269
+ */
270
+ builder: function() {
271
+ var binding = this ;
272
+ var ret = function(fromProperty) { return binding.beget().from(fromProperty); };
273
+ ret.beget = function() { return binding.beget(); } ;
274
+ return ret ;
275
+ },
276
+
277
+ /**
278
+ This will set "from" property path to the specified value. It will not
279
+ attempt to resolve this property path to an actual object/property tuple
280
+ until you connect the binding.
281
+
282
+ The binding will search for the property path starting at the root level
283
+ unless you specify an alternate root object as the second paramter to this
284
+ method. Alternatively, you can begin your property path with either "." or
285
+ "*", which will use the root object of the to side be default. This special
286
+ behavior is used to support the high-level API provided by SC.Object.
287
+
288
+ @param propertyPath {String|Tuple} A property path or tuple
289
+ @param root {Object} optional root object to use when resolving the path.
290
+ @returns {SC.Binding} this
291
+ */
292
+ from: function(propertyPath, root) {
293
+
294
+ // if the propertyPath is null/undefined, return this. This allows the
295
+ // method to be called from other methods when the fromPath might be
296
+ // optional. (cf single(), multiple())
297
+ if (!propertyPath) return this ;
298
+
299
+ // beget if needed.
300
+ var binding = (this === SC.Binding) ? this.beget() : this ;
301
+ binding._fromPropertyPath = propertyPath ;
302
+ binding._fromRoot = root ;
303
+ binding._fromTuple = null ;
304
+ return binding ;
305
+ },
306
+
307
+ /**
308
+ This will set the "to" property path to the specified value. It will not
309
+ attempt to reoslve this property path to an actual object/property tuple
310
+ until you connect the binding.
311
+
312
+ @param propertyPath {String|Tuple} A property path or tuple
313
+ @param root {Object} optional root object to use when resolving the path.
314
+ @returns {SC.Binding} this
315
+ */
316
+ to: function(propertyPath, root) {
317
+ // beget if needed.
318
+ var binding = (this === SC.Binding) ? this.beget() : this ;
319
+ binding._toPropertyPath = propertyPath ;
320
+ binding._toRoot = root ;
321
+ binding._toTuple = null ; // clear out any existing one.
322
+ return binding ;
323
+ },
324
+
325
+ /**
326
+ Attempts to connect this binding instance so that it can receive and relay
327
+ changes. This method will raise an exception if you have not set the
328
+ from/to properties yet.
329
+
330
+ @returns {SC.Binding} this
331
+ */
332
+ connect: function() {
333
+ // If the binding is already connected, do nothing.
334
+ if (this.isConnected) return this ;
335
+ this.isConnected = YES ;
336
+ this._connectionPending = YES ; // its connected but not really...
337
+ SC.Binding._connectQueue.add(this) ;
338
+ return this;
339
+ },
340
+
341
+ /** @private
342
+ Actually connects the binding. This is done at the end of the runloop
343
+ to give you time to setup your entire object graph before the bindings
344
+ try to activate.
345
+ */
346
+ _connect: function() {
347
+ if (!this._connectionPending) return; //nothing to do
348
+ this._connectionPending = NO ;
349
+
350
+ var path, root ;
351
+ var bench = SC.BENCHMARK_BINDING_SETUP;
352
+
353
+ if (bench) SC.Benchmark.start("SC.Binding.connect()");
354
+
355
+ // try to connect the from side.
356
+ // as a special behavior, if the from property path begins with either a
357
+ // . or * and the fromRoot is null, use the toRoot instead. This allows
358
+ // for support for the SC.Object shorthand:
359
+ //
360
+ // contentBinding: "*owner.value"
361
+ //
362
+ path = this._fromPropertyPath; root = this._fromRoot ;
363
+ if (SC.typeOf(path) === SC.T_STRING) {
364
+
365
+ // if the first character is a '.', this is a static path. make the
366
+ // toRoot the default root.
367
+ if (path.indexOf('.') === 0) {
368
+ path = path.slice(1);
369
+ if (!root) root = this._toRoot ;
370
+
371
+ // if the first character is a '*', then setup a tuple since this is a
372
+ // chained path.
373
+ } else if (path.indexOf('*') === 0) {
374
+ path = [this._fromRoot || this._toRoot, path.slice(1)] ;
375
+ root = null ;
376
+ }
377
+ }
378
+ SC.Observers.addObserver(path, this, this.fromPropertyDidChange, root) ;
379
+
380
+ // try to connect the to side
381
+ if (!this._oneWay) {
382
+ path = this._toPropertyPath; root = this._toRoot ;
383
+ SC.Observers.addObserver(path, this, this.toPropertyDidChange, root) ;
384
+ }
385
+
386
+ if (bench) SC.Benchmark.end("SC.Binding.connect()");
387
+
388
+ // now try to sync if needed
389
+ if (this._syncOnConnect) {
390
+ this._syncOnConnect = NO ;
391
+ if (bench) SC.Benchmark.start("SC.Binding.connect().sync");
392
+ this.sync();
393
+ if (bench) SC.Benchmark.end("SC.Binding.connect().sync");
394
+ }
395
+ },
396
+
397
+ /**
398
+ Disconnects the binding instance. Changes will no longer be relayed. You
399
+ will not usually need to call this method.
400
+
401
+ @returns {SC.Binding} this
402
+ */
403
+ disconnect: function() {
404
+ if (!this.isConnected) return this; // nothing to do.
405
+
406
+ // if connection is still pending, just cancel
407
+ if (this._connectionPending) {
408
+ this._connectionPending = NO ;
409
+
410
+ // connection is completed, disconnect.
411
+ } else {
412
+ SC.Observers.removeObserver(this._fromPropertyPath, this, this.fromPropertyDidChange, this._fromRoot) ;
413
+ if (!this._oneWay) {
414
+ SC.Observers.removeObserver(this._toPropertyPath, this, this.toPropertyDidChange, this._toRoot) ;
415
+ }
416
+ }
417
+
418
+ this.isConnected = NO ;
419
+ return this ;
420
+ },
421
+
422
+ /**
423
+ Invoked whenever the value of the "from" property changes. This will mark
424
+ the binding as dirty if the value has changed.
425
+ */
426
+ fromPropertyDidChange: function(target, key) {
427
+ var v = target.get(key) ;
428
+
429
+ //console.log("fromPropertyDidChange: %@ v = %@".fmt(this, v)) ;
430
+
431
+ // if the new value is different from the current binding value, then
432
+ // schedule to register an update.
433
+ if (v !== this._bindingValue) {
434
+
435
+ this._setBindingValue(v) ;
436
+ this._changePending = YES ;
437
+ SC.Binding._changeQueue.add(this) ; // save for later.
438
+ }
439
+ },
440
+
441
+ /**
442
+ Invoked whenever the value of the "to" property changes. This will mark the
443
+ binding as dirty only if:
444
+
445
+ - the binding is not one way
446
+ - the value does not match the stored transformedBindingValue
447
+
448
+ if the value does not match the transformedBindingValue, then it will
449
+ become the new bindingValue.
450
+ */
451
+ toPropertyDidChange: function(target, key) {
452
+ if (this._oneWay) return; // nothing to do
453
+
454
+ var v = target.get(key) ;
455
+
456
+ // if the new value is different from the current binding value, then
457
+ // schedule to register an update.
458
+ if (v !== this._transformedBindingValue) {
459
+ this._setBindingValue(v) ;
460
+ this._changePending = YES ;
461
+ SC.Binding._changeQueue.add(this) ; // save for later.
462
+ }
463
+ },
464
+
465
+ _setBindingValue: function(v) {
466
+ this._bindingValue = v ;
467
+
468
+ // apply any transforms to get the to property value also
469
+ var transforms = this._transforms;
470
+ if (transforms) {
471
+ var len = transforms.length ;
472
+ for(var idx=0;idx<len;idx++) {
473
+ var transform = transforms[idx] ;
474
+ v = transform(v, this) ;
475
+ }
476
+ }
477
+
478
+ // if error objects are not allowed, and the value is an error, then
479
+ // change it to null.
480
+ if (this._noError && SC.typeOf(v) === SC.T_ERROR) v = null ;
481
+
482
+ this._transformedBindingValue = v;
483
+ },
484
+
485
+ _connectQueue: SC.Set.create(),
486
+ _alternateConnectQueue: SC.Set.create(),
487
+ _changeQueue: SC.Set.create(),
488
+ _alternateChangeQueue: SC.Set.create(),
489
+ _changePending: NO,
490
+
491
+ /**
492
+ Call this method on SC.Binding to flush all bindings with changed pending.
493
+
494
+ @returns {Boolean} YES if changes were flushed.
495
+ */
496
+ flushPendingChanges: function() {
497
+
498
+ // don't allow flushing more than one at a time
499
+ if (this._isFlushing) return NO;
500
+ this._isFlushing = YES ;
501
+
502
+ var didFlush = NO ;
503
+ var log = SC.LOG_BINDING_NOTIFICATIONS ;
504
+
505
+ // connect any bindings
506
+ var queue, binding ;
507
+ while((queue = this._connectQueue).length >0) {
508
+ this._connectQueue = this._alternateConnectQueue ;
509
+ this._alternateConnectQueue = queue ;
510
+ while(binding = queue.pop()) binding._connect() ;
511
+ }
512
+
513
+ // loop through the changed queue...
514
+ while ((queue = this._changeQueue).length > 0) {
515
+ if (log) console.log("Begin: Trigger changed bindings") ;
516
+
517
+ didFlush = YES ;
518
+
519
+ // first, swap the change queues. This way any binding changes that
520
+ // happen while we flush the current queue can be queued up.
521
+ this._changeQueue = this._alternateChangeQueue ;
522
+ this._alternateChangeQueue = queue ;
523
+
524
+ // next, apply any bindings in the current queue. This may cause
525
+ // additional bindings to trigger, which will end up in the new active
526
+ // queue.
527
+ while(binding = queue.pop()) binding.applyBindingValue() ;
528
+
529
+ // now loop back and see if there are additional changes pending in the
530
+ // active queue. Repeat this until all bindings that need to trigger
531
+ // have triggered.
532
+ if (log) console.log("End: Trigger changed bindings") ;
533
+ }
534
+
535
+ // clean up
536
+ this._isFlushing = NO ;
537
+ return didFlush ;
538
+ },
539
+
540
+ /**
541
+ This method is called at the end of the Run Loop to relay the changed
542
+ binding value from one side to the other.
543
+ */
544
+ applyBindingValue: function() {
545
+ this._changePending = NO ;
546
+
547
+ // compute the binding targets if needed.
548
+ this._computeBindingTargets() ;
549
+
550
+ var v = this._bindingValue ;
551
+ var tv = this._transformedBindingValue ;
552
+ var bench = SC.BENCHMARK_BINDING_NOTIFICATIONS ;
553
+ var log = SC.LOG_BINDING_NOTIFICATIONS ;
554
+
555
+ // the from property value will always be the binding value, update if
556
+ // needed.
557
+ if (!this._oneWay && this._fromTarget) {
558
+ if (log) console.log("%@: %@ -> %@".fmt(this, v, tv)) ;
559
+ if (bench) SC.Benchmark.start(this.toString() + "->") ;
560
+ this._fromTarget.setPathIfChanged(this._fromPropertyKey, v) ;
561
+ if (bench) SC.Benchmark.end(this.toString() + "->") ;
562
+ }
563
+
564
+ // update the to value with the transformed value if needed.
565
+ if (this._toTarget) {
566
+ if (log) console.log("%@: %@ <- %@".fmt(this, v, tv)) ;
567
+ if (bench) SC.Benchmark.start(this.toString() + "<-") ;
568
+ this._toTarget.setPathIfChanged(this._toPropertyKey, tv) ;
569
+ if (bench) SC.Benchmark.start(this.toString() + "<-") ;
570
+ }
571
+ },
572
+
573
+ /**
574
+ Calling this method on a binding will cause it to check the value of the
575
+ from side of the binding matches the current expected value of the
576
+ binding. If not, it will relay the change as if the from side's value has
577
+ just changed.
578
+
579
+ This method is useful when you are dynamically connecting bindings to a
580
+ network of objects that may have already been initialized.
581
+ */
582
+ sync: function() {
583
+
584
+ // do nothing if not connected
585
+ if (!this.isConnected) return this;
586
+
587
+ // connection is pending, just note that we should sync also
588
+ if (this._connectionPending) {
589
+ this._syncOnConnect = YES ;
590
+
591
+ // we are connected, go ahead and sync
592
+ } else {
593
+ this._computeBindingTargets() ;
594
+ var target = this._fromTarget ;
595
+ var key = this._fromPropertyKey ;
596
+ if (!target || !key) return this ; // nothing to do
597
+
598
+ // get the new value
599
+ var v = target.getPath(key) ;
600
+
601
+ // if the new value is different from the current binding value, then
602
+ // schedule to register an update.
603
+ if (v !== this._bindingValue) {
604
+ this._setBindingValue(v) ;
605
+ this._changePending = YES ;
606
+ SC.Binding._changeQueue.add(this) ; // save for later.
607
+ }
608
+ }
609
+
610
+ return this ;
611
+ },
612
+
613
+ // set if you call sync() when the binding connection is still pending.
614
+ _syncOnConnect: NO,
615
+
616
+ _computeBindingTargets: function() {
617
+ if (!this._fromTarget) {
618
+
619
+ var path, root, tuple ;
620
+
621
+ // if the fromPropertyPath begins with a . or * then we may use the
622
+ // toRoot as the root object. Similar code exists in connect() so if
623
+ // you make a change to one be sure to update the other.
624
+ path = this._fromPropertyPath; root = this._fromRoot ;
625
+ if (SC.typeOf(path) === SC.T_STRING) {
626
+
627
+ // static path beginning with the toRoot
628
+ if (path.indexOf('.') === 0) {
629
+ path = path.slice(1) ; // remove the .
630
+ if (!root) root = this._toRoot; // use the toRoot optionally
631
+
632
+ // chained path beginning with toRoot. Setup a tuple
633
+ } else if (path.indexOf('*') === 0) {
634
+ path = [root || this._toRoot, path.slice(1)];
635
+ root = null ;
636
+ }
637
+ }
638
+
639
+ tuple = SC.tupleForPropertyPath(path, root) ;
640
+ if (tuple) {
641
+ this._fromTarget = tuple[0]; this._fromPropertyKey = tuple[1] ;
642
+ }
643
+ }
644
+
645
+ if (!this._toTarget) {
646
+ path = this._toPropertyPath; root = this._toRoot ;
647
+ tuple = SC.tupleForPropertyPath(path, root) ;
648
+ if (tuple) {
649
+ this._toTarget = tuple[0]; this._toPropertyKey = tuple[1] ;
650
+ }
651
+ }
652
+ },
653
+
654
+ /**
655
+ Configures the binding as one way. A one-way binding will relay changes
656
+ on the "from" side to the "to" side, but not the other way around. This
657
+ means that if you change the "to" side directly, the "from" side may have
658
+ a different value.
659
+
660
+ @param fromPath {String} optional from path to connect.
661
+ @param aFlag {Boolean} Optionally pass NO to set the binding back to two-way
662
+ @returns {SC.Binding} this
663
+ */
664
+ oneWay: function(fromPath, aFlag) {
665
+
666
+ // If fromPath is a bool but aFlag is undefined, swap.
667
+ if ((aFlag === undefined) && (SC.typeOf(fromPath) === SC.T_BOOL)) {
668
+ aFlag = fromPath; fromPath = null ;
669
+ }
670
+
671
+ // beget if needed.
672
+ var binding = this.from(fromPath) ;
673
+ if (binding === SC.Binding) binding = binding.beget() ;
674
+ binding._oneWay = (aFlag === undefined) ? YES : aFlag ;
675
+ return binding ;
676
+ },
677
+
678
+ /**
679
+ Adds the specified transform function to the array of transform functions.
680
+
681
+ The function you pass must have the following signature:
682
+
683
+ {{{
684
+ function(value) {} ;
685
+ }}}
686
+
687
+ It must return either the transformed value or an error object.
688
+
689
+ Transform functions are chained, so they are called in order. If you are
690
+ extending a binding and want to reset the transforms, you can call
691
+ resetTransform() first.
692
+
693
+ @param transformFunc {Function} the transform function.
694
+ @returns {SC.Binding} this
695
+ */
696
+ transform: function(transformFunc) {
697
+ var binding = (this === SC.Binding) ? this.beget() : this ;
698
+ var t = binding._transforms ;
699
+
700
+ // clone the transform array if this comes from the parent
701
+ if (t && (t === binding.parentBinding._transform)) {
702
+ t = binding._transforms = t.slice() ;
703
+ }
704
+
705
+ // create the transform array if needed.
706
+ if (!t) t = binding._transforms = [] ;
707
+
708
+ // add the transform function
709
+ t.push(transformFunc) ;
710
+ return binding;
711
+ },
712
+
713
+ /**
714
+ Resets the transforms for the binding. After calling this method the
715
+ binding will no longer transform values. You can then add new transforms
716
+ as needed.
717
+
718
+ @returns {SC.Binding} this
719
+ */
720
+ resetTransforms: function() {
721
+ var binding = (this === SC.Binding) ? this.beget() : this ;
722
+ binding._transforms = null ; return binding ;
723
+ },
724
+
725
+ /**
726
+ Specifies that the binding should not return error objects. If the value
727
+ of a binding is an Error object, it will be transformed to a null value
728
+ instead.
729
+
730
+ Note that this is not a transform function since it will be called at the
731
+ end of the transform chain.
732
+
733
+ @param fromPath {String} optional from path to connect.
734
+ @param aFlag {Boolean} optionally pass NO to allow error objects again.
735
+ @returns {SC.Binding} this
736
+ */
737
+ noError: function(fromPath, aFlag) {
738
+ // If fromPath is a bool but aFlag is undefined, swap.
739
+ if ((aFlag === undefined) && (SC.typeOf(fromPath) === SC.T_BOOL)) {
740
+ aFlag = fromPath; fromPath = null ;
741
+ }
742
+
743
+ // beget if needed.
744
+ var binding = this.from(fromPath) ;
745
+ if (binding === SC.Binding) binding = binding.beget() ;
746
+ binding._noError = (aFlag === undefined) ? YES : aFlag ;
747
+ return binding ;
748
+ },
749
+
750
+ /**
751
+ Adds a transform to the chain that will allow only single values to pass.
752
+ This will allow single values, nulls, and error values to pass through. If
753
+ you pass an array, it will be mapped as so:
754
+
755
+ {{{
756
+ [] => null
757
+ [a] => a
758
+ [a,b,c] => Multiple Placeholder
759
+ }}}
760
+
761
+ You can pass in an optional multiple placeholder or it will use the
762
+ default.
763
+
764
+ Note that this transform will only happen on forwarded valued. Reverse
765
+ values are send unchanged.
766
+
767
+ @param fromPath {String} from path or null
768
+ @param placeholder {Object} optional placeholder value.
769
+ @returns {SC.Binding} this
770
+ */
771
+ single: function(fromPath, placeholder) {
772
+ if (placeholder === undefined) {
773
+ placeholder = SC.MULTIPLE_PLACEHOLDER ;
774
+ }
775
+ return this.from(fromPath).transform(function(value, isForward) {
776
+ if (SC.isArray(value)) {
777
+ value = (value.length>1) ? placeholder : (value.length<=0) ? null : (value.objectAt ? value.objectAt(0) : value[0]);
778
+ }
779
+ return value ;
780
+ }) ;
781
+ },
782
+
783
+ /**
784
+ Adds a transform that will return the placeholder value if the value is
785
+ null, undefined, an empty array or an empty string. See also notNull().
786
+
787
+ @param fromPath {String} from path or null
788
+ @param placeholder {Object} optional placeholder.
789
+ @returns {SC.Binding} this
790
+ */
791
+ notEmpty: function(fromPath, placeholder) {
792
+ if (placeholder === undefined) placeholder = SC.EMPTY_PLACEHOLDER ;
793
+ return this.from(fromPath).transform(function(value, isForward) {
794
+ if (SC.none(value) || (value === '') || (SC.isArray(value) && value.length === 0)) {
795
+ value = placeholder ;
796
+ }
797
+ return value ;
798
+ }) ;
799
+ },
800
+
801
+ /**
802
+ Adds a transform that will return the placeholder value if the value is
803
+ null. Otherwise it will passthrough untouched. See also notEmpty().
804
+
805
+ @param fromPath {String} from path or null
806
+ @param placeholder {Object} optional placeholder;
807
+ @returns {SC.Binding} this
808
+ */
809
+ notNull: function(fromPath, placeholder) {
810
+ if (placeholder === undefined) placeholder = SC.EMPTY_PLACEHOLDER ;
811
+ return this.from(fromPath).transform(function(value, isForward) {
812
+ if (SC.none(value)) value = placeholder ;
813
+ return value ;
814
+ }) ;
815
+ },
816
+
817
+ /**
818
+ Adds a transform that will convert the passed value to an array. If
819
+ the value is null or undefined, it will be converted to an empty array.
820
+
821
+ @param fromPath {String} optional from path
822
+ @returns {SC.Binding} this
823
+ */
824
+ multiple: function(fromPath) {
825
+ return this.from(fromPath).transform(function(value) {
826
+ if (!SC.isArray(value)) value = (value == null) ? [] : [value] ;
827
+ return value ;
828
+ }) ;
829
+ },
830
+
831
+ /**
832
+ Adds a transform to convert the value to a bool value. If the value is
833
+ an array it will return YES if array is not empty. If the value is a string
834
+ it will return YES if the string is not empty.
835
+
836
+ @param fromPath {String} optional from path
837
+ @returns {SC.Binding} this
838
+ */
839
+ bool: function(fromPath) {
840
+ return this.from(fromPath).transform(function(v) {
841
+ var t = SC.typeOf(v) ;
842
+ if (t === SC.T_ERROR) return v ;
843
+ return (t == SC.T_ARRAY) ? (v.length > 0) : (v === '') ? NO : !!v ;
844
+ }) ;
845
+ },
846
+
847
+ /**
848
+ Adds a transform to convert the value to the inverse of a bool value. This
849
+ uses the same transform as bool() but inverts it.
850
+
851
+ @param fromPath {String} optional from path
852
+ @returns {SC.Binding} this
853
+ */
854
+ not: function(fromPath) {
855
+ return this.from(fromPath).transform(function(v) {
856
+ var t = SC.typeOf(v) ;
857
+ if (t === SC.T_ERROR) return v ;
858
+ return !((t == SC.T_ARRAY) ? (v.length > 0) : (v === '') ? NO : !!v) ;
859
+ }) ;
860
+ },
861
+
862
+ /**
863
+ Adds a transform that will return YES if the value is null, NO otherwise.
864
+
865
+ @returns {SC.Binding} this
866
+ */
867
+ isNull: function(fromPath) {
868
+ return this.from(fromPath).transform(function(v) {
869
+ var t = SC.typeOf(v) ;
870
+ return (t === SC.T_ERROR) ? v : SC.none(v) ;
871
+ });
872
+ },
873
+
874
+ toString: function() {
875
+ var from = this._fromRoot ? "<%@>:%@".fmt(this._fromRoot,this._fromPropertyPath) : this._fromPropertyPath;
876
+
877
+ var to = this._toRoot ? "<%@>:%@".fmt(this._toRoot,this._toPropertyPath) : this._toPropertyPath;
878
+
879
+ return "SC.Binding%@(%@ -> %@)".fmt(SC.guidFor(this), from, to) ;
880
+ }
881
+ } ;
882
+
883
+ /**
884
+ Shorthand method to define a binding. This is the same as calling:
885
+
886
+ {{{
887
+ SC.binding(path) = SC.Binding.from(path)
888
+ }}}
889
+ */
890
+ SC.binding = function(path, root) { return SC.Binding.from(path,root); } ;
891
+