sproutcore 0.9.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 (270) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +269 -0
  4. data/README.txt +67 -0
  5. data/Rakefile +4 -0
  6. data/app_generators/sproutcore/USAGE +5 -0
  7. data/app_generators/sproutcore/sproutcore_generator.rb +66 -0
  8. data/app_generators/sproutcore/templates/README +77 -0
  9. data/app_generators/sproutcore/templates/environment.yml +4 -0
  10. data/bin/sc-build +145 -0
  11. data/bin/sc-gen +24 -0
  12. data/bin/sc-server +63 -0
  13. data/bin/sproutcore +21 -0
  14. data/clients/sc_docs/controllers/docs.js +118 -0
  15. data/clients/sc_docs/core.js +19 -0
  16. data/clients/sc_docs/english.lproj/body.css +159 -0
  17. data/clients/sc_docs/english.lproj/body.rhtml +33 -0
  18. data/clients/sc_docs/english.lproj/controls.css +0 -0
  19. data/clients/sc_docs/english.lproj/icons/small/next.png +0 -0
  20. data/clients/sc_docs/english.lproj/icons/small/reset.png +0 -0
  21. data/clients/sc_docs/english.lproj/images/gradients.png +0 -0
  22. data/clients/sc_docs/english.lproj/images/indicator.gif +0 -0
  23. data/clients/sc_docs/english.lproj/images/toolbar.png +0 -0
  24. data/clients/sc_docs/english.lproj/no_docs.rhtml +7 -0
  25. data/clients/sc_docs/english.lproj/strings.js +14 -0
  26. data/clients/sc_docs/english.lproj/warning.rhtml +6 -0
  27. data/clients/sc_docs/fixtures/doc.js +11 -0
  28. data/clients/sc_docs/main.js +21 -0
  29. data/clients/sc_docs/models/doc.js +9 -0
  30. data/clients/sc_docs/tests/controllers/docs.rhtml +21 -0
  31. data/clients/sc_docs/tests/models/doc.rhtml +21 -0
  32. data/clients/sc_docs/tests/views/doc_frame.rhtml +21 -0
  33. data/clients/sc_docs/tests/views/doc_label_view.rhtml +21 -0
  34. data/clients/sc_docs/views/doc_frame.js +33 -0
  35. data/clients/sc_docs/views/doc_label.js +20 -0
  36. data/clients/sc_test_runner/controllers/runner.js +175 -0
  37. data/clients/sc_test_runner/core.js +19 -0
  38. data/clients/sc_test_runner/english.lproj/body.css +151 -0
  39. data/clients/sc_test_runner/english.lproj/body.rhtml +35 -0
  40. data/clients/sc_test_runner/english.lproj/controls.css +0 -0
  41. data/clients/sc_test_runner/english.lproj/icons/small/next.png +0 -0
  42. data/clients/sc_test_runner/english.lproj/icons/small/reset.png +0 -0
  43. data/clients/sc_test_runner/english.lproj/images/gradients.png +0 -0
  44. data/clients/sc_test_runner/english.lproj/images/indicator.gif +0 -0
  45. data/clients/sc_test_runner/english.lproj/images/toolbar.png +0 -0
  46. data/clients/sc_test_runner/english.lproj/no_tests.rhtml +6 -0
  47. data/clients/sc_test_runner/english.lproj/strings.js +14 -0
  48. data/clients/sc_test_runner/english.lproj/warning.rhtml +6 -0
  49. data/clients/sc_test_runner/fixtures/test.js +12 -0
  50. data/clients/sc_test_runner/main.js +26 -0
  51. data/clients/sc_test_runner/models/test.js +11 -0
  52. data/clients/sc_test_runner/views/runner_frame.js +72 -0
  53. data/clients/sc_test_runner/views/test_label.js +20 -0
  54. data/config/hoe.rb +70 -0
  55. data/config/requirements.rb +17 -0
  56. data/environment.yml +9 -0
  57. data/frameworks/prototype/prototype.js +4186 -0
  58. data/frameworks/sproutcore/Core.js +378 -0
  59. data/frameworks/sproutcore/README +3 -0
  60. data/frameworks/sproutcore/controllers/array.js +236 -0
  61. data/frameworks/sproutcore/controllers/collection.js +305 -0
  62. data/frameworks/sproutcore/controllers/controller.js +323 -0
  63. data/frameworks/sproutcore/controllers/object.js +372 -0
  64. data/frameworks/sproutcore/drag/drag.js +549 -0
  65. data/frameworks/sproutcore/drag/drag_data_source.js +32 -0
  66. data/frameworks/sproutcore/drag/drag_source.js +64 -0
  67. data/frameworks/sproutcore/drag/drop_target.js +153 -0
  68. data/frameworks/sproutcore/english.lproj/blank.gif +0 -0
  69. data/frameworks/sproutcore/english.lproj/buttons.css +589 -0
  70. data/frameworks/sproutcore/english.lproj/buttons.png +0 -0
  71. data/frameworks/sproutcore/english.lproj/inline_text_editor.css +21 -0
  72. data/frameworks/sproutcore/english.lproj/menu.css +121 -0
  73. data/frameworks/sproutcore/english.lproj/panels/background-fat.jpg +0 -0
  74. data/frameworks/sproutcore/english.lproj/panels/background-thin.jpg +0 -0
  75. data/frameworks/sproutcore/english.lproj/panels/bottom-edge.png +0 -0
  76. data/frameworks/sproutcore/english.lproj/panels/bottom-left-corner.png +0 -0
  77. data/frameworks/sproutcore/english.lproj/panels/bottom-right-corner.png +0 -0
  78. data/frameworks/sproutcore/english.lproj/panels/left-edge.png +0 -0
  79. data/frameworks/sproutcore/english.lproj/panels/overlay.png +0 -0
  80. data/frameworks/sproutcore/english.lproj/panels/right-edge.png +0 -0
  81. data/frameworks/sproutcore/english.lproj/panels/top-edge.png +0 -0
  82. data/frameworks/sproutcore/english.lproj/panels/top-left-corner.png +0 -0
  83. data/frameworks/sproutcore/english.lproj/panels/top-right-corner.png +0 -0
  84. data/frameworks/sproutcore/english.lproj/panes.css +155 -0
  85. data/frameworks/sproutcore/english.lproj/picker.css +22 -0
  86. data/frameworks/sproutcore/english.lproj/strings.js +15 -0
  87. data/frameworks/sproutcore/english.lproj/tab.css +23 -0
  88. data/frameworks/sproutcore/english.lproj/tests.css +67 -0
  89. data/frameworks/sproutcore/english.lproj/theme.css +77 -0
  90. data/frameworks/sproutcore/foundation/animator.js +670 -0
  91. data/frameworks/sproutcore/foundation/application.js +199 -0
  92. data/frameworks/sproutcore/foundation/array.js +348 -0
  93. data/frameworks/sproutcore/foundation/benchmark.js +211 -0
  94. data/frameworks/sproutcore/foundation/binding.js +384 -0
  95. data/frameworks/sproutcore/foundation/date.js +357 -0
  96. data/frameworks/sproutcore/foundation/error.js +39 -0
  97. data/frameworks/sproutcore/foundation/input_manager.js +153 -0
  98. data/frameworks/sproutcore/foundation/json.js +296 -0
  99. data/frameworks/sproutcore/foundation/mock.js +42 -0
  100. data/frameworks/sproutcore/foundation/node_descriptor.js +56 -0
  101. data/frameworks/sproutcore/foundation/object.js +777 -0
  102. data/frameworks/sproutcore/foundation/observable.js +451 -0
  103. data/frameworks/sproutcore/foundation/page.js +63 -0
  104. data/frameworks/sproutcore/foundation/path_module.js +413 -0
  105. data/frameworks/sproutcore/foundation/responder.js +310 -0
  106. data/frameworks/sproutcore/foundation/routes.js +371 -0
  107. data/frameworks/sproutcore/foundation/run_loop.js +21 -0
  108. data/frameworks/sproutcore/foundation/server.js +491 -0
  109. data/frameworks/sproutcore/foundation/set.js +96 -0
  110. data/frameworks/sproutcore/foundation/string.js +149 -0
  111. data/frameworks/sproutcore/foundation/undo_manager.js +186 -0
  112. data/frameworks/sproutcore/foundation/unittest.js +622 -0
  113. data/frameworks/sproutcore/foundation/utils.js +61 -0
  114. data/frameworks/sproutcore/globals/panels.js +182 -0
  115. data/frameworks/sproutcore/globals/popups.js +60 -0
  116. data/frameworks/sproutcore/globals/window.js +381 -0
  117. data/frameworks/sproutcore/lib/index.rhtml +66 -0
  118. data/frameworks/sproutcore/models/collection.js +395 -0
  119. data/frameworks/sproutcore/models/record.js +622 -0
  120. data/frameworks/sproutcore/models/store.js +295 -0
  121. data/frameworks/sproutcore/panes/dialog.js +16 -0
  122. data/frameworks/sproutcore/panes/manager.js +164 -0
  123. data/frameworks/sproutcore/panes/menu.js +45 -0
  124. data/frameworks/sproutcore/panes/overlay.js +231 -0
  125. data/frameworks/sproutcore/panes/pane.js +90 -0
  126. data/frameworks/sproutcore/panes/panel.js +19 -0
  127. data/frameworks/sproutcore/panes/picker.js +45 -0
  128. data/frameworks/sproutcore/tests/controllers/array.rhtml +86 -0
  129. data/frameworks/sproutcore/tests/controllers/controller.rhtml +273 -0
  130. data/frameworks/sproutcore/tests/controllers/object.rhtml +327 -0
  131. data/frameworks/sproutcore/tests/foundation/application.rhtml +125 -0
  132. data/frameworks/sproutcore/tests/foundation/array.rhtml +221 -0
  133. data/frameworks/sproutcore/tests/foundation/object.rhtml +69 -0
  134. data/frameworks/sproutcore/tests/globals/window.rhtml +45 -0
  135. data/frameworks/sproutcore/tests/panes/pane.rhtml +88 -0
  136. data/frameworks/sproutcore/tests/views/collection.rhtml +137 -0
  137. data/frameworks/sproutcore/tests/views/popup_button.rhtml +115 -0
  138. data/frameworks/sproutcore/tests/views/text_field.rhtml +37 -0
  139. data/frameworks/sproutcore/validators/credit_card.js +92 -0
  140. data/frameworks/sproutcore/validators/date.js +36 -0
  141. data/frameworks/sproutcore/validators/email.js +29 -0
  142. data/frameworks/sproutcore/validators/not_empty.js +24 -0
  143. data/frameworks/sproutcore/validators/number.js +55 -0
  144. data/frameworks/sproutcore/validators/password.js +78 -0
  145. data/frameworks/sproutcore/validators/validator.js +304 -0
  146. data/frameworks/sproutcore/views/button.js +425 -0
  147. data/frameworks/sproutcore/views/checkbox_field.js +30 -0
  148. data/frameworks/sproutcore/views/collection.js +1521 -0
  149. data/frameworks/sproutcore/views/container.js +62 -0
  150. data/frameworks/sproutcore/views/error_explanation.js +45 -0
  151. data/frameworks/sproutcore/views/field.js +214 -0
  152. data/frameworks/sproutcore/views/filter_button.js +29 -0
  153. data/frameworks/sproutcore/views/form.js +591 -0
  154. data/frameworks/sproutcore/views/image.js +141 -0
  155. data/frameworks/sproutcore/views/inline_text_editor.js +96 -0
  156. data/frameworks/sproutcore/views/label.js +176 -0
  157. data/frameworks/sproutcore/views/menu_item.js +90 -0
  158. data/frameworks/sproutcore/views/pagination.js +54 -0
  159. data/frameworks/sproutcore/views/popup_button.js +86 -0
  160. data/frameworks/sproutcore/views/popup_menu.js +137 -0
  161. data/frameworks/sproutcore/views/progress.js +100 -0
  162. data/frameworks/sproutcore/views/radio_field.js +107 -0
  163. data/frameworks/sproutcore/views/radio_group.js +48 -0
  164. data/frameworks/sproutcore/views/segmented.js +80 -0
  165. data/frameworks/sproutcore/views/select_field.js +272 -0
  166. data/frameworks/sproutcore/views/spinner.js +11 -0
  167. data/frameworks/sproutcore/views/tab.js +126 -0
  168. data/frameworks/sproutcore/views/text_field.js +179 -0
  169. data/frameworks/sproutcore/views/textarea_field.js +14 -0
  170. data/frameworks/sproutcore/views/toolbar.js +29 -0
  171. data/frameworks/sproutcore/views/view.js +1389 -0
  172. data/frameworks/sproutcore/views/workspace.js +170 -0
  173. data/generators/client/README +3 -0
  174. data/generators/client/USAGE +12 -0
  175. data/generators/client/client_generator.rb +53 -0
  176. data/generators/client/templates/core.js +19 -0
  177. data/generators/client/templates/english.lproj/body.css +0 -0
  178. data/generators/client/templates/english.lproj/body.rhtml +3 -0
  179. data/generators/client/templates/english.lproj/controls.css +0 -0
  180. data/generators/client/templates/english.lproj/strings.js +14 -0
  181. data/generators/client/templates/main.js +37 -0
  182. data/generators/controller/USAGE +16 -0
  183. data/generators/controller/controller_generator.rb +51 -0
  184. data/generators/controller/templates/controller.js +21 -0
  185. data/generators/controller/templates/test.rhtml +21 -0
  186. data/generators/framework/README +7 -0
  187. data/generators/framework/USAGE +12 -0
  188. data/generators/framework/framework_generator.rb +53 -0
  189. data/generators/framework/templates/core.js +20 -0
  190. data/generators/framework/templates/english.lproj/body.css +0 -0
  191. data/generators/framework/templates/english.lproj/body.rhtml +3 -0
  192. data/generators/framework/templates/english.lproj/controls.css +0 -0
  193. data/generators/framework/templates/english.lproj/strings.js +14 -0
  194. data/generators/language/USAGE +16 -0
  195. data/generators/language/language_generator.rb +47 -0
  196. data/generators/language/templates/strings.js +10 -0
  197. data/generators/model/USAGE +24 -0
  198. data/generators/model/model_generator.rb +55 -0
  199. data/generators/model/templates/fixture.js +11 -0
  200. data/generators/model/templates/model.js +20 -0
  201. data/generators/model/templates/test.rhtml +21 -0
  202. data/generators/test/USAGE +16 -0
  203. data/generators/test/templates/test.rhtml +21 -0
  204. data/generators/test/test_generator.rb +47 -0
  205. data/generators/view/USAGE +16 -0
  206. data/generators/view/templates/test.rhtml +21 -0
  207. data/generators/view/templates/view.js +20 -0
  208. data/generators/view/view_generator.rb +51 -0
  209. data/jsdoc/README.txt +119 -0
  210. data/jsdoc/app/DocFile.js +137 -0
  211. data/jsdoc/app/DocTag.js +110 -0
  212. data/jsdoc/app/Doclet.js +63 -0
  213. data/jsdoc/app/Dumper.js +143 -0
  214. data/jsdoc/app/JsDoc.js +103 -0
  215. data/jsdoc/app/JsHilite.js +45 -0
  216. data/jsdoc/app/JsIO.js +163 -0
  217. data/jsdoc/app/JsParse.js +385 -0
  218. data/jsdoc/app/JsPlate.js +130 -0
  219. data/jsdoc/app/JsTestrun.js +129 -0
  220. data/jsdoc/app/JsToke.js +564 -0
  221. data/jsdoc/app/Symbol.js +298 -0
  222. data/jsdoc/app/Transformer.js +14 -0
  223. data/jsdoc/app/Util.js +97 -0
  224. data/jsdoc/app/js.jar +0 -0
  225. data/jsdoc/app/run.js +144 -0
  226. data/jsdoc/plugins/min.js +316 -0
  227. data/jsdoc/plugins/strip.js +20 -0
  228. data/jsdoc/templates/sproutcore/class.tmpl +438 -0
  229. data/jsdoc/templates/sproutcore/default.css +241 -0
  230. data/jsdoc/templates/sproutcore/index.html +13 -0
  231. data/jsdoc/templates/sproutcore/index.tmpl +21 -0
  232. data/jsdoc/templates/sproutcore/prototype.js +4186 -0
  233. data/jsdoc/templates/sproutcore/publish.js +236 -0
  234. data/jsdoc/templates/sproutcore/splash.html +7 -0
  235. data/lib/sproutcore/build_tools/html_builder.rb +88 -0
  236. data/lib/sproutcore/build_tools/resource_builder.rb +194 -0
  237. data/lib/sproutcore/build_tools.rb +44 -0
  238. data/lib/sproutcore/bundle.rb +517 -0
  239. data/lib/sproutcore/bundle_manifest.rb +397 -0
  240. data/lib/sproutcore/generator_helper.rb +170 -0
  241. data/lib/sproutcore/helpers/capture_helper.rb +42 -0
  242. data/lib/sproutcore/helpers/static_helper.rb +80 -0
  243. data/lib/sproutcore/helpers/tag_helper.rb +110 -0
  244. data/lib/sproutcore/helpers/text_helper.rb +336 -0
  245. data/lib/sproutcore/helpers.rb +3 -0
  246. data/lib/sproutcore/jsdoc.rb +40 -0
  247. data/lib/sproutcore/jsmin.rb +247 -0
  248. data/lib/sproutcore/library.rb +258 -0
  249. data/lib/sproutcore/merb/bundle_controller.rb +179 -0
  250. data/lib/sproutcore/merb/router.rb +43 -0
  251. data/lib/sproutcore/merb.rb +27 -0
  252. data/lib/sproutcore/version.rb +9 -0
  253. data/lib/sproutcore/view_helpers/button_views.rb +302 -0
  254. data/lib/sproutcore/view_helpers/core_views.rb +284 -0
  255. data/lib/sproutcore/view_helpers/form_views.rb +258 -0
  256. data/lib/sproutcore/view_helpers/menu_views.rb +94 -0
  257. data/lib/sproutcore/view_helpers.rb +628 -0
  258. data/lib/sproutcore.rb +30 -0
  259. data/script/destroy +14 -0
  260. data/script/generate +14 -0
  261. data/script/txt2html +74 -0
  262. data/setup.rb +1585 -0
  263. data/spec/spec.opts +1 -0
  264. data/spec/spec_helper.rb +7 -0
  265. data/spec/sproutcore_spec.rb +11 -0
  266. data/tasks/deployment.rake +34 -0
  267. data/tasks/environment.rake +7 -0
  268. data/tasks/rspec.rake +21 -0
  269. data/tasks/website.rake +17 -0
  270. metadata +365 -0
@@ -0,0 +1,425 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/view') ;
7
+ require('views/label') ;
8
+
9
+ // Constants
10
+ SC.TOGGLE_BEHAVIOR = 'toggle';
11
+ SC.PUSH_BEHAVIOR = 'push';
12
+ SC.TOGGLE_ON_BEHAVIOR = "on";
13
+ SC.TOGGLE_OFF_BEHAVIOR = "off" ;
14
+ SC.MIXED_STATE = '__MIXED__' ;
15
+
16
+ /** @class
17
+
18
+ A button handles simple link functions. It can be set to a selected,
19
+ enabled or disabled state.
20
+
21
+ @extends SC.View
22
+ */
23
+ SC.ButtonView = SC.View.extend(
24
+ /** @scope SC.ButtonView.prototype */
25
+ {
26
+
27
+ emptyElement: '<a href="javascript:;" class="regular"><span class="button-inner"><span class="label"></span></span></a>',
28
+
29
+ // PROPERTIES
30
+
31
+ /**
32
+ Used to automatically update the state of the button view for toggle style
33
+ buttons.
34
+
35
+ for toggle style buttons, you can set the value and it will be used to
36
+ automatically update the state of the button view. The value will also
37
+ change as the user selects to deselects. The button will make its best
38
+ effort to convert this value into a reasonable selection state:
39
+
40
+ null, false, 0 -> isSelected = false
41
+ any other single value -> isSelected = true
42
+ array -> if all values are the same state: that state. otherwise MIXED.
43
+
44
+ @type Object
45
+
46
+ */
47
+ value: false,
48
+
49
+ /**
50
+ Value of a selected toggle button.
51
+
52
+ for a toggle button, set this to any object value you want. The button
53
+ will be selected if the value property equals the targetValue. If the
54
+ value is an array of multiple items that contains the targetValue, then
55
+ the button will be set to a mixed state.
56
+
57
+ default is false
58
+
59
+ @type Object
60
+ */
61
+ toggleOnValue: true,
62
+
63
+ /**
64
+ Value of an unselected toggle button.
65
+
66
+ For a toggle button, set this to any object value you want. When the
67
+ user toggle's the button off, the value of the button will be set to this
68
+ value.
69
+
70
+ default is false
71
+
72
+ @type Object
73
+
74
+ */
75
+ toggleOffValue: false,
76
+
77
+ /**
78
+ optionally set this to the theme you want this button to have.
79
+
80
+ This is used to determine the type of button this is. You generally
81
+ should set a class name on the HTML with the same value to allow CSS
82
+ styling.
83
+
84
+ The default SproutCore theme supports "regular", "back", "checkbox", and
85
+ "radio"
86
+ */
87
+ theme: 'regular',
88
+
89
+ /**
90
+ Optionally set the behavioral mode of this button.
91
+
92
+ Possible values are:
93
+
94
+ {{{
95
+ SC.PUSH_BEHAVIOR: ('push')
96
+ Pressing the button will trigger an action tied to the button. Does
97
+ not change the value of the button.
98
+
99
+ SC.TOGGLE_BEHAVIOR: ('toggle')
100
+ Pressing the button will invert the current value of the button. If
101
+ the button has a mixed value, it will be set to true.
102
+
103
+ SC.TOGGLE_ON_BEHAVIOR: ('on')
104
+ Pressing the button will set the current state to true no matter the
105
+ previous value.
106
+
107
+ SC.TOGGLE_OFF_BEHAVIOR: ('off')
108
+ Pressing the button will set the current state to false no matter the
109
+ previous value.
110
+ }}}
111
+
112
+ */
113
+ buttonBehavior: SC.PUSH_BEHAVIOR,
114
+
115
+ /**
116
+ set to false to disable the button. clicks will be ignored.
117
+
118
+ @type bool
119
+ */
120
+ isEnabled: true,
121
+ isEnabledBindingDefault: SC.Binding.OneWayBool,
122
+
123
+ /**
124
+ this is the buttons selection state. Returns true, false or SC.MIXED_STATE.
125
+ */
126
+ isSelected: false,
127
+ isSelectedBindingDefault: SC.Binding.OneWayBool,
128
+
129
+ /**
130
+ if set to true, then this button will be triggered when you hit return
131
+ while focused on a form view. This will also apply the 'def' class name
132
+ to the button.
133
+ */
134
+ isDefault: false,
135
+ isDefaultBindingDefault: SC.Binding.OneWayBool,
136
+
137
+ /**
138
+ is set to true, then this button will be triggered when you hit escape
139
+ inside a pane.
140
+ */
141
+ isCancel: false,
142
+ isCancelBindingDefault: SC.Binding.OneWayBool,
143
+
144
+ /**
145
+ set to true if you want the internal element with the class name
146
+ 'label' to be localized on init.
147
+ */
148
+ localize: false,
149
+
150
+ /**
151
+ this property can be used to edit the contents of the label element,
152
+ (if there is one).
153
+ */
154
+ labelText: function(key, value) {
155
+ // set the value of the label text. Possibly localize and set innerHTML.
156
+ if (value !== undefined) {
157
+ if (this._labelText != value) {
158
+ var text = this._labelText = value ;
159
+ var lsel = this.get('labelSelector') ;
160
+ var el = (lsel) ? this.$sel(lsel) : this.rootElement ;
161
+
162
+ if (this.get('localize')) text = text.loc() ;
163
+ if (el) Element.update(el, text) ;
164
+ }
165
+
166
+ // lazily fetch the label text. This only happens if localization is
167
+ // turned off.
168
+ if (!this._labelText) {
169
+ var el = this.$sel(this.labelSelector) ;
170
+ this._labelText = (el) ? el.innerHTML : '' ;
171
+ }
172
+ return this._labelText ;
173
+ }
174
+
175
+ // return value.
176
+ return this._labelText ;
177
+ }.property(),
178
+
179
+ labelSelector: '.label',
180
+
181
+ /**
182
+ The name of the action you want triggered when the button is pressed.
183
+
184
+ This property is used in conjunction with the target property to execute
185
+ a method when a regular button is pressed. These properties are not
186
+ relevant when the button is used in toggle mode.
187
+
188
+ If you do not set a target, then pressing a button will cause the
189
+ responder chain to search for a view that implements the action you name
190
+ here. If you set a target, then the button will try to call the method
191
+ on the target itself.
192
+
193
+ For legacy support, you can also set the action property to a function.
194
+ Doing so will cause the function itself to be called when the button is
195
+ clicked. It is generally better to use the target/action approach and
196
+ to implement your code in a controller of some type.
197
+
198
+ @type String
199
+ */
200
+ action: null,
201
+
202
+ /**
203
+ The target object to invoke the action on when the button is pressed.
204
+
205
+ If you set this target, the action will be called on the target object
206
+ directly when the button is clicked. If you leave this property set to
207
+ null, then the button will search the responder chain for a view that
208
+ implements the action when the button is pressed instead.
209
+
210
+ @type Object
211
+ */
212
+ target: null,
213
+
214
+ /**
215
+ The key equivalent that should trigger this button on the page.
216
+ */
217
+ keyEquivalent: null,
218
+
219
+ performKeyEquivalent: function( keystring, evt )
220
+ {
221
+ if (!this.get('isEnabled')) return false;
222
+
223
+ var keyEquivalent = this.get('keyEquivalent');
224
+ if (keyEquivalent && (keyEquivalent == keystring))
225
+ {
226
+ // button has defined a keyEquivalent and it matches!
227
+ // if triggering succeeded, true will be returned and the operation will be handeled
228
+ // (i.e performKeyEquivalent will cease crawling the view tree)
229
+ return this.triggerAction(evt);
230
+ }
231
+ return false;
232
+ },
233
+
234
+ /**
235
+ fakes a click... evt is optional.
236
+
237
+ Temporarily highlights the button to show that it is being triggered.
238
+ Does nothing if the button is disabled.
239
+
240
+ @returns {bool} success/failure of the request
241
+ */
242
+ triggerAction: function(evt) {
243
+ if (!this.get('isEnabled')) return false;
244
+ this.setClassName('active', true);
245
+ this.didTriggerAction();
246
+ this._action(evt);
247
+ var view = this;
248
+ setTimeout(function() { view.setClassName('active', false); }, 200);
249
+ return true;
250
+ },
251
+
252
+ didTriggerAction: function() {},
253
+
254
+ // ................................................................
255
+ // INTERNAL SUPPORT
256
+
257
+ /** @private */
258
+ init: function() {
259
+ arguments.callee.base.call(this) ;
260
+ this._updateClassForState() ;
261
+
262
+ var el ;
263
+ var lsel = this.get('labelSelector') ;
264
+ if (this.get('localize') && (el = (lsel) ? this.$sel(lsel) : this.rootElement)) {
265
+ this._labelText = el.innerHTML.strip() ;
266
+ Element.update(el, this._labelText.loc()) ;
267
+ }
268
+ },
269
+
270
+ _selectedStateFromValue: function(value) {
271
+ var targetValue = this.get('toggleOnValue') ;
272
+ var state ;
273
+
274
+ if ($type(value) == T_ARRAY) {
275
+ if (value.length == 1) {
276
+ state = (value[0] == targetValue) ;
277
+ } else {
278
+ state = (value.include(targetValue)) ? SC.MIXED_STATE : false ;
279
+ }
280
+ } else {
281
+ state = (value == targetValue) ;
282
+ }
283
+ return state ;
284
+ },
285
+
286
+ /** @private */
287
+ propertyObserver: function(observing,target,key,value) {
288
+ if (target != this) return ;
289
+
290
+ // handle changes to the value
291
+ if (key == 'value') {
292
+ // determine the new selection state.
293
+ value = this.get('value') ;
294
+ if (value == this._value) return ; // process value one time.
295
+ this._value = value ;
296
+
297
+ // if the new selected state does not match the computed value, set it.
298
+ var state = this._selectedStateFromValue(value) ;
299
+ if (!(this.get('isSelected') == state)) {
300
+ this.set('isSelected', state) ;
301
+ this._updateClassForState() ;
302
+ }
303
+
304
+ // handle changes to the selected state
305
+ // forward to value if needed...
306
+ } else if (key == "isSelected") {
307
+ var newState = this.get('isSelected') ;
308
+ var curState = this._selectedStateFromValue(this.get('value')) ;
309
+ if (curState != newState) {
310
+ var valueKey = (newState) ? 'toggleOnValue' : 'toggleOffValue' ;
311
+ this.set('value', this.get(valueKey)) ;
312
+ }
313
+ this._updateClassForState() ;
314
+
315
+ // otherwise, handle changes to the isEnabled or isDefault states...
316
+ } else if ((key == 'isEnabled') || (key == 'isDefault')) {
317
+ this._updateClassForState() ;
318
+ }
319
+ },
320
+
321
+ _updateClassForState: function() {
322
+ var enabled = !!this.get('isEnabled') ; // force to bool.
323
+ var tagName = this.rootElement.tagName.toLowerCase() ;
324
+ if (tagName == "button") {
325
+ this.rootElement.disabled = !enabled ;
326
+ }
327
+
328
+ this.setClassName('disabled', !enabled) ;
329
+ this.setClassName('def', this.get('isDefault')) ;
330
+
331
+ // handle selected state.
332
+ var sel =this.get('isSelected') ;
333
+ var mixed = (sel == SC.MIXED_STATE) ;
334
+ this.setClassName('mixed', mixed) ;
335
+ this.setClassName('sel', ((mixed) ? false : sel)) ;
336
+ },
337
+
338
+ // on mouse down, set active only if enabled.
339
+ /** @private */
340
+ mouseDown: function(evt) {
341
+ this.setClassName('active',this.get('isEnabled')) ;
342
+ return true ;
343
+ },
344
+
345
+ // on mouse up, trigger the action only if we are enabled and the mouse
346
+ // was released inside the view.
347
+ /** @private */
348
+ mouseUp: function(evt) {
349
+ this.setClassName('active', false) ;
350
+
351
+ var tgt = Event.element(evt) ;
352
+ var inside = false ;
353
+ while(tgt && (tgt != this.rootElement)) tgt = tgt.parentNode;
354
+ if (tgt == this.rootElement) inside = true ;
355
+
356
+ if (inside && this.get('isEnabled')) this._action(evt) ;
357
+ return true ;
358
+ },
359
+
360
+ // perform action depending on the behavior of the button.
361
+ _action: function(evt) {
362
+ switch(this.get('buttonBehavior')) {
363
+
364
+ // When toggling, try to invert like values. i.e. 1 => 0, etc.
365
+ case SC.TOGGLE_BEHAVIOR:
366
+ var sel = this.get('isSelected') ;
367
+ if (sel == true) {
368
+ this.set('value', this.get('toggleOffValue')) ;
369
+ } else {
370
+ this.set('value', this.get('toggleOnValue')) ;
371
+ }
372
+ break ;
373
+
374
+ // set value to on. change 0 => 1.
375
+ case SC.TOGGLE_ON_BEHAVIOR:
376
+ this.set('value', this.get('toggleOnValue')) ;
377
+ break ;
378
+
379
+ // set the value to false. change 1 => 0
380
+ case SC.TOGGLE_OFF_BEHAVIOR:
381
+ this.set('value', this.get('toggleOffValue')) ;
382
+ break ;
383
+
384
+ // otherwise, just trigger an action if there is one.
385
+ default:
386
+ //if (this.action) this.action(evt);
387
+ var action = this.get('action');
388
+ var target = this.get('target') || null;
389
+ if (action)
390
+ {
391
+ if (this._hasLegacyActionHandler()) {
392
+ // old school...
393
+ this._triggerLegacyActionHandler(evt);
394
+ } else {
395
+ // newer action method + optional target syntax...
396
+ SC.app.sendAction(action, target, this);
397
+ }
398
+ }
399
+ }
400
+ },
401
+
402
+ /** @private */
403
+ _hasLegacyActionHandler: function()
404
+ {
405
+ var action = this.get('action');
406
+ if (action && ($type(action) == T_FUNCTION)) return true;
407
+ if (action && ($type(action) == T_STRING) && (action.indexOf('.') != -1)) return true;
408
+ return false;
409
+ },
410
+
411
+ /** @private */
412
+ _triggerLegacyActionHandler: function( evt )
413
+ {
414
+ if (!this._hasLegacyActionHandler()) return false;
415
+
416
+ var action = this.get('action');
417
+ if ($type(action) == T_FUNCTION) this.action(evt);
418
+ if ($type(action) == T_STRING)
419
+ {
420
+ eval("this.action = function(e) { return "+ action +"(this, e); };");
421
+ this.action(evt);
422
+ }
423
+ }
424
+
425
+ }) ;
@@ -0,0 +1,30 @@
1
+ // ========================================================================
2
+ // SproutCore
3
+ // copyright 2006-2007 Sprout Systems, Inc.
4
+ // ========================================================================
5
+
6
+ require('views/field') ;
7
+
8
+ // A text field is an input element with type "text". This view adds support
9
+ // for hinted values, etc.
10
+ SC.CheckboxFieldView = SC.FieldView.extend({
11
+
12
+ emptyElement: '<input type="checkbox" value="1" />',
13
+
14
+ setFieldValue: function(value) {
15
+ this.rootElement.checked = !!value;
16
+ },
17
+
18
+ getFieldValue: function() {
19
+ return this.rootElement.checked;
20
+ },
21
+
22
+ valueBindingDefault: SC.Binding.Flag,
23
+
24
+ init: function() {
25
+ arguments.callee.base.apply(this,arguments) ;
26
+ var f = this.fieldValueDidChange.bind(this, false) ;
27
+ Event.observe(this.rootElement,'click', f) ;
28
+ }
29
+
30
+ }) ;