@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,195 @@
1
+ /**
2
+ * @license
3
+ * Visual Blocks Editor
4
+ *
5
+ * Copyright 2016 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 An SVG that floats on top of the workspace.
23
+ * Blocks are moved into this SVG during a drag, improving performance.
24
+ * The entire SVG is translated using css translation instead of SVG so the
25
+ * blocks are never repainted during drag improving performance.
26
+ * @author katelyn@google.com (Katelyn Mann)
27
+ */
28
+
29
+ 'use strict';
30
+
31
+ goog.provide('Blockly.WorkspaceDragSurfaceSvg');
32
+
33
+ goog.require('Blockly.utils');
34
+
35
+ goog.require('goog.asserts');
36
+ goog.require('goog.math.Coordinate');
37
+
38
+
39
+ /**
40
+ * Blocks are moved into this SVG during a drag, improving performance.
41
+ * The entire SVG is translated using css transforms instead of SVG so the
42
+ * blocks are never repainted during drag improving performance.
43
+ * @param {!Element} container Containing element.
44
+ * @constructor
45
+ */
46
+ Blockly.WorkspaceDragSurfaceSvg = function(container) {
47
+ this.container_ = container;
48
+ this.createDom();
49
+ };
50
+
51
+ /**
52
+ * The SVG drag surface. Set once by Blockly.WorkspaceDragSurfaceSvg.createDom.
53
+ * @type {Element}
54
+ * @private
55
+ */
56
+ Blockly.WorkspaceDragSurfaceSvg.prototype.SVG_ = null;
57
+
58
+ /**
59
+ * SVG group inside the drag surface that holds blocks while a drag is in
60
+ * progress. Blocks are moved here by the workspace at start of a drag and moved
61
+ * back into the main SVG at the end of a drag.
62
+ *
63
+ * @type {Element}
64
+ * @private
65
+ */
66
+ Blockly.WorkspaceDragSurfaceSvg.prototype.dragGroup_ = null;
67
+
68
+ /**
69
+ * Containing HTML element; parent of the workspace and the drag surface.
70
+ * @type {Element}
71
+ * @private
72
+ */
73
+ Blockly.WorkspaceDragSurfaceSvg.prototype.container_ = null;
74
+
75
+ /**
76
+ * Create the drag surface and inject it into the container.
77
+ */
78
+ Blockly.WorkspaceDragSurfaceSvg.prototype.createDom = function() {
79
+ if (this.SVG_) {
80
+ return; // Already created.
81
+ }
82
+
83
+ /**
84
+ * Dom structure when the workspace is being dragged. If there is no drag in
85
+ * progress, the SVG is empty and display: none.
86
+ * <svg class="blocklyWsDragSurface" style=transform:translate3d(...)>
87
+ * <g class="blocklyBlockCanvas"></g>
88
+ * <g class="blocklyBubbleCanvas">/g>
89
+ * </svg>
90
+ */
91
+ this.SVG_ = Blockly.utils.createSvgElement('svg',
92
+ {
93
+ 'xmlns': Blockly.SVG_NS,
94
+ 'xmlns:html': Blockly.HTML_NS,
95
+ 'xmlns:xlink': 'http://www.w3.org/1999/xlink',
96
+ 'version': '1.1',
97
+ 'class': 'blocklyWsDragSurface blocklyOverflowVisible'
98
+ }, null);
99
+ this.container_.appendChild(this.SVG_);
100
+ };
101
+
102
+ /**
103
+ * Translate the entire drag surface during a drag.
104
+ * We translate the drag surface instead of the blocks inside the surface
105
+ * so that the browser avoids repainting the SVG.
106
+ * Because of this, the drag coordinates must be adjusted by scale.
107
+ * @param {number} x X translation for the entire surface
108
+ * @param {number} y Y translation for the entire surface
109
+ * @package
110
+ */
111
+ Blockly.WorkspaceDragSurfaceSvg.prototype.translateSurface = function(x, y) {
112
+ // This is a work-around to prevent a the blocks from rendering
113
+ // fuzzy while they are being moved on the drag surface.
114
+ var fixedX = x.toFixed(0);
115
+ var fixedY = y.toFixed(0);
116
+
117
+ this.SVG_.style.display = 'block';
118
+ Blockly.utils.setCssTransform(
119
+ this.SVG_, 'translate3d(' + fixedX + 'px, ' + fixedY + 'px, 0px)');
120
+ };
121
+
122
+ /**
123
+ * Reports the surface translation in scaled workspace coordinates.
124
+ * Use this when finishing a drag to return blocks to the correct position.
125
+ * @return {!goog.math.Coordinate} Current translation of the surface
126
+ * @package
127
+ */
128
+ Blockly.WorkspaceDragSurfaceSvg.prototype.getSurfaceTranslation = function() {
129
+ return Blockly.utils.getRelativeXY(this.SVG_);
130
+ };
131
+
132
+ /**
133
+ * Move the blockCanvas and bubbleCanvas out of the surface SVG and on to
134
+ * newSurface.
135
+ * @param {SVGElement} newSurface The element to put the drag surface contents
136
+ * into.
137
+ * @package
138
+ */
139
+ Blockly.WorkspaceDragSurfaceSvg.prototype.clearAndHide = function(newSurface) {
140
+ if (!newSurface) {
141
+ throw 'Couldn\'t clear and hide the drag surface: missing new surface.';
142
+ }
143
+ var blockCanvas = this.SVG_.childNodes[0];
144
+ var bubbleCanvas = this.SVG_.childNodes[1];
145
+ if (!blockCanvas || !bubbleCanvas ||
146
+ !Blockly.utils.hasClass(blockCanvas, 'blocklyBlockCanvas') ||
147
+ !Blockly.utils.hasClass(bubbleCanvas, 'blocklyBubbleCanvas')) {
148
+ throw 'Couldn\'t clear and hide the drag surface. A node was missing.';
149
+ }
150
+
151
+ // If there is a previous sibling, put the blockCanvas back right afterwards,
152
+ // otherwise insert it as the first child node in newSurface.
153
+ if (this.previousSibling_ != null) {
154
+ Blockly.utils.insertAfter(blockCanvas, this.previousSibling_);
155
+ } else {
156
+ newSurface.insertBefore(blockCanvas, newSurface.firstChild);
157
+ }
158
+
159
+ // Reattach the bubble canvas after the blockCanvas.
160
+ Blockly.utils.insertAfter(bubbleCanvas, blockCanvas);
161
+ // Hide the drag surface.
162
+ this.SVG_.style.display = 'none';
163
+ goog.asserts.assert(
164
+ this.SVG_.childNodes.length == 0, 'Drag surface was not cleared.');
165
+ Blockly.utils.setCssTransform(this.SVG_, '');
166
+ this.previousSibling_ = null;
167
+ };
168
+
169
+ /**
170
+ * Set the SVG to have the block canvas and bubble canvas in it and then
171
+ * show the surface.
172
+ * @param {!Element} blockCanvas The block canvas <g> element from the workspace.
173
+ * @param {!Element} bubbleCanvas The <g> element that contains the bubbles.
174
+ * @param {?Element} previousSibling The element to insert the block canvas &
175
+ bubble canvas after when it goes back in the DOM at the end of a drag.
176
+ * @param {number} width The width of the workspace SVG element.
177
+ * @param {number} height The height of the workspace SVG element.
178
+ * @param {number} scale The scale of the workspace being dragged.
179
+ * @package
180
+ */
181
+ Blockly.WorkspaceDragSurfaceSvg.prototype.setContentsAndShow = function(
182
+ blockCanvas, bubbleCanvas, previousSibling, width, height, scale) {
183
+ goog.asserts.assert(
184
+ this.SVG_.childNodes.length == 0, 'Already dragging a block.');
185
+ this.previousSibling_ = previousSibling;
186
+ // Make sure the blocks and bubble canvas are scaled appropriately.
187
+ blockCanvas.setAttribute('transform', 'translate(0, 0) scale(' + scale + ')');
188
+ bubbleCanvas.setAttribute(
189
+ 'transform', 'translate(0, 0) scale(' + scale + ')');
190
+ this.SVG_.setAttribute('width', width);
191
+ this.SVG_.setAttribute('height', height);
192
+ this.SVG_.appendChild(blockCanvas);
193
+ this.SVG_.appendChild(bubbleCanvas);
194
+ this.SVG_.style.display = 'block';
195
+ };
@@ -0,0 +1,132 @@
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 workspace visually.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.WorkspaceDragger');
28
+
29
+ goog.require('goog.math.Coordinate');
30
+ goog.require('goog.asserts');
31
+
32
+
33
+ /**
34
+ * Class for a workspace dragger. It moves the workspace around when it is
35
+ * being dragged by a mouse or touch.
36
+ * Note that the workspace itself manages whether or not it has a drag surface
37
+ * and how to do translations based on that. This simply passes the right
38
+ * commands based on events.
39
+ * @param {!Blockly.WorkspaceSvg} workspace The workspace to drag.
40
+ * @constructor
41
+ */
42
+ Blockly.WorkspaceDragger = function(workspace) {
43
+ /**
44
+ * @type {!Blockly.WorkspaceSvg}
45
+ * @private
46
+ */
47
+ this.workspace_ = workspace;
48
+
49
+ /**
50
+ * The workspace's metrics object at the beginning of the drag. Contains size
51
+ * and position metrics of a workspace.
52
+ * Coordinate system: pixel coordinates.
53
+ * @type {!Object}
54
+ * @private
55
+ */
56
+ this.startDragMetrics_ = workspace.getMetrics();
57
+
58
+ /**
59
+ * The scroll position of the workspace at the beginning of the drag.
60
+ * Coordinate system: pixel coordinates.
61
+ * @type {!goog.math.Coordinate}
62
+ * @private
63
+ */
64
+ this.startScrollXY_ = new goog.math.Coordinate(
65
+ workspace.scrollX, workspace.scrollY);
66
+ };
67
+
68
+ /**
69
+ * Sever all links from this object.
70
+ * @package
71
+ */
72
+ Blockly.WorkspaceDragger.prototype.dispose = function() {
73
+ this.workspace_ = null;
74
+ };
75
+
76
+ /**
77
+ * Start dragging the workspace.
78
+ * @package
79
+ */
80
+ Blockly.WorkspaceDragger.prototype.startDrag = function() {
81
+ if (Blockly.selected) {
82
+ Blockly.selected.unselect();
83
+ }
84
+ this.workspace_.setupDragSurface();
85
+ };
86
+
87
+ /**
88
+ * Finish dragging the workspace and put everything back where it belongs.
89
+ * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has
90
+ * moved from the position at the start of the drag, in pixel coordinates.
91
+ * @package
92
+ */
93
+ Blockly.WorkspaceDragger.prototype.endDrag = function(currentDragDeltaXY) {
94
+ // Make sure everything is up to date.
95
+ this.drag(currentDragDeltaXY);
96
+ this.workspace_.resetDragSurface();
97
+ };
98
+
99
+ /**
100
+ * Move the workspace based on the most recent mouse movements.
101
+ * @param {!goog.math.Coordinate} currentDragDeltaXY How far the pointer has
102
+ * moved from the position at the start of the drag, in pixel coordinates.
103
+ * @package
104
+ */
105
+ Blockly.WorkspaceDragger.prototype.drag = function(currentDragDeltaXY) {
106
+ var metrics = this.startDragMetrics_;
107
+ var newXY = goog.math.Coordinate.sum(this.startScrollXY_, currentDragDeltaXY);
108
+
109
+ // Bound the new XY based on workspace bounds.
110
+ var x = Math.min(newXY.x, -metrics.contentLeft);
111
+ var y = Math.min(newXY.y, -metrics.contentTop);
112
+ x = Math.max(x, metrics.viewWidth - metrics.contentLeft -
113
+ metrics.contentWidth);
114
+ y = Math.max(y, metrics.viewHeight - metrics.contentTop -
115
+ metrics.contentHeight);
116
+
117
+ x = -x - metrics.contentLeft;
118
+ y = -y - metrics.contentTop;
119
+
120
+ this.updateScroll_(x, y);
121
+ };
122
+
123
+ /**
124
+ * Move the scrollbars to drag the workspace.
125
+ * x and y are in pixels.
126
+ * @param {number} x The new x position to move the scrollbar to.
127
+ * @param {number} y The new y position to move the scrollbar to.
128
+ * @private
129
+ */
130
+ Blockly.WorkspaceDragger.prototype.updateScroll_ = function(x, y) {
131
+ this.workspace_.scrollbar.set(x, y);
132
+ };