blockly 8.20220331.0-beta.0 → 9.0.0-beta.1

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 (735) hide show
  1. package/blockly.min.js +2000 -2269
  2. package/blockly_compressed.js +1495 -1994
  3. package/blockly_compressed.js.map +1 -1
  4. package/blocks.d.ts +10 -8
  5. package/blocks_compressed.js +189 -171
  6. package/blocks_compressed.js.map +1 -1
  7. package/closure/goog/base.d.ts +2 -0
  8. package/closure/goog/base_minimal.d.ts +19 -0
  9. package/closure/goog/goog.d.ts +26 -0
  10. package/core/any_aliases.d.ts +2 -0
  11. package/core/block.d.ts +871 -0
  12. package/core/block_animations.d.ts +38 -0
  13. package/core/block_drag_surface.d.ts +124 -0
  14. package/core/block_dragger.d.ts +158 -0
  15. package/core/block_svg.d.ts +656 -0
  16. package/core/blockly.d.ts +583 -0
  17. package/core/blockly_options.d.ts +71 -0
  18. package/core/blocks.d.ts +19 -0
  19. package/core/browser_events.d.ts +94 -0
  20. package/core/bubble.d.ts +309 -0
  21. package/core/bubble_dragger.d.ts +80 -0
  22. package/core/bump_objects.d.ts +38 -0
  23. package/core/clipboard.d.ts +46 -0
  24. package/core/comment.d.ts +123 -0
  25. package/core/common.d.ts +155 -0
  26. package/core/component_manager.d.ts +101 -0
  27. package/core/config.d.ts +24 -0
  28. package/core/connection.d.ts +262 -0
  29. package/core/connection_checker.d.ts +87 -0
  30. package/core/connection_db.d.ts +102 -0
  31. package/core/connection_type.d.ts +17 -0
  32. package/core/constants.d.ts +18 -0
  33. package/core/contextmenu.d.ts +90 -0
  34. package/core/contextmenu_items.d.ts +92 -0
  35. package/core/contextmenu_registry.d.ts +110 -0
  36. package/core/css.d.ts +27 -0
  37. package/core/delete_area.d.ts +51 -0
  38. package/core/dialog.d.ts +68 -0
  39. package/core/drag_target.d.ts +71 -0
  40. package/core/dropdowndiv.d.ts +187 -0
  41. package/core/events/events.d.ts +103 -0
  42. package/core/events/events_abstract.d.ts +58 -0
  43. package/core/events/events_block_base.d.ts +35 -0
  44. package/core/events/events_block_change.d.ts +62 -0
  45. package/core/events/events_block_create.d.ts +40 -0
  46. package/core/events/events_block_delete.d.ts +41 -0
  47. package/core/events/events_block_drag.d.ts +40 -0
  48. package/core/events/events_block_move.d.ts +58 -0
  49. package/core/events/events_bubble_open.d.ts +39 -0
  50. package/core/events/events_click.d.ts +40 -0
  51. package/core/events/events_comment_base.d.ts +44 -0
  52. package/core/events/events_comment_change.d.ts +49 -0
  53. package/core/events/events_comment_create.d.ts +40 -0
  54. package/core/events/events_comment_delete.d.ts +40 -0
  55. package/core/events/events_comment_move.d.ts +62 -0
  56. package/core/events/events_marker_move.d.ts +44 -0
  57. package/core/events/events_selected.d.ts +38 -0
  58. package/core/events/events_theme_change.d.ts +34 -0
  59. package/core/events/events_toolbox_item_select.d.ts +38 -0
  60. package/core/events/events_trashcan_open.d.ts +35 -0
  61. package/core/events/events_ui.d.ts +41 -0
  62. package/core/events/events_ui_base.d.ts +28 -0
  63. package/core/events/events_var_base.d.ts +35 -0
  64. package/core/events/events_var_create.d.ts +40 -0
  65. package/core/events/events_var_delete.d.ts +40 -0
  66. package/core/events/events_var_rename.d.ts +41 -0
  67. package/core/events/events_viewport.d.ts +43 -0
  68. package/core/events/utils.d.ts +315 -0
  69. package/core/events/workspace_events.d.ts +40 -0
  70. package/core/extensions.d.ts +117 -0
  71. package/core/field.d.ts +593 -0
  72. package/core/field_angle.d.ts +187 -0
  73. package/core/field_checkbox.d.ts +137 -0
  74. package/core/field_colour.d.ts +216 -0
  75. package/core/field_dropdown.d.ts +242 -0
  76. package/core/field_image.d.ts +145 -0
  77. package/core/field_label.d.ts +77 -0
  78. package/core/field_label_serializable.d.ts +45 -0
  79. package/core/field_multilineinput.d.ts +161 -0
  80. package/core/field_number.d.ts +172 -0
  81. package/core/field_registry.d.ts +51 -0
  82. package/core/field_textinput.d.ts +239 -0
  83. package/core/field_variable.d.ts +240 -0
  84. package/core/flyout_base.d.ts +505 -0
  85. package/core/flyout_button.d.ts +88 -0
  86. package/core/flyout_horizontal.d.ts +90 -0
  87. package/core/flyout_metrics_manager.d.ts +43 -0
  88. package/core/flyout_vertical.d.ts +91 -0
  89. package/core/generator.d.ts +224 -0
  90. package/core/gesture.d.ts +392 -0
  91. package/core/grid.d.ts +87 -0
  92. package/core/icon.d.ts +87 -0
  93. package/core/inject.d.ts +17 -0
  94. package/core/input.d.ts +143 -0
  95. package/core/input_types.d.ts +16 -0
  96. package/core/insertion_marker_manager.d.ts +230 -0
  97. package/core/interfaces/i_ast_node_location.d.ts +13 -0
  98. package/core/interfaces/i_ast_node_location_svg.d.ts +26 -0
  99. package/core/interfaces/i_ast_node_location_with_block.d.ts +21 -0
  100. package/core/interfaces/i_autohideable.d.ts +21 -0
  101. package/core/interfaces/i_block_dragger.d.ts +49 -0
  102. package/core/interfaces/i_bounded_element.d.ts +28 -0
  103. package/core/interfaces/i_bubble.d.ts +68 -0
  104. package/core/interfaces/i_collapsible_toolbox_item.d.ts +30 -0
  105. package/core/interfaces/i_component.d.ts +19 -0
  106. package/core/interfaces/i_connection_checker.d.ts +77 -0
  107. package/core/interfaces/i_contextmenu.d.ts +15 -0
  108. package/core/interfaces/i_copyable.d.ts +26 -0
  109. package/core/interfaces/i_deletable.d.ts +19 -0
  110. package/core/interfaces/i_delete_area.d.ts +28 -0
  111. package/core/interfaces/i_drag_target.d.ts +61 -0
  112. package/core/interfaces/i_draggable.d.ts +14 -0
  113. package/core/interfaces/i_flyout.d.ts +150 -0
  114. package/core/interfaces/i_keyboard_accessible.d.ts +21 -0
  115. package/core/interfaces/i_metrics_manager.d.ts +129 -0
  116. package/core/interfaces/i_movable.d.ts +19 -0
  117. package/core/interfaces/i_positionable.d.ts +31 -0
  118. package/core/interfaces/i_registrable.d.ts +13 -0
  119. package/core/interfaces/i_registrable_field.d.ts +19 -0
  120. package/core/interfaces/i_selectable.d.ts +20 -0
  121. package/core/interfaces/i_selectable_toolbox_item.d.ts +49 -0
  122. package/core/interfaces/i_serializer.d.ts +47 -0
  123. package/core/interfaces/i_styleable.d.ts +25 -0
  124. package/core/interfaces/i_toolbox.d.ts +96 -0
  125. package/core/interfaces/i_toolbox_item.d.ts +72 -0
  126. package/core/internal_constants.d.ts +46 -0
  127. package/core/keyboard_nav/ast_node.d.ts +266 -0
  128. package/core/keyboard_nav/basic_cursor.d.ts +99 -0
  129. package/core/keyboard_nav/cursor.d.ts +47 -0
  130. package/core/keyboard_nav/marker.d.ts +65 -0
  131. package/core/keyboard_nav/tab_navigate_cursor.d.ts +22 -0
  132. package/core/main.d.ts +12 -0
  133. package/core/marker_manager.d.ts +96 -0
  134. package/core/menu.d.ts +167 -0
  135. package/core/menuitem.d.ts +133 -0
  136. package/core/metrics_manager.d.ts +216 -0
  137. package/core/msg.d.ts +10 -0
  138. package/core/mutator.d.ts +140 -0
  139. package/core/names.d.ts +136 -0
  140. package/core/options.d.ts +143 -0
  141. package/core/positionable_helpers.d.ts +96 -0
  142. package/core/procedures.d.ts +125 -0
  143. package/core/registry.d.ts +148 -0
  144. package/core/rendered_connection.d.ts +212 -0
  145. package/core/renderers/common/block_rendering.d.ts +121 -0
  146. package/core/renderers/common/constants.d.ts +490 -0
  147. package/core/renderers/common/debug.d.ts +32 -0
  148. package/core/renderers/common/debugger.d.ts +131 -0
  149. package/core/renderers/common/drawer.d.ts +144 -0
  150. package/core/renderers/common/i_path_object.d.ts +132 -0
  151. package/core/renderers/common/info.d.ts +211 -0
  152. package/core/renderers/common/marker_svg.d.ts +249 -0
  153. package/core/renderers/common/path_object.d.ts +166 -0
  154. package/core/renderers/common/renderer.d.ts +178 -0
  155. package/core/renderers/geras/constants.d.ts +25 -0
  156. package/core/renderers/geras/drawer.d.ts +45 -0
  157. package/core/renderers/geras/geras.d.ts +12 -0
  158. package/core/renderers/geras/highlight_constants.d.ts +111 -0
  159. package/core/renderers/geras/highlighter.d.ts +109 -0
  160. package/core/renderers/geras/info.d.ts +48 -0
  161. package/core/renderers/geras/measurables/inline_input.d.ts +25 -0
  162. package/core/renderers/geras/measurables/statement_input.d.ts +25 -0
  163. package/core/renderers/geras/path_object.d.ts +51 -0
  164. package/core/renderers/geras/renderer.d.ts +79 -0
  165. package/core/renderers/measurables/base.d.ts +29 -0
  166. package/core/renderers/measurables/bottom_row.d.ts +67 -0
  167. package/core/renderers/measurables/connection.d.ts +27 -0
  168. package/core/renderers/measurables/external_value_input.d.ts +28 -0
  169. package/core/renderers/measurables/field.d.ts +31 -0
  170. package/core/renderers/measurables/hat.d.ts +22 -0
  171. package/core/renderers/measurables/icon.d.ts +28 -0
  172. package/core/renderers/measurables/in_row_spacer.d.ts +22 -0
  173. package/core/renderers/measurables/inline_input.d.ts +25 -0
  174. package/core/renderers/measurables/input_connection.d.ts +31 -0
  175. package/core/renderers/measurables/input_row.d.ts +33 -0
  176. package/core/renderers/measurables/jagged_edge.d.ts +21 -0
  177. package/core/renderers/measurables/next_connection.d.ts +24 -0
  178. package/core/renderers/measurables/output_connection.d.ts +27 -0
  179. package/core/renderers/measurables/previous_connection.d.ts +24 -0
  180. package/core/renderers/measurables/round_corner.d.ts +22 -0
  181. package/core/renderers/measurables/row.d.ts +163 -0
  182. package/core/renderers/measurables/spacer_row.d.ts +30 -0
  183. package/core/renderers/measurables/square_corner.d.ts +22 -0
  184. package/core/renderers/measurables/statement_input.d.ts +23 -0
  185. package/core/renderers/measurables/top_row.d.ts +60 -0
  186. package/core/renderers/measurables/types.d.ts +264 -0
  187. package/core/renderers/minimalist/constants.d.ts +16 -0
  188. package/core/renderers/minimalist/drawer.d.ts +23 -0
  189. package/core/renderers/minimalist/info.d.ts +33 -0
  190. package/core/renderers/minimalist/minimalist.d.ts +7 -0
  191. package/core/renderers/minimalist/renderer.d.ts +46 -0
  192. package/core/renderers/thrasos/info.d.ts +43 -0
  193. package/core/renderers/thrasos/renderer.d.ts +28 -0
  194. package/core/renderers/thrasos/thrasos.d.ts +5 -0
  195. package/core/renderers/zelos/constants.d.ts +194 -0
  196. package/core/renderers/zelos/drawer.d.ts +50 -0
  197. package/core/renderers/zelos/info.d.ts +93 -0
  198. package/core/renderers/zelos/marker_svg.d.ts +51 -0
  199. package/core/renderers/zelos/measurables/bottom_row.d.ts +29 -0
  200. package/core/renderers/zelos/measurables/inputs.d.ts +25 -0
  201. package/core/renderers/zelos/measurables/row_elements.d.ts +23 -0
  202. package/core/renderers/zelos/measurables/top_row.d.ts +31 -0
  203. package/core/renderers/zelos/path_object.d.ts +84 -0
  204. package/core/renderers/zelos/renderer.d.ts +82 -0
  205. package/core/renderers/zelos/zelos.d.ts +13 -0
  206. package/core/scrollbar.d.ts +309 -0
  207. package/core/scrollbar_pair.d.ts +119 -0
  208. package/core/serialization/blocks.d.ts +104 -0
  209. package/core/serialization/exceptions.d.ts +78 -0
  210. package/core/serialization/priorities.d.ts +18 -0
  211. package/core/serialization/registry.d.ts +23 -0
  212. package/core/serialization/variables.d.ts +16 -0
  213. package/core/serialization/workspaces.d.ts +31 -0
  214. package/core/shortcut_items.d.ts +71 -0
  215. package/core/shortcut_registry.d.ts +167 -0
  216. package/core/sprites.d.ts +17 -0
  217. package/core/theme/classic.d.ts +14 -0
  218. package/core/theme/themes.d.ts +9 -0
  219. package/core/theme/zelos.d.ts +13 -0
  220. package/core/theme.d.ts +153 -0
  221. package/core/theme_manager.d.ts +90 -0
  222. package/core/toolbox/category.d.ts +266 -0
  223. package/core/toolbox/collapsible_category.d.ts +98 -0
  224. package/core/toolbox/separator.d.ts +42 -0
  225. package/core/toolbox/toolbox.d.ts +400 -0
  226. package/core/toolbox/toolbox_item.d.ts +95 -0
  227. package/core/tooltip.d.ts +147 -0
  228. package/core/touch.d.ts +133 -0
  229. package/core/touch_gesture.d.ts +129 -0
  230. package/core/trashcan.d.ts +216 -0
  231. package/core/utils/aria.d.ts +71 -0
  232. package/core/utils/array.d.ts +16 -0
  233. package/core/utils/colour.d.ts +114 -0
  234. package/core/utils/coordinate.d.ts +82 -0
  235. package/core/utils/deprecation.d.ts +19 -0
  236. package/core/utils/dom.d.ts +185 -0
  237. package/core/utils/idgenerator.d.ts +35 -0
  238. package/core/utils/keycodes.d.ts +138 -0
  239. package/core/utils/math.d.ts +34 -0
  240. package/core/utils/metrics.d.ts +65 -0
  241. package/core/utils/object.d.ts +40 -0
  242. package/core/utils/parsing.d.ts +55 -0
  243. package/core/utils/rect.d.ts +40 -0
  244. package/core/utils/sentinel.d.ts +13 -0
  245. package/core/utils/size.d.ts +29 -0
  246. package/core/utils/string.d.ts +62 -0
  247. package/core/utils/style.d.ts +108 -0
  248. package/core/utils/svg.d.ts +71 -0
  249. package/core/utils/svg_math.d.ts +78 -0
  250. package/core/utils/svg_paths.d.ts +111 -0
  251. package/core/utils/toolbox.d.ts +214 -0
  252. package/core/utils/useragent.d.ts +22 -0
  253. package/core/utils/xml.d.ts +60 -0
  254. package/core/utils.d.ts +239 -0
  255. package/core/variable_map.d.ts +158 -0
  256. package/core/variable_model.d.ts +43 -0
  257. package/core/variables.d.ts +196 -0
  258. package/core/variables_dynamic.d.ts +58 -0
  259. package/core/warning.d.ts +55 -0
  260. package/core/widgetdiv.d.ts +78 -0
  261. package/core/workspace.d.ts +436 -0
  262. package/core/workspace_audio.d.ts +53 -0
  263. package/core/workspace_comment.d.ts +192 -0
  264. package/core/workspace_comment_svg.d.ts +372 -0
  265. package/core/workspace_drag_surface_svg.d.ts +74 -0
  266. package/core/workspace_dragger.d.ts +54 -0
  267. package/core/workspace_svg.d.ts +1032 -0
  268. package/core/xml.d.ts +132 -0
  269. package/core/zoom_controls.d.ts +140 -0
  270. package/core.d.ts +1 -9
  271. package/core.js +1 -2
  272. package/dart.d.ts +1 -9
  273. package/dart_compressed.js +387 -99
  274. package/dart_compressed.js.map +1 -1
  275. package/index.d.ts +4 -16
  276. package/javascript.d.ts +1 -9
  277. package/javascript_compressed.js +314 -104
  278. package/javascript_compressed.js.map +1 -1
  279. package/lua.d.ts +1 -9
  280. package/lua_compressed.js +399 -81
  281. package/lua_compressed.js.map +1 -1
  282. package/msg/ab.js +10 -6
  283. package/msg/ace.js +10 -6
  284. package/msg/af.js +10 -6
  285. package/msg/am.js +10 -6
  286. package/msg/ar.js +10 -6
  287. package/msg/ast.js +10 -6
  288. package/msg/az.js +12 -8
  289. package/msg/ba.js +10 -6
  290. package/msg/bcc.js +10 -6
  291. package/msg/be-tarask.js +10 -6
  292. package/msg/be.js +14 -10
  293. package/msg/bg.js +10 -6
  294. package/msg/bn.js +10 -6
  295. package/msg/br.js +10 -6
  296. package/msg/bs.js +10 -6
  297. package/msg/ca.js +10 -6
  298. package/msg/cdo.js +10 -6
  299. package/msg/cs.js +25 -21
  300. package/msg/da.js +10 -6
  301. package/msg/de.js +11 -7
  302. package/msg/diq.js +11 -7
  303. package/msg/dty.js +10 -6
  304. package/msg/ee.js +10 -6
  305. package/msg/el.js +10 -6
  306. package/msg/en-gb.js +10 -6
  307. package/msg/en.js +10 -6
  308. package/msg/eo.js +11 -7
  309. package/msg/es.js +11 -7
  310. package/msg/et.js +10 -6
  311. package/msg/eu.js +10 -6
  312. package/msg/fa.js +11 -7
  313. package/msg/fi.js +10 -6
  314. package/msg/fo.js +10 -6
  315. package/msg/fr.js +14 -10
  316. package/msg/frr.js +10 -6
  317. package/msg/gl.js +10 -6
  318. package/msg/gn.js +10 -6
  319. package/msg/gor.js +10 -6
  320. package/msg/ha.js +10 -6
  321. package/msg/hak.js +10 -6
  322. package/msg/he.js +11 -7
  323. package/msg/hi.js +10 -6
  324. package/msg/hr.js +12 -8
  325. package/msg/hrx.js +10 -6
  326. package/msg/hu.js +10 -6
  327. package/msg/hy.js +12 -8
  328. package/msg/ia.js +10 -6
  329. package/msg/id.js +22 -18
  330. package/msg/ig.js +10 -6
  331. package/msg/inh.js +24 -20
  332. package/msg/is.js +10 -6
  333. package/msg/it.js +10 -6
  334. package/msg/ja.js +17 -13
  335. package/msg/ka.js +10 -6
  336. package/msg/kab.js +10 -6
  337. package/msg/kbd-cyrl.js +10 -6
  338. package/msg/km.js +10 -6
  339. package/msg/kn.js +10 -6
  340. package/msg/ko.js +10 -6
  341. package/msg/ksh.js +10 -6
  342. package/msg/ku-latn.js +10 -6
  343. package/msg/ky.js +10 -6
  344. package/msg/la.js +10 -6
  345. package/msg/lb.js +10 -6
  346. package/msg/lki.js +10 -6
  347. package/msg/lo.js +10 -6
  348. package/msg/lrc.js +10 -6
  349. package/msg/lt.js +10 -6
  350. package/msg/lv.js +39 -35
  351. package/msg/mg.js +10 -6
  352. package/msg/mk.js +10 -6
  353. package/msg/ml.js +10 -6
  354. package/msg/mnw.js +10 -6
  355. package/msg/ms.js +10 -6
  356. package/msg/my.js +10 -6
  357. package/msg/mzn.js +10 -6
  358. package/msg/nb.js +10 -6
  359. package/msg/ne.js +10 -6
  360. package/msg/nl.js +10 -6
  361. package/msg/oc.js +10 -6
  362. package/msg/olo.js +10 -6
  363. package/msg/pa.js +13 -9
  364. package/msg/pl.js +10 -6
  365. package/msg/pms.js +10 -6
  366. package/msg/ps.js +10 -6
  367. package/msg/pt-br.js +10 -6
  368. package/msg/pt.js +10 -6
  369. package/msg/ro.js +10 -6
  370. package/msg/ru.js +10 -6
  371. package/msg/sc.js +10 -6
  372. package/msg/sco.js +10 -6
  373. package/msg/sd.js +10 -6
  374. package/msg/shn.js +10 -6
  375. package/msg/si.js +10 -6
  376. package/msg/sk.js +10 -6
  377. package/msg/skr-arab.js +10 -6
  378. package/msg/sl.js +10 -6
  379. package/msg/smn.js +440 -0
  380. package/msg/sq.js +10 -6
  381. package/msg/sr-latn.js +10 -6
  382. package/msg/sr.js +10 -6
  383. package/msg/sv.js +10 -6
  384. package/msg/sw.js +10 -6
  385. package/msg/ta.js +10 -6
  386. package/msg/tcy.js +10 -6
  387. package/msg/te.js +11 -7
  388. package/msg/th.js +10 -6
  389. package/msg/ti.js +10 -6
  390. package/msg/tl.js +10 -6
  391. package/msg/tlh.js +10 -6
  392. package/msg/tr.js +10 -6
  393. package/msg/ug-arab.js +10 -6
  394. package/msg/uk.js +10 -6
  395. package/msg/ur.js +10 -6
  396. package/msg/uz.js +10 -6
  397. package/msg/vi.js +10 -6
  398. package/msg/xmf.js +10 -6
  399. package/msg/yo.js +10 -6
  400. package/msg/yue.js +11 -7
  401. package/msg/zgh.js +10 -6
  402. package/msg/zh-hans.js +13 -9
  403. package/msg/zh-hant.js +13 -9
  404. package/package.json +8 -5
  405. package/php.d.ts +1 -9
  406. package/php_compressed.js +322 -93
  407. package/php_compressed.js.map +1 -1
  408. package/python.d.ts +1 -9
  409. package/python_compressed.js +237 -90
  410. package/python_compressed.js.map +1 -1
  411. package/blockly.d.ts +0 -25607
  412. package/blocks/blocks.js +0 -47
  413. package/blocks/colour.js +0 -119
  414. package/blocks/lists.js +0 -924
  415. package/blocks/logic.js +0 -657
  416. package/blocks/loops.js +0 -373
  417. package/blocks/math.js +0 -592
  418. package/blocks/procedures.js +0 -1194
  419. package/blocks/text.js +0 -992
  420. package/blocks/variables.js +0 -174
  421. package/blocks/variables_dynamic.js +0 -190
  422. package/core/block.js +0 -2212
  423. package/core/block_animations.js +0 -206
  424. package/core/block_drag_surface.js +0 -269
  425. package/core/block_dragger.js +0 -484
  426. package/core/block_svg.js +0 -1894
  427. package/core/blockly.js +0 -890
  428. package/core/blockly_options.js +0 -28
  429. package/core/blocks.js +0 -33
  430. package/core/browser_events.js +0 -284
  431. package/core/bubble.js +0 -985
  432. package/core/bubble_dragger.js +0 -298
  433. package/core/bump_objects.js +0 -180
  434. package/core/clipboard.js +0 -80
  435. package/core/comment.js +0 -448
  436. package/core/common.js +0 -265
  437. package/core/component_manager.js +0 -263
  438. package/core/config.js +0 -87
  439. package/core/connection.js +0 -742
  440. package/core/connection_checker.js +0 -312
  441. package/core/connection_db.js +0 -314
  442. package/core/connection_type.js +0 -36
  443. package/core/constants.js +0 -33
  444. package/core/contextmenu.js +0 -398
  445. package/core/contextmenu_items.js +0 -651
  446. package/core/contextmenu_registry.js +0 -178
  447. package/core/css.js +0 -568
  448. package/core/delete_area.js +0 -87
  449. package/core/dialog.js +0 -107
  450. package/core/drag_target.js +0 -98
  451. package/core/dropdowndiv.js +0 -754
  452. package/core/events/events.js +0 -147
  453. package/core/events/events_abstract.js +0 -133
  454. package/core/events/events_block_base.js +0 -70
  455. package/core/events/events_block_change.js +0 -179
  456. package/core/events/events_block_create.js +0 -127
  457. package/core/events/events_block_delete.js +0 -139
  458. package/core/events/events_block_drag.js +0 -89
  459. package/core/events/events_block_move.js +0 -202
  460. package/core/events/events_bubble_open.js +0 -90
  461. package/core/events/events_click.js +0 -87
  462. package/core/events/events_comment_base.js +0 -121
  463. package/core/events/events_comment_change.js +0 -105
  464. package/core/events/events_comment_create.js +0 -84
  465. package/core/events/events_comment_delete.js +0 -81
  466. package/core/events/events_comment_move.js +0 -157
  467. package/core/events/events_marker_move.js +0 -110
  468. package/core/events/events_selected.js +0 -83
  469. package/core/events/events_theme_change.js +0 -72
  470. package/core/events/events_toolbox_item_select.js +0 -84
  471. package/core/events/events_trashcan_open.js +0 -73
  472. package/core/events/events_ui.js +0 -88
  473. package/core/events/events_ui_base.js +0 -63
  474. package/core/events/events_var_base.js +0 -70
  475. package/core/events/events_var_create.js +0 -89
  476. package/core/events/events_var_delete.js +0 -89
  477. package/core/events/events_var_rename.js +0 -90
  478. package/core/events/events_viewport.js +0 -107
  479. package/core/events/utils.js +0 -600
  480. package/core/events/workspace_events.js +0 -93
  481. package/core/extensions.js +0 -523
  482. package/core/field.js +0 -1282
  483. package/core/field_angle.js +0 -591
  484. package/core/field_checkbox.js +0 -255
  485. package/core/field_colour.js +0 -717
  486. package/core/field_dropdown.js +0 -795
  487. package/core/field_image.js +0 -304
  488. package/core/field_label.js +0 -149
  489. package/core/field_label_serializable.js +0 -80
  490. package/core/field_multilineinput.js +0 -463
  491. package/core/field_number.js +0 -340
  492. package/core/field_registry.js +0 -80
  493. package/core/field_textinput.js +0 -619
  494. package/core/field_variable.js +0 -558
  495. package/core/flyout_base.js +0 -1254
  496. package/core/flyout_button.js +0 -356
  497. package/core/flyout_horizontal.js +0 -391
  498. package/core/flyout_metrics_manager.js +0 -106
  499. package/core/flyout_vertical.js +0 -395
  500. package/core/generator.js +0 -564
  501. package/core/gesture.js +0 -1026
  502. package/core/grid.js +0 -226
  503. package/core/icon.js +0 -225
  504. package/core/inject.js +0 -389
  505. package/core/input.js +0 -332
  506. package/core/input_types.js +0 -36
  507. package/core/insertion_marker_manager.js +0 -790
  508. package/core/interfaces/i_ast_node_location.js +0 -26
  509. package/core/interfaces/i_ast_node_location_svg.js +0 -45
  510. package/core/interfaces/i_ast_node_location_with_block.js +0 -41
  511. package/core/interfaces/i_autohideable.js +0 -40
  512. package/core/interfaces/i_block_dragger.js +0 -66
  513. package/core/interfaces/i_bounded_element.js +0 -45
  514. package/core/interfaces/i_bubble.js +0 -95
  515. package/core/interfaces/i_collapsible_toolbox_item.js +0 -53
  516. package/core/interfaces/i_component.js +0 -37
  517. package/core/interfaces/i_connection_checker.js +0 -104
  518. package/core/interfaces/i_contextmenu.js +0 -32
  519. package/core/interfaces/i_copyable.js +0 -49
  520. package/core/interfaces/i_deletable.js +0 -33
  521. package/core/interfaces/i_delete_area.js +0 -50
  522. package/core/interfaces/i_drag_target.js +0 -88
  523. package/core/interfaces/i_draggable.js +0 -31
  524. package/core/interfaces/i_flyout.js +0 -201
  525. package/core/interfaces/i_keyboard_accessible.js +0 -38
  526. package/core/interfaces/i_metrics_manager.js +0 -154
  527. package/core/interfaces/i_movable.js +0 -33
  528. package/core/interfaces/i_positionable.js +0 -51
  529. package/core/interfaces/i_registrable.js +0 -29
  530. package/core/interfaces/i_registrable_field.js +0 -39
  531. package/core/interfaces/i_selectable.js +0 -51
  532. package/core/interfaces/i_selectable_toolbox_item.js +0 -73
  533. package/core/interfaces/i_serializer.js +0 -77
  534. package/core/interfaces/i_styleable.js +0 -39
  535. package/core/interfaces/i_toolbox.js +0 -142
  536. package/core/interfaces/i_toolbox_item.js +0 -85
  537. package/core/internal_constants.js +0 -72
  538. package/core/keyboard_nav/ast_node.js +0 -741
  539. package/core/keyboard_nav/basic_cursor.js +0 -225
  540. package/core/keyboard_nav/cursor.js +0 -144
  541. package/core/keyboard_nav/marker.js +0 -134
  542. package/core/keyboard_nav/tab_navigate_cursor.js +0 -52
  543. package/core/marker_manager.js +0 -213
  544. package/core/menu.js +0 -482
  545. package/core/menuitem.js +0 -292
  546. package/core/metrics_manager.js +0 -495
  547. package/core/msg.js +0 -24
  548. package/core/mutator.js +0 -575
  549. package/core/names.js +0 -289
  550. package/core/options.js +0 -391
  551. package/core/positionable_helpers.js +0 -188
  552. package/core/procedures.js +0 -452
  553. package/core/registry.js +0 -384
  554. package/core/rendered_connection.js +0 -588
  555. package/core/renderers/common/block_rendering.js +0 -170
  556. package/core/renderers/common/constants.js +0 -1250
  557. package/core/renderers/common/debug.js +0 -67
  558. package/core/renderers/common/debugger.js +0 -457
  559. package/core/renderers/common/drawer.js +0 -475
  560. package/core/renderers/common/i_path_object.js +0 -162
  561. package/core/renderers/common/info.js +0 -775
  562. package/core/renderers/common/marker_svg.js +0 -721
  563. package/core/renderers/common/path_object.js +0 -283
  564. package/core/renderers/common/renderer.js +0 -305
  565. package/core/renderers/geras/constants.js +0 -73
  566. package/core/renderers/geras/drawer.js +0 -220
  567. package/core/renderers/geras/geras.js +0 -36
  568. package/core/renderers/geras/highlight_constants.js +0 -299
  569. package/core/renderers/geras/highlighter.js +0 -311
  570. package/core/renderers/geras/info.js +0 -488
  571. package/core/renderers/geras/measurables/inline_input.js +0 -58
  572. package/core/renderers/geras/measurables/statement_input.js +0 -57
  573. package/core/renderers/geras/path_object.js +0 -166
  574. package/core/renderers/geras/renderer.js +0 -149
  575. package/core/renderers/measurables/base.js +0 -64
  576. package/core/renderers/measurables/bottom_row.js +0 -138
  577. package/core/renderers/measurables/connection.js +0 -56
  578. package/core/renderers/measurables/external_value_input.js +0 -70
  579. package/core/renderers/measurables/field.js +0 -71
  580. package/core/renderers/measurables/hat.js +0 -50
  581. package/core/renderers/measurables/icon.js +0 -58
  582. package/core/renderers/measurables/in_row_spacer.js +0 -47
  583. package/core/renderers/measurables/inline_input.js +0 -80
  584. package/core/renderers/measurables/input_connection.js +0 -75
  585. package/core/renderers/measurables/input_row.js +0 -89
  586. package/core/renderers/measurables/jagged_edge.js +0 -46
  587. package/core/renderers/measurables/next_connection.js +0 -50
  588. package/core/renderers/measurables/output_connection.js +0 -61
  589. package/core/renderers/measurables/previous_connection.js +0 -50
  590. package/core/renderers/measurables/round_corner.js +0 -52
  591. package/core/renderers/measurables/row.js +0 -247
  592. package/core/renderers/measurables/spacer_row.js +0 -69
  593. package/core/renderers/measurables/square_corner.js +0 -50
  594. package/core/renderers/measurables/statement_input.js +0 -59
  595. package/core/renderers/measurables/top_row.js +0 -143
  596. package/core/renderers/measurables/types.js +0 -353
  597. package/core/renderers/minimalist/constants.js +0 -37
  598. package/core/renderers/minimalist/drawer.js +0 -42
  599. package/core/renderers/minimalist/info.js +0 -54
  600. package/core/renderers/minimalist/minimalist.js +0 -26
  601. package/core/renderers/minimalist/renderer.js +0 -80
  602. package/core/renderers/thrasos/info.js +0 -339
  603. package/core/renderers/thrasos/renderer.js +0 -53
  604. package/core/renderers/thrasos/thrasos.js +0 -22
  605. package/core/renderers/zelos/constants.js +0 -1005
  606. package/core/renderers/zelos/drawer.js +0 -250
  607. package/core/renderers/zelos/info.js +0 -624
  608. package/core/renderers/zelos/marker_svg.js +0 -179
  609. package/core/renderers/zelos/measurables/bottom_row.js +0 -66
  610. package/core/renderers/zelos/measurables/inputs.js +0 -57
  611. package/core/renderers/zelos/measurables/row_elements.js +0 -46
  612. package/core/renderers/zelos/measurables/top_row.js +0 -71
  613. package/core/renderers/zelos/path_object.js +0 -247
  614. package/core/renderers/zelos/renderer.js +0 -147
  615. package/core/renderers/zelos/zelos.js +0 -38
  616. package/core/scrollbar.js +0 -891
  617. package/core/scrollbar_pair.js +0 -329
  618. package/core/serialization/blocks.js +0 -699
  619. package/core/serialization/exceptions.js +0 -144
  620. package/core/serialization/priorities.js +0 -38
  621. package/core/serialization/registry.js +0 -45
  622. package/core/serialization/variables.js +0 -98
  623. package/core/serialization/workspaces.js +0 -103
  624. package/core/shortcut_items.js +0 -302
  625. package/core/shortcut_registry.js +0 -366
  626. package/core/sprites.js +0 -31
  627. package/core/theme/classic.js +0 -56
  628. package/core/theme/themes.js +0 -23
  629. package/core/theme/zelos.js +0 -94
  630. package/core/theme.js +0 -228
  631. package/core/theme_manager.js +0 -211
  632. package/core/toolbox/category.js +0 -751
  633. package/core/toolbox/collapsible_category.js +0 -311
  634. package/core/toolbox/separator.js +0 -133
  635. package/core/toolbox/toolbox.js +0 -1160
  636. package/core/toolbox/toolbox_item.js +0 -173
  637. package/core/tooltip.js +0 -541
  638. package/core/touch.js +0 -285
  639. package/core/touch_gesture.js +0 -333
  640. package/core/trashcan.js +0 -757
  641. package/core/utils/aria.js +0 -174
  642. package/core/utils/array.js +0 -34
  643. package/core/utils/colour.js +0 -288
  644. package/core/utils/coordinate.js +0 -138
  645. package/core/utils/deprecation.js +0 -41
  646. package/core/utils/dom.js +0 -430
  647. package/core/utils/global.js +0 -41
  648. package/core/utils/idgenerator.js +0 -83
  649. package/core/utils/keycodes.js +0 -172
  650. package/core/utils/math.js +0 -63
  651. package/core/utils/metrics.js +0 -154
  652. package/core/utils/object.js +0 -91
  653. package/core/utils/parsing.js +0 -261
  654. package/core/utils/rect.js +0 -75
  655. package/core/utils/sentinel.js +0 -25
  656. package/core/utils/size.js +0 -65
  657. package/core/utils/string.js +0 -305
  658. package/core/utils/style.js +0 -296
  659. package/core/utils/svg.js +0 -186
  660. package/core/utils/svg_math.js +0 -268
  661. package/core/utils/svg_paths.js +0 -149
  662. package/core/utils/toolbox.js +0 -459
  663. package/core/utils/useragent.js +0 -197
  664. package/core/utils/xml.js +0 -107
  665. package/core/utils.js +0 -383
  666. package/core/variable_map.js +0 -410
  667. package/core/variable_model.js +0 -96
  668. package/core/variables.js +0 -578
  669. package/core/variables_dynamic.js +0 -129
  670. package/core/warning.js +0 -175
  671. package/core/widgetdiv.js +0 -290
  672. package/core/workspace.js +0 -836
  673. package/core/workspace_audio.js +0 -169
  674. package/core/workspace_comment.js +0 -400
  675. package/core/workspace_comment_svg.js +0 -1224
  676. package/core/workspace_drag_surface_svg.js +0 -194
  677. package/core/workspace_dragger.js +0 -115
  678. package/core/workspace_svg.js +0 -2735
  679. package/core/xml.js +0 -1043
  680. package/core/zoom_controls.js +0 -507
  681. package/generators/dart/all.js +0 -25
  682. package/generators/dart/colour.js +0 -105
  683. package/generators/dart/lists.js +0 -431
  684. package/generators/dart/logic.js +0 -123
  685. package/generators/dart/loops.js +0 -161
  686. package/generators/dart/math.js +0 -446
  687. package/generators/dart/procedures.js +0 -105
  688. package/generators/dart/text.js +0 -338
  689. package/generators/dart/variables.js +0 -32
  690. package/generators/dart/variables_dynamic.js +0 -21
  691. package/generators/dart.js +0 -304
  692. package/generators/javascript/all.js +0 -25
  693. package/generators/javascript/colour.js +0 -85
  694. package/generators/javascript/lists.js +0 -405
  695. package/generators/javascript/logic.js +0 -127
  696. package/generators/javascript/loops.js +0 -180
  697. package/generators/javascript/math.js +0 -401
  698. package/generators/javascript/procedures.js +0 -110
  699. package/generators/javascript/text.js +0 -371
  700. package/generators/javascript/variables.js +0 -32
  701. package/generators/javascript/variables_dynamic.js +0 -21
  702. package/generators/javascript.js +0 -324
  703. package/generators/lua/all.js +0 -25
  704. package/generators/lua/colour.js +0 -71
  705. package/generators/lua/lists.js +0 -348
  706. package/generators/lua/logic.js +0 -112
  707. package/generators/lua/loops.js +0 -168
  708. package/generators/lua/math.js +0 -406
  709. package/generators/lua/procedures.js +0 -106
  710. package/generators/lua/text.js +0 -327
  711. package/generators/lua/variables.js +0 -31
  712. package/generators/lua/variables_dynamic.js +0 -21
  713. package/generators/lua.js +0 -207
  714. package/generators/php/all.js +0 -25
  715. package/generators/php/colour.js +0 -81
  716. package/generators/php/lists.js +0 -482
  717. package/generators/php/logic.js +0 -119
  718. package/generators/php/loops.js +0 -161
  719. package/generators/php/math.js +0 -349
  720. package/generators/php/procedures.js +0 -125
  721. package/generators/php/text.js +0 -255
  722. package/generators/php/variables.js +0 -32
  723. package/generators/php/variables_dynamic.js +0 -21
  724. package/generators/php.js +0 -304
  725. package/generators/python/all.js +0 -25
  726. package/generators/python/colour.js +0 -67
  727. package/generators/python/lists.js +0 -346
  728. package/generators/python/logic.js +0 -120
  729. package/generators/python/loops.js +0 -209
  730. package/generators/python/math.js +0 -373
  731. package/generators/python/procedures.js +0 -129
  732. package/generators/python/text.js +0 -291
  733. package/generators/python/variables.js +0 -32
  734. package/generators/python/variables_dynamic.js +0 -21
  735. package/generators/python.js +0 -334
@@ -1,1194 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2012 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- /**
8
- * @fileoverview Procedure blocks for Blockly.
9
- * @suppress {checkTypes|visibility}
10
- */
11
- 'use strict';
12
-
13
- goog.module('Blockly.libraryBlocks.procedures');
14
-
15
- /* eslint-disable-next-line no-unused-vars */
16
- const AbstractEvent = goog.requireType('Blockly.Events.Abstract');
17
- const ContextMenu = goog.require('Blockly.ContextMenu');
18
- const Events = goog.require('Blockly.Events');
19
- const Procedures = goog.require('Blockly.Procedures');
20
- const Variables = goog.require('Blockly.Variables');
21
- const Xml = goog.require('Blockly.Xml');
22
- const xmlUtils = goog.require('Blockly.utils.xml');
23
- const {Align} = goog.require('Blockly.Input');
24
- /* eslint-disable-next-line no-unused-vars */
25
- const {Block} = goog.requireType('Blockly.Block');
26
- /* eslint-disable-next-line no-unused-vars */
27
- const {BlockDefinition} = goog.requireType('Blockly.blocks');
28
- const {config} = goog.require('Blockly.config');
29
- /* eslint-disable-next-line no-unused-vars */
30
- const {FieldCheckbox} = goog.require('Blockly.FieldCheckbox');
31
- const {FieldLabel} = goog.require('Blockly.FieldLabel');
32
- const {FieldTextInput} = goog.require('Blockly.FieldTextInput');
33
- const {Msg} = goog.require('Blockly.Msg');
34
- const {Mutator} = goog.require('Blockly.Mutator');
35
- const {Names} = goog.require('Blockly.Names');
36
- /* eslint-disable-next-line no-unused-vars */
37
- const {VariableModel} = goog.requireType('Blockly.VariableModel');
38
- /* eslint-disable-next-line no-unused-vars */
39
- const {Workspace} = goog.requireType('Blockly.Workspace');
40
- const {defineBlocks} = goog.require('Blockly.common');
41
- /** @suppress {extraRequire} */
42
- goog.require('Blockly.Comment');
43
- /** @suppress {extraRequire} */
44
- goog.require('Blockly.Warning');
45
-
46
-
47
- /**
48
- * A dictionary of the block definitions provided by this module.
49
- * @type {!Object<string, !BlockDefinition>}
50
- */
51
- const blocks = {};
52
- exports.blocks = blocks;
53
-
54
- /**
55
- * Common properties for the procedure_defnoreturn and
56
- * procedure_defreturn blocks.
57
- */
58
- const PROCEDURE_DEF_COMMON = {
59
- /**
60
- * Add or remove the statement block from this function definition.
61
- * @param {boolean} hasStatements True if a statement block is needed.
62
- * @this {Block}
63
- */
64
- setStatements_: function(hasStatements) {
65
- if (this.hasStatements_ === hasStatements) {
66
- return;
67
- }
68
- if (hasStatements) {
69
- this.appendStatementInput('STACK').appendField(
70
- Msg['PROCEDURES_DEFNORETURN_DO']);
71
- if (this.getInput('RETURN')) {
72
- this.moveInputBefore('STACK', 'RETURN');
73
- }
74
- } else {
75
- this.removeInput('STACK', true);
76
- }
77
- this.hasStatements_ = hasStatements;
78
- },
79
- /**
80
- * Update the display of parameters for this procedure definition block.
81
- * @private
82
- * @this {Block}
83
- */
84
- updateParams_: function() {
85
- // Merge the arguments into a human-readable list.
86
- let paramString = '';
87
- if (this.arguments_.length) {
88
- paramString =
89
- Msg['PROCEDURES_BEFORE_PARAMS'] + ' ' + this.arguments_.join(', ');
90
- }
91
- // The params field is deterministic based on the mutation,
92
- // no need to fire a change event.
93
- Events.disable();
94
- try {
95
- this.setFieldValue(paramString, 'PARAMS');
96
- } finally {
97
- Events.enable();
98
- }
99
- },
100
- /**
101
- * Create XML to represent the argument inputs.
102
- * Backwards compatible serialization implementation.
103
- * @param {boolean=} opt_paramIds If true include the IDs of the parameter
104
- * quarks. Used by Procedures.mutateCallers for reconnection.
105
- * @return {!Element} XML storage element.
106
- * @this {Block}
107
- */
108
- mutationToDom: function(opt_paramIds) {
109
- const container = xmlUtils.createElement('mutation');
110
- if (opt_paramIds) {
111
- container.setAttribute('name', this.getFieldValue('NAME'));
112
- }
113
- for (let i = 0; i < this.argumentVarModels_.length; i++) {
114
- const parameter = xmlUtils.createElement('arg');
115
- const argModel = this.argumentVarModels_[i];
116
- parameter.setAttribute('name', argModel.name);
117
- parameter.setAttribute('varid', argModel.getId());
118
- if (opt_paramIds && this.paramIds_) {
119
- parameter.setAttribute('paramId', this.paramIds_[i]);
120
- }
121
- container.appendChild(parameter);
122
- }
123
-
124
- // Save whether the statement input is visible.
125
- if (!this.hasStatements_) {
126
- container.setAttribute('statements', 'false');
127
- }
128
- return container;
129
- },
130
- /**
131
- * Parse XML to restore the argument inputs.
132
- * Backwards compatible serialization implementation.
133
- * @param {!Element} xmlElement XML storage element.
134
- * @this {Block}
135
- */
136
- domToMutation: function(xmlElement) {
137
- this.arguments_ = [];
138
- this.argumentVarModels_ = [];
139
- for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {
140
- if (childNode.nodeName.toLowerCase() === 'arg') {
141
- const varName = childNode.getAttribute('name');
142
- const varId =
143
- childNode.getAttribute('varid') || childNode.getAttribute('varId');
144
- this.arguments_.push(varName);
145
- const variable = Variables.getOrCreateVariablePackage(
146
- this.workspace, varId, varName, '');
147
- if (variable !== null) {
148
- this.argumentVarModels_.push(variable);
149
- } else {
150
- console.log(
151
- 'Failed to create a variable with name ' + varName +
152
- ', ignoring.');
153
- }
154
- }
155
- }
156
- this.updateParams_();
157
- Procedures.mutateCallers(this);
158
-
159
- // Show or hide the statement input.
160
- this.setStatements_(xmlElement.getAttribute('statements') !== 'false');
161
- },
162
- /**
163
- * Returns the state of this block as a JSON serializable object.
164
- * @return {?{params: (!Array<{name: string, id: string}>|undefined),
165
- * hasStatements: (boolean|undefined)}} The state of this block, eg the
166
- * parameters and statements.
167
- */
168
- saveExtraState: function() {
169
- if (!this.argumentVarModels_.length && this.hasStatements_) {
170
- return null;
171
- }
172
- const state = Object.create(null);
173
- if (this.argumentVarModels_.length) {
174
- state['params'] = [];
175
- for (let i = 0; i < this.argumentVarModels_.length; i++) {
176
- state['params'].push({
177
- // We don't need to serialize the name, but just in case we decide
178
- // to separate params from variables.
179
- 'name': this.argumentVarModels_[i].name,
180
- 'id': this.argumentVarModels_[i].getId(),
181
- });
182
- }
183
- }
184
- if (!this.hasStatements_) {
185
- state['hasStatements'] = false;
186
- }
187
- return state;
188
- },
189
- /**
190
- * Applies the given state to this block.
191
- * @param {*} state The state to apply to this block, eg the parameters and
192
- * statements.
193
- */
194
- loadExtraState: function(state) {
195
- this.arguments_ = [];
196
- this.argumentVarModels_ = [];
197
- if (state['params']) {
198
- for (let i = 0; i < state['params'].length; i++) {
199
- const param = state['params'][i];
200
- const variable = Variables.getOrCreateVariablePackage(
201
- this.workspace, param['id'], param['name'], '');
202
- this.arguments_.push(variable.name);
203
- this.argumentVarModels_.push(variable);
204
- }
205
- }
206
- this.updateParams_();
207
- Procedures.mutateCallers(this);
208
- this.setStatements_(state['hasStatements'] === false ? false : true);
209
- },
210
- /**
211
- * Populate the mutator's dialog with this block's components.
212
- * @param {!Workspace} workspace Mutator's workspace.
213
- * @return {!Block} Root block in mutator.
214
- * @this {Block}
215
- */
216
- decompose: function(workspace) {
217
- /*
218
- * Creates the following XML:
219
- * <block type="procedures_mutatorcontainer">
220
- * <statement name="STACK">
221
- * <block type="procedures_mutatorarg">
222
- * <field name="NAME">arg1_name</field>
223
- * <next>etc...</next>
224
- * </block>
225
- * </statement>
226
- * </block>
227
- */
228
-
229
- const containerBlockNode = xmlUtils.createElement('block');
230
- containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer');
231
- const statementNode = xmlUtils.createElement('statement');
232
- statementNode.setAttribute('name', 'STACK');
233
- containerBlockNode.appendChild(statementNode);
234
-
235
- let node = statementNode;
236
- for (let i = 0; i < this.arguments_.length; i++) {
237
- const argBlockNode = xmlUtils.createElement('block');
238
- argBlockNode.setAttribute('type', 'procedures_mutatorarg');
239
- const fieldNode = xmlUtils.createElement('field');
240
- fieldNode.setAttribute('name', 'NAME');
241
- const argumentName = xmlUtils.createTextNode(this.arguments_[i]);
242
- fieldNode.appendChild(argumentName);
243
- argBlockNode.appendChild(fieldNode);
244
- const nextNode = xmlUtils.createElement('next');
245
- argBlockNode.appendChild(nextNode);
246
-
247
- node.appendChild(argBlockNode);
248
- node = nextNode;
249
- }
250
-
251
- const containerBlock = Xml.domToBlock(containerBlockNode, workspace);
252
-
253
- if (this.type === 'procedures_defreturn') {
254
- containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');
255
- } else {
256
- containerBlock.removeInput('STATEMENT_INPUT');
257
- }
258
-
259
- // Initialize procedure's callers with blank IDs.
260
- Procedures.mutateCallers(this);
261
- return containerBlock;
262
- },
263
- /**
264
- * Reconfigure this block based on the mutator dialog's components.
265
- * @param {!Block} containerBlock Root block in mutator.
266
- * @this {Block}
267
- */
268
- compose: function(containerBlock) {
269
- // Parameter list.
270
- this.arguments_ = [];
271
- this.paramIds_ = [];
272
- this.argumentVarModels_ = [];
273
- let paramBlock = containerBlock.getInputTargetBlock('STACK');
274
- while (paramBlock && !paramBlock.isInsertionMarker()) {
275
- const varName = paramBlock.getFieldValue('NAME');
276
- this.arguments_.push(varName);
277
- const variable = this.workspace.getVariable(varName, '');
278
- this.argumentVarModels_.push(variable);
279
-
280
- this.paramIds_.push(paramBlock.id);
281
- paramBlock =
282
- paramBlock.nextConnection && paramBlock.nextConnection.targetBlock();
283
- }
284
- this.updateParams_();
285
- Procedures.mutateCallers(this);
286
-
287
- // Show/hide the statement input.
288
- let hasStatements = containerBlock.getFieldValue('STATEMENTS');
289
- if (hasStatements !== null) {
290
- hasStatements = hasStatements === 'TRUE';
291
- if (this.hasStatements_ !== hasStatements) {
292
- if (hasStatements) {
293
- this.setStatements_(true);
294
- // Restore the stack, if one was saved.
295
- Mutator.reconnect(this.statementConnection_, this, 'STACK');
296
- this.statementConnection_ = null;
297
- } else {
298
- // Save the stack, then disconnect it.
299
- const stackConnection = this.getInput('STACK').connection;
300
- this.statementConnection_ = stackConnection.targetConnection;
301
- if (this.statementConnection_) {
302
- const stackBlock = stackConnection.targetBlock();
303
- stackBlock.unplug();
304
- stackBlock.bumpNeighbours();
305
- }
306
- this.setStatements_(false);
307
- }
308
- }
309
- }
310
- },
311
- /**
312
- * Return all variables referenced by this block.
313
- * @return {!Array<string>} List of variable names.
314
- * @this {Block}
315
- */
316
- getVars: function() {
317
- return this.arguments_;
318
- },
319
- /**
320
- * Return all variables referenced by this block.
321
- * @return {!Array<!VariableModel>} List of variable models.
322
- * @this {Block}
323
- */
324
- getVarModels: function() {
325
- return this.argumentVarModels_;
326
- },
327
- /**
328
- * Notification that a variable is renaming.
329
- * If the ID matches one of this block's variables, rename it.
330
- * @param {string} oldId ID of variable to rename.
331
- * @param {string} newId ID of new variable. May be the same as oldId, but
332
- * with an updated name. Guaranteed to be the same type as the old
333
- * variable.
334
- * @override
335
- * @this {Block}
336
- */
337
- renameVarById: function(oldId, newId) {
338
- const oldVariable = this.workspace.getVariableById(oldId);
339
- if (oldVariable.type !== '') {
340
- // Procedure arguments always have the empty type.
341
- return;
342
- }
343
- const oldName = oldVariable.name;
344
- const newVar = this.workspace.getVariableById(newId);
345
-
346
- let change = false;
347
- for (let i = 0; i < this.argumentVarModels_.length; i++) {
348
- if (this.argumentVarModels_[i].getId() === oldId) {
349
- this.arguments_[i] = newVar.name;
350
- this.argumentVarModels_[i] = newVar;
351
- change = true;
352
- }
353
- }
354
- if (change) {
355
- this.displayRenamedVar_(oldName, newVar.name);
356
- Procedures.mutateCallers(this);
357
- }
358
- },
359
- /**
360
- * Notification that a variable is renaming but keeping the same ID. If the
361
- * variable is in use on this block, rerender to show the new name.
362
- * @param {!VariableModel} variable The variable being renamed.
363
- * @package
364
- * @override
365
- * @this {Block}
366
- */
367
- updateVarName: function(variable) {
368
- const newName = variable.name;
369
- let change = false;
370
- let oldName;
371
- for (let i = 0; i < this.argumentVarModels_.length; i++) {
372
- if (this.argumentVarModels_[i].getId() === variable.getId()) {
373
- oldName = this.arguments_[i];
374
- this.arguments_[i] = newName;
375
- change = true;
376
- }
377
- }
378
- if (change) {
379
- this.displayRenamedVar_(oldName, newName);
380
- Procedures.mutateCallers(this);
381
- }
382
- },
383
- /**
384
- * Update the display to reflect a newly renamed argument.
385
- * @param {string} oldName The old display name of the argument.
386
- * @param {string} newName The new display name of the argument.
387
- * @private
388
- * @this {Block}
389
- */
390
- displayRenamedVar_: function(oldName, newName) {
391
- this.updateParams_();
392
- // Update the mutator's variables if the mutator is open.
393
- if (this.mutator && this.mutator.isVisible()) {
394
- const blocks = this.mutator.workspace_.getAllBlocks(false);
395
- for (let i = 0, block; (block = blocks[i]); i++) {
396
- if (block.type === 'procedures_mutatorarg' &&
397
- Names.equals(oldName, block.getFieldValue('NAME'))) {
398
- block.setFieldValue(newName, 'NAME');
399
- }
400
- }
401
- }
402
- },
403
- /**
404
- * Add custom menu options to this block's context menu.
405
- * @param {!Array} options List of menu options to add to.
406
- * @this {Block}
407
- */
408
- customContextMenu: function(options) {
409
- if (this.isInFlyout) {
410
- return;
411
- }
412
- // Add option to create caller.
413
- const option = {enabled: true};
414
- const name = this.getFieldValue('NAME');
415
- option.text = Msg['PROCEDURES_CREATE_DO'].replace('%1', name);
416
- const xmlMutation = xmlUtils.createElement('mutation');
417
- xmlMutation.setAttribute('name', name);
418
- for (let i = 0; i < this.arguments_.length; i++) {
419
- const xmlArg = xmlUtils.createElement('arg');
420
- xmlArg.setAttribute('name', this.arguments_[i]);
421
- xmlMutation.appendChild(xmlArg);
422
- }
423
- const xmlBlock = xmlUtils.createElement('block');
424
- xmlBlock.setAttribute('type', this.callType_);
425
- xmlBlock.appendChild(xmlMutation);
426
- option.callback = ContextMenu.callbackFactory(this, xmlBlock);
427
- options.push(option);
428
-
429
- // Add options to create getters for each parameter.
430
- if (!this.isCollapsed()) {
431
- for (let i = 0; i < this.argumentVarModels_.length; i++) {
432
- const argOption = {enabled: true};
433
- const argVar = this.argumentVarModels_[i];
434
- argOption.text =
435
- Msg['VARIABLES_SET_CREATE_GET'].replace('%1', argVar.name);
436
-
437
- const argXmlField = Variables.generateVariableFieldDom(argVar);
438
- const argXmlBlock = xmlUtils.createElement('block');
439
- argXmlBlock.setAttribute('type', 'variables_get');
440
- argXmlBlock.appendChild(argXmlField);
441
- argOption.callback = ContextMenu.callbackFactory(this, argXmlBlock);
442
- options.push(argOption);
443
- }
444
- }
445
- },
446
- };
447
-
448
- blocks['procedures_defnoreturn'] = {
449
- ...PROCEDURE_DEF_COMMON,
450
- /**
451
- * Block for defining a procedure with no return value.
452
- * @this {Block}
453
- */
454
- init: function() {
455
- const initName = Procedures.findLegalName('', this);
456
- const nameField = new FieldTextInput(initName, Procedures.rename);
457
- nameField.setSpellcheck(false);
458
- this.appendDummyInput()
459
- .appendField(Msg['PROCEDURES_DEFNORETURN_TITLE'])
460
- .appendField(nameField, 'NAME')
461
- .appendField('', 'PARAMS');
462
- this.setMutator(new Mutator(['procedures_mutatorarg']));
463
- if ((this.workspace.options.comments ||
464
- (this.workspace.options.parentWorkspace &&
465
- this.workspace.options.parentWorkspace.options.comments)) &&
466
- Msg['PROCEDURES_DEFNORETURN_COMMENT']) {
467
- this.setCommentText(Msg['PROCEDURES_DEFNORETURN_COMMENT']);
468
- }
469
- this.setStyle('procedure_blocks');
470
- this.setTooltip(Msg['PROCEDURES_DEFNORETURN_TOOLTIP']);
471
- this.setHelpUrl(Msg['PROCEDURES_DEFNORETURN_HELPURL']);
472
- this.arguments_ = [];
473
- this.argumentVarModels_ = [];
474
- this.setStatements_(true);
475
- this.statementConnection_ = null;
476
- },
477
- /**
478
- * Return the signature of this procedure definition.
479
- * @return {!Array} Tuple containing three elements:
480
- * - the name of the defined procedure,
481
- * - a list of all its arguments,
482
- * - that it DOES NOT have a return value.
483
- * @this {Block}
484
- */
485
- getProcedureDef: function() {
486
- return [this.getFieldValue('NAME'), this.arguments_, false];
487
- },
488
- callType_: 'procedures_callnoreturn',
489
- };
490
-
491
- blocks['procedures_defreturn'] = {
492
- ...PROCEDURE_DEF_COMMON,
493
- /**
494
- * Block for defining a procedure with a return value.
495
- * @this {Block}
496
- */
497
- init: function() {
498
- const initName = Procedures.findLegalName('', this);
499
- const nameField = new FieldTextInput(initName, Procedures.rename);
500
- nameField.setSpellcheck(false);
501
- this.appendDummyInput()
502
- .appendField(Msg['PROCEDURES_DEFRETURN_TITLE'])
503
- .appendField(nameField, 'NAME')
504
- .appendField('', 'PARAMS');
505
- this.appendValueInput('RETURN')
506
- .setAlign(Align.RIGHT)
507
- .appendField(Msg['PROCEDURES_DEFRETURN_RETURN']);
508
- this.setMutator(new Mutator(['procedures_mutatorarg']));
509
- if ((this.workspace.options.comments ||
510
- (this.workspace.options.parentWorkspace &&
511
- this.workspace.options.parentWorkspace.options.comments)) &&
512
- Msg['PROCEDURES_DEFRETURN_COMMENT']) {
513
- this.setCommentText(Msg['PROCEDURES_DEFRETURN_COMMENT']);
514
- }
515
- this.setStyle('procedure_blocks');
516
- this.setTooltip(Msg['PROCEDURES_DEFRETURN_TOOLTIP']);
517
- this.setHelpUrl(Msg['PROCEDURES_DEFRETURN_HELPURL']);
518
- this.arguments_ = [];
519
- this.argumentVarModels_ = [];
520
- this.setStatements_(true);
521
- this.statementConnection_ = null;
522
- },
523
- /**
524
- * Return the signature of this procedure definition.
525
- * @return {!Array} Tuple containing three elements:
526
- * - the name of the defined procedure,
527
- * - a list of all its arguments,
528
- * - that it DOES have a return value.
529
- * @this {Block}
530
- */
531
- getProcedureDef: function() {
532
- return [this.getFieldValue('NAME'), this.arguments_, true];
533
- },
534
- callType_: 'procedures_callreturn',
535
- };
536
-
537
- blocks['procedures_mutatorcontainer'] = {
538
- /**
539
- * Mutator block for procedure container.
540
- * @this {Block}
541
- */
542
- init: function() {
543
- this.appendDummyInput().appendField(
544
- Msg['PROCEDURES_MUTATORCONTAINER_TITLE']);
545
- this.appendStatementInput('STACK');
546
- this.appendDummyInput('STATEMENT_INPUT')
547
- .appendField(Msg['PROCEDURES_ALLOW_STATEMENTS'])
548
- .appendField(new FieldCheckbox('TRUE'), 'STATEMENTS');
549
- this.setStyle('procedure_blocks');
550
- this.setTooltip(Msg['PROCEDURES_MUTATORCONTAINER_TOOLTIP']);
551
- this.contextMenu = false;
552
- },
553
- };
554
-
555
- blocks['procedures_mutatorarg'] = {
556
- /**
557
- * Mutator block for procedure argument.
558
- * @this {Block}
559
- */
560
- init: function() {
561
- const field = new FieldTextInput(Procedures.DEFAULT_ARG, this.validator_);
562
- // Hack: override showEditor to do just a little bit more work.
563
- // We don't have a good place to hook into the start of a text edit.
564
- field.oldShowEditorFn_ = field.showEditor_;
565
- /**
566
- * @this {FieldTextInput}
567
- */
568
- const newShowEditorFn = function() {
569
- this.createdVariables_ = [];
570
- this.oldShowEditorFn_();
571
- };
572
- field.showEditor_ = newShowEditorFn;
573
-
574
- this.appendDummyInput()
575
- .appendField(Msg['PROCEDURES_MUTATORARG_TITLE'])
576
- .appendField(field, 'NAME');
577
- this.setPreviousStatement(true);
578
- this.setNextStatement(true);
579
- this.setStyle('procedure_blocks');
580
- this.setTooltip(Msg['PROCEDURES_MUTATORARG_TOOLTIP']);
581
- this.contextMenu = false;
582
-
583
- // Create the default variable when we drag the block in from the flyout.
584
- // Have to do this after installing the field on the block.
585
- field.onFinishEditing_ = this.deleteIntermediateVars_;
586
- // Create an empty list so onFinishEditing_ has something to look at, even
587
- // though the editor was never opened.
588
- field.createdVariables_ = [];
589
- field.onFinishEditing_('x');
590
- },
591
-
592
- /**
593
- * Obtain a valid name for the procedure argument. Create a variable if
594
- * necessary.
595
- * Merge runs of whitespace. Strip leading and trailing whitespace.
596
- * Beyond this, all names are legal.
597
- * @param {string} varName User-supplied name.
598
- * @return {?string} Valid name, or null if a name was not specified.
599
- * @private
600
- * @this {FieldTextInput}
601
- */
602
- validator_: function(varName) {
603
- const sourceBlock = this.getSourceBlock();
604
- const outerWs = Mutator.findParentWs(sourceBlock.workspace);
605
- varName = varName.replace(/[\s\xa0]+/g, ' ').replace(/^ | $/g, '');
606
- if (!varName) {
607
- return null;
608
- }
609
-
610
- // Prevents duplicate parameter names in functions
611
- const workspace =
612
- sourceBlock.workspace.targetWorkspace || sourceBlock.workspace;
613
- const blocks = workspace.getAllBlocks(false);
614
- const caselessName = varName.toLowerCase();
615
- for (let i = 0; i < blocks.length; i++) {
616
- if (blocks[i].id === this.getSourceBlock().id) {
617
- continue;
618
- }
619
- // Other blocks values may not be set yet when this is loaded.
620
- const otherVar = blocks[i].getFieldValue('NAME');
621
- if (otherVar && otherVar.toLowerCase() === caselessName) {
622
- return null;
623
- }
624
- }
625
-
626
- // Don't create variables for arg blocks that
627
- // only exist in the mutator's flyout.
628
- if (sourceBlock.isInFlyout) {
629
- return varName;
630
- }
631
-
632
- let model = outerWs.getVariable(varName, '');
633
- if (model && model.name !== varName) {
634
- // Rename the variable (case change)
635
- outerWs.renameVariableById(model.getId(), varName);
636
- }
637
- if (!model) {
638
- model = outerWs.createVariable(varName, '');
639
- if (model && this.createdVariables_) {
640
- this.createdVariables_.push(model);
641
- }
642
- }
643
- return varName;
644
- },
645
-
646
- /**
647
- * Called when focusing away from the text field.
648
- * Deletes all variables that were created as the user typed their intended
649
- * variable name.
650
- * @param {string} newText The new variable name.
651
- * @private
652
- * @this {FieldTextInput}
653
- */
654
- deleteIntermediateVars_: function(newText) {
655
- const outerWs = Mutator.findParentWs(this.getSourceBlock().workspace);
656
- if (!outerWs) {
657
- return;
658
- }
659
- for (let i = 0; i < this.createdVariables_.length; i++) {
660
- const model = this.createdVariables_[i];
661
- if (model.name !== newText) {
662
- outerWs.deleteVariableById(model.getId());
663
- }
664
- }
665
- },
666
- };
667
-
668
- /**
669
- * Common properties for the procedure_callnoreturn and
670
- * procedure_callreturn blocks.
671
- */
672
- const PROCEDURE_CALL_COMMON = {
673
- /**
674
- * Returns the name of the procedure this block calls.
675
- * @return {string} Procedure name.
676
- * @this {Block}
677
- */
678
- getProcedureCall: function() {
679
- // The NAME field is guaranteed to exist, null will never be returned.
680
- return /** @type {string} */ (this.getFieldValue('NAME'));
681
- },
682
- /**
683
- * Notification that a procedure is renaming.
684
- * If the name matches this block's procedure, rename it.
685
- * @param {string} oldName Previous name of procedure.
686
- * @param {string} newName Renamed procedure.
687
- * @this {Block}
688
- */
689
- renameProcedure: function(oldName, newName) {
690
- if (Names.equals(oldName, this.getProcedureCall())) {
691
- this.setFieldValue(newName, 'NAME');
692
- const baseMsg = this.outputConnection ?
693
- Msg['PROCEDURES_CALLRETURN_TOOLTIP'] :
694
- Msg['PROCEDURES_CALLNORETURN_TOOLTIP'];
695
- this.setTooltip(baseMsg.replace('%1', newName));
696
- }
697
- },
698
- /**
699
- * Notification that the procedure's parameters have changed.
700
- * @param {!Array<string>} paramNames New param names, e.g. ['x', 'y', 'z'].
701
- * @param {!Array<string>} paramIds IDs of params (consistent for each
702
- * parameter through the life of a mutator, regardless of param renaming),
703
- * e.g. ['piua', 'f8b_', 'oi.o'].
704
- * @private
705
- * @this {Block}
706
- */
707
- setProcedureParameters_: function(paramNames, paramIds) {
708
- // Data structures:
709
- // this.arguments = ['x', 'y']
710
- // Existing param names.
711
- // this.quarkConnections_ {piua: null, f8b_: Connection}
712
- // Look-up of paramIds to connections plugged into the call block.
713
- // this.quarkIds_ = ['piua', 'f8b_']
714
- // Existing param IDs.
715
- // Note that quarkConnections_ may include IDs that no longer exist, but
716
- // which might reappear if a param is reattached in the mutator.
717
- const defBlock =
718
- Procedures.getDefinition(this.getProcedureCall(), this.workspace);
719
- const mutatorOpen =
720
- defBlock && defBlock.mutator && defBlock.mutator.isVisible();
721
- if (!mutatorOpen) {
722
- this.quarkConnections_ = {};
723
- this.quarkIds_ = null;
724
- }
725
- if (!paramIds) {
726
- // Reset the quarks (a mutator is about to open).
727
- return;
728
- }
729
- // Test arguments (arrays of strings) for changes. '\n' is not a valid
730
- // argument name character, so it is a valid delimiter here.
731
- if (paramNames.join('\n') === this.arguments_.join('\n')) {
732
- // No change.
733
- this.quarkIds_ = paramIds;
734
- return;
735
- }
736
- if (paramIds.length !== paramNames.length) {
737
- throw RangeError('paramNames and paramIds must be the same length.');
738
- }
739
- this.setCollapsed(false);
740
- if (!this.quarkIds_) {
741
- // Initialize tracking for this block.
742
- this.quarkConnections_ = {};
743
- this.quarkIds_ = [];
744
- }
745
- // Switch off rendering while the block is rebuilt.
746
- const savedRendered = this.rendered;
747
- this.rendered = false;
748
- // Update the quarkConnections_ with existing connections.
749
- for (let i = 0; i < this.arguments_.length; i++) {
750
- const input = this.getInput('ARG' + i);
751
- if (input) {
752
- const connection = input.connection.targetConnection;
753
- this.quarkConnections_[this.quarkIds_[i]] = connection;
754
- if (mutatorOpen && connection &&
755
- paramIds.indexOf(this.quarkIds_[i]) === -1) {
756
- // This connection should no longer be attached to this block.
757
- connection.disconnect();
758
- connection.getSourceBlock().bumpNeighbours();
759
- }
760
- }
761
- }
762
- // Rebuild the block's arguments.
763
- this.arguments_ = [].concat(paramNames);
764
- // And rebuild the argument model list.
765
- this.argumentVarModels_ = [];
766
- for (let i = 0; i < this.arguments_.length; i++) {
767
- const variable = Variables.getOrCreateVariablePackage(
768
- this.workspace, null, this.arguments_[i], '');
769
- this.argumentVarModels_.push(variable);
770
- }
771
-
772
- this.updateShape_();
773
- this.quarkIds_ = paramIds;
774
- // Reconnect any child blocks.
775
- if (this.quarkIds_) {
776
- for (let i = 0; i < this.arguments_.length; i++) {
777
- const quarkId = this.quarkIds_[i];
778
- if (quarkId in this.quarkConnections_) {
779
- const connection = this.quarkConnections_[quarkId];
780
- if (!Mutator.reconnect(connection, this, 'ARG' + i)) {
781
- // Block no longer exists or has been attached elsewhere.
782
- delete this.quarkConnections_[quarkId];
783
- }
784
- }
785
- }
786
- }
787
- // Restore rendering and show the changes.
788
- this.rendered = savedRendered;
789
- if (this.rendered) {
790
- this.render();
791
- }
792
- },
793
- /**
794
- * Modify this block to have the correct number of arguments.
795
- * @private
796
- * @this {Block}
797
- */
798
- updateShape_: function() {
799
- for (let i = 0; i < this.arguments_.length; i++) {
800
- const argField = this.getField('ARGNAME' + i);
801
- if (argField) {
802
- // Ensure argument name is up to date.
803
- // The argument name field is deterministic based on the mutation,
804
- // no need to fire a change event.
805
- Events.disable();
806
- try {
807
- argField.setValue(this.arguments_[i]);
808
- } finally {
809
- Events.enable();
810
- }
811
- } else {
812
- // Add new input.
813
- const newField = new FieldLabel(this.arguments_[i]);
814
- const input = this.appendValueInput('ARG' + i)
815
- .setAlign(Align.RIGHT)
816
- .appendField(newField, 'ARGNAME' + i);
817
- input.init();
818
- }
819
- }
820
- // Remove deleted inputs.
821
- for (let i = this.arguments_.length; this.getInput('ARG' + i); i++) {
822
- this.removeInput('ARG' + i);
823
- }
824
- // Add 'with:' if there are parameters, remove otherwise.
825
- const topRow = this.getInput('TOPROW');
826
- if (topRow) {
827
- if (this.arguments_.length) {
828
- if (!this.getField('WITH')) {
829
- topRow.appendField(Msg['PROCEDURES_CALL_BEFORE_PARAMS'], 'WITH');
830
- topRow.init();
831
- }
832
- } else {
833
- if (this.getField('WITH')) {
834
- topRow.removeField('WITH');
835
- }
836
- }
837
- }
838
- },
839
- /**
840
- * Create XML to represent the (non-editable) name and arguments.
841
- * Backwards compatible serialization implementation.
842
- * @return {!Element} XML storage element.
843
- * @this {Block}
844
- */
845
- mutationToDom: function() {
846
- const container = xmlUtils.createElement('mutation');
847
- container.setAttribute('name', this.getProcedureCall());
848
- for (let i = 0; i < this.arguments_.length; i++) {
849
- const parameter = xmlUtils.createElement('arg');
850
- parameter.setAttribute('name', this.arguments_[i]);
851
- container.appendChild(parameter);
852
- }
853
- return container;
854
- },
855
- /**
856
- * Parse XML to restore the (non-editable) name and parameters.
857
- * Backwards compatible serialization implementation.
858
- * @param {!Element} xmlElement XML storage element.
859
- * @this {Block}
860
- */
861
- domToMutation: function(xmlElement) {
862
- const name = xmlElement.getAttribute('name');
863
- this.renameProcedure(this.getProcedureCall(), name);
864
- const args = [];
865
- const paramIds = [];
866
- for (let i = 0, childNode; (childNode = xmlElement.childNodes[i]); i++) {
867
- if (childNode.nodeName.toLowerCase() === 'arg') {
868
- args.push(childNode.getAttribute('name'));
869
- paramIds.push(childNode.getAttribute('paramId'));
870
- }
871
- }
872
- this.setProcedureParameters_(args, paramIds);
873
- },
874
- /**
875
- * Returns the state of this block as a JSON serializable object.
876
- * @return {{name: string, params:(!Array<string>|undefined)}} The state of
877
- * this block, ie the params and procedure name.
878
- */
879
- saveExtraState: function() {
880
- const state = Object.create(null);
881
- state['name'] = this.getProcedureCall();
882
- if (this.arguments_.length) {
883
- state['params'] = this.arguments_;
884
- }
885
- return state;
886
- },
887
- /**
888
- * Applies the given state to this block.
889
- * @param {*} state The state to apply to this block, ie the params and
890
- * procedure name.
891
- */
892
- loadExtraState: function(state) {
893
- this.renameProcedure(this.getProcedureCall(), state['name']);
894
- const params = state['params'];
895
- if (params) {
896
- const ids = [];
897
- ids.length = params.length;
898
- ids.fill(null);
899
- this.setProcedureParameters_(params, ids);
900
- }
901
- },
902
- /**
903
- * Return all variables referenced by this block.
904
- * @return {!Array<string>} List of variable names.
905
- * @this {Block}
906
- */
907
- getVars: function() {
908
- return this.arguments_;
909
- },
910
- /**
911
- * Return all variables referenced by this block.
912
- * @return {!Array<!VariableModel>} List of variable models.
913
- * @this {Block}
914
- */
915
- getVarModels: function() {
916
- return this.argumentVarModels_;
917
- },
918
- /**
919
- * Procedure calls cannot exist without the corresponding procedure
920
- * definition. Enforce this link whenever an event is fired.
921
- * @param {!AbstractEvent} event Change event.
922
- * @this {Block}
923
- */
924
- onchange: function(event) {
925
- if (!this.workspace || this.workspace.isFlyout) {
926
- // Block is deleted or is in a flyout.
927
- return;
928
- }
929
- if (!event.recordUndo) {
930
- // Events not generated by user. Skip handling.
931
- return;
932
- }
933
- if (event.type === Events.BLOCK_CREATE &&
934
- event.ids.indexOf(this.id) !== -1) {
935
- // Look for the case where a procedure call was created (usually through
936
- // paste) and there is no matching definition. In this case, create
937
- // an empty definition block with the correct signature.
938
- const name = this.getProcedureCall();
939
- let def = Procedures.getDefinition(name, this.workspace);
940
- if (def &&
941
- (def.type !== this.defType_ ||
942
- JSON.stringify(def.getVars()) !== JSON.stringify(this.arguments_))) {
943
- // The signatures don't match.
944
- def = null;
945
- }
946
- if (!def) {
947
- Events.setGroup(event.group);
948
- /**
949
- * Create matching definition block.
950
- * <xml xmlns="https://developers.google.com/blockly/xml">
951
- * <block type="procedures_defreturn" x="10" y="20">
952
- * <mutation name="test">
953
- * <arg name="x"></arg>
954
- * </mutation>
955
- * <field name="NAME">test</field>
956
- * </block>
957
- * </xml>
958
- */
959
- const xml = xmlUtils.createElement('xml');
960
- const block = xmlUtils.createElement('block');
961
- block.setAttribute('type', this.defType_);
962
- const xy = this.getRelativeToSurfaceXY();
963
- const x = xy.x + config.snapRadius * (this.RTL ? -1 : 1);
964
- const y = xy.y + config.snapRadius * 2;
965
- block.setAttribute('x', x);
966
- block.setAttribute('y', y);
967
- const mutation = this.mutationToDom();
968
- block.appendChild(mutation);
969
- const field = xmlUtils.createElement('field');
970
- field.setAttribute('name', 'NAME');
971
- let callName = this.getProcedureCall();
972
- if (!callName) {
973
- // Rename if name is empty string.
974
- callName = Procedures.findLegalName('', this);
975
- this.renameProcedure('', callName);
976
- }
977
- field.appendChild(xmlUtils.createTextNode(callName));
978
- block.appendChild(field);
979
- xml.appendChild(block);
980
- Xml.domToWorkspace(xml, this.workspace);
981
- Events.setGroup(false);
982
- }
983
- } else if (event.type === Events.BLOCK_DELETE) {
984
- // Look for the case where a procedure definition has been deleted,
985
- // leaving this block (a procedure call) orphaned. In this case, delete
986
- // the orphan.
987
- const name = this.getProcedureCall();
988
- const def = Procedures.getDefinition(name, this.workspace);
989
- if (!def) {
990
- Events.setGroup(event.group);
991
- this.dispose(true);
992
- Events.setGroup(false);
993
- }
994
- } else if (event.type === Events.CHANGE && event.element === 'disabled') {
995
- const name = this.getProcedureCall();
996
- const def = Procedures.getDefinition(name, this.workspace);
997
- if (def && def.id === event.blockId) {
998
- // in most cases the old group should be ''
999
- const oldGroup = Events.getGroup();
1000
- if (oldGroup) {
1001
- // This should only be possible programmatically and may indicate a
1002
- // problem with event grouping. If you see this message please
1003
- // investigate. If the use ends up being valid we may need to reorder
1004
- // events in the undo stack.
1005
- console.log(
1006
- 'Saw an existing group while responding to a definition change');
1007
- }
1008
- Events.setGroup(event.group);
1009
- if (event.newValue) {
1010
- this.previousEnabledState_ = this.isEnabled();
1011
- this.setEnabled(false);
1012
- } else {
1013
- this.setEnabled(this.previousEnabledState_);
1014
- }
1015
- Events.setGroup(oldGroup);
1016
- }
1017
- }
1018
- },
1019
- /**
1020
- * Add menu option to find the definition block for this call.
1021
- * @param {!Array} options List of menu options to add to.
1022
- * @this {Block}
1023
- */
1024
- customContextMenu: function(options) {
1025
- if (!this.workspace.isMovable()) {
1026
- // If we center on the block and the workspace isn't movable we could
1027
- // loose blocks at the edges of the workspace.
1028
- return;
1029
- }
1030
-
1031
- const option = {enabled: true};
1032
- option.text = Msg['PROCEDURES_HIGHLIGHT_DEF'];
1033
- const name = this.getProcedureCall();
1034
- const workspace = this.workspace;
1035
- option.callback = function() {
1036
- const def = Procedures.getDefinition(name, workspace);
1037
- if (def) {
1038
- workspace.centerOnBlock(def.id);
1039
- def.select();
1040
- }
1041
- };
1042
- options.push(option);
1043
- },
1044
- };
1045
-
1046
- blocks['procedures_callnoreturn'] = {
1047
- ...PROCEDURE_CALL_COMMON,
1048
- /**
1049
- * Block for calling a procedure with no return value.
1050
- * @this {Block}
1051
- */
1052
- init: function() {
1053
- this.appendDummyInput('TOPROW').appendField('', 'NAME');
1054
- this.setPreviousStatement(true);
1055
- this.setNextStatement(true);
1056
- this.setStyle('procedure_blocks');
1057
- // Tooltip is set in renameProcedure.
1058
- this.setHelpUrl(Msg['PROCEDURES_CALLNORETURN_HELPURL']);
1059
- this.arguments_ = [];
1060
- this.argumentVarModels_ = [];
1061
- this.quarkConnections_ = {};
1062
- this.quarkIds_ = null;
1063
- this.previousEnabledState_ = true;
1064
- },
1065
-
1066
- defType_: 'procedures_defnoreturn',
1067
- };
1068
-
1069
- blocks['procedures_callreturn'] = {
1070
- ...PROCEDURE_CALL_COMMON,
1071
- /**
1072
- * Block for calling a procedure with a return value.
1073
- * @this {Block}
1074
- */
1075
- init: function() {
1076
- this.appendDummyInput('TOPROW').appendField('', 'NAME');
1077
- this.setOutput(true);
1078
- this.setStyle('procedure_blocks');
1079
- // Tooltip is set in domToMutation.
1080
- this.setHelpUrl(Msg['PROCEDURES_CALLRETURN_HELPURL']);
1081
- this.arguments_ = [];
1082
- this.argumentVarModels_ = [];
1083
- this.quarkConnections_ = {};
1084
- this.quarkIds_ = null;
1085
- this.previousEnabledState_ = true;
1086
- },
1087
-
1088
- defType_: 'procedures_defreturn',
1089
- };
1090
-
1091
- blocks['procedures_ifreturn'] = {
1092
- /**
1093
- * Block for conditionally returning a value from a procedure.
1094
- * @this {Block}
1095
- */
1096
- init: function() {
1097
- this.appendValueInput('CONDITION')
1098
- .setCheck('Boolean')
1099
- .appendField(Msg['CONTROLS_IF_MSG_IF']);
1100
- this.appendValueInput('VALUE').appendField(
1101
- Msg['PROCEDURES_DEFRETURN_RETURN']);
1102
- this.setInputsInline(true);
1103
- this.setPreviousStatement(true);
1104
- this.setNextStatement(true);
1105
- this.setStyle('procedure_blocks');
1106
- this.setTooltip(Msg['PROCEDURES_IFRETURN_TOOLTIP']);
1107
- this.setHelpUrl(Msg['PROCEDURES_IFRETURN_HELPURL']);
1108
- this.hasReturnValue_ = true;
1109
- },
1110
- /**
1111
- * Create XML to represent whether this block has a return value.
1112
- * @return {!Element} XML storage element.
1113
- * @this {Block}
1114
- */
1115
- mutationToDom: function() {
1116
- const container = xmlUtils.createElement('mutation');
1117
- container.setAttribute('value', Number(this.hasReturnValue_));
1118
- return container;
1119
- },
1120
- /**
1121
- * Parse XML to restore whether this block has a return value.
1122
- * @param {!Element} xmlElement XML storage element.
1123
- * @this {Block}
1124
- */
1125
- domToMutation: function(xmlElement) {
1126
- const value = xmlElement.getAttribute('value');
1127
- this.hasReturnValue_ = (value === '1');
1128
- if (!this.hasReturnValue_) {
1129
- this.removeInput('VALUE');
1130
- this.appendDummyInput('VALUE').appendField(
1131
- Msg['PROCEDURES_DEFRETURN_RETURN']);
1132
- }
1133
- },
1134
-
1135
- // This block does not need JSO serialization hooks (saveExtraState and
1136
- // loadExtraState) because the state of this block is already encoded in the
1137
- // block's position in the workspace.
1138
- // XML hooks are kept for backwards compatibility.
1139
-
1140
- /**
1141
- * Called whenever anything on the workspace changes.
1142
- * Add warning if this flow block is not nested inside a loop.
1143
- * @param {!AbstractEvent} _e Change event.
1144
- * @this {Block}
1145
- */
1146
- onchange: function(_e) {
1147
- if (this.workspace.isDragging && this.workspace.isDragging()) {
1148
- return; // Don't change state at the start of a drag.
1149
- }
1150
- let legal = false;
1151
- // Is the block nested in a procedure?
1152
- let block = this;
1153
- do {
1154
- if (this.FUNCTION_TYPES.indexOf(block.type) !== -1) {
1155
- legal = true;
1156
- break;
1157
- }
1158
- block = block.getSurroundParent();
1159
- } while (block);
1160
- if (legal) {
1161
- // If needed, toggle whether this block has a return value.
1162
- if (block.type === 'procedures_defnoreturn' && this.hasReturnValue_) {
1163
- this.removeInput('VALUE');
1164
- this.appendDummyInput('VALUE').appendField(
1165
- Msg['PROCEDURES_DEFRETURN_RETURN']);
1166
- this.hasReturnValue_ = false;
1167
- } else if (
1168
- block.type === 'procedures_defreturn' && !this.hasReturnValue_) {
1169
- this.removeInput('VALUE');
1170
- this.appendValueInput('VALUE').appendField(
1171
- Msg['PROCEDURES_DEFRETURN_RETURN']);
1172
- this.hasReturnValue_ = true;
1173
- }
1174
- this.setWarningText(null);
1175
- if (!this.isInFlyout) {
1176
- this.setEnabled(true);
1177
- }
1178
- } else {
1179
- this.setWarningText(Msg['PROCEDURES_IFRETURN_WARNING']);
1180
- if (!this.isInFlyout && !this.getInheritedDisabled()) {
1181
- this.setEnabled(false);
1182
- }
1183
- }
1184
- },
1185
- /**
1186
- * List of block types that are functions and thus do not need warnings.
1187
- * To add a new function type add this to your code:
1188
- * Blocks['procedures_ifreturn'].FUNCTION_TYPES.push('custom_func');
1189
- */
1190
- FUNCTION_TYPES: ['procedures_defnoreturn', 'procedures_defreturn'],
1191
- };
1192
-
1193
- // Register provided blocks.
1194
- defineBlocks(blocks);