sproutcore 1.6.0.rc.2-x86-mingw32 → 1.6.0.1-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. data/CHANGELOG +12 -0
  2. data/VERSION.yml +1 -1
  3. data/bin/sc-docs +6 -1
  4. data/lib/buildtasks/target.rake +1 -1
  5. data/lib/frameworks/sproutcore/Buildfile +5 -1
  6. data/lib/frameworks/sproutcore/CHANGELOG.md +175 -1
  7. data/lib/frameworks/sproutcore/apps/test_controls/controllers/select.js +12 -0
  8. data/lib/frameworks/sproutcore/apps/test_controls/resources/select_page.js +19 -5
  9. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +28 -31
  10. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +9 -2
  11. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +21 -1
  12. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +1 -1
  13. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/checkbox_support.js +6 -1
  14. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +26 -8
  15. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +2 -0
  16. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +12 -5
  17. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/template.js +25 -9
  18. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +157 -5
  19. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +7 -6
  20. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +9 -3
  21. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +8 -8
  22. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +104 -4
  23. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/theme.js +3 -56
  24. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils.js +4 -2
  25. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +59 -0
  26. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +41 -1
  27. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/template_helpers/text_field_support.js +10 -2
  28. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/panes/template.js +16 -1
  29. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +1 -1
  30. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/clippingFrame.js +11 -0
  31. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/didAppendToDocument.js +18 -2
  32. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/insertBefore.js +10 -6
  33. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/keyboard.js +18 -1
  34. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/template_collection.js +9 -1
  35. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +9 -4
  36. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +15 -3
  37. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +14 -8
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +8 -18
  39. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +12 -2
  40. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +296 -0
  41. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_record.js +1 -1
  42. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +330 -326
  43. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +22 -1
  44. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +1 -1
  45. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +614 -614
  46. data/lib/frameworks/sproutcore/frameworks/datastore/tests/data_sources/data_source.js +14 -1
  47. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +3 -1
  48. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +2 -0
  49. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +2 -0
  50. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +20 -13
  51. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +61 -46
  52. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +30 -30
  53. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +24 -24
  54. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/connectDataSource.js +31 -0
  55. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +1177 -0
  56. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +4 -63
  57. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +1 -1
  58. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/scrollable.js +1 -1
  59. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +7 -8
  60. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +18 -1
  61. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +9 -0
  62. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +3 -3
  63. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +3 -3
  64. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +1 -1
  65. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/checkbox.js +1 -1
  66. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +1 -1
  67. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +1 -1
  68. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +1 -1
  69. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/master_detail.js +3 -2
  70. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/menu.js +12 -2
  71. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +1 -1
  72. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/picker.js +1 -1
  73. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio.js +1 -1
  75. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/radio_group.js +2 -2
  76. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +1 -1
  79. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/toolbar.js +1 -1
  80. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/well.js +1 -1
  81. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/workspace.js +1 -1
  82. data/lib/frameworks/sproutcore/frameworks/desktop/resources/segmented.css +1 -0
  83. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +33 -22
  84. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/methods.js +20 -1
  85. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +10 -3
  86. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/methods.js +34 -7
  87. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +14 -15
  88. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +40 -14
  89. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +699 -700
  90. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +2 -2
  91. data/lib/frameworks/sproutcore/frameworks/desktop/views/master_detail.js +11 -1
  92. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +16 -6
  93. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +0 -1
  94. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +49 -7
  95. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +9 -0
  96. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_field.js +6 -2
  97. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +4 -26
  98. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +20 -19
  99. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  100. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +249 -249
  101. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/mixins/edit_mode.js +13 -5
  102. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/mixins/emptiness.js +53 -37
  103. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/render_delegates/form.js +2 -1
  104. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/render_delegates/form_row.js +3 -11
  105. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/mixins/edit_mode.js +53 -0
  106. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/mixins/emptiness.js +114 -0
  107. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form.js +174 -6
  108. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_row.js +86 -6
  109. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +80 -110
  110. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form_row.js +96 -97
  111. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/README.md +2 -1
  112. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/models/record.js +20 -36
  113. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +121 -0
  114. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +90 -0
  115. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/mixins/select_view_menu.js +139 -0
  116. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/render_delegates/select_button.js +14 -0
  117. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/ext/menu_resizing.js +25 -0
  118. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/bindings.js +43 -0
  119. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/mixins/select_view_menu/check_selected.js +32 -0
  120. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/popup_button/menu_setup.js +40 -0
  121. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/popup_button/show_menu.js +45 -0
  122. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/menu_width.js +49 -0
  123. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/tests/views/select/selected_item.js +191 -0
  124. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +264 -0
  125. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +450 -0
  126. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +14 -6
  127. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +1 -1
  128. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/render_delegates/split.js +1 -1
  129. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/render_delegates/split_divider.js +1 -1
  130. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +9 -0
  131. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/thumb.js +3 -2
  132. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +7 -17
  133. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +1 -1
  134. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +35 -8
  135. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +1 -1
  136. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor_delegate.js +1 -1
  138. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inner_frame.js +1 -1
  139. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/canvas_image.js +1 -1
  140. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +2 -0
  141. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/image.js +1 -1
  142. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +1 -1
  143. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +6 -6
  144. data/lib/frameworks/sproutcore/frameworks/foundation/resources/images/favicon.ico +0 -0
  145. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +0 -5
  146. data/lib/frameworks/sproutcore/frameworks/foundation/system/exception_handler.js +4 -2
  147. data/lib/frameworks/sproutcore/frameworks/foundation/system/math.js +2 -1
  148. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +13 -0
  149. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +6 -9
  150. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +912 -0
  151. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +36 -7
  152. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +58 -4
  153. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +1 -3
  154. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +0 -15
  155. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +2 -2
  156. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +25 -14
  157. data/lib/frameworks/sproutcore/frameworks/handlebars/handlebars.js +1 -1
  158. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -9
  159. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/flatten.js +24 -0
  160. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +2 -1
  161. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +5 -5
  162. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +19 -0
  163. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +3 -2
  164. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +1 -1
  165. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +1 -1
  166. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +14 -14
  167. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +3 -0
  168. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +2 -2
  169. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +2 -2
  170. data/lib/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +1 -1
  171. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +3 -3
  172. data/lib/frameworks/sproutcore/frameworks/runtime/system/set.js +15 -16
  173. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/itemType.js +6 -2
  174. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/enhance.js +30 -0
  175. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +17 -0
  176. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +9 -2
  177. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +3 -1
  178. data/lib/frameworks/sproutcore/frameworks/testing/resources/runner.css +0 -1
  179. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +80 -0
  180. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/core.css +0 -4
  181. data/lib/frameworks/sproutcore/lib/index.rhtml +2 -1
  182. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list.css +3 -3
  183. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
  184. data/lib/frameworks/sproutcore/themes/ace/resources/form/form.css +9 -0
  185. data/lib/frameworks/sproutcore/themes/ace/resources/menu/menu.css +3 -1
  186. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/picker.js +1 -1
  187. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/workspace.js +1 -1
  188. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/button.js +1 -1
  189. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/panel.js +1 -1
  190. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/progress.js +2 -0
  191. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/slider.js +1 -1
  192. data/lib/frameworks/sproutcore/themes/legacy_theme/render_delegates/well.js +1 -1
  193. data/lib/sproutcore/builders/base.rb +5 -1
  194. data/lib/sproutcore/builders/handlebars.rb +12 -1
  195. data/lib/sproutcore/models/target.rb +1 -9
  196. data/lib/sproutcore/rack/proxy.rb +238 -92
  197. data/lib/sproutcore/tools/docs.rb +1 -7
  198. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -0
  199. data/spec/fixtures/builder_tests/apps/handlebars_test/{template.handlebars → templates/template.handlebars} +2 -0
  200. data/spec/lib/builders/handlebars_spec.rb +10 -4
  201. data/sproutcore.gemspec +3 -1
  202. metadata +73 -44
  203. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/english.lproj/default_styles.css +0 -5
  204. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/english.lproj/strings.js +0 -15
  205. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_checkbox_field.js +0 -17
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_field.js +0 -17
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_label.js +0 -17
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_radio_field.js +0 -17
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/tests/views/form_text_field.js +0 -17
@@ -344,9 +344,18 @@ SC.RootResponder = SC.Object.extend(
344
344
  (removing sc-blur). Also notify panes.
345
345
  */
346
346
  focus: function() {
347
+
347
348
  if (!this.get('hasFocus')) {
348
349
  SC.$('body').addClass('sc-focus').removeClass('sc-blur');
349
350
 
351
+ // If the app is getting focus again set the first responder to the first
352
+ // valid firstResponder view in the view's tree
353
+ if(!SC.TABBING_ONLY_INSIDE_DOCUMENT){
354
+ var mainPane = this.get('mainPane'),
355
+ nextValidKeyView = mainPane ? mainPane.get('nextValidKeyView') : null;
356
+ if (nextValidKeyView) mainPane.makeFirstResponder(nextValidKeyView);
357
+ }
358
+
350
359
  SC.run(function() {
351
360
  this.set('hasFocus', YES);
352
361
  }, this);
@@ -689,7 +698,6 @@ SC.RootResponder = SC.Object.extend(
689
698
 
690
699
  // do some initial set
691
700
  this.set('currentWindowSize', this.computeWindowSize()) ;
692
- this.focus(); // assume the window is focused when you load.
693
701
 
694
702
  if (SC.browser.mobileSafari) {
695
703
 
@@ -1717,8 +1725,6 @@ SC.RootResponder = SC.Object.extend(
1717
1725
  return YES;
1718
1726
  }
1719
1727
 
1720
- if(!SC.browser.msie) window.focus();
1721
-
1722
1728
  // First, save the click count. The click count resets if the mouse down
1723
1729
  // event occurs more than 250 ms later than the mouse up event or more
1724
1730
  // than 8 pixels away from the mouse down event.
@@ -102,7 +102,7 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
102
102
  added as range requests are completed.
103
103
  */
104
104
  requestedRangeIndex: null,
105
-
105
+
106
106
  /**
107
107
  Make sure to create the index array during init so that it is not shared
108
108
  between all instances.
@@ -110,13 +110,13 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
110
110
  init: function() {
111
111
  sc_super();
112
112
  this.requestedRangeIndex = [];
113
-
113
+
114
114
  this._TMP_PROVIDE_ARRAY = [];
115
115
  this._TMP_PROVIDE_RANGE = { length: 1 };
116
116
  this._TMP_RANGE = {};
117
117
  },
118
-
119
- /**
118
+
119
+ /**
120
120
  Returns the object at the specified index. If the value for the index
121
121
  is currently undefined, invokes the didRequestIndex() method to notify
122
122
  the delegate.
@@ -124,9 +124,9 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
124
124
  The omitMaterializing flag ensures that the object will not be materialized,
125
125
  but it simply checks for the presence of an object at the specified index
126
126
  and will return YES (or undefined if not found). This is useful in the case
127
- of SparseArrays, where you might NOT want to request the index to be loaded,
127
+ of SparseArrays, where you might NOT want to request the index to be loaded,
128
128
  but simply need a shallow check to see if the position has been filled.
129
-
129
+
130
130
  @param {Number} idx the index to get
131
131
  @param {Boolean} omitMaterializing
132
132
  @return {Object} the object
@@ -251,7 +251,7 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
251
251
 
252
252
  @param {Range} range the range to apply to
253
253
  @param {Array} array the array of objects to insert
254
- @returns {SC.SparseArray} reciever
254
+ @returns {SC.SparseArray} receiver
255
255
  */
256
256
  provideObjectsInRange: function(range, array) {
257
257
  var content = this._sa_content ;
@@ -300,7 +300,7 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
300
300
  var start = range.start, loc = Math.min(start + range.length, content.length);
301
301
  while (--loc>=start) content[loc] = undefined;
302
302
  }
303
- }
303
+ }
304
304
  this.arrayContentDidChange(range.start, range.length, range.length) ; // notify
305
305
  return this ;
306
306
  },
@@ -116,7 +116,7 @@ SC.mixin(SC.String, {
116
116
  },
117
117
 
118
118
  /**
119
- Localizes the string. This will look up the reciever string as a key
119
+ Localizes the string. This will look up the receiver string as a key
120
120
  in the current Strings hash. If the key matches, the loc'd value will be
121
121
  used. The resulting string will also be passed through fmt() to insert
122
122
  any variables.
@@ -136,12 +136,104 @@ SC.mixin(SC.String, {
136
136
 
137
137
  var args = SC.$A(arguments);
138
138
  args.shift(); // remove str param
139
- //to extend String.prototype
139
+ //to extend String.prototype
140
140
  if(args.length>0 && args[0].isSCArray) args=args[0];
141
141
 
142
142
  return SC.String.fmt(localized, args);
143
143
  },
144
144
 
145
+ /**
146
+ Returns the localized metric value for the specified key. A metric is a
147
+ single value intended to be used in your interface’s layout, such as
148
+ "Button.Confirm.Width" = 100.
149
+
150
+ If you would like to return a set of metrics for use in a layout hash, you
151
+ may prefer to use the locLayout() method instead.
152
+
153
+ @param str {String} key
154
+ @returns {Number} the localized metric
155
+ */
156
+ locMetric: function(key) {
157
+ var K = SC.Locale,
158
+ currentLocale = K.currentLocale;
159
+
160
+ if (!currentLocale) {
161
+ K.createCurrentLocale();
162
+ currentLocale = K.currentLocale;
163
+ }
164
+ return currentLocale.locMetric(key);
165
+ },
166
+
167
+ /**
168
+ Creates and returns a new hash suitable for use as an SC.View’s 'layout'
169
+ hash. This hash will be created by looking for localized metrics following
170
+ a pattern based on the “base key” you specify.
171
+
172
+ For example, if you specify "Button.Confirm", the following metrics will be
173
+ used if they are defined:
174
+
175
+ Button.Confirm.left
176
+ Button.Confirm.top
177
+ Button.Confirm.right
178
+ Button.Confirm.bottom
179
+ Button.Confirm.width
180
+ Button.Confirm.height
181
+ Button.Confirm.midWidth
182
+ Button.Confirm.minHeight
183
+ Button.Confirm.centerX
184
+ Button.Confirm.centerY
185
+
186
+ Additionally, you can optionally specify a hash which will be merged on top
187
+ of the returned hash. For example, if you wish to allow a button’s width
188
+ to be configurable per-locale, but always wish for it to be centered
189
+ vertically and horizontally, you can call:
190
+
191
+ locLayout("Button.Confirm", {centerX:0, centerY:0})
192
+
193
+ …so that you can combine both localized and non-localized elements in the
194
+ returned hash. (An exception will be thrown if there is a locale-specific
195
+ key that matches a key specific in this hash.)
196
+
197
+
198
+ For example, if your locale defines:
199
+
200
+ Button.Confirm.left
201
+ Button.Confirm.top
202
+ Button.Confirm.right
203
+ Button.Confirm.bottom
204
+
205
+
206
+ …then these two code snippets will produce the same result:
207
+
208
+ layout: {
209
+ left: "Button.Confirm.left".locMetric(),
210
+ top: "Button.Confirm.top".locMetric(),
211
+ right: "Button.Confirm.right".locMetric(),
212
+ bottom: "Button.Confirm.bottom".locMetric()
213
+ }
214
+
215
+ layout: "Button.Confirm".locLayout()
216
+
217
+ The former is slightly more efficient because it doesn’t have to iterate
218
+ through the possible localized layout keys, but in virtually all situations
219
+ you will likely wish to use the latter.
220
+
221
+ @param str {String} key
222
+ @param {str} (optional) additionalHash
223
+ @param {String} (optional) additionalHash
224
+ @returns {Number} the localized metric
225
+ */
226
+ locLayout: function(key, additionalHash) {
227
+ var K = SC.Locale,
228
+ currentLocale = K.currentLocale;
229
+
230
+ if (!currentLocale) {
231
+ K.createCurrentLocale();
232
+ currentLocale = K.currentLocale;
233
+ }
234
+ return currentLocale.locLayout(key, additionalHash);
235
+ },
236
+
145
237
  /**
146
238
  Works just like loc() except that it will return the passed default
147
239
  string if a matching key is not found.
@@ -163,7 +255,7 @@ SC.mixin(SC.String, {
163
255
 
164
256
  return SC.String.fmt(localized, args);
165
257
  },
166
-
258
+
167
259
  /**
168
260
  Removes any extra whitespace from the edges of the string. This method is
169
261
  also aliased as strip().
@@ -214,9 +306,17 @@ if(String.prototype.trim) {
214
306
  // We want the version defined here, not in Runtime
215
307
  SC.mixin(String.prototype,
216
308
  /** @scope String.prototype */ {
217
-
309
+
218
310
  loc: function() {
219
311
  return SC.String.loc(this.toString(), SC.$A(arguments));
312
+ },
313
+
314
+ locMetric: function() {
315
+ return SC.String.locMetric(this.toString());
316
+ },
317
+
318
+ locLayout: function(additionalHash) {
319
+ return SC.String.locLayout(this.toString(), additionalHash);
220
320
  }
221
321
 
222
322
  });
@@ -23,21 +23,6 @@
23
23
  by SC.View when you name a theme that doesn't actually exist: it creates
24
24
  a theme based on the parent theme.
25
25
 
26
- Renderers
27
- ---------------------------
28
- Themes are used to keep track of theme class names and, more important,
29
- to keep track of renderers.
30
-
31
- Renderers are added to a theme using theme.addRenderer(theRenderer). After
32
- this has been done, they may be instantiated using theme.renderer(rendererName).
33
-
34
- Instantiating with renderer() instantiates a version of that renderer
35
- specialized for this specific theme-- not any parent themes. The renderer
36
- will include all class names for _this_ theme. This means that you can
37
- theme controls differently without overriding any renderers: just subclass
38
- the original theme that _has_ the renderers, give it its own name, and
39
- all renderers will render with that name as a class name.
40
-
41
26
  Locating Child Themes
42
27
  ----------------------------
43
28
  Locating child themes is relatively simple for the most part: it looks in
@@ -51,7 +36,7 @@
51
36
  base classes; if the theme is a global theme, those class names should not
52
37
  be included.
53
38
 
54
- This makes sense logically as well, because when searching for a renderer,
39
+ This makes sense logically as well, because when searching for a render delegate,
55
40
  it will locate it in any base theme that has it, but that doesn't mean
56
41
  class names from the derived theme shouldn't be included.
57
42
 
@@ -143,10 +128,6 @@ SC.Theme = {
143
128
  // method.
144
129
  result._privateThemes = {};
145
130
 
146
- // the theme also specializes all renderers it creates so that they
147
- // have the theme's classNames and have their 'theme' property set.
148
- result._specializedRenderers = {};
149
-
150
131
  // also, the theme specializes all child themes as they are created
151
132
  // to ensure that all of the class names on this theme are included.
152
133
  result._specializedThemes = {};
@@ -263,40 +244,6 @@ SC.Theme = {
263
244
  */
264
245
  addTheme: function(theme) {
265
246
  this.themes[theme.name] = theme;
266
- },
267
-
268
- /**
269
- Adds a renderer to the theme. The renderer's name will be used to
270
- keep track of it and identify it later.
271
-
272
- The biggest responsibility of addRenderer is to ensure that renderer()
273
- can be used to instantiate that renderer. If a renderer is not instantiated
274
- through renderer(), it will not know its theme's classNames.
275
- */
276
- addRenderer: function(renderer) {
277
- this[renderer.name] = renderer;
278
- },
279
-
280
- /**
281
- Finds the named renderer and instantiates it, returning the result.
282
- It also ensures it is using a version of the renderer specialized for
283
- this theme. It keeps a cache of specialized versions of the renderer.
284
-
285
- Any arguments after the name are passed on to the instantiated
286
- renderer.
287
- */
288
- renderer: function(name) {
289
- var renderer = this._specializedRenderers[name], base = this[name];
290
- if (!renderer || renderer._specializedFrom !== base) {
291
- if (!base) return null;
292
-
293
- renderer = base.extend({ classNames: this.classNames, theme: this });
294
- }
295
-
296
- var args = SC.$A(arguments);
297
- args.shift();
298
- renderer = renderer.create.apply(renderer, args);
299
- return renderer;
300
247
  }
301
248
  };
302
249
 
@@ -304,8 +251,8 @@ SC.Theme = {
304
251
  // optimal, but the reasoning is because of test running: the
305
252
  // test runner, when running foundation unit tests, cannot load
306
253
  // the theme. As such, foundation must include default versions of
307
- // all of its renderers, and it does so in BaseTheme. All SproutCore
308
- // controls have renderers in BaseTheme.
254
+ // all of its render delegates, and it does so in BaseTheme. All SproutCore
255
+ // controls have render delegates in BaseTheme.
309
256
  SC.BaseTheme = SC.Theme.create({
310
257
  name: '' // it is a base class, and doesn't need a class name or such
311
258
  });
@@ -152,8 +152,10 @@ SC.mixin( /** @scope SC */ {
152
152
  return result;
153
153
  },
154
154
 
155
- /** @deprecated
156
- Deprecated. SC.offset() is more accurate, more flexible in the value for the element parameter and
155
+ /**
156
+ @deprecated Use SC.offset instead.
157
+
158
+ SC.offset() is more accurate, more flexible in the value for the element parameter and
157
159
  easier to understand.
158
160
 
159
161
  @param el The DOM element
@@ -0,0 +1,59 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ var content, newContent, controller, destroyCount;
9
+
10
+ // ..........................................................
11
+ // SINGLE OBSERVABLE OBJECT
12
+ //
13
+
14
+ SC.TestObject = SC.Object.extend();
15
+
16
+ SC.TestObject.reopen({
17
+ destroy: function() {
18
+ destroyCount = 1;
19
+ }
20
+ });
21
+
22
+ module("SC.ObjectController - content destroyed", {
23
+ setup: function() {
24
+ content = SC.TestObject.create({
25
+ foo: "foo1", bar: "bar1"
26
+ });
27
+ newContent = SC.Object.create({
28
+ foo: "foo2"
29
+ });
30
+ destroyCount = 0;
31
+ console.log('SSSSS');
32
+ controller = SC.ObjectController.create({
33
+ destroyContentOnReplace: YES,
34
+ content: content
35
+ });
36
+ },
37
+
38
+ teardown: function() {
39
+ controller.destroy();
40
+ }
41
+ });
42
+
43
+ test("Setting content should call 'destroy' on old content if destroyContentOnReplace has been set", function() {
44
+ controller.set('content', newContent);
45
+ equals(destroyCount, 1, 'destroyCount');
46
+ equals(controller.getPath('content.foo'), 'foo2');
47
+ });
48
+
49
+ test("Setting content should NOT call 'destroy' on old content if destroyContentOnReplace has not been set", function() {
50
+ controller.set('destroyContentOnReplace', NO);
51
+ controller.set('content', newContent);
52
+ equals(destroyCount, 0, 'destroyCount');
53
+ equals(controller.getPath('content.foo'), 'foo2');
54
+ });
55
+
56
+ test("Setting content should NOT call 'destroy' if set to the same object", function() {
57
+ controller.set('content', content);
58
+ equals(destroyCount, 0, 'destroyCount');
59
+ });
@@ -4,7 +4,7 @@
4
4
  // ©2008-2011 Apple Inc. All rights reserved.
5
5
  // License: Licensed under MIT license (see license.js)
6
6
  // ==========================================================================
7
- /*global module test equals context ok same */
7
+ /*global module test equals context ok same should_throw*/
8
8
  var LocaleObject;
9
9
 
10
10
  module('SC.Object', {
@@ -26,6 +26,13 @@ module('SC.Object', {
26
26
  'Test': '%@',
27
27
  'Test.Multiple': '%@ %@'
28
28
  });
29
+
30
+ SC.metricsFor('English', {
31
+ 'Button.left': 10,
32
+ 'Button.top': 20,
33
+ 'Button.width': 80,
34
+ 'Button.height': 30
35
+ });
29
36
  }
30
37
  });
31
38
 
@@ -76,3 +83,36 @@ test("Localize a string even if localized version is empty", function() {
76
83
  equals("empty".locWithDefault("Empty"), "", "Using String.prototype.locWithDefault");
77
84
  equals(SC.String.locWithDefault("empty", "Empty"), "", "Using SC.String.locWithDefault");
78
85
  });
86
+
87
+ test("Access a localized metric", function() {
88
+ equals(10, "Button.left".locMetric());
89
+ equals(20, "Button.top".locMetric());
90
+ equals(undefined, "Button.notThere".locMetric());
91
+ });
92
+
93
+ test("Access a localized layout hash", function() {
94
+ // Simple case (if we ever get a full hash comparison function, we should use
95
+ // it here).
96
+ var layout = "Button".locLayout();
97
+ equals(10, layout.left);
98
+ equals(20, layout.top);
99
+ equals(80, layout.width);
100
+ equals(30, layout.height);
101
+ equals(undefined, layout.right); // No localized key
102
+
103
+
104
+ // Slightly more involved case: allow the user to specify an additional hash.
105
+ layout = "Button".locLayout({right:50});
106
+ equals(10, layout.left);
107
+ equals(20, layout.top);
108
+ equals(80, layout.width);
109
+ equals(30, layout.height);
110
+ equals(50, layout.right); // No localized key
111
+
112
+
113
+ // Sanity-check case: Since we have both a localized key for 'left' and we'll
114
+ // pass it in, an exception should be thrown.
115
+ should_throw(function() {
116
+ "Button".locLayout({left:10});
117
+ }, Error, "locLayout(): There is a localized value for the key 'Button.left' but a value for 'left' was also specified in the non-localized hash");
118
+ });