@blockdia/scratch-blocks 0.1.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 (243) hide show
  1. package/.nvmrc +1 -0
  2. package/LICENSE +674 -0
  3. package/README.md +57 -0
  4. package/TRADEMARK +1 -0
  5. package/blockly_compressed_horizontal.js +2268 -0
  6. package/blockly_compressed_vertical.js +2296 -0
  7. package/blockly_uncompressed_horizontal.js +1212 -0
  8. package/blockly_uncompressed_vertical.js +1212 -0
  9. package/blocks_common/colour.js +61 -0
  10. package/blocks_common/math.js +159 -0
  11. package/blocks_common/matrix.js +54 -0
  12. package/blocks_common/note.js +58 -0
  13. package/blocks_common/text.js +57 -0
  14. package/blocks_compressed.js +37 -0
  15. package/blocks_compressed_horizontal.js +68 -0
  16. package/blocks_compressed_vertical.js +216 -0
  17. package/blocks_horizontal/control.js +212 -0
  18. package/blocks_horizontal/default_toolbox.js +139 -0
  19. package/blocks_horizontal/event.js +190 -0
  20. package/blocks_horizontal/wedo.js +325 -0
  21. package/blocks_vertical/control.js +532 -0
  22. package/blocks_vertical/data.js +666 -0
  23. package/blocks_vertical/default_toolbox.js +571 -0
  24. package/blocks_vertical/event.js +329 -0
  25. package/blocks_vertical/extensions.js +294 -0
  26. package/blocks_vertical/looks.js +591 -0
  27. package/blocks_vertical/motion.js +587 -0
  28. package/blocks_vertical/operators.js +470 -0
  29. package/blocks_vertical/procedures.js +1051 -0
  30. package/blocks_vertical/sensing.js +555 -0
  31. package/blocks_vertical/sound.js +246 -0
  32. package/blocks_vertical/vertical_extensions.js +289 -0
  33. package/build/gen_blocks.js +1 -0
  34. package/build/test_expect.js +1 -0
  35. package/build/test_input.js +1 -0
  36. package/build.py +647 -0
  37. package/cleanup.sh +101 -0
  38. package/core/block.js +1837 -0
  39. package/core/block_animations.js +107 -0
  40. package/core/block_drag_surface.js +299 -0
  41. package/core/block_dragger.js +424 -0
  42. package/core/block_events.js +531 -0
  43. package/core/block_render_svg_horizontal.js +892 -0
  44. package/core/block_render_svg_vertical.js +1734 -0
  45. package/core/block_svg.js +1355 -0
  46. package/core/blockly.js +620 -0
  47. package/core/blocks.js +37 -0
  48. package/core/bubble.js +664 -0
  49. package/core/bubble_dragger.js +285 -0
  50. package/core/colours.js +177 -0
  51. package/core/comment.js +293 -0
  52. package/core/comment_events.js +539 -0
  53. package/core/connection.js +776 -0
  54. package/core/connection_db.js +300 -0
  55. package/core/constants.js +408 -0
  56. package/core/contextmenu.js +534 -0
  57. package/core/css.js +1354 -0
  58. package/core/data_category.js +490 -0
  59. package/core/dragged_connection_manager.js +260 -0
  60. package/core/dropdowndiv.js +408 -0
  61. package/core/events.js +429 -0
  62. package/core/events_abstract.js +113 -0
  63. package/core/extensions.js +450 -0
  64. package/core/field.js +810 -0
  65. package/core/field_angle.js +410 -0
  66. package/core/field_checkbox.js +133 -0
  67. package/core/field_colour.js +253 -0
  68. package/core/field_colour_slider.js +387 -0
  69. package/core/field_date.js +353 -0
  70. package/core/field_dropdown.js +447 -0
  71. package/core/field_iconmenu.js +309 -0
  72. package/core/field_image.js +200 -0
  73. package/core/field_label.js +136 -0
  74. package/core/field_label_serializable.js +125 -0
  75. package/core/field_matrix.js +566 -0
  76. package/core/field_note.js +850 -0
  77. package/core/field_number.js +366 -0
  78. package/core/field_numberdropdown.js +77 -0
  79. package/core/field_textdropdown.js +164 -0
  80. package/core/field_textinput.js +675 -0
  81. package/core/field_textinput_removable.js +105 -0
  82. package/core/field_variable.js +385 -0
  83. package/core/field_variable_getter.js +185 -0
  84. package/core/field_vertical_separator.js +161 -0
  85. package/core/flyout_base.js +935 -0
  86. package/core/flyout_button.js +324 -0
  87. package/core/flyout_dragger.js +83 -0
  88. package/core/flyout_extension_category_header.js +159 -0
  89. package/core/flyout_horizontal.js +475 -0
  90. package/core/flyout_vertical.js +770 -0
  91. package/core/generator.js +426 -0
  92. package/core/gesture.js +1010 -0
  93. package/core/grid.js +227 -0
  94. package/core/icon.js +205 -0
  95. package/core/inject.js +496 -0
  96. package/core/input.js +285 -0
  97. package/core/insertion_marker_manager.js +678 -0
  98. package/core/intersection_observer.js +102 -0
  99. package/core/msg.js +62 -0
  100. package/core/mutator.js +426 -0
  101. package/core/names.js +198 -0
  102. package/core/options.js +244 -0
  103. package/core/procedures.js +739 -0
  104. package/core/rendered_connection.js +417 -0
  105. package/core/scratch_block_comment.js +646 -0
  106. package/core/scratch_blocks_utils.js +246 -0
  107. package/core/scratch_bubble.js +699 -0
  108. package/core/scratch_events.js +131 -0
  109. package/core/scratch_msgs.js +85 -0
  110. package/core/scrollbar.js +875 -0
  111. package/core/toolbox.js +803 -0
  112. package/core/tooltip.js +337 -0
  113. package/core/touch.js +226 -0
  114. package/core/trashcan.js +343 -0
  115. package/core/ui_events.js +91 -0
  116. package/core/ui_menu_utils.js +68 -0
  117. package/core/utils.js +825 -0
  118. package/core/variable_events.js +259 -0
  119. package/core/variable_map.js +415 -0
  120. package/core/variable_model.js +116 -0
  121. package/core/variables.js +674 -0
  122. package/core/warning.js +199 -0
  123. package/core/widgetdiv.js +344 -0
  124. package/core/workspace.js +673 -0
  125. package/core/workspace_audio.js +170 -0
  126. package/core/workspace_comment.js +426 -0
  127. package/core/workspace_comment_render_svg.js +706 -0
  128. package/core/workspace_comment_svg.js +609 -0
  129. package/core/workspace_drag_surface_svg.js +195 -0
  130. package/core/workspace_dragger.js +132 -0
  131. package/core/workspace_svg.js +2382 -0
  132. package/core/xml.js +930 -0
  133. package/core/zoom_controls.js +301 -0
  134. package/dist/horizontal.js +222 -0
  135. package/dist/vertical.js +222 -0
  136. package/dist/web/horizontal.js +232 -0
  137. package/dist/web/vertical.js +232 -0
  138. package/i18n/common.py +234 -0
  139. package/i18n/create_messages.py +162 -0
  140. package/i18n/create_scratch_msgs.js +69 -0
  141. package/i18n/dedup_json.py +73 -0
  142. package/i18n/js_to_json.js +46 -0
  143. package/i18n/js_to_json.py +136 -0
  144. package/i18n/json_to_js.js +52 -0
  145. package/i18n/json_to_js.py +185 -0
  146. package/i18n/sync_tx_translations.js +111 -0
  147. package/i18n/test_scratch_msgs.js +87 -0
  148. package/i18n/tests.py +47 -0
  149. package/i18n/xliff_to_json.py +232 -0
  150. package/local_build.sh +70 -0
  151. package/media/click.mp3 +0 -0
  152. package/media/click.ogg +0 -0
  153. package/media/click.wav +0 -0
  154. package/media/comment-arrow-down.svg +10 -0
  155. package/media/comment-arrow-up.svg +10 -0
  156. package/media/delete-x.svg +10 -0
  157. package/media/delete.mp3 +0 -0
  158. package/media/delete.ogg +0 -0
  159. package/media/delete.wav +0 -0
  160. package/media/dropdown-arrow-dark.svg +1 -0
  161. package/media/dropdown-arrow.svg +1 -0
  162. package/media/extensions/microbit-block-icon.svg +130 -0
  163. package/media/extensions/music-block-icon.svg +17 -0
  164. package/media/extensions/pen-block-icon.svg +19 -0
  165. package/media/extensions/wedo2-block-icon.svg +36 -0
  166. package/media/eyedropper.svg +22 -0
  167. package/media/green-flag.svg +17 -0
  168. package/media/handclosed.cur +0 -0
  169. package/media/handdelete.cur +0 -0
  170. package/media/handopen.cur +0 -0
  171. package/media/icons/arrow.svg +12 -0
  172. package/media/icons/arrow_button.svg +1 -0
  173. package/media/icons/control_forever.svg +1 -0
  174. package/media/icons/control_repeat.svg +1 -0
  175. package/media/icons/control_stop.svg +1 -0
  176. package/media/icons/control_wait.svg +1 -0
  177. package/media/icons/event_broadcast_blue.svg +1 -0
  178. package/media/icons/event_broadcast_coral.svg +1 -0
  179. package/media/icons/event_broadcast_green.svg +1 -0
  180. package/media/icons/event_broadcast_magenta.svg +1 -0
  181. package/media/icons/event_broadcast_orange.svg +1 -0
  182. package/media/icons/event_broadcast_purple.svg +1 -0
  183. package/media/icons/event_when-broadcast-received_blue.svg +1 -0
  184. package/media/icons/event_when-broadcast-received_coral.svg +1 -0
  185. package/media/icons/event_when-broadcast-received_green.svg +1 -0
  186. package/media/icons/event_when-broadcast-received_magenta.svg +1 -0
  187. package/media/icons/event_when-broadcast-received_orange.svg +1 -0
  188. package/media/icons/event_when-broadcast-received_purple.svg +1 -0
  189. package/media/icons/event_whenflagclicked.svg +1 -0
  190. package/media/icons/remove.svg +19 -0
  191. package/media/icons/set-led_blue.svg +1 -0
  192. package/media/icons/set-led_coral.svg +1 -0
  193. package/media/icons/set-led_green.svg +1 -0
  194. package/media/icons/set-led_magenta.svg +1 -0
  195. package/media/icons/set-led_mystery.svg +1 -0
  196. package/media/icons/set-led_orange.svg +1 -0
  197. package/media/icons/set-led_purple.svg +1 -0
  198. package/media/icons/set-led_white.svg +1 -0
  199. package/media/icons/set-led_yellow.svg +1 -0
  200. package/media/icons/wedo_motor-clockwise.svg +1 -0
  201. package/media/icons/wedo_motor-counterclockwise.svg +1 -0
  202. package/media/icons/wedo_motor-speed_fast.svg +1 -0
  203. package/media/icons/wedo_motor-speed_med.svg +1 -0
  204. package/media/icons/wedo_motor-speed_slow.svg +1 -0
  205. package/media/icons/wedo_when-distance_close.svg +1 -0
  206. package/media/icons/wedo_when-tilt-backward.svg +1 -0
  207. package/media/icons/wedo_when-tilt-forward.svg +1 -0
  208. package/media/icons/wedo_when-tilt-left.svg +1 -0
  209. package/media/icons/wedo_when-tilt-right.svg +1 -0
  210. package/media/icons/wedo_when-tilt.svg +1 -0
  211. package/media/repeat.svg +18 -0
  212. package/media/rotate-left.svg +1 -0
  213. package/media/rotate-right.svg +1 -0
  214. package/media/sprites.png +0 -0
  215. package/media/status-not-ready.svg +13 -0
  216. package/media/status-ready.svg +13 -0
  217. package/media/zoom-in.svg +1 -0
  218. package/media/zoom-out.svg +1 -0
  219. package/media/zoom-reset.svg +1 -0
  220. package/msg/js/en.js +290 -0
  221. package/msg/json/en.json +285 -0
  222. package/msg/messages.js +359 -0
  223. package/msg/scratch_msgs.js +22969 -0
  224. package/package.json +60 -0
  225. package/pull_from_blockly.sh +151 -0
  226. package/renovate.json5 +15 -0
  227. package/shim/blockly_compressed_horizontal-blocks_compressed.js +1 -0
  228. package/shim/blockly_compressed_horizontal.Blockly.js +1 -0
  229. package/shim/blockly_compressed_horizontal.goog.js +1 -0
  230. package/shim/blockly_compressed_horizontal.js +1 -0
  231. package/shim/blockly_compressed_vertical-blocks_compressed.js +1 -0
  232. package/shim/blockly_compressed_vertical.Blockly.js +1 -0
  233. package/shim/blockly_compressed_vertical.goog.js +1 -0
  234. package/shim/blockly_compressed_vertical.js +1 -0
  235. package/shim/blocks_compressed_horizontal-blockly_compressed_horizontal-messages.js +1 -0
  236. package/shim/blocks_compressed_horizontal.js +1 -0
  237. package/shim/blocks_compressed_vertical-blockly_compressed_vertical-messages.js +1 -0
  238. package/shim/blocks_compressed_vertical.js +1 -0
  239. package/shim/gh-pages.js +1 -0
  240. package/shim/horizontal.js +1 -0
  241. package/shim/index.js +17 -0
  242. package/shim/vertical.js +1 -0
  243. package/universal-python.js +82 -0
@@ -0,0 +1,490 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2017 Google Inc.
6
+ * https://developers.google.com/blockly/
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */
20
+
21
+ /**
22
+ * @fileoverview Data Flyout components including variable and list blocks.
23
+ * @author marisaleung@google.com (Marisa Leung)
24
+ */
25
+ 'use strict';
26
+
27
+ /**
28
+ * @name Blockly.DataCategory
29
+ * @namespace
30
+ **/
31
+ goog.provide('Blockly.DataCategory');
32
+
33
+ goog.require('Blockly.Blocks');
34
+ goog.require('Blockly.VariableModel');
35
+ goog.require('Blockly.Variables');
36
+ goog.require('Blockly.Workspace');
37
+
38
+ /**
39
+ * Construct the blocks required by the flyout for the variable category.
40
+ * @param {!Blockly.Workspace} workspace The workspace containing variables.
41
+ * @return {!Array.<!Element>} Array of XML block elements.
42
+ */
43
+ Blockly.DataCategory = function(workspace) {
44
+ var variableModelList = workspace.getVariablesOfType('');
45
+ variableModelList.sort(Blockly.VariableModel.compareByName);
46
+ var xmlList = [];
47
+
48
+ Blockly.DataCategory.addCreateButton(xmlList, workspace, 'VARIABLE');
49
+
50
+ for (var i = 0; i < variableModelList.length; i++) {
51
+ Blockly.DataCategory.addDataVariable(xmlList, variableModelList[i]);
52
+ }
53
+
54
+ if (variableModelList.length > 0) {
55
+ xmlList[xmlList.length - 1].setAttribute('gap', 28);
56
+ var firstVariable = variableModelList[0];
57
+
58
+ Blockly.DataCategory.addSetVariableTo(xmlList, firstVariable);
59
+ Blockly.DataCategory.addChangeVariableBy(xmlList, firstVariable);
60
+ Blockly.DataCategory.addShowVariable(xmlList, firstVariable);
61
+ Blockly.DataCategory.addHideVariable(xmlList, firstVariable);
62
+ }
63
+
64
+ // Now add list variables to the flyout
65
+ Blockly.DataCategory.addCreateButton(xmlList, workspace, 'LIST');
66
+ variableModelList = workspace.getVariablesOfType(Blockly.LIST_VARIABLE_TYPE);
67
+ variableModelList.sort(Blockly.VariableModel.compareByName);
68
+ for (var i = 0; i < variableModelList.length; i++) {
69
+ Blockly.DataCategory.addDataList(xmlList, variableModelList[i]);
70
+ }
71
+
72
+ if (variableModelList.length > 0) {
73
+ xmlList[xmlList.length - 1].setAttribute('gap', 28);
74
+ var firstVariable = variableModelList[0];
75
+
76
+ Blockly.DataCategory.addAddToList(xmlList, firstVariable);
77
+ Blockly.DataCategory.addSep(xmlList);
78
+ Blockly.DataCategory.addDeleteOfList(xmlList, firstVariable);
79
+ Blockly.DataCategory.addDeleteAllOfList(xmlList, firstVariable);
80
+ Blockly.DataCategory.addInsertAtList(xmlList, firstVariable);
81
+ Blockly.DataCategory.addReplaceItemOfList(xmlList, firstVariable);
82
+ Blockly.DataCategory.addSep(xmlList);
83
+ Blockly.DataCategory.addItemOfList(xmlList, firstVariable);
84
+ Blockly.DataCategory.addItemNumberOfList(xmlList, firstVariable);
85
+ Blockly.DataCategory.addLengthOfList(xmlList, firstVariable);
86
+ Blockly.DataCategory.addListContainsItem(xmlList, firstVariable);
87
+ Blockly.DataCategory.addSep(xmlList);
88
+ Blockly.DataCategory.addShowList(xmlList, firstVariable);
89
+ Blockly.DataCategory.addHideList(xmlList, firstVariable);
90
+ }
91
+
92
+ return xmlList;
93
+ };
94
+
95
+ /**
96
+ * Construct and add a data_variable block to xmlList.
97
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
98
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
99
+ */
100
+ Blockly.DataCategory.addDataVariable = function(xmlList, variable) {
101
+ // <block id="variableId" type="data_variable">
102
+ // <field name="VARIABLE">variablename</field>
103
+ // </block>
104
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_variable', 'VARIABLE');
105
+ // In the flyout, this ID must match variable ID for monitor syncing reasons
106
+ xmlList[xmlList.length - 1].setAttribute('id', variable.getId());
107
+ };
108
+
109
+ /**
110
+ * Construct and add a data_setvariableto block to xmlList.
111
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
112
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
113
+ */
114
+ Blockly.DataCategory.addSetVariableTo = function(xmlList, variable) {
115
+ // <block type="data_setvariableto" gap="20">
116
+ // <value name="VARIABLE">
117
+ // <shadow type="data_variablemenu"></shadow>
118
+ // </value>
119
+ // <value name="VALUE">
120
+ // <shadow type="text">
121
+ // <field name="TEXT">0</field>
122
+ // </shadow>
123
+ // </value>
124
+ // </block>
125
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_setvariableto',
126
+ 'VARIABLE', ['VALUE', 'text', 0]);
127
+ };
128
+
129
+ /**
130
+ * Construct and add a data_changevariableby block to xmlList.
131
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
132
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
133
+ */
134
+ Blockly.DataCategory.addChangeVariableBy = function(xmlList, variable) {
135
+ // <block type="data_changevariableby">
136
+ // <value name="VARIABLE">
137
+ // <shadow type="data_variablemenu"></shadow>
138
+ // </value>
139
+ // <value name="VALUE">
140
+ // <shadow type="math_number">
141
+ // <field name="NUM">1</field>
142
+ // </shadow>
143
+ // </value>
144
+ // </block>
145
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_changevariableby',
146
+ 'VARIABLE', ['VALUE', 'math_number', 1]);
147
+ };
148
+
149
+ /**
150
+ * Construct and add a data_showVariable block to xmlList.
151
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
152
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
153
+ */
154
+ Blockly.DataCategory.addShowVariable = function(xmlList, variable) {
155
+ // <block type="data_showvariable">
156
+ // <value name="VARIABLE">
157
+ // <shadow type="data_variablemenu"></shadow>
158
+ // </value>
159
+ // </block>
160
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_showvariable',
161
+ 'VARIABLE');
162
+ };
163
+
164
+ /**
165
+ * Construct and add a data_hideVariable block to xmlList.
166
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
167
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
168
+ */
169
+ Blockly.DataCategory.addHideVariable = function(xmlList, variable) {
170
+ // <block type="data_hidevariable">
171
+ // <value name="VARIABLE">
172
+ // <shadow type="data_variablemenu"></shadow>
173
+ // </value>
174
+ // </block>
175
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_hidevariable',
176
+ 'VARIABLE');
177
+ };
178
+
179
+ /**
180
+ * Construct and add a data_listcontents block to xmlList.
181
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
182
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
183
+ */
184
+ Blockly.DataCategory.addDataList = function(xmlList, variable) {
185
+ // <block id="variableId" type="data_listcontents">
186
+ // <field name="LIST">variablename</field>
187
+ // </block>
188
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_listcontents', 'LIST');
189
+ // In the flyout, this ID must match variable ID for monitor syncing reasons
190
+ xmlList[xmlList.length - 1].setAttribute('id', variable.getId());
191
+ };
192
+
193
+ /**
194
+ * Construct and add a data_addtolist block to xmlList.
195
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
196
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
197
+ */
198
+ Blockly.DataCategory.addAddToList = function(xmlList, variable) {
199
+ // <block type="data_addtolist">
200
+ // <field name="LIST" variabletype="list" id="">variablename</field>
201
+ // <value name="ITEM">
202
+ // <shadow type="text">
203
+ // <field name="TEXT">thing</field>
204
+ // </shadow>
205
+ // </value>
206
+ // </block>
207
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_addtolist', 'LIST',
208
+ ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]);
209
+ };
210
+
211
+ /**
212
+ * Construct and add a data_deleteoflist block to xmlList.
213
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
214
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
215
+ */
216
+ Blockly.DataCategory.addDeleteOfList = function(xmlList, variable) {
217
+ // <block type="data_deleteoflist">
218
+ // <field name="LIST" variabletype="list" id="">variablename</field>
219
+ // <value name="INDEX">
220
+ // <shadow type="math_integer">
221
+ // <field name="NUM">1</field>
222
+ // </shadow>
223
+ // </value>
224
+ // </block>
225
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_deleteoflist', 'LIST',
226
+ ['INDEX', 'math_integer', 1]);
227
+ };
228
+
229
+ /**
230
+ * Construct and add a data_deleteoflist block to xmlList.
231
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
232
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
233
+ */
234
+ Blockly.DataCategory.addDeleteAllOfList = function(xmlList, variable) {
235
+ // <block type="data_deletealloflist">
236
+ // <field name="LIST" variabletype="list" id="">variablename</field>
237
+ // </block>
238
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_deletealloflist',
239
+ 'LIST');
240
+ };
241
+
242
+ /**
243
+ * Construct and add a data_insertatlist block to xmlList.
244
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
245
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
246
+ */
247
+ Blockly.DataCategory.addInsertAtList = function(xmlList, variable) {
248
+ // <block type="data_insertatlist">
249
+ // <field name="LIST" variabletype="list" id="">variablename</field>
250
+ // <value name="INDEX">
251
+ // <shadow type="math_integer">
252
+ // <field name="NUM">1</field>
253
+ // </shadow>
254
+ // </value>
255
+ // <value name="ITEM">
256
+ // <shadow type="text">
257
+ // <field name="TEXT">thing</field>
258
+ // </shadow>
259
+ // </value>
260
+ // </block>
261
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_insertatlist', 'LIST',
262
+ ['INDEX', 'math_integer', 1], ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]);
263
+ };
264
+
265
+ /**
266
+ * Construct and add a data_replaceitemoflist block to xmlList.
267
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
268
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
269
+ */
270
+ Blockly.DataCategory.addReplaceItemOfList = function(xmlList, variable) {
271
+ // <block type="data_replaceitemoflist">
272
+ // <field name="LIST" variabletype="list" id="">variablename</field>
273
+ // <value name="INDEX">
274
+ // <shadow type="math_integer">
275
+ // <field name="NUM">1</field>
276
+ // </shadow>
277
+ // </value>
278
+ // <value name="ITEM">
279
+ // <shadow type="text">
280
+ // <field name="TEXT">thing</field>
281
+ // </shadow>
282
+ // </value>
283
+ // </block>
284
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_replaceitemoflist',
285
+ 'LIST', ['INDEX', 'math_integer', 1], ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]);
286
+ };
287
+
288
+ /**
289
+ * Construct and add a data_itemoflist block to xmlList.
290
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
291
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
292
+ */
293
+ Blockly.DataCategory.addItemOfList = function(xmlList, variable) {
294
+ // <block type="data_itemoflist">
295
+ // <field name="LIST" variabletype="list" id="">variablename</field>
296
+ // <value name="INDEX">
297
+ // <shadow type="math_integer">
298
+ // <field name="NUM">1</field>
299
+ // </shadow>
300
+ // </value>
301
+ // </block>
302
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_itemoflist', 'LIST',
303
+ ['INDEX', 'math_integer', 1]);
304
+ };
305
+
306
+ /** Construct and add a data_itemnumoflist block to xmlList.
307
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
308
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
309
+ */
310
+ Blockly.DataCategory.addItemNumberOfList = function(xmlList, variable) {
311
+ // <block type="data_itemnumoflist">
312
+ // <value name="ITEM">
313
+ // <shadow type="text">
314
+ // <field name="TEXT">thing</field>
315
+ // </shadow>
316
+ // </value>
317
+ // <field name="LIST" variabletype="list" id="">variablename</field>
318
+ // </block>
319
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_itemnumoflist',
320
+ 'LIST', ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]);
321
+ };
322
+
323
+ /**
324
+ * Construct and add a data_lengthoflist block to xmlList.
325
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
326
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
327
+ */
328
+ Blockly.DataCategory.addLengthOfList = function(xmlList, variable) {
329
+ // <block type="data_lengthoflist">
330
+ // <field name="LIST" variabletype="list" id="">variablename</field>
331
+ // </block>
332
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_lengthoflist', 'LIST');
333
+ };
334
+
335
+ /**
336
+ * Construct and add a data_listcontainsitem block to xmlList.
337
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
338
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
339
+ */
340
+ Blockly.DataCategory.addListContainsItem = function(xmlList, variable) {
341
+ // <block type="data_listcontainsitem">
342
+ // <field name="LIST" variabletype="list" id="">variablename</field>
343
+ // <value name="ITEM">
344
+ // <shadow type="text">
345
+ // <field name="TEXT">thing</field>
346
+ // </shadow>
347
+ // </value>
348
+ // </block>
349
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_listcontainsitem',
350
+ 'LIST', ['ITEM', 'text', Blockly.Msg.DEFAULT_LIST_ITEM]);
351
+ };
352
+
353
+ /**
354
+ * Construct and add a data_showlist block to xmlList.
355
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
356
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
357
+ */
358
+ Blockly.DataCategory.addShowList = function(xmlList, variable) {
359
+ // <block type="data_showlist">
360
+ // <field name="LIST" variabletype="list" id="">variablename</field>
361
+ // </block>
362
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_showlist', 'LIST');
363
+ };
364
+
365
+ /**
366
+ * Construct and add a data_hidelist block to xmlList.
367
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
368
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
369
+ */
370
+ Blockly.DataCategory.addHideList = function(xmlList, variable) {
371
+ // <block type="data_hidelist">
372
+ // <field name="LIST" variabletype="list" id="">variablename</field>
373
+ // </block>
374
+ Blockly.DataCategory.addBlock(xmlList, variable, 'data_hidelist', 'LIST');
375
+ };
376
+
377
+ /**
378
+ * Construct a create variable button and push it to the xmlList.
379
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
380
+ * @param {Blockly.Workspace} workspace Workspace to register callback to.
381
+ * @param {string} type Type of variable this is for. For example, 'LIST' or
382
+ * 'VARIABLE'.
383
+ */
384
+ Blockly.DataCategory.addCreateButton = function(xmlList, workspace, type) {
385
+ var button = goog.dom.createDom('button');
386
+ // Set default msg, callbackKey, and callback values for type 'VARIABLE'
387
+ var msg = Blockly.Msg.NEW_VARIABLE;
388
+ var callbackKey = 'CREATE_VARIABLE';
389
+ var callback = function(button) {
390
+ Blockly.Variables.createVariable(button.getTargetWorkspace(), null, '');};
391
+
392
+ if (type === 'LIST') {
393
+ msg = Blockly.Msg.NEW_LIST;
394
+ callbackKey = 'CREATE_LIST';
395
+ callback = function(button) {
396
+ Blockly.Variables.createVariable(button.getTargetWorkspace(), null,
397
+ Blockly.LIST_VARIABLE_TYPE);};
398
+ }
399
+ button.setAttribute('text', msg);
400
+ button.setAttribute('callbackKey', callbackKey);
401
+ workspace.registerButtonCallback(callbackKey, callback);
402
+ xmlList.push(button);
403
+ };
404
+
405
+ /**
406
+ * Construct a variable block with the given variable, blockType, and optional
407
+ * value tags. Add the variable block to the given xmlList.
408
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
409
+ * @param {?Blockly.VariableModel} variable Variable to select in the field.
410
+ * @param {string} blockType Type of block. For example, 'data_hidelist' or
411
+ * data_showlist'.
412
+ * @param {string} fieldName Name of field in block. For example: 'VARIABLE' or
413
+ * 'LIST'.
414
+ * @param {?Array.<string>} opt_value Optional array containing the value name
415
+ * and shadow type of value tags.
416
+ * @param {?Array.<string>} opt_secondValue Optional array containing the value
417
+ * name and shadow type of a second pair of value tags.
418
+ */
419
+ Blockly.DataCategory.addBlock = function(xmlList, variable, blockType,
420
+ fieldName, opt_value, opt_secondValue) {
421
+ if (Blockly.Blocks[blockType]) {
422
+ var firstValueField;
423
+ var secondValueField;
424
+ if (opt_value) {
425
+ firstValueField = Blockly.DataCategory.createValue(opt_value[0],
426
+ opt_value[1], opt_value[2]);
427
+ }
428
+ if (opt_secondValue) {
429
+ secondValueField = Blockly.DataCategory.createValue(opt_secondValue[0],
430
+ opt_secondValue[1], opt_secondValue[2]);
431
+ }
432
+
433
+ var gap = 10;
434
+ var blockText = '<xml>' +
435
+ '<block type="' + blockType + '" gap="' + gap + '">' +
436
+ Blockly.Variables.generateVariableFieldXml_(variable, fieldName) +
437
+ firstValueField + secondValueField +
438
+ '</block>' +
439
+ '</xml>';
440
+ var block = Blockly.Xml.textToDom(blockText).firstChild;
441
+ xmlList.push(block);
442
+ }
443
+ };
444
+
445
+ /**
446
+ * Create the text representation of a value dom element with a shadow of the
447
+ * indicated type inside.
448
+ * @param {string} valueName Name of the value tags.
449
+ * @param {string} type The type of the shadow tags.
450
+ * @param {string|number} value The default shadow value.
451
+ * @return {string} The generated dom element in text.
452
+ */
453
+ Blockly.DataCategory.createValue = function(valueName, type, value) {
454
+ var fieldName;
455
+ switch (valueName) {
456
+ case 'ITEM':
457
+ fieldName = 'TEXT';
458
+ break;
459
+ case 'INDEX':
460
+ fieldName = 'NUM';
461
+ break;
462
+ case 'VALUE':
463
+ if (type === 'math_number') {
464
+ fieldName = 'NUM';
465
+ } else {
466
+ fieldName = 'TEXT';
467
+ }
468
+ break;
469
+ }
470
+ var valueField =
471
+ '<value name="' + valueName + '">' +
472
+ '<shadow type="' + type + '">' +
473
+ '<field name="' + fieldName + '">' + value + '</field>' +
474
+ '</shadow>' +
475
+ '</value>';
476
+ return valueField;
477
+ };
478
+
479
+ /**
480
+ * Construct a block separator. Add the separator to the given xmlList.
481
+ * @param {!Array.<!Element>} xmlList Array of XML block elements.
482
+ */
483
+ Blockly.DataCategory.addSep = function(xmlList) {
484
+ var gap = 36;
485
+ var sepText = '<xml>' +
486
+ '<sep gap="' + gap + '"/>' +
487
+ '</xml>';
488
+ var sep = Blockly.Xml.textToDom(sepText).firstChild;
489
+ xmlList.push(sep);
490
+ };