@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,424 @@
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 Methods for dragging a block visually.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.BlockDragger');
28
+
29
+ goog.require('Blockly.BlockAnimations');
30
+ goog.require('Blockly.Events.BlockMove');
31
+ goog.require('Blockly.Events.DragBlockOutside');
32
+ goog.require('Blockly.Events.EndBlockDrag');
33
+ goog.require('Blockly.InsertionMarkerManager');
34
+
35
+ goog.require('goog.math.Coordinate');
36
+ goog.require('goog.asserts');
37
+
38
+
39
+ /**
40
+ * Class for a block dragger. It moves blocks around the workspace when they
41
+ * are being dragged by a mouse or touch.
42
+ * @param {!Blockly.BlockSvg} block The block to drag.
43
+ * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag on.
44
+ * @constructor
45
+ */
46
+ Blockly.BlockDragger = function(block, workspace) {
47
+ /**
48
+ * The top block in the stack that is being dragged.
49
+ * @type {!Blockly.BlockSvg}
50
+ * @private
51
+ */
52
+ this.draggingBlock_ = block;
53
+
54
+ /**
55
+ * The workspace on which the block is being dragged.
56
+ * @type {!Blockly.WorkspaceSvg}
57
+ * @private
58
+ */
59
+ this.workspace_ = workspace;
60
+
61
+ /**
62
+ * Object that keeps track of connections on dragged blocks.
63
+ * @type {!Blockly.InsertionMarkerManager}
64
+ * @private
65
+ */
66
+ this.draggedConnectionManager_ = new Blockly.InsertionMarkerManager(
67
+ this.draggingBlock_);
68
+
69
+ /**
70
+ * Which delete area the mouse pointer is over, if any.
71
+ * One of {@link Blockly.DELETE_AREA_TRASH},
72
+ * {@link Blockly.DELETE_AREA_TOOLBOX}, or {@link Blockly.DELETE_AREA_NONE}.
73
+ * @type {?number}
74
+ * @private
75
+ */
76
+ this.deleteArea_ = null;
77
+
78
+ /**
79
+ * Whether the block would be deleted if dropped immediately.
80
+ * @type {boolean}
81
+ * @private
82
+ */
83
+ this.wouldDeleteBlock_ = false;
84
+
85
+ /**
86
+ * Whether the currently dragged block is outside of the workspace. Keep
87
+ * track so that we can fire events only when this changes.
88
+ * @type {boolean}
89
+ * @private
90
+ */
91
+ this.wasOutside_ = false;
92
+
93
+ /**
94
+ * The location of the top left corner of the dragging block at the beginning
95
+ * of the drag in workspace coordinates.
96
+ * @type {!goog.math.Coordinate}
97
+ * @private
98
+ */
99
+ this.startXY_ = this.draggingBlock_.getRelativeToSurfaceXY();
100
+
101
+ /**
102
+ * A list of all of the icons (comment, warning, and mutator) that are
103
+ * on this block and its descendants. Moving an icon moves the bubble that
104
+ * extends from it if that bubble is open.
105
+ * @type {Array.<!Object>}
106
+ * @private
107
+ */
108
+ this.dragIconData_ = Blockly.BlockDragger.initIconData_(block);
109
+ };
110
+
111
+ /**
112
+ * Sever all links from this object.
113
+ * @package
114
+ */
115
+ Blockly.BlockDragger.prototype.dispose = function() {
116
+ this.draggingBlock_ = null;
117
+ this.workspace_ = null;
118
+ this.startWorkspace_ = null;
119
+ this.dragIconData_.length = 0;
120
+
121
+ if (this.draggedConnectionManager_) {
122
+ this.draggedConnectionManager_.dispose();
123
+ this.draggedConnectionManager_ = null;
124
+ }
125
+ };
126
+
127
+ /**
128
+ * Make a list of all of the icons (comment, warning, and mutator) that are
129
+ * on this block and its descendants. Moving an icon moves the bubble that
130
+ * extends from it if that bubble is open.
131
+ * @param {!Blockly.BlockSvg} block The root block that is being dragged.
132
+ * @return {!Array.<!Object>} The list of all icons and their locations.
133
+ * @private
134
+ */
135
+ Blockly.BlockDragger.initIconData_ = function(block) {
136
+ // Build a list of icons that need to be moved and where they started.
137
+ var dragIconData = [];
138
+ var descendants = block.getDescendants(false);
139
+ for (var i = 0, descendant; descendant = descendants[i]; i++) {
140
+ var icons = descendant.getIcons();
141
+ for (var j = 0; j < icons.length; j++) {
142
+ var data = {
143
+ // goog.math.Coordinate with x and y properties (workspace coordinates).
144
+ location: icons[j].getIconLocation(),
145
+ // Blockly.Icon
146
+ icon: icons[j]
147
+ };
148
+ dragIconData.push(data);
149
+ }
150
+ }
151
+ return dragIconData;
152
+ };
153
+
154
+ /**
155
+ * Start dragging a block. This includes moving it to the drag surface.
156
+ * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has
157
+ * moved from the position at mouse down, in pixel units.
158
+ * @package
159
+ */
160
+ Blockly.BlockDragger.prototype.startBlockDrag = function(currentDragDeltaXY) {
161
+ if (!Blockly.Events.getGroup()) {
162
+ Blockly.Events.setGroup(true);
163
+ }
164
+
165
+ this.workspace_.setResizesEnabled(false);
166
+ Blockly.BlockAnimations.disconnectUiStop();
167
+
168
+ if (this.draggingBlock_.getParent()) {
169
+ this.draggingBlock_.unplug();
170
+ var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY);
171
+ var newLoc = goog.math.Coordinate.sum(this.startXY_, delta);
172
+
173
+ this.draggingBlock_.translate(newLoc.x, newLoc.y);
174
+ Blockly.BlockAnimations.disconnectUiEffect(this.draggingBlock_);
175
+ }
176
+ this.draggingBlock_.setDragging(true);
177
+ // For future consideration: we may be able to put moveToDragSurface inside
178
+ // the block dragger, which would also let the block not track the block drag
179
+ // surface.
180
+ this.draggingBlock_.moveToDragSurface_();
181
+
182
+ var toolbox = this.workspace_.getToolbox();
183
+ if (toolbox) {
184
+ var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' :
185
+ 'blocklyToolboxGrab';
186
+ toolbox.addStyle(style);
187
+ }
188
+ };
189
+
190
+ /**
191
+ * Execute a step of block dragging, based on the given event. Update the
192
+ * display accordingly.
193
+ * @param {!Event} e The most recent move event.
194
+ * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has
195
+ * moved from the position at the start of the drag, in pixel units.
196
+ * @package
197
+ * @return {boolean} True if the event should be propagated, false if not.
198
+ */
199
+ Blockly.BlockDragger.prototype.dragBlock = function(e, currentDragDeltaXY) {
200
+ var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY);
201
+ var newLoc = goog.math.Coordinate.sum(this.startXY_, delta);
202
+
203
+ this.draggingBlock_.moveDuringDrag(newLoc);
204
+ this.dragIcons_(delta);
205
+
206
+ this.deleteArea_ = this.workspace_.isDeleteArea(e);
207
+ var isOutside = !this.workspace_.isInsideBlocksArea(e);
208
+ this.draggedConnectionManager_.update(delta, this.deleteArea_, isOutside);
209
+ if (isOutside !== this.wasOutside_) {
210
+ this.fireDragOutsideEvent_(isOutside);
211
+ this.wasOutside_ = isOutside;
212
+ }
213
+
214
+ this.updateCursorDuringBlockDrag_(isOutside);
215
+ return isOutside;
216
+ };
217
+
218
+ /**
219
+ * Finish a block drag and put the block back on the workspace.
220
+ * @param {!Event} e The mouseup/touchend event.
221
+ * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has
222
+ * moved from the position at the start of the drag, in pixel units.
223
+ * @package
224
+ */
225
+ Blockly.BlockDragger.prototype.endBlockDrag = function(e, currentDragDeltaXY) {
226
+ // Make sure internal state is fresh.
227
+ this.dragBlock(e, currentDragDeltaXY);
228
+ this.dragIconData_ = [];
229
+ var isOutside = this.wasOutside_;
230
+ this.fireEndDragEvent_(isOutside);
231
+ this.draggingBlock_.setMouseThroughStyle(false);
232
+
233
+ Blockly.BlockAnimations.disconnectUiStop();
234
+
235
+ var delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY);
236
+ var newLoc = goog.math.Coordinate.sum(this.startXY_, delta);
237
+ this.draggingBlock_.moveOffDragSurface_(newLoc);
238
+
239
+ // Scratch-specific: note possible illegal definition deletion for rollback below.
240
+ var isDeletingProcDef = this.wouldDeleteBlock_ &&
241
+ (this.draggingBlock_.type == Blockly.PROCEDURES_DEFINITION_BLOCK_TYPE);
242
+ if (isDeletingProcDef) {
243
+ var procCodeBeingDeleted = this.draggingBlock_.getInput('custom_block').connection.targetBlock().getProcCode();
244
+ }
245
+
246
+ var deleted = this.maybeDeleteBlock_();
247
+ if (!deleted) {
248
+ // These are expensive and don't need to be done if we're deleting.
249
+ this.draggingBlock_.moveConnections_(delta.x, delta.y);
250
+ this.draggingBlock_.setDragging(false);
251
+ this.fireMoveEvent_();
252
+ if (this.draggedConnectionManager_.wouldConnectBlock()) {
253
+ // Applying connections also rerenders the relevant blocks.
254
+ this.draggedConnectionManager_.applyConnections();
255
+ } else {
256
+ this.draggingBlock_.render();
257
+ }
258
+ this.draggingBlock_.scheduleSnapAndBump();
259
+ }
260
+ this.workspace_.setResizesEnabled(true);
261
+
262
+ var toolbox = this.workspace_.getToolbox();
263
+ if (toolbox) {
264
+ var style = this.draggingBlock_.isDeletable() ? 'blocklyToolboxDelete' :
265
+ 'blocklyToolboxGrab';
266
+ toolbox.removeStyle(style);
267
+ }
268
+ Blockly.Events.setGroup(false);
269
+
270
+ if (isOutside) {
271
+ var ws = this.workspace_;
272
+ // Reset a drag to outside of scratch-blocks
273
+ setTimeout(function() {
274
+ ws.undo();
275
+ });
276
+ }
277
+
278
+ // Scratch-specific: roll back deletes that create call blocks with defines.
279
+ // Have to wait for connections to be re-established, so put in setTimeout.
280
+ // Only do this if we deleted a proc def.
281
+ if (isDeletingProcDef) {
282
+ var ws = this.workspace_;
283
+ setTimeout(function() {
284
+ var allBlocks = ws.getAllBlocks();
285
+ for (var i = 0; i < allBlocks.length; i++) {
286
+ var block = allBlocks[i];
287
+ if (block.type == Blockly.PROCEDURES_CALL_BLOCK_TYPE) {
288
+ var procCode = block.getProcCode();
289
+ // Check for call blocks with no associated define block.
290
+ if (procCode === procCodeBeingDeleted) {
291
+ alert(Blockly.Msg.PROCEDURE_USED);
292
+ ws.undo();
293
+ return; // There can only be one define deletion at a time.
294
+ }
295
+ }
296
+ }
297
+ // The proc deletion was valid, update the toolbox.
298
+ ws.refreshToolboxSelection_();
299
+ });
300
+ }
301
+ };
302
+
303
+ /**
304
+ * Fire an event when the dragged blocks move outside or back into the blocks workspace
305
+ * @param {?boolean} isOutside True if the drag is going outside the visible area.
306
+ * @private
307
+ */
308
+ Blockly.BlockDragger.prototype.fireDragOutsideEvent_ = function(isOutside) {
309
+ var event = new Blockly.Events.DragBlockOutside(this.draggingBlock_);
310
+ event.isOutside = isOutside;
311
+ Blockly.Events.fire(event);
312
+ };
313
+
314
+ /**
315
+ * Fire an end drag event at the end of a block drag.
316
+ * @param {?boolean} isOutside True if the drag is going outside the visible area.
317
+ * @private
318
+ */
319
+ Blockly.BlockDragger.prototype.fireEndDragEvent_ = function(isOutside) {
320
+ var event = new Blockly.Events.EndBlockDrag(this.draggingBlock_, isOutside);
321
+ Blockly.Events.fire(event);
322
+ };
323
+
324
+ /**
325
+ * Fire a move event at the end of a block drag.
326
+ * @private
327
+ */
328
+ Blockly.BlockDragger.prototype.fireMoveEvent_ = function() {
329
+ var event = new Blockly.Events.BlockMove(this.draggingBlock_);
330
+ event.oldCoordinate = this.startXY_;
331
+ event.recordNew();
332
+ Blockly.Events.fire(event);
333
+ };
334
+
335
+ /**
336
+ * Shut the trash can and, if necessary, delete the dragging block.
337
+ * Should be called at the end of a block drag.
338
+ * @return {boolean} whether the block was deleted.
339
+ * @private
340
+ */
341
+ Blockly.BlockDragger.prototype.maybeDeleteBlock_ = function() {
342
+ var trashcan = this.workspace_.trashcan;
343
+
344
+ if (this.wouldDeleteBlock_) {
345
+ if (trashcan) {
346
+ goog.Timer.callOnce(trashcan.close, 100, trashcan);
347
+ }
348
+ // Fire a move event, so we know where to go back to for an undo.
349
+ this.fireMoveEvent_();
350
+ this.draggingBlock_.dispose(false, true);
351
+ } else if (trashcan) {
352
+ // Make sure the trash can is closed.
353
+ trashcan.close();
354
+ }
355
+ return this.wouldDeleteBlock_;
356
+ };
357
+
358
+ /**
359
+ * Update the cursor (and possibly the trash can lid) to reflect whether the
360
+ * dragging block would be deleted if released immediately.
361
+ * @param {boolean} isOutside True if the cursor is outside of the blocks workspace
362
+ * @private
363
+ */
364
+ Blockly.BlockDragger.prototype.updateCursorDuringBlockDrag_ = function(isOutside) {
365
+ this.wouldDeleteBlock_ = this.draggedConnectionManager_.wouldDeleteBlock();
366
+ var trashcan = this.workspace_.trashcan;
367
+ if (this.wouldDeleteBlock_) {
368
+ this.draggingBlock_.setDeleteStyle(true);
369
+ if (this.deleteArea_ == Blockly.DELETE_AREA_TRASH && trashcan) {
370
+ trashcan.setOpen_(true);
371
+ }
372
+ } else {
373
+ this.draggingBlock_.setDeleteStyle(false);
374
+ if (trashcan) {
375
+ trashcan.setOpen_(false);
376
+ }
377
+ }
378
+
379
+ if (isOutside) {
380
+ // Let mouse events through to GUI
381
+ this.draggingBlock_.setMouseThroughStyle(true);
382
+ } else {
383
+ this.draggingBlock_.setMouseThroughStyle(false);
384
+ }
385
+ };
386
+
387
+ /**
388
+ * Convert a coordinate object from pixels to workspace units, including a
389
+ * correction for mutator workspaces.
390
+ * This function does not consider differing origins. It simply scales the
391
+ * input's x and y values.
392
+ * @param {!goog.math.Coordinate} pixelCoord A coordinate with x and y values
393
+ * in css pixel units.
394
+ * @return {!goog.math.Coordinate} The input coordinate divided by the workspace
395
+ * scale.
396
+ * @private
397
+ */
398
+ Blockly.BlockDragger.prototype.pixelsToWorkspaceUnits_ = function(pixelCoord) {
399
+ var result = new goog.math.Coordinate(pixelCoord.x / this.workspace_.scale,
400
+ pixelCoord.y / this.workspace_.scale);
401
+ if (this.workspace_.isMutator) {
402
+ // If we're in a mutator, its scale is always 1, purely because of some
403
+ // oddities in our rendering optimizations. The actual scale is the same as
404
+ // the scale on the parent workspace.
405
+ // Fix that for dragging.
406
+ var mainScale = this.workspace_.options.parentWorkspace.scale;
407
+ result = result.scale(1 / mainScale);
408
+ }
409
+ return result;
410
+ };
411
+
412
+ /**
413
+ * Move all of the icons connected to this drag.
414
+ * @param {!goog.math.Coordinate} dxy How far to move the icons from their
415
+ * original positions, in workspace units.
416
+ * @private
417
+ */
418
+ Blockly.BlockDragger.prototype.dragIcons_ = function(dxy) {
419
+ // Moving icons moves their associated bubbles.
420
+ for (var i = 0; i < this.dragIconData_.length; i++) {
421
+ var data = this.dragIconData_[i];
422
+ data.icon.setIconLocation(goog.math.Coordinate.sum(data.location, dxy));
423
+ }
424
+ };