sproutcore 1.7.1.beta → 1.8.0

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 (445) hide show
  1. data/CHANGELOG +44 -0
  2. data/README.rdoc +20 -20
  3. data/VERSION.yml +3 -3
  4. data/lib/Buildfile +1 -1
  5. data/lib/buildtasks/build.rake +5 -0
  6. data/lib/buildtasks/manifest.rake +19 -1
  7. data/lib/frameworks/sproutcore/Buildfile +19 -17
  8. data/lib/frameworks/sproutcore/CHANGELOG.md +163 -29
  9. data/lib/frameworks/sproutcore/README.md +29 -8
  10. data/lib/frameworks/sproutcore/apps/statechart_routing/Buildfile +12 -0
  11. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/login_controller.js +11 -0
  12. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/main_controller.js +7 -0
  13. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/statechart_controller.js +17 -0
  14. data/lib/frameworks/sproutcore/apps/statechart_routing/core.js +25 -0
  15. data/lib/frameworks/sproutcore/apps/statechart_routing/main.js +15 -0
  16. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/_theme.css +18 -0
  17. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/bar_page.js +14 -0
  18. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/foo_page.js +14 -0
  19. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/loading.rhtml +9 -0
  20. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/login_page.js +61 -0
  21. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/main_page.js +46 -0
  22. data/lib/frameworks/sproutcore/apps/statechart_routing/statechart.js +76 -0
  23. data/lib/frameworks/sproutcore/apps/statechart_routing/theme.js +27 -0
  24. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +1 -1
  25. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +1 -1
  26. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +1 -1
  27. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +1 -1
  28. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +1 -1
  29. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +1 -1
  30. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +14 -1
  32. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +15 -15
  33. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/animation/core.js +8 -5
  35. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +302 -70
  36. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +19 -14
  37. data/lib/frameworks/sproutcore/frameworks/bootstrap/tests/system/browser.js +471 -149
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +3 -3
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +42 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/run_loop.js +3 -2
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +2 -2
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +3 -3
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/body_overflow.js +63 -0
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +1 -1
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +37 -2
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +28 -6
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +10 -3
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +2 -2
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +66 -2
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +1 -1
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/cursor.js +1 -1
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +58 -57
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js.orig +445 -0
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +51 -31
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/ready.js +5 -1
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +53 -69
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +98 -72
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +37 -3
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +7 -4
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +21 -0
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +7 -7
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +23 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/browser.js +66 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/event.js +22 -0
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/locale.js +11 -11
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +4 -4
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +41 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +8 -8
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +17 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +15 -0
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +5 -5
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +50 -30
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/acceleration.js +46 -0
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -43
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +8 -34
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +3 -2
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +10 -1
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +6 -5
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +22 -2
  88. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +2 -2
  89. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +1 -1
  90. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +0 -2
  91. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +35 -0
  92. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +46 -19
  93. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -9
  94. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -3
  95. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +2 -2
  97. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +294 -302
  98. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js.orig +1531 -0
  99. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +4 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +14 -11
  101. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/many_array.js +63 -0
  102. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +4 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +50 -10
  105. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +4 -4
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +3 -3
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +1 -1
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +1 -1
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +114 -67
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +54 -1
  114. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +29 -9
  115. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +37 -45
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +127 -127
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +16 -0
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +42 -4
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +1 -1
  125. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -7
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +8 -0
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/resources/strings.js +2 -1
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +1 -0
  129. data/lib/frameworks/sproutcore/frameworks/debug/core.js +3 -3
  130. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +1 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  132. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +1 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -4
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +19 -6
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +30 -1
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +24 -1
  138. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +121 -28
  139. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +15 -15
  140. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +1 -1
  141. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -2
  142. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +2 -2
  143. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +39 -15
  144. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +3 -3
  145. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +2 -2
  147. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +14 -6
  148. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/popup_button.js +3 -3
  149. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +11 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +4 -3
  151. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -51
  152. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +11 -16
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +0 -2
  155. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +3 -3
  156. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +3 -3
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +9 -9
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/content.js +11 -11
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +1 -1
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +107 -81
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +3 -3
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +68 -60
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +57 -12
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +21 -19
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +2 -2
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +32 -3
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +12 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +12 -0
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +0 -8
  172. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +77 -132
  173. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +5 -6
  174. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +16 -15
  175. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +52 -52
  176. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +1 -1
  178. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +147 -147
  179. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +11 -2
  180. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -5
  182. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +22 -12
  183. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +13 -7
  184. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +2 -2
  185. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +462 -441
  186. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +48 -62
  187. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +22 -2
  188. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +150 -32
  189. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +104 -45
  190. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +42 -20
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +24 -24
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +148 -154
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -2
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +8 -7
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +2 -2
  197. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  198. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/files.js +1 -1
  199. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/library.js +1 -1
  200. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/targets.js +1 -1
  201. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/view_configs.js +1 -1
  202. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/mixins/drop_down.js +1 -1
  203. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/states/ready.js +1 -1
  204. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/plist_item.js +1 -1
  205. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/web.js +1 -1
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/controllers/page_design.js +2 -2
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/css/css_style_sheet.js +2 -2
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/object_designer.js +1 -1
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +2 -2
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/mixins/snap_lines.js +3 -3
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/designer_drop_target.js +1 -1
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/drawing.js +21 -21
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/page_item_view.js +1 -1
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +59 -53
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +2 -2
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphism/simple.js +1 -1
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +6 -6
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +2 -2
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +2 -2
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +17 -6
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +38 -14
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +5 -13
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +1 -1
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +5 -3
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/children.js +19 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/methods.js +20 -2
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/split_thumb.js +1 -1
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +35 -12
  230. data/lib/frameworks/sproutcore/frameworks/formatters/README +6 -0
  231. data/lib/frameworks/sproutcore/frameworks/formatters/english.lproj/strings.js +174 -0
  232. data/lib/frameworks/sproutcore/frameworks/formatters/formatters/date_formatter.js +351 -0
  233. data/lib/frameworks/sproutcore/frameworks/formatters/tests/date_formatter.js +517 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +345 -138
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +5 -3
  237. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +176 -42
  238. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +137 -105
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gestureable.js +2 -2
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +2 -2
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +16 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +1 -1
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +47 -47
  245. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +3 -3
  246. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +28 -6
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +1 -1
  249. data/lib/frameworks/sproutcore/frameworks/foundation/resources/benchmark.css +0 -5
  250. data/lib/frameworks/sproutcore/frameworks/foundation/resources/bootstrap.rhtml +34 -19
  251. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +0 -2
  252. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +1 -5
  253. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +8 -9
  254. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +2 -2
  255. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +179 -47
  256. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +34 -1
  257. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +1 -1
  258. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +26 -12
  259. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +7 -7
  260. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +12 -4
  261. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_metric_optimization.js +202 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/content_value_support/content.js +77 -8
  263. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +1 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/beginEditing.js +2 -2
  265. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/commitEditing.js +4 -3
  266. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/discardEditing.js +4 -2
  267. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/beginEditing.js +2 -2
  268. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/commitEditing.js +4 -2
  269. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/discardEditing.js +4 -2
  270. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +2 -2
  271. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +0 -8
  272. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +163 -149
  273. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +1 -1
  274. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +1 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  276. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +1 -1
  277. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +3 -3
  278. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +16 -43
  279. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -3
  280. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +67 -54
  281. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +49 -38
  282. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +285 -242
  283. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +13 -13
  284. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +19 -22
  285. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-sc.js +9 -3
  286. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +231 -186
  287. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +145 -143
  288. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +156 -154
  289. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +5 -5
  290. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +3 -3
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js.orig +540 -0
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +2 -2
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -8
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +5 -5
  295. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +12 -0
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +2 -2
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +1 -1
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +1 -1
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +7 -7
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +98 -32
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +7 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +14 -3
  303. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +98 -13
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +8 -14
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +2 -2
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +23 -6
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +69 -18
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +57 -31
  310. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +189 -14
  311. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +82 -22
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +20 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +125 -4
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +1 -1
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +2 -2
  316. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +37 -0
  317. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +2 -2
  318. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +16 -0
  319. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +75 -4
  320. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +41 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart_delegate.js +113 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/private/state_path_matcher.js +312 -0
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +18 -22
  324. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +508 -131
  325. data/lib/frameworks/sproutcore/frameworks/statechart/system/state_route_handler_context.js +78 -0
  326. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +265 -44
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +16 -0
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/responder_chain.js +11 -3
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/private/state_path_matcher.js +116 -0
  330. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/add_substate.js +108 -0
  331. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/with_concurrent.js +179 -0
  332. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/without_concurrent.js +74 -0
  333. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_state.js +141 -0
  334. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_substate.js +340 -0
  335. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/route_triggered.js +161 -0
  336. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/try_to_handle_event.js +288 -0
  337. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/history_state/standard/without_concurrent_states/context.js +5 -33
  338. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/with_concurrent_states/basic.js +213 -0
  339. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/without_concurrent_states/basic.js +212 -0
  340. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/without_concurrent_states/core.js +8 -0
  341. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{state/namespacing.js → statechart/methods/get_state.js} +3 -41
  342. data/lib/frameworks/sproutcore/frameworks/statechart/tests/statechart/{invoke_state_method.js → methods/invoke_state_method.js} +1 -1
  343. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{event_handling/advanced → statechart}/respond_to_event.js +1 -1
  344. data/lib/frameworks/sproutcore/frameworks/statechart/tests/system/state_route_handler_context/methods/retry.js +64 -0
  345. data/lib/frameworks/sproutcore/frameworks/table/core.js +2 -0
  346. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/controls/button.js +0 -1
  347. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars.js +29 -5
  348. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/bind.js +4 -3
  349. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/collection.js +0 -0
  350. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/localization.js +0 -0
  351. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/view.js +0 -0
  352. data/lib/frameworks/sproutcore/frameworks/{handlebars → template_view}/handlebars.js +493 -357
  353. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/checkbox_support.js +0 -0
  354. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/text_field_support.js +13 -2
  355. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/panes/template.js +0 -0
  356. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/controls/button.js +0 -0
  357. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/checkbox_support.js +0 -0
  358. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/text_field_support.js +0 -0
  359. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/panes/template.js +0 -0
  360. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/collection.js +39 -14
  361. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/core.js +0 -0
  362. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/handlebars.js +57 -6
  363. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/bindable_span.js +21 -6
  364. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template.js +9 -3
  365. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template_collection.js +55 -26
  366. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +1 -1
  367. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +122 -122
  368. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +2 -2
  369. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +4 -4
  370. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +1 -1
  371. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +0 -1
  372. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +4 -4
  373. data/lib/frameworks/sproutcore/lib/index.rhtml +55 -32
  374. data/lib/frameworks/sproutcore/license.js +2 -4
  375. data/lib/frameworks/sproutcore/themes/ace/resources/body.css +5 -1
  376. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +2 -2
  377. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/24px/button.css +21 -13
  378. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/30px/button.css +17 -10
  379. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +4 -3
  380. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/24px/button.css +20 -12
  381. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/30px/button.css +16 -8
  382. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/jumbo/button.css +17 -0
  383. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/small/button.css +17 -0
  384. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +2 -2
  385. data/lib/frameworks/sproutcore/themes/ace/resources/master-detail/master-detail.css +2 -2
  386. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +5 -3
  387. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +1 -1
  388. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/toolbar.css +1 -1
  389. data/lib/gen/app/USAGE +17 -4
  390. data/lib/gen/language/Buildfile +4 -4
  391. data/lib/gen/language/USAGE +4 -4
  392. data/lib/gen/page/templates/pages/@target_name@/Buildfile +7 -7
  393. data/lib/gen/{html_app → statechart_app}/Buildfile +0 -0
  394. data/lib/gen/{html_app → statechart_app}/README +0 -0
  395. data/lib/gen/statechart_app/USAGE +21 -0
  396. data/lib/gen/statechart_app/templates/apps/@target_name@/Buildfile +9 -0
  397. data/lib/gen/statechart_app/templates/apps/@target_name@/core.js +24 -0
  398. data/lib/gen/statechart_app/templates/apps/@target_name@/main.js +26 -0
  399. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/_theme.css +18 -0
  400. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  401. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/main_page.js +21 -0
  402. data/lib/gen/statechart_app/templates/apps/@target_name@/statechart.js +8 -0
  403. data/lib/gen/statechart_app/templates/apps/@target_name@/states/ready_state.js +12 -0
  404. data/lib/gen/statechart_app/templates/apps/@target_name@/theme.js +24 -0
  405. data/lib/sproutcore/builders.rb +1 -0
  406. data/lib/sproutcore/builders/base.rb +19 -1
  407. data/lib/sproutcore/builders/chance_file.rb +6 -1
  408. data/lib/sproutcore/builders/handlebars.rb +1 -9
  409. data/lib/sproutcore/builders/javascript.rb +1 -10
  410. data/lib/sproutcore/builders/json.rb +25 -0
  411. data/lib/sproutcore/builders/less.rb +1 -1
  412. data/lib/sproutcore/builders/sass.rb +1 -1
  413. data/lib/sproutcore/builders/stylesheet.rb +1 -9
  414. data/lib/sproutcore/helpers/html5_manifest.rb +1 -1
  415. data/lib/sproutcore/helpers/static_helper.rb +42 -0
  416. data/lib/sproutcore/rack/proxy.rb +21 -3
  417. data/lib/sproutcore/rack/service.rb +3 -2
  418. data/lib/sproutcore/tools.rb +18 -25
  419. data/lib/sproutcore/tools/gen.rb +10 -3
  420. data/lib/sproutcore/tools/init.rb +11 -10
  421. data/spec/buildtasks/manifest/prepare_build_tasks/json_spec.rb +62 -0
  422. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -1
  423. data/spec/fixtures/builder_tests/apps/json_test/sc_static.json +2 -0
  424. data/spec/lib/builders/json_spec.rb +53 -0
  425. data/sproutcore.gemspec +2 -2
  426. data/vendor/chance/lib/chance/parser.rb +1 -1
  427. metadata +222 -177
  428. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  429. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +0 -259
  430. data/lib/frameworks/sproutcore/frameworks/documentation/core.js +0 -0
  431. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +0 -69
  432. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +0 -44
  433. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +0 -64
  434. data/lib/frameworks/sproutcore/frameworks/mini/license.js +0 -30
  435. data/lib/gen/html_app/USAGE +0 -15
  436. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +0 -11
  437. data/lib/gen/html_app/templates/apps/@target_name@/resources/images/.gitkeep +0 -0
  438. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +0 -6
  439. data/lib/gen/html_app/templates/apps/@target_name@/resources/templates/@target_name@.handlebars +0 -1
  440. data/lib/gen/html_project/Buildfile +0 -45
  441. data/lib/gen/html_project/INIT +0 -3
  442. data/lib/gen/html_project/README +0 -1
  443. data/lib/gen/html_project/USAGE +0 -2
  444. data/lib/gen/html_project/templates/@filename@/Buildfile +0 -5
  445. data/lib/gen/html_project/templates/@filename@/README +0 -4
@@ -0,0 +1,78 @@
1
+ // ==========================================================================
2
+ // Project: SC.Statechart - A Statechart Framework for SproutCore
3
+ // Copyright: ©2010, 2011 Michael Cohen, and contributors.
4
+ // Portions @2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ /*globals SC */
9
+
10
+ /**
11
+ @class
12
+
13
+ Represents contextual information for whenever a state handles a triggered
14
+ route. In additional to retaining contextual information, you can also
15
+ use the object to retry trigging the state's route handler. Useful in cases
16
+ where you need to defer the handling of the route for a later time.
17
+
18
+ @see SC.State
19
+
20
+ @extends SC.Object
21
+ @author Michael Cohen
22
+ */
23
+ SC.StateRouteHandlerContext = SC.Object.extend(
24
+ /** @scope SC.StateRouteContext.prototype */{
25
+
26
+ /**
27
+ The state that constructed this context object.
28
+
29
+ @property {SC.State}
30
+ */
31
+ state: null,
32
+
33
+ /**
34
+ The location that caused the state's route to be
35
+ triggered.
36
+
37
+ @property {String}
38
+ */
39
+ location: null,
40
+
41
+ /**
42
+ The parameters that were supplied to the state's
43
+ handler when the state's route was triggered.
44
+
45
+ @property {Hash}
46
+ */
47
+ params: null,
48
+
49
+ /**
50
+ The handler that got invoked when the state's
51
+ route was triggered. This can either be a reference
52
+ to the actual method or a name of the method.
53
+
54
+ @property {Function|String}
55
+ */
56
+ handler: null,
57
+
58
+ /**
59
+ Used to retry invoking the state's handler for when
60
+ the state's route gets triggered. When called this will
61
+ essentially perform the same call as when the handler
62
+ was originally triggered on state.
63
+ */
64
+ retry: function() {
65
+ var state = this.get('state'),
66
+ params = this.get('params'),
67
+ handler = this.get('handler');
68
+
69
+ if (SC.typeOf(handler) === SC.T_STRING) {
70
+ handler = state[handler];
71
+ }
72
+
73
+ if (SC.typeOf(handler) === SC.T_FUNCTION) {
74
+ handler.apply(state, [params]);
75
+ }
76
+ }
77
+
78
+ });
@@ -8,6 +8,7 @@
8
8
  /*globals SC */
9
9
 
10
10
  sc_require('system/state');
11
+ sc_require('mixins/statechart_delegate');
11
12
 
12
13
  /**
13
14
  @class
@@ -15,7 +16,7 @@ sc_require('system/state');
15
16
  The startchart manager mixin allows an object to be a statechart. By becoming a statechart, the
16
17
  object can then be manage a set of its own states.
17
18
 
18
- This implemention of the statechart manager closely follows the concepts stated in D. Harel's
19
+ This implementation of the statechart manager closely follows the concepts stated in D. Harel's
19
20
  original paper "Statecharts: A Visual Formalism For Complex Systems"
20
21
  (www.wisdom.weizmann.ac.il/~harel/papers/Statecharts.pdf).
21
22
 
@@ -121,7 +122,7 @@ sc_require('system/state');
121
122
  initialSubstate: 'stateX',
122
123
 
123
124
  stateX: SC.State.design({ ... })
124
- stateY: SC.State.desgin({ ... })
125
+ stateY: SC.State.design({ ... })
125
126
  })
126
127
  })
127
128
  });
@@ -182,6 +183,13 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
182
183
  */
183
184
  statechartIsInitialized: NO,
184
185
 
186
+ /**
187
+ Optional name you can provide the statechart with. If set this will be included
188
+ in tracing and error output as well as detail output. Useful for
189
+ debugging/diagnostic purposes
190
+ */
191
+ name: null,
192
+
185
193
  /**
186
194
  The root state of this statechart. All statecharts must have a root state.
187
195
 
@@ -210,7 +218,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
210
218
  rootStateExample: SC.State,
211
219
 
212
220
  /**
213
- Indicates what state should be the intiail state of this statechart. The value
221
+ Indicates what state should be the initial state of this statechart. The value
214
222
  assigned must be the name of a property on this object that represents a state.
215
223
  As well, the statesAreConcurrent must be set to NO.
216
224
 
@@ -308,6 +316,29 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
308
316
  */
309
317
  suppressStatechartWarnings: NO,
310
318
 
319
+ /**
320
+ A statechart delegate used by the statechart and the states that the statechart
321
+ manages. The value assigned must adhere to the {@link SC.StatechartDelegate} mixin.
322
+
323
+ @property {SC.Object}
324
+
325
+ @see SC.StatechartDelegate
326
+ */
327
+ delegate: null,
328
+
329
+ /**
330
+ Computed property that returns an objects that adheres to the
331
+ {@link SC.StatechartDelegate} mixin. If the {@link #delegate} is not
332
+ assigned then this object is the default value returned.
333
+
334
+ @see SC.StatechartDelegate
335
+ @see #delegate
336
+ */
337
+ statechartDelegate: function() {
338
+ var del = this.get('delegate');
339
+ return this.delegateFor('isStatechartDelegate', del);
340
+ }.property('delegate'),
341
+
311
342
  initMixin: function() {
312
343
  if (this.get('autoInitStatechart')) {
313
344
  this.initStatechart();
@@ -476,10 +507,11 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
476
507
  @param value {State|String} either a state object of the name of a state
477
508
  @returns {State} if a match then the matching state is returned, otherwise null is returned
478
509
  */
479
- getState: function(value) {
480
- return this.get('rootState').getSubstate(value);
510
+ getState: function(state) {
511
+ var root = this.get('rootState');
512
+ return root === state ? root : root.getSubstate(state);
481
513
  },
482
-
514
+
483
515
  /**
484
516
  When called, the statechart will proceed with making state transitions in the statechart starting from
485
517
  a current state that meet the statechart conditions. When complete, some or all of the statechart's
@@ -524,7 +556,6 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
524
556
  @param context {Hash} Optional. A context object that will be passed to all exited and entered states
525
557
  */
526
558
  gotoState: function(state, fromCurrentState, useHistory, context) {
527
-
528
559
  if (!this.get('statechartIsInitialized')) {
529
560
  this.statechartLogError("can not go to state %@. statechart has not yet been initialized".fmt(state));
530
561
  return;
@@ -551,7 +582,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
551
582
  paramFromCurrentState = fromCurrentState,
552
583
  msg;
553
584
 
554
- state = rootState.getSubstate(state);
585
+ state = this.getState(state);
555
586
 
556
587
  if (SC.none(state)) {
557
588
  this.statechartLogError("Can not to goto state %@. Not a recognized state in statechart".fmt(paramState));
@@ -576,9 +607,9 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
576
607
  // interferes.
577
608
  this._gotoStateLocked = YES;
578
609
 
579
- if (!SC.none(fromCurrentState)) {
610
+ if (fromCurrentState) {
580
611
  // Check to make sure the current state given is actually a current state of this statechart
581
- fromCurrentState = rootState.getSubstate(fromCurrentState);
612
+ fromCurrentState = this.getState(fromCurrentState);
582
613
  if (SC.none(fromCurrentState) || !fromCurrentState.get('isCurrentState')) {
583
614
  msg = "Can not to goto state %@. %@ is not a recognized current state in statechart";
584
615
  this.statechartLogError(msg.fmt(paramState, paramFromCurrentState));
@@ -586,12 +617,11 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
586
617
  return;
587
618
  }
588
619
  }
589
- else if (this.getPath('currentStates.length') > 0) {
590
- // No explicit current state to start from; therefore, just use the first current state as
591
- // a default, if there is a current state.
592
- fromCurrentState = this.get('currentStates')[0];
593
- msg = "gotoState: fromCurrentState not explicitly provided. Using a default current state to transition from: %@";
594
- this.statechartLogWarning(msg.fmt(fromCurrentState));
620
+ else {
621
+ // No explicit current state to start from; therefore, need to find a current state
622
+ // to transition from.
623
+ fromCurrentState = state.findFirstRelativeCurrentState();
624
+ if (!fromCurrentState) fromCurrentState = this.get('firstCurrentState');
595
625
  }
596
626
 
597
627
  if (trace) {
@@ -618,7 +648,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
618
648
 
619
649
  if (pivotState) {
620
650
  if (trace) this.statechartLogTrace("pivot state = %@".fmt(pivotState));
621
- if (pivotState.get('substatesAreConcurrent')) {
651
+ if (pivotState.get('substatesAreConcurrent') && pivotState !== state) {
622
652
  this.statechartLogError("Can not go to state %@ from %@. Pivot state %@ has concurrent substates.".fmt(state, fromCurrentState, pivotState));
623
653
  this._gotoStateLocked = NO;
624
654
  return;
@@ -628,6 +658,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
628
658
  // Collect what actions to perform for the state transition process
629
659
  var gotoStateActions = [];
630
660
 
661
+
631
662
  // Go ahead and find states that are to be exited
632
663
  this._traverseStatesToExit(exitStates.shift(), exitStates, pivotState, gotoStateActions);
633
664
 
@@ -640,6 +671,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
640
671
  }
641
672
 
642
673
  // Collected all the state transition actions to be performed. Now execute them.
674
+ this._gotoStateActions = gotoStateActions;
643
675
  this._executeGotoStateActions(state, gotoStateActions, null, context);
644
676
  },
645
677
 
@@ -680,7 +712,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
680
712
  marker = SC.none(marker) ? 0 : marker;
681
713
 
682
714
  for (; marker < len; marker += 1) {
683
- action = actions[marker];
715
+ this._currentGotoStateAction = action = actions[marker];
684
716
  switch (action.action) {
685
717
  case SC.EXIT_STATE:
686
718
  actionResult = this._exitState(action.state, context);
@@ -722,9 +754,14 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
722
754
  this.statechartLogTrace("END gotoState: %@".fmt(gotoState));
723
755
  }
724
756
 
725
- // Okay. We're done with the current state transition. Make sure to unlock the
726
- // gotoState and let other pending state transitions execute.
757
+ this._cleanupStateTransition();
758
+ },
759
+
760
+ /** @private */
761
+ _cleanupStateTransition: function() {
762
+ this._currentGotoStateAction = null;
727
763
  this._gotoStateSuspendedPoint = null;
764
+ this._gotoStateActions = null;
728
765
  this._gotoStateLocked = NO;
729
766
  this._flushPendingStateTransition();
730
767
  },
@@ -747,14 +784,15 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
747
784
  parentState = parentState.get('parentState');
748
785
  }
749
786
 
750
- if (this.get('allowStatechartTracing')) this.statechartLogTrace("<-- exiting state: %@".fmt(state));
787
+ if (this.get('allowStatechartTracing')) {
788
+ this.statechartLogTrace("<-- exiting state: %@".fmt(state));
789
+ }
751
790
 
752
791
  state.set('currentSubstates', []);
753
- state.notifyPropertyChange('isCurrentState');
754
792
 
755
- state.stateWillBecomeExited();
793
+ state.stateWillBecomeExited(context);
756
794
  var result = this.exitState(state, context);
757
- state.stateDidBecomeExited();
795
+ state.stateDidBecomeExited(context);
758
796
 
759
797
  if (this.get('monitorIsActive')) this.get('monitor').pushExitedState(state);
760
798
 
@@ -797,11 +835,9 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
797
835
 
798
836
  if (this.get('allowStatechartTracing')) this.statechartLogTrace("--> entering state: %@".fmt(state));
799
837
 
800
- state.notifyPropertyChange('isCurrentState');
801
-
802
- state.stateWillBecomeEntered();
838
+ state.stateWillBecomeEntered(context);
803
839
  var result = this.enterState(state, context);
804
- state.stateDidBecomeEntered();
840
+ state.stateDidBecomeEntered(context);
805
841
 
806
842
  if (this.get('monitorIsActive')) this.get('monitor').pushEnteredState(state);
807
843
 
@@ -814,11 +850,21 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
814
850
  Called during the state transition process whenever the gotoState method is
815
851
  invoked.
816
852
 
853
+ If the context provided is a state route context object
854
+ ({@link SC.StateRouteContext}), then if the given state has a enterStateByRoute
855
+ method, that method will be invoked, otherwise the state's enterState method
856
+ will be invoked by default. The state route context object will be supplied to
857
+ both enter methods in either case.
858
+
817
859
  @param state {SC.State} the state whose enterState method is to be invoked
818
860
  @param context {Hash} a context hash object to provide the enterState method
819
861
  */
820
862
  enterState: function(state, context) {
821
- return state.enterState(context);
863
+ if (state.enterStateByRoute && SC.kindOf(context, SC.StateRouteHandlerContext)) {
864
+ return state.enterStateByRoute(context);
865
+ } else {
866
+ return state.enterState(context);
867
+ }
822
868
  },
823
869
 
824
870
  /**
@@ -840,17 +886,17 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
840
886
  Method can be called in the following ways:
841
887
 
842
888
  // With one arguments.
843
- gotoHistorytate(<state>)
889
+ gotoHistoryState(<state>)
844
890
 
845
891
  // With two arguments.
846
- gotoHistorytate(<state>, <state | boolean | hash>)
892
+ gotoHistoryState(<state>, <state | boolean | hash>)
847
893
 
848
894
  // With three arguments.
849
- gotoHistorytate(<state>, <state>, <boolean | hash>)
850
- gotoHistorytate(<state>, <boolean>, <hash>)
895
+ gotoHistoryState(<state>, <state>, <boolean | hash>)
896
+ gotoHistoryState(<state>, <boolean>, <hash>)
851
897
 
852
898
  // With four argumetns
853
- gotoHistorytate(<state>, <state>, <boolean>, <hash>)
899
+ gotoHistoryState(<state>, <state>, <boolean>, <hash>)
854
900
 
855
901
  where <state> is either a SC.State object or a string and <hash> is a regular JS hash object.
856
902
 
@@ -897,10 +943,17 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
897
943
  If a current state does can not respond to the sent event, then the current state's parent state
898
944
  will be tried. This process is recursively done until no more parent state can be tried.
899
945
 
946
+ Note that a state will only be checked once if it can respond to an event. Therefore, if
947
+ there is a state S that handles event foo and S has concurrent substates, then foo will
948
+ only be invoked once; not as many times as there are substates.
949
+
900
950
  @param event {String} name of the event
901
951
  @param arg1 {Object} optional argument
902
952
  @param arg2 {Object} optional argument
903
953
  @returns {SC.Responder} the responder that handled it or null
954
+
955
+ @see #stateWillTryToHandleEvent
956
+ @see #stateDidTryToHandleEvent
904
957
  */
905
958
  sendEvent: function(event, arg1, arg2) {
906
959
 
@@ -912,6 +965,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
912
965
  var statechartHandledEvent = NO,
913
966
  eventHandled = NO,
914
967
  currentStates = this.get('currentStates').slice(),
968
+ checkedStates = {},
915
969
  len = 0,
916
970
  i = 0,
917
971
  state = null,
@@ -933,7 +987,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
933
987
  this._sendEventLocked = YES;
934
988
 
935
989
  if (trace) {
936
- this.statechartLogTrace("BEGIN sendEvent: event<%@>".fmt(event));
990
+ this.statechartLogTrace("BEGIN sendEvent: '%@'".fmt(event));
937
991
  }
938
992
 
939
993
  len = currentStates.get('length');
@@ -942,7 +996,10 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
942
996
  state = currentStates[i];
943
997
  if (!state.get('isCurrentState')) continue;
944
998
  while (!eventHandled && state) {
945
- eventHandled = state.tryToHandleEvent(event, arg1, arg2);
999
+ if (!checkedStates[state.get('fullPath')]) {
1000
+ eventHandled = state.tryToHandleEvent(event, arg1, arg2);
1001
+ checkedStates[state.get('fullPath')] = YES;
1002
+ }
946
1003
  if (!eventHandled) state = state.get('parentState');
947
1004
  else statechartHandledEvent = YES;
948
1005
  }
@@ -954,13 +1011,42 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
954
1011
 
955
1012
  if (trace) {
956
1013
  if (!statechartHandledEvent) this.statechartLogTrace("No state was able handle event %@".fmt(event));
957
- this.statechartLogTrace("END sendEvent: event<%@>".fmt(event));
1014
+ this.statechartLogTrace("END sendEvent: '%@'".fmt(event));
958
1015
  }
959
1016
 
960
1017
  var result = this._flushPendingSentEvents();
961
1018
 
962
1019
  return statechartHandledEvent ? this : (result ? this : null);
963
1020
  },
1021
+
1022
+ /**
1023
+ Used to notify the statechart that a state will try to handle event that has been passed
1024
+ to it.
1025
+
1026
+ @param {SC.State} state the state that will try to handle the event
1027
+ @param {String} event the event the state will try to handle
1028
+ @param {String} handler the name of the method on the state that will try to handle the event
1029
+ */
1030
+ stateWillTryToHandleEvent: function(state, event, handler) {
1031
+ this._stateHandleEventInfo = {
1032
+ state: state,
1033
+ event: event,
1034
+ handler: handler
1035
+ };
1036
+ },
1037
+
1038
+ /**
1039
+ Used to notify the statechart that a state did try to handle event that has been passed
1040
+ to it.
1041
+
1042
+ @param {SC.State} state the state that did try to handle the event
1043
+ @param {String} event the event the state did try to handle
1044
+ @param {String} handler the name of the method on the state that did try to handle the event
1045
+ @param {Boolean} handled indicates if the handler was able to handle the event
1046
+ */
1047
+ stateDidTryToHandleEvent: function(state, event, handler, handled) {
1048
+ this._stateHandleEventInfo = null;
1049
+ },
964
1050
 
965
1051
  /** @private
966
1052
 
@@ -1032,7 +1118,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
1032
1118
 
1033
1119
  /** @private
1034
1120
 
1035
- Recursively follow states that are to be entred during the state transition process. The
1121
+ Recursively follow states that are to be entered during the state transition process. The
1036
1122
  enter process is to start from the given state and work its way down a given enter path. When
1037
1123
  the end of enter path has been reached, then continue entering states based on whether
1038
1124
  an initial substate is defined, there are concurrent substates or history states are to be
@@ -1135,7 +1221,7 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
1135
1221
 
1136
1222
  /** @override
1137
1223
 
1138
- Attemps to handle a given event against any of the statechart's current states and the
1224
+ Attempts to handle a given event against any of the statechart's current states and the
1139
1225
  statechart itself. If any current state can handle the event or the statechart itself can
1140
1226
  handle the event then YES is returned, otherwise NO is returned.
1141
1227
 
@@ -1145,10 +1231,14 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
1145
1231
  @returns {Boolean} YES if handled, NO if not handled
1146
1232
  */
1147
1233
  tryToPerform: function(event, arg1, arg2) {
1148
- if (this.respondsTo(event)) {
1149
- if (SC.typeOf(this[event]) === SC.T_FUNCTION) return (this[event](arg1, arg2) !== NO);
1150
- else return !!this.sendEvent(event, arg1, arg2);
1151
- } return NO;
1234
+ if (!this.respondsTo(event)) return NO;
1235
+
1236
+ if (SC.typeOf(this[event]) === SC.T_FUNCTION) {
1237
+ var result = this[event](arg1, arg2);
1238
+ if (result !== NO) return YES;
1239
+ }
1240
+
1241
+ return !!this.sendEvent(event, arg1, arg2);
1152
1242
  },
1153
1243
 
1154
1244
  /**
@@ -1319,7 +1409,10 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
1319
1409
  processedArgs.useHistory = value;
1320
1410
  break;
1321
1411
  case SC.T_HASH:
1322
- processedArgs.context = value;
1412
+ case SC.T_OBJECT:
1413
+ if (!SC.kindOf(value, SC.State)) {
1414
+ processedArgs.context = value;
1415
+ }
1323
1416
  break;
1324
1417
  default:
1325
1418
  processedArgs.fromCurrentState = value;
@@ -1459,10 +1552,138 @@ SC.StatechartManager = /** @scope SC.StatechartManager.prototype */{
1459
1552
  /** @private */
1460
1553
  _statechartTraceDidChange: function() {
1461
1554
  this.notifyPropertyChange('allowStatechartTracing');
1555
+ },
1556
+
1557
+ /**
1558
+ @property
1559
+
1560
+ Returns an object containing current detailed information about
1561
+ the statechart. This is primarily used for diagnostic/debugging
1562
+ purposes.
1563
+
1564
+ Detailed information includes:
1565
+
1566
+ - current states
1567
+ - state transtion information
1568
+ - event handling information
1569
+
1570
+ @returns {Hash}
1571
+ */
1572
+ details: function() {
1573
+ var details = {
1574
+ 'initialized': this.get('statechartIsInitialized')
1575
+ };
1576
+
1577
+ if (this.get('name')) {
1578
+ details['name'] = this.get('name');
1579
+ }
1580
+
1581
+ if (!this.get('statechartIsInitialized')) {
1582
+ return details;
1583
+ }
1584
+
1585
+ details['current-states'] = [];
1586
+ this.get('currentStates').forEach(function(state) {
1587
+ details['current-states'].push(state.get('fullPath'));
1588
+ });
1589
+
1590
+ var stateTransition = {
1591
+ active: this.get('gotoStateActive'),
1592
+ suspended: this.get('gotoStateSuspended')
1593
+ };
1594
+
1595
+ if (this._gotoStateActions) {
1596
+ stateTransition['transition-sequence'] = [];
1597
+ var actions = this._gotoStateActions,
1598
+ actionToStr = function(action) {
1599
+ var actionName = action.action === SC.ENTER_STATE ? "enter" : "exit";
1600
+ return "%@ %@".fmt(actionName, action.state.get('fullPath'));
1601
+ };
1602
+
1603
+ actions.forEach(function(action) {
1604
+ stateTransition['transition-sequence'].push(actionToStr(action));
1605
+ });
1606
+
1607
+ stateTransition['current-transition'] = actionToStr(this._currentGotoStateAction);
1608
+ }
1609
+
1610
+ details['state-transition'] = stateTransition;
1611
+
1612
+ if (this._stateHandleEventInfo) {
1613
+ var info = this._stateHandleEventInfo;
1614
+ details['handling-event'] = {
1615
+ state: info.state.get('fullPath'),
1616
+ event: info.event,
1617
+ handler: info.handler
1618
+ };
1619
+ } else {
1620
+ details['handling-event'] = false;
1621
+ }
1622
+
1623
+ return details;
1624
+ }.property(),
1625
+
1626
+ /**
1627
+ Returns a formatted string of detailed information about this statechart. Useful
1628
+ for diagnostic/debugging purposes.
1629
+
1630
+ @returns {String}
1631
+
1632
+ @see #details
1633
+ */
1634
+ toStringWithDetails: function() {
1635
+ var str = "",
1636
+ header = this.toString(),
1637
+ details = this.get('details');
1638
+
1639
+ str += header + "\n";
1640
+ str += this._hashToString(details, 2);
1641
+
1642
+ return str;
1643
+ },
1644
+
1645
+ /** @private */
1646
+ _hashToString: function(hash, indent) {
1647
+ var str = "";
1648
+
1649
+ for (var key in hash) {
1650
+ var value = hash[key];
1651
+ if (value instanceof Array) {
1652
+ str += this._arrayToString(key, value, indent) + "\n";
1653
+ }
1654
+ else if (value instanceof Object) {
1655
+ str += "%@%@:\n".fmt(' '.mult(indent), key);
1656
+ str += this._hashToString(value, indent + 2);
1657
+ }
1658
+ else {
1659
+ str += "%@%@: %@\n".fmt(' '.mult(indent), key, value);
1660
+ }
1661
+ }
1662
+
1663
+ return str;
1664
+ },
1665
+
1666
+ /** @private */
1667
+ _arrayToString: function(key, array, indent) {
1668
+ if (array.length === 0) {
1669
+ return "%@%@: []".fmt(' '.mult(indent), key);
1670
+ }
1671
+
1672
+ var str = "%@%@: [\n".fmt(' '.mult(indent), key);
1673
+
1674
+ array.forEach(function(item, idx) {
1675
+ str += "%@%@\n".fmt(' '.mult(indent + 2), item);
1676
+ }, this);
1677
+
1678
+ str += ' '.mult(indent) + "]";
1679
+
1680
+ return str;
1462
1681
  }
1463
1682
 
1464
1683
  };
1465
1684
 
1685
+ SC.mixin(SC.StatechartManager, SC.StatechartDelegate, SC.DelegateSupport);
1686
+
1466
1687
  /**
1467
1688
  The default name given to a statechart's root state
1468
1689
  */