sproutit-sproutcore 1.0.20090721145281 → 1.0.20090721145282

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/Buildfile +4 -3
  2. data/VERSION.yml +2 -2
  3. data/buildtasks/entry.rake +3 -0
  4. data/buildtasks/manifest.rake +35 -9
  5. data/buildtasks/target.rake +25 -6
  6. data/frameworks/sproutcore/Buildfile +10 -0
  7. data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +41 -20
  8. data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +14 -43
  9. data/frameworks/sproutcore/frameworks/datastore/models/record.js +11 -0
  10. data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +6 -3
  11. data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +5 -1
  12. data/frameworks/sproutcore/frameworks/datastore/system/query.js +10 -7
  13. data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +19 -20
  14. data/frameworks/sproutcore/frameworks/datastore/system/store.js +126 -93
  15. data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +9 -3
  16. data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +6 -1
  17. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +28 -3
  18. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +13 -5
  19. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/storeDidChangeProperties.js +46 -23
  20. data/frameworks/sproutcore/frameworks/datastore/tests/models/record/writeAttribute.js +29 -5
  21. data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +13 -4
  22. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +109 -0
  23. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +69 -15
  24. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +20 -1
  25. data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +4 -1
  26. data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +56 -6
  27. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +9 -2
  28. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +45 -2
  29. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +0 -1
  30. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +53 -6
  31. data/frameworks/sproutcore/frameworks/datastore/tests/system/store/writeDataHash.js +0 -5
  32. data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +47 -27
  33. data/frameworks/sproutcore/frameworks/desktop/system/drag.js +5 -4
  34. data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +23 -12
  35. data/frameworks/sproutcore/frameworks/desktop/tests/views/list/render.js +92 -0
  36. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/methods.js +104 -53
  37. data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +2 -0
  38. data/frameworks/sproutcore/frameworks/desktop/views/button.js +4 -3
  39. data/frameworks/sproutcore/frameworks/desktop/views/collection.js +6 -2
  40. data/frameworks/sproutcore/frameworks/desktop/views/list.js +9 -0
  41. data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +2 -2
  42. data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +3 -3
  43. data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +9 -1
  44. data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +80 -102
  45. data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +0 -1
  46. data/frameworks/sproutcore/frameworks/foundation/english.lproj/text_field.css +5 -1
  47. data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +8 -1
  48. data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +0 -1
  49. data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +31 -3
  50. data/frameworks/sproutcore/frameworks/foundation/system/event.js +0 -4
  51. data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +3 -7
  52. data/frameworks/sproutcore/frameworks/foundation/system/request.js +3 -4
  53. data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +78 -17
  54. data/frameworks/sproutcore/frameworks/foundation/system/utils.js +9 -0
  55. data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +2 -2
  56. data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +2 -2
  57. data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +5 -0
  58. data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +2 -2
  59. data/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +1 -4
  60. data/frameworks/sproutcore/frameworks/foundation/tests/validators/validator.js +20 -0
  61. data/frameworks/sproutcore/frameworks/foundation/tests/views/image/ui.js +13 -0
  62. data/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +132 -0
  63. data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +6 -3
  64. data/frameworks/sproutcore/frameworks/foundation/validators/validator.js +8 -5
  65. data/frameworks/sproutcore/frameworks/foundation/views/image.js +18 -5
  66. data/frameworks/sproutcore/frameworks/foundation/views/text_field.js +292 -21
  67. data/frameworks/sproutcore/frameworks/foundation/views/view.js +13 -14
  68. data/frameworks/sproutcore/frameworks/mini/license.js +28 -0
  69. data/frameworks/sproutcore/frameworks/runtime/core.js +35 -0
  70. data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +1 -1
  71. data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +79 -5
  72. data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +6 -6
  73. data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +53 -0
  74. data/frameworks/sproutcore/frameworks/testing/system/plan.js +4 -0
  75. data/frameworks/sproutcore/frameworks/testing/system/runner.js +1 -1
  76. data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +4 -0
  77. data/gen/design/Buildfile +23 -0
  78. data/gen/design/README +1 -0
  79. data/gen/design/USAGE +10 -0
  80. data/gen/design/templates/english.lproj/@filename@.js +16 -0
  81. data/gen/page/Buildfile +36 -0
  82. data/gen/page/README +1 -0
  83. data/gen/page/USAGE +15 -0
  84. data/gen/page/templates/pages/@target_name@/Buildfile +16 -0
  85. data/gen/page/templates/pages/@target_name@/core.js +22 -0
  86. data/gen/page/templates/pages/@target_name@/english.lproj/body.css +1 -0
  87. data/gen/page/templates/pages/@target_name@/english.lproj/body.rhtml +7 -0
  88. data/gen/page/templates/pages/@target_name@/english.lproj/strings.js +15 -0
  89. data/gen/view/README +1 -1
  90. data/gen/view/USAGE +5 -5
  91. data/lib/sproutcore/builders/base.rb +13 -2
  92. data/lib/sproutcore/builders/html.rb +28 -1
  93. data/lib/sproutcore/builders/minify.rb +84 -18
  94. data/lib/sproutcore/builders/test.rb +2 -1
  95. data/lib/sproutcore/helpers/entry_sorter.rb +16 -1
  96. data/lib/sproutcore/helpers/static_helper.rb +32 -4
  97. data/lib/sproutcore/helpers/tag_helper.rb +65 -0
  98. data/lib/sproutcore/models/manifest.rb +40 -6
  99. data/lib/sproutcore/models/target.rb +12 -3
  100. data/lib/sproutcore/rack/builder.rb +56 -4
  101. data/lib/sproutcore/tools/manifest.rb +1 -0
  102. data/lib/sproutcore/tools/server.rb +1 -0
  103. data/lib/sproutcore/tools.rb +21 -1
  104. data/lib/sproutcore.rb +13 -0
  105. metadata +16 -1
@@ -54,7 +54,7 @@ module("SC.CollectionView Mouse Events", {
54
54
  @param {IndexSet} expected expected selection
55
55
  @returns {void}
56
56
  */
57
- function clickOn(view, index, shiftKey, ctrlKey, expected) {
57
+ function clickOn(view, index, shiftKey, ctrlKey, expected, delay) {
58
58
  var itemView = view.getPath('childViews.%@'.fmt(index)),
59
59
  layer = itemView.get('layer'),
60
60
  opts = { shiftKey: shiftKey, ctrlKey: ctrlKey },
@@ -69,15 +69,26 @@ function clickOn(view, index, shiftKey, ctrlKey, expected) {
69
69
  SC.Event.trigger(layer, 'mouseup', [ev]);
70
70
 
71
71
  if (expected !== undefined) {
72
- sel = view.get('selection');
73
-
74
- modifiers = [];
75
- if (shiftKey) modifiers.push('shift');
76
- if (ctrlKey) modifiers.push('ctrl');
77
- modifiers = modifiers.length > 0 ? modifiers.join('+') : 'no modifiers';
72
+ var f = function() {
73
+ SC.RunLoop.begin();
74
+ sel = view.get('selection');
75
+
76
+ modifiers = [];
77
+ if (shiftKey) modifiers.push('shift');
78
+ if (ctrlKey) modifiers.push('ctrl');
79
+ modifiers = modifiers.length > 0 ? modifiers.join('+') : 'no modifiers';
80
+
81
+ expected = SC.SelectionSet.create().add(view.get('content'), expected);
82
+
83
+ ok(expected.isEqual(sel), 'should have selection: %@ after click with %@ on item[%@], actual: %@'.fmt(expected, modifiers, index, sel));
84
+ SC.RunLoop.end();
85
+ if (delay) window.start() ; // starts the test runner
86
+ };
78
87
 
79
- expected = SC.SelectionSet.create().add(view.get('content'), expected);
80
- ok(expected.isEqual(sel), 'should have selection: %@ after click with %@ on item[%@], actual: %@'.fmt(expected, modifiers, index, sel));
88
+ if (delay) {
89
+ stop() ; // stops the test runner
90
+ setTimeout(f, delay) ;
91
+ } else f() ;
81
92
  }
82
93
 
83
94
  layer = itemView = null ;
@@ -91,11 +102,11 @@ test("clicking on an item should select it", function() {
91
102
  clickOn(view, 3, NO, NO, SC.IndexSet.create(3));
92
103
  });
93
104
 
94
- test("clicking on a selected item should clear selection and reselect it it", function() {
95
-
105
+ test("clicking on a selected item should clear selection after 301ms and reselect it", function() {
96
106
  view.select(SC.IndexSet.create(1,5));
97
107
  SC.stopIt = YES ;
98
- clickOn(view, 3, NO, NO, SC.IndexSet.create(3));
108
+ SC.RootResponder.responder._lastMouseUpAt = null ; // HACK: don't want a doubleClick from previous tests
109
+ clickOn(view, 3, NO, NO, SC.IndexSet.create(3), 301);
99
110
  SC.stopIt = NO ;
100
111
  });
101
112
 
@@ -0,0 +1,92 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
4
+ // portions copyright @2009 Apple, Inc.
5
+ // License: Licened under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ // SC.LOG_BINDINGS = YES ;
9
+
10
+ var view, content, pane ;
11
+
12
+ var renderFunc = CoreTest.stub("render", function() {
13
+ SC.ListItemView.prototype.render.apply(this, arguments) ;
14
+ });
15
+
16
+ module("SC.ListView.render", {
17
+
18
+ setup: function() {
19
+ SC.RunLoop.begin();
20
+
21
+ content = "1 2 3 4 5 6 7 8 9 10".w().map(function(x) {
22
+ return SC.Object.create({ value: x });
23
+ });
24
+
25
+ view = SC.ListView.create({
26
+ content: content,
27
+
28
+ layout: { top: 0, left: 0, width: 300, height: 500 },
29
+
30
+ layoutForContentIndex: function(idx) {
31
+ return { left: 0, right: 0, top: idx * 50, height: 50 };
32
+ },
33
+
34
+ didReload: CoreTest.stub("didReload"),
35
+
36
+ _cv_isVisibleInWindowDidChange: CoreTest.stub("_cv_isVisibleInWindowDidChange", function() {
37
+ SC.ListView.prototype._cv_isVisibleInWindowDidChange.apply(this, arguments) ;
38
+ }),
39
+
40
+ _cv_nowShowingDidChange: CoreTest.stub("_cv_nowShowingDidChange", function() {
41
+ SC.ListView.prototype._cv_nowShowingDidChange.apply(this, arguments) ;
42
+ }),
43
+
44
+ exampleView: SC.ListItemView.extend({
45
+ render: renderFunc
46
+ }),
47
+
48
+ // reset stubs
49
+ reset: function() {
50
+ this.didReload.reset();
51
+ this._cv_isVisibleInWindowDidChange.reset();
52
+ this._cv_nowShowingDidChange.reset();
53
+ renderFunc.reset();
54
+ }
55
+
56
+ });
57
+
58
+ pane = SC.MainPane.create();
59
+ pane.appendChild(view);
60
+ pane.append();
61
+
62
+ SC.RunLoop.end();
63
+ },
64
+
65
+ teardown: function() {
66
+ SC.RunLoop.begin();
67
+ pane.remove();
68
+ SC.RunLoop.end();
69
+ view.reset();
70
+ }
71
+
72
+ });
73
+
74
+ // ..........................................................
75
+ // BASIC TESTS
76
+ //
77
+
78
+ test("didReload() should only be called once with a static content array", function() {
79
+ view.didReload.expect(1);
80
+ });
81
+
82
+ test("_cv_isVisibleInWindowDidChange() should only be called once with a static content array", function() {
83
+ view._cv_isVisibleInWindowDidChange.expect(1);
84
+ });
85
+
86
+ test("list item render() should only be called once per item view a static content array", function() {
87
+ renderFunc.expect(10);
88
+ });
89
+
90
+ // test("_cv_nowShowingDidChange() should only be called once with a static content array", function() {
91
+ // view._cv_nowShowingDidChange.expect(1); // currently is 3...
92
+ // });
@@ -7,75 +7,126 @@
7
7
 
8
8
  /*global module test htmlbody ok equals same stop start */
9
9
 
10
- var pane, view ;
10
+ var pane, view , view1, view2, view3;
11
11
  module("SC.SelectFieldView",{
12
- setup: function() {
13
- SC.RunLoop.begin();
14
- pane = SC.MainPane.create({
15
- childViews: [
16
- SC.SelectFieldView.extend({
17
- objects:[1,6,11,2,8]
18
- }),
19
- SC.SelectFieldView.extend({
20
- objects:["Apple","Sproutcore 1.0","Development","Charles"]// ,
21
- // sortObjects:function(objects){
22
- // console.log('Displaying the options without sorting');
23
- // }
24
- })]
25
- });
26
- pane.append(); // make sure there is a layer...
27
- SC.RunLoop.end();
28
-
29
- view = pane.childViews[0];
30
- view1= pane.childViews[1];
31
-
32
- },
33
-
34
- teardown: function() {
35
- pane.remove();
36
- pane = view = null ;
37
- }
12
+ setup: function() {
13
+ SC.RunLoop.begin();
14
+ pane = SC.MainPane.create({
15
+ objs : ["Apple","Sproutcore 1.0","Development","Charles"],
16
+ selectedValue: "Apple",
17
+ childViews: [
18
+ SC.SelectFieldView.extend({
19
+ objects: [1,6,11,2,8]
20
+ }),
21
+ SC.SelectFieldView.extend({
22
+ objects: ["Apple","Sproutcore 1.0","Development","Charles"]
23
+ }),
24
+ SC.SelectFieldView.extend({
25
+ objectsBinding: '*owner.objs',
26
+ valueBinding: '*owner.selectedValue'
27
+ }),
28
+ SC.SelectFieldView.extend({
29
+ objectsBinding: '*owner.objs',
30
+ valueBinding: '*owner.selectedValue',
31
+ valueKey: 'title',
32
+ nameKey: 'title',
33
+ sortKey: 'pos'
34
+ })
35
+
36
+
37
+ ]
38
+ });
39
+ pane.append(); // make sure there is a layer...
40
+ SC.RunLoop.end();
41
+
42
+ view = pane.childViews[0] ;
43
+ view1 = pane.childViews[1] ;
44
+ view2 = pane.childViews[2] ;
45
+ view3 = pane.childViews[3] ;
46
+ },
47
+
48
+ teardown: function() {
49
+ pane.remove();
50
+ pane = view = null ;
51
+ }
38
52
  });
39
53
 
40
54
  test("renders a select field input tag with appropriate attributes", function() {
41
- equals(view.get('tagName'), 'select', 'should have type as text');
42
- var q = Q$('select', view.get('layer'));
43
- equals(view.$().attr('id'), SC.guidFor(view), 'should have id as view_guid');
55
+ equals(view.get('tagName'), 'select', 'should have type as text');
56
+ var q = Q$('select', view.get('layer'));
57
+ equals(view.$().attr('id'), SC.guidFor(view), 'should have id as view_guid');
44
58
  });
45
59
 
46
60
  test("select component with options", function() {
47
- equals(5,view.objects.length,'The select component should have 5 options');
48
- equals(null,view.nameKey,'the select should not have any name key');
49
- equals(null,view.valueKey,'the select should not have any value key');
61
+ equals(5,view.objects.length,'The select component should have 5 options');
62
+ equals(null,view.nameKey,'the select should not have any name key');
63
+ equals(null,view.valueKey,'the select should not have any value key');
50
64
  });
51
65
 
52
- test("sortObjects() sorts the options of the select component", function() {
53
- var obj = view.objects;
54
- view.objects = view.sortObjects(obj);
66
+ test("sortObjects() sorts the options of the select component", function() {
67
+ var obj = view.objects;
68
+ view.objects = view.sortObjects(obj);
55
69
 
56
- equals(1,obj.get(0),'should be the first element');
57
- equals(2,obj.get(1),'should be the second element');
58
- equals(6,obj.get(2),'should be the third element');
59
- equals(8,obj.get(3),'should be the forth element');
60
- equals(11,obj.get(4),'should be the fifth element');
70
+ equals(1,obj.get(0),'should be the first element');
71
+ equals(2,obj.get(1),'should be the second element');
72
+ equals(6,obj.get(2),'should be the third element');
73
+ equals(8,obj.get(3),'should be the forth element');
74
+ equals(11,obj.get(4),'should be the fifth element');
61
75
  });
62
76
 
63
- test("rebuildMenu() populates the select component with new data", function() {
64
- var newObj = ['Hai,','how','are','you?'];
65
- view1.objects = newObj;
66
- var obj = view1.objects;
67
- equals('Hai,',obj.get(0),'should be the first element');
68
- equals('how',obj.get(1),'should be the second element');
69
- equals('are',obj.get(2),'should be the third element');
70
- equals('you?',obj.get(3),'should be the forth element');
77
+ test("rebuildMenu() populates the select component with new data", function() {
78
+ var newObj = ['Hai,','how','are','you?'];
79
+ view1.objects = newObj;
80
+ var obj = view1.objects;
81
+ equals('Hai,',obj.get(0),'should be the first element');
82
+ equals('how',obj.get(1),'should be the second element');
83
+ equals('are',obj.get(2),'should be the third element');
84
+ equals('you?',obj.get(3),'should be the forth element');
71
85
  });
72
86
 
73
87
  test("isEnabled=NO should add disabled class", function() {
74
- SC.RunLoop.begin();
75
- view.set('isEnabled', NO);
76
- SC.RunLoop.end();
77
- ok(view.$().hasClass('disabled'), 'should have disabled class');
88
+ SC.RunLoop.begin();
89
+ view.set('isEnabled', NO);
90
+ SC.RunLoop.end();
91
+ ok(view.$().hasClass('disabled'), 'should have disabled class');
92
+ });
93
+
94
+ test("objects should change on changing the binding", function() {
95
+ SC.RunLoop.begin();
96
+ var newObjects = ['Test1','Test2'] ;
97
+ pane.set('objs', newObjects);
98
+ SC.RunLoop.end();
99
+ var objects = view2.objects ;
100
+ newObjects = pane.objs ;
101
+ ok(objects===newObjects, 'the objects should be same');
78
102
  });
79
103
 
80
104
 
105
+ test("selectedValue shouldn't have st string attached to it", function() {
106
+ SC.RunLoop.begin();
107
+ var newObjects = ['Test1','Test2'] ;
108
+ pane.set('objs', newObjects);
109
+ SC.RunLoop.end();
110
+ SC.RunLoop.begin();
111
+ pane.set('selectedValue', 'Test1');
112
+ SC.RunLoop.end();
113
+ var selectedValue = view2.getFieldValue() ;
114
+ equals(selectedValue,'Test1', 'the new Value is ');
115
+
116
+
117
+ SC.RunLoop.begin();
118
+ var newObjects2 =[{pos: 1,title:'US/Pacific'},
119
+ {pos: 2, title:'America/Vancouver'},
120
+ {pos: 3, title:'Canada/Mountain'},
121
+ {pos: 4, title:'Other...'}];
122
+ pane.set('objs', newObjects2);
123
+ SC.RunLoop.end();
124
+ SC.RunLoop.begin();
125
+ pane.set('selectedValue', 'America/Vancouver');
126
+ SC.RunLoop.end();
127
+ selectedValue = view3.getFieldValue() ;
128
+ equals(selectedValue,'America/Vancouver', 'the new Value is ');
129
+
130
+ });
131
+
81
132
 
@@ -41,6 +41,8 @@ var pane = SC.ControlTestPane.design()
41
41
  useStaticLayout: YES,
42
42
  layout: { width: '150', right: '0' }
43
43
  });
44
+
45
+ pane.show();
44
46
 
45
47
  // ..........................................................
46
48
  // TEST VIEWS
@@ -172,9 +172,10 @@ SC.ButtonView = SC.View.extend(SC.Control, SC.Button, SC.StaticLayout,
172
172
 
173
173
  // If there is a toolTip set, grab it and localize if necessary.
174
174
  var toolTip = this.get('toolTip') ;
175
- if(SC.typeOf(toolTip) === SC.T_STRING) {
176
- context.attr('title', this.get('localize') ? toolTip.loc() : toolTip) ;
177
- context.attr('alt', this.get('localize') ? toolTip.loc() : toolTip) ;
175
+ if (SC.typeOf(toolTip) === SC.T_STRING) {
176
+ if (this.get('localize')) toolTip = toolTip.loc() ;
177
+ context.attr('title', toolTip) ;
178
+ context.attr('alt', toolTip) ;
178
179
  }
179
180
 
180
181
  // add some standard attributes & classes.
@@ -1959,8 +1959,11 @@ SC.CollectionView = SC.View.extend(
1959
1959
  canEdit = (canEdit && itemView.beginEditing) ? itemView.beginEditing() : NO ;
1960
1960
  }
1961
1961
 
1962
- // if cannot edit, just reselect
1963
- if (!canEdit) this.select(idx, false) ;
1962
+ // if cannot edit, schedule a reselect (but give doubleClick a chance)
1963
+ if (!canEdit) {
1964
+ if (this._cv_reselectTimer) this._cv_reselectTimer.invalidate() ;
1965
+ this._cv_reselectTimer = this.invokeLater(this.select, 300, idx, false) ;
1966
+ }
1964
1967
  }
1965
1968
 
1966
1969
  this._cleanupMouseDown() ;
@@ -2710,6 +2713,7 @@ SC.CollectionView = SC.View.extend(
2710
2713
  if (delay === undefined) delay = 0 ;
2711
2714
  if (clickCount === undefined) clickCount = 1;
2712
2715
  if ((clickCount>1) || this.get('actOnSelect')) {
2716
+ if (this._cv_reselectTimer) this._cv_reselectTimer.invalidate() ;
2713
2717
  sel = this.get('selection');
2714
2718
  sel = sel ? sel.toArray() : [];
2715
2719
  if (this._cv_actionTimer) this._cv_actionTimer.invalidate();
@@ -370,6 +370,15 @@ SC.ListView = SC.CollectionView.extend(
370
370
  }
371
371
 
372
372
  end++; // end should be after start
373
+
374
+ // if height is greater than 0, on some platforms we should just render
375
+ // to specific windows in order to minimize render time.
376
+ if (height > 0 && !SC.browser.msie) {
377
+ start = start - (start % 50);
378
+ if (start < 0) start = 0 ;
379
+ end = end - (end % 50) + 50;
380
+ }
381
+
373
382
  if (end<start) end = start;
374
383
  if (end>len) end = len ;
375
384
 
@@ -400,7 +400,7 @@ SC.ListItemView = SC.View.extend(
400
400
  occurred inside of it.
401
401
  */
402
402
  _isInsideDisclosure: function(evt) {
403
- if (this.get('disclosureSate')===SC.LEAF_NODE) return NO;
403
+ if (this.get('disclosureState')===SC.LEAF_NODE) return NO;
404
404
  return this._isInsideElementWithClassName('disclosure', evt);
405
405
  },
406
406
 
@@ -574,7 +574,7 @@ SC.ListItemView = SC.View.extend(
574
574
  var oldLineHeight = el.css('lineHeight');
575
575
  var fontSize = el.css('fontSize');
576
576
  var top = this.$().css('top');
577
- if(top) top = parseInt(top.substring(0,top.length-2),00);
577
+ if(top) top = parseInt(top.substring(0,top.length-2),0);
578
578
  else top =0;
579
579
  var lineHeight = oldLineHeight;
580
580
  var lineHeightShift = 0;
@@ -204,8 +204,8 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
204
204
  key = this.getDelegateProperty('isSeparatorKey', del) ;
205
205
  val = (key && content) ? (content.get ? content.get(key) : content[key]) : null ;
206
206
  if (val) {
207
- //ic.begin('span').addClass('separator').end() ;
208
207
  ic.push("<span class='separator'></span>") ;
208
+ context.addClass('disabled') ;
209
209
  } else {
210
210
  // handle checkbox
211
211
  key = this.getDelegateProperty('contentCheckboxKey', del) ;
@@ -333,7 +333,7 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
333
333
  */
334
334
  getAnchor: function() {
335
335
  var anchor = this.get('anchor') ;
336
- if(anchor && anchor.kindOf(SC.MenuItemView)) return anchor ;
336
+ if(anchor && anchor.kindOf && anchor.kindOf(SC.MenuItemView)) return anchor ;
337
337
  return null ;
338
338
  },
339
339
 
@@ -437,7 +437,7 @@ SC.MenuItemView = SC.ButtonView.extend( SC.ContentDisplay,
437
437
  if (content && content.get(key)) {
438
438
  this.$('.checkbox').setClass('inactive', YES) ;
439
439
  content.set(key, NO) ;
440
- } else {
440
+ } else if( content.get(key)!== undefined ) {
441
441
  this.$('.checkbox').removeClass('inactive') ;
442
442
  content.set(key, YES) ;
443
443
  }
@@ -13,6 +13,14 @@ SC.PopupButtonView = SC.ButtonView.extend({
13
13
  */
14
14
  keyEquivalent: null,
15
15
  classNames: ['sc-popup-button'],
16
+
17
+ /**
18
+ Prefer matrix to pass the offsets to position the pane popped up by this
19
+ button.
20
+
21
+ @property
22
+ */
23
+ preferMatrix: null,
16
24
 
17
25
  /**private */
18
26
  acceptsFirstResponder: YES,
@@ -61,7 +69,7 @@ SC.PopupButtonView = SC.ButtonView.extend({
61
69
  var menu = this.get('menu') ;
62
70
  // no menu to toggle... bail...
63
71
  if (!menu) return NO ;
64
- menu.popup(this) ;
72
+ menu.popup(this, this.preferMatrix) ;
65
73
  return YES;
66
74
  }
67
75