@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,609 @@
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 Object representing a code comment on a rendered workspace.
23
+ * @author fenichel@google.com (Rachel Fenichel)
24
+ */
25
+ 'use strict';
26
+
27
+ goog.provide('Blockly.WorkspaceCommentSvg');
28
+
29
+ goog.require('Blockly.Events.CommentCreate');
30
+ goog.require('Blockly.Events.CommentDelete');
31
+ goog.require('Blockly.Events.CommentMove');
32
+ goog.require('Blockly.WorkspaceComment');
33
+
34
+
35
+ /**
36
+ * Class for a workspace comment's SVG representation.
37
+ * @param {!Blockly.Workspace} workspace The block's workspace.
38
+ * @param {string} content The content of this workspace comment.
39
+ * @param {number} height Height of the comment.
40
+ * @param {number} width Width of the comment.
41
+ * @param {boolean} minimized Whether this comment is minimized.
42
+ * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise
43
+ * create a new ID.
44
+ * @extends {Blockly.WorkspaceComment}
45
+ * @constructor
46
+ */
47
+ Blockly.WorkspaceCommentSvg = function(workspace, content, height, width, minimized,
48
+ opt_id) {
49
+ // Create core elements for the block.
50
+ /**
51
+ * @type {SVGElement}
52
+ * @private
53
+ */
54
+ this.svgGroup_ = Blockly.utils.createSvgElement(
55
+ 'g', {}, null);
56
+ this.svgGroup_.translate_ = '';
57
+
58
+ this.svgRect_ = Blockly.utils.createSvgElement(
59
+ 'rect',
60
+ {
61
+ 'class': 'scratchCommentRect scratchWorkspaceCommentBorder',
62
+ 'x': 0,
63
+ 'y': 0,
64
+ 'rx': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH,
65
+ 'ry': 4 * Blockly.WorkspaceCommentSvg.BORDER_WIDTH
66
+ });
67
+ this.svgGroup_.appendChild(this.svgRect_);
68
+
69
+
70
+ /**
71
+ * Whether the comment is rendered onscreen and is a part of the DOM.
72
+ * @type {boolean}
73
+ * @private
74
+ */
75
+ this.rendered_ = false;
76
+
77
+ /**
78
+ * Whether to move the comment to the drag surface when it is dragged.
79
+ * True if it should move, false if it should be translated directly.
80
+ * @type {boolean}
81
+ * @private
82
+ */
83
+ this.useDragSurface_ =
84
+ Blockly.utils.is3dSupported() && !!workspace.blockDragSurface_;
85
+
86
+ Blockly.WorkspaceCommentSvg.superClass_.constructor.call(this,
87
+ workspace, content, height, width, minimized, opt_id);
88
+
89
+ this.render();
90
+ }; goog.inherits(Blockly.WorkspaceCommentSvg, Blockly.WorkspaceComment);
91
+
92
+ /**
93
+ * The width and height to use to size a workspace comment when it is first
94
+ * added, before it has been edited by the user.
95
+ * @type {number}
96
+ * @package
97
+ */
98
+ Blockly.WorkspaceCommentSvg.DEFAULT_SIZE = 200;
99
+
100
+ /**
101
+ * Dispose of this comment.
102
+ * @package
103
+ */
104
+ Blockly.WorkspaceCommentSvg.prototype.dispose = function() {
105
+ if (!this.workspace) {
106
+ // The comment has already been deleted.
107
+ return;
108
+ }
109
+ // If this comment is being deleted, unlink the mouse events.
110
+ if (Blockly.selected == this) {
111
+ this.unselect();
112
+ this.workspace.cancelCurrentGesture();
113
+ }
114
+
115
+ if (Blockly.Events.isEnabled()) {
116
+ Blockly.Events.fire(new Blockly.Events.CommentDelete(this));
117
+ }
118
+
119
+ goog.dom.removeNode(this.svgGroup_);
120
+ // Sever JavaScript to DOM connections.
121
+ this.svgGroup_ = null;
122
+ this.svgRect_ = null;
123
+ // Dispose of any rendered components
124
+ this.disposeInternal_();
125
+
126
+ Blockly.Events.disable();
127
+ Blockly.WorkspaceCommentSvg.superClass_.dispose.call(this);
128
+ Blockly.Events.enable();
129
+ };
130
+
131
+ /**
132
+ * Create and initialize the SVG representation of a workspace comment.
133
+ * May be called more than once.
134
+ * @package
135
+ */
136
+ Blockly.WorkspaceCommentSvg.prototype.initSvg = function() {
137
+ goog.asserts.assert(this.workspace.rendered, 'Workspace is headless.');
138
+ if (!this.workspace.options.readOnly && !this.eventsInit_) {
139
+ Blockly.bindEventWithChecks_(
140
+ this.svgHandleTarget_, 'mousedown', this, this.pathMouseDown_);
141
+ }
142
+ this.eventsInit_ = true;
143
+
144
+ this.updateMovable();
145
+ if (!this.getSvgRoot().parentNode) {
146
+ this.workspace.getBubbleCanvas().appendChild(this.getSvgRoot());
147
+ }
148
+ };
149
+
150
+ /**
151
+ * Handle a mouse-down on an SVG comment.
152
+ * @param {!Event} e Mouse down event or touch start event.
153
+ * @private
154
+ */
155
+ Blockly.WorkspaceCommentSvg.prototype.pathMouseDown_ = function(e) {
156
+ var gesture = this.workspace.getGesture(e);
157
+ if (gesture) {
158
+ gesture.handleBubbleStart(e, this);
159
+ }
160
+ };
161
+
162
+ /**
163
+ * Show the context menu for this workspace comment.
164
+ * @param {!Event} e Mouse event.
165
+ * @private
166
+ */
167
+ Blockly.WorkspaceCommentSvg.prototype.showContextMenu_ = function(e) {
168
+ if (this.workspace.options.readOnly) {
169
+ return;
170
+ }
171
+ // Save the current workspace comment in a variable for use in closures.
172
+ var comment = this;
173
+ var menuOptions = [];
174
+
175
+ if (this.isDeletable() && this.isMovable()) {
176
+ menuOptions.push(Blockly.ContextMenu.commentDuplicateOption(comment));
177
+ menuOptions.push(Blockly.ContextMenu.commentDeleteOption(comment));
178
+ }
179
+
180
+ Blockly.ContextMenu.show(e, menuOptions, this.RTL);
181
+ };
182
+
183
+ /**
184
+ * Select this comment. Highlight it visually.
185
+ * @package
186
+ */
187
+ Blockly.WorkspaceCommentSvg.prototype.select = function() {
188
+ if (Blockly.selected == this) {
189
+ return;
190
+ }
191
+ var oldId = null;
192
+ if (Blockly.selected) {
193
+ oldId = Blockly.selected.id;
194
+ // Unselect any previously selected block or comment.
195
+ Blockly.Events.disable();
196
+ try {
197
+ Blockly.selected.unselect();
198
+ } finally {
199
+ Blockly.Events.enable();
200
+ }
201
+ }
202
+ var event = new Blockly.Events.Ui(null, 'selected', oldId, this.id);
203
+ event.workspaceId = this.workspace.id;
204
+ Blockly.Events.fire(event);
205
+ Blockly.selected = this;
206
+ this.addSelect();
207
+ };
208
+
209
+ /**
210
+ * Unselect this comment. Remove its highlighting.
211
+ * @package
212
+ */
213
+ Blockly.WorkspaceCommentSvg.prototype.unselect = function() {
214
+ if (Blockly.selected != this) {
215
+ return;
216
+ }
217
+ var event = new Blockly.Events.Ui(null, 'selected', this.id, null);
218
+ event.workspaceId = this.workspace.id;
219
+ Blockly.Events.fire(event);
220
+ Blockly.selected = null;
221
+ this.removeSelect();
222
+ };
223
+
224
+ /**
225
+ * Select this comment. Highlight it visually.
226
+ * @package
227
+ */
228
+ Blockly.WorkspaceCommentSvg.prototype.addSelect = function() {
229
+ Blockly.utils.addClass(
230
+ /** @type {!Element} */ (this.svgGroup_), 'blocklySelected');
231
+ this.setFocus();
232
+ };
233
+
234
+ /**
235
+ * Unselect this comment. Remove its highlighting.
236
+ * @package
237
+ */
238
+ Blockly.WorkspaceCommentSvg.prototype.removeSelect = function() {
239
+ Blockly.utils.removeClass(
240
+ /** @type {!Element} */ (this.svgGroup_), 'blocklySelected');
241
+ this.blurFocus();
242
+ };
243
+
244
+ /**
245
+ * Focus this comment. Highlight it visually.
246
+ * @package
247
+ */
248
+ Blockly.WorkspaceCommentSvg.prototype.addFocus = function() {
249
+ Blockly.utils.addClass(
250
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyFocused');
251
+ };
252
+
253
+ /**
254
+ * Unfocus this comment. Remove its highlighting.
255
+ * @package
256
+ */
257
+ Blockly.WorkspaceCommentSvg.prototype.removeFocus = function() {
258
+ Blockly.utils.removeClass(
259
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyFocused');
260
+ };
261
+
262
+ /**
263
+ * Return the coordinates of the top-left corner of this comment relative to the
264
+ * drawing surface's origin (0,0), in workspace units.
265
+ * If the comment is on the workspace, (0, 0) is the origin of the workspace
266
+ * coordinate system.
267
+ * This does not change with workspace scale.
268
+ * @return {!goog.math.Coordinate} Object with .x and .y properties in
269
+ * workspace coordinates.
270
+ * @package
271
+ */
272
+ Blockly.WorkspaceCommentSvg.prototype.getRelativeToSurfaceXY = function() {
273
+ var x = 0;
274
+ var y = 0;
275
+
276
+ var dragSurfaceGroup = this.useDragSurface_ ?
277
+ this.workspace.blockDragSurface_.getGroup() : null;
278
+
279
+ var element = this.getSvgRoot();
280
+ if (element) {
281
+ do {
282
+ // Loop through this comment and every parent.
283
+ var xy = Blockly.utils.getRelativeXY(element);
284
+ x += xy.x;
285
+ y += xy.y;
286
+ // If this element is the current element on the drag surface, include
287
+ // the translation of the drag surface itself.
288
+ if (this.useDragSurface_ &&
289
+ this.workspace.blockDragSurface_.getCurrentBlock() == element) {
290
+ var surfaceTranslation =
291
+ this.workspace.blockDragSurface_.getSurfaceTranslation();
292
+ x += surfaceTranslation.x;
293
+ y += surfaceTranslation.y;
294
+ }
295
+ element = element.parentNode;
296
+ } while (element && element != this.workspace.getBubbleCanvas() &&
297
+ element != dragSurfaceGroup);
298
+ }
299
+ this.xy_ = new goog.math.Coordinate(x, y);
300
+ return this.xy_;
301
+ };
302
+
303
+ /**
304
+ * Move a comment by a relative offset.
305
+ * @param {number} dx Horizontal offset, in workspace units.
306
+ * @param {number} dy Vertical offset, in workspace units.
307
+ * @package
308
+ */
309
+ Blockly.WorkspaceCommentSvg.prototype.moveBy = function(dx, dy) {
310
+ var event = new Blockly.Events.CommentMove(this);
311
+ // TODO: Do I need to look up the relative to surface XY position here?
312
+ var xy = this.getRelativeToSurfaceXY();
313
+ this.translate(xy.x + dx, xy.y + dy);
314
+ event.recordNew();
315
+ Blockly.Events.fire(event);
316
+ this.workspace.resizeContents();
317
+ };
318
+
319
+ /**
320
+ * Transforms a comment by setting the translation on the transform attribute
321
+ * of the block's SVG.
322
+ * @param {number} x The x coordinate of the translation in workspace units.
323
+ * @param {number} y The y coordinate of the translation in workspace units.
324
+ * @package
325
+ */
326
+ Blockly.WorkspaceCommentSvg.prototype.translate = function(x, y) {
327
+ this.xy_ = new goog.math.Coordinate(x, y);
328
+ this.getSvgRoot().setAttribute('transform',
329
+ 'translate(' + x + ',' + y + ')');
330
+ };
331
+
332
+ /**
333
+ * Move this comment to its workspace's drag surface, accounting for positioning.
334
+ * Generally should be called at the same time as setDragging(true).
335
+ * Does nothing if useDragSurface_ is false.
336
+ * @private
337
+ */
338
+ Blockly.WorkspaceCommentSvg.prototype.moveToDragSurface_ = function() {
339
+ if (!this.useDragSurface_) {
340
+ return;
341
+ }
342
+ // The translation for drag surface blocks,
343
+ // is equal to the current relative-to-surface position,
344
+ // to keep the position in sync as it move on/off the surface.
345
+ // This is in workspace coordinates.
346
+ var xy = this.getRelativeToSurfaceXY();
347
+ this.clearTransformAttributes_();
348
+ this.workspace.blockDragSurface_.translateSurface(xy.x, xy.y);
349
+ // Execute the move on the top-level SVG component
350
+ this.workspace.blockDragSurface_.setBlocksAndShow(this.getSvgRoot());
351
+ };
352
+
353
+ /**
354
+ * Move this comment back to the workspace block canvas.
355
+ * Generally should be called at the same time as setDragging(false).
356
+ * Does nothing if useDragSurface_ is false.
357
+ * @param {!goog.math.Coordinate} newXY The position the comment should take on
358
+ * on the workspace canvas, in workspace coordinates.
359
+ * @private
360
+ */
361
+ Blockly.WorkspaceCommentSvg.prototype.moveOffDragSurface_ = function(newXY) {
362
+ if (!this.useDragSurface_) {
363
+ return;
364
+ }
365
+ // Translate to current position, turning off 3d.
366
+ this.translate(newXY.x, newXY.y);
367
+ this.workspace.blockDragSurface_.clearAndHide(this.workspace.getCanvas());
368
+ };
369
+
370
+ /**
371
+ * Move this comment during a drag, taking into account whether we are using a
372
+ * drag surface to translate blocks.
373
+ * @param {?Blockly.BlockDragSurfaceSvg} dragSurface The surface that carries
374
+ * rendered items during a drag, or null if no drag surface is in use.
375
+ * @param {!goog.math.Coordinate} newLoc The location to translate to, in
376
+ * workspace coordinates.
377
+ * @package
378
+ */
379
+ Blockly.WorkspaceCommentSvg.prototype.moveDuringDrag = function(dragSurface, newLoc) {
380
+ if (dragSurface) {
381
+ dragSurface.translateSurface(newLoc.x, newLoc.y);
382
+ } else {
383
+ this.svgGroup_.translate_ = 'translate(' + newLoc.x + ',' + newLoc.y + ')';
384
+ this.svgGroup_.setAttribute('transform',
385
+ this.svgGroup_.translate_ + this.svgGroup_.skew_);
386
+ }
387
+ };
388
+
389
+ /**
390
+ * Move the bubble group to the specified location in workspace coordinates.
391
+ * @param {number} x The x position to move to.
392
+ * @param {number} y The y position to move to.
393
+ * @package
394
+ */
395
+ Blockly.WorkspaceCommentSvg.prototype.moveTo = function(x, y) {
396
+ this.translate(x, y);
397
+ };
398
+
399
+ /**
400
+ * Clear the comment of transform="..." attributes.
401
+ * Used when the comment is switching from 3d to 2d transform or vice versa.
402
+ * @private
403
+ */
404
+ Blockly.WorkspaceCommentSvg.prototype.clearTransformAttributes_ = function() {
405
+ Blockly.utils.removeAttribute(this.getSvgRoot(), 'transform');
406
+ };
407
+
408
+ /**
409
+ * Return the rendered size of the comment or the stored size if the comment is
410
+ * not rendered. This differs from getHeightWidth in the behavior of rendered
411
+ * minimized comments. This function reports the actual size of the minimized
412
+ * comment instead of the full sized comment height/width.
413
+ * @return {!{height: number, width: number}} Object with height and width
414
+ * properties in workspace units.
415
+ * @package
416
+ */
417
+ Blockly.WorkspaceCommentSvg.prototype.getBubbleSize = function() {
418
+ if (this.rendered_) {
419
+ return {
420
+ width: parseInt(this.svgRect_.getAttribute('width')),
421
+ height: parseInt(this.svgRect_.getAttribute('height'))
422
+ };
423
+ } else {
424
+ this.getHeightWidth();
425
+ }
426
+ };
427
+
428
+ /**
429
+ * Returns the coordinates of a bounding box describing the dimensions of this
430
+ * comment.
431
+ * Coordinate system: workspace coordinates.
432
+ * @return {!{topLeft: goog.math.Coordinate, bottomRight: goog.math.Coordinate}}
433
+ * Object with top left and bottom right coordinates of the bounding box.
434
+ * @package
435
+ */
436
+ Blockly.WorkspaceCommentSvg.prototype.getBoundingRectangle = function() {
437
+ var blockXY = this.getRelativeToSurfaceXY();
438
+ var commentBounds = this.getHeightWidth();
439
+ var topLeft;
440
+ var bottomRight;
441
+ if (this.RTL) {
442
+ topLeft = new goog.math.Coordinate(blockXY.x - (commentBounds.width),
443
+ blockXY.y);
444
+ // Add the width of the tab/puzzle piece knob to the x coordinate
445
+ // since X is the corner of the rectangle, not the whole puzzle piece.
446
+ bottomRight = new goog.math.Coordinate(blockXY.x,
447
+ blockXY.y + commentBounds.height);
448
+ } else {
449
+ // Subtract the width of the tab/puzzle piece knob to the x coordinate
450
+ // since X is the corner of the rectangle, not the whole puzzle piece.
451
+ topLeft = new goog.math.Coordinate(blockXY.x, blockXY.y);
452
+ bottomRight = new goog.math.Coordinate(blockXY.x + commentBounds.width,
453
+ blockXY.y + commentBounds.height);
454
+ }
455
+ return {topLeft: topLeft, bottomRight: bottomRight};
456
+ };
457
+
458
+ /**
459
+ * Add or remove the UI indicating if this comment is movable or not.
460
+ * @package
461
+ */
462
+ Blockly.WorkspaceCommentSvg.prototype.updateMovable = function() {
463
+ if (this.isMovable()) {
464
+ Blockly.utils.addClass(
465
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable');
466
+ } else {
467
+ Blockly.utils.removeClass(
468
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggable');
469
+ }
470
+ };
471
+
472
+ /**
473
+ * Set whether this comment is movable or not.
474
+ * @param {boolean} movable True if movable.
475
+ * @package
476
+ */
477
+ Blockly.WorkspaceCommentSvg.prototype.setMovable = function(movable) {
478
+ Blockly.WorkspaceCommentSvg.superClass_.setMovable.call(this, movable);
479
+ this.updateMovable();
480
+ };
481
+
482
+ /**
483
+ * Recursively adds or removes the dragging class to this node and its children.
484
+ * @param {boolean} adding True if adding, false if removing.
485
+ * @package
486
+ */
487
+ Blockly.WorkspaceCommentSvg.prototype.setDragging = function(adding) {
488
+ if (adding) {
489
+ var group = this.getSvgRoot();
490
+ group.translate_ = '';
491
+ group.skew_ = '';
492
+ Blockly.utils.addClass(
493
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging');
494
+ } else {
495
+ Blockly.utils.removeClass(
496
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDragging');
497
+ }
498
+ };
499
+
500
+ /**
501
+ * Return the root node of the SVG or null if none exists.
502
+ * @return {Element} The root SVG node (probably a group).
503
+ * @package
504
+ */
505
+ Blockly.WorkspaceCommentSvg.prototype.getSvgRoot = function() {
506
+ return this.svgGroup_;
507
+ };
508
+
509
+ /**
510
+ * Returns this comment's text.
511
+ * @return {string} Comment text.
512
+ * @package
513
+ */
514
+ Blockly.WorkspaceCommentSvg.prototype.getText = function() {
515
+ return this.textarea_ ? this.textarea_.value : this.content_;
516
+ };
517
+
518
+ /**
519
+ * Set this comment's text.
520
+ * @param {string} text Comment text.
521
+ * @package
522
+ */
523
+ Blockly.WorkspaceCommentSvg.prototype.setText = function(text) {
524
+ Blockly.WorkspaceCommentSvg.superClass_.setText.call(this, text);
525
+ if (this.textarea_) {
526
+ this.textarea_.value = text;
527
+ }
528
+ };
529
+
530
+ /**
531
+ * Update the cursor over this comment by adding or removing a class.
532
+ * @param {boolean} enable True if the delete cursor should be shown, false
533
+ * otherwise.
534
+ * @package
535
+ */
536
+ Blockly.WorkspaceCommentSvg.prototype.setDeleteStyle = function(enable) {
537
+ if (enable) {
538
+ Blockly.utils.addClass(
539
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggingDelete');
540
+ } else {
541
+ Blockly.utils.removeClass(
542
+ /** @type {!Element} */ (this.svgGroup_), 'blocklyDraggingDelete');
543
+ }
544
+ };
545
+
546
+ Blockly.WorkspaceCommentSvg.prototype.setAutoLayout = function() {
547
+ // NOP for compatibility with the bubble dragger.
548
+ };
549
+
550
+ /**
551
+ * Decode an XML comment tag and create a rendered comment on the workspace.
552
+ * @param {!Element} xmlComment XML comment element.
553
+ * @param {!Blockly.Workspace} workspace The workspace.
554
+ * @param {number=} opt_wsWidth The width of the workspace, which is used to
555
+ * position comments correctly in RTL.
556
+ * @return {!Blockly.WorkspaceCommentSvg} The created workspace comment.
557
+ * @package
558
+ */
559
+ Blockly.WorkspaceCommentSvg.fromXml = function(xmlComment, workspace,
560
+ opt_wsWidth) {
561
+ Blockly.Events.disable();
562
+ try {
563
+ var info = Blockly.WorkspaceComment.parseAttributes(xmlComment);
564
+
565
+ var comment = new Blockly.WorkspaceCommentSvg(workspace,
566
+ info.content, info.h, info.w, info.minimized, info.id);
567
+ if (workspace.rendered) {
568
+ comment.initSvg();
569
+ comment.render(false);
570
+ }
571
+ // Position the comment correctly, taking into account the width of a
572
+ // rendered RTL workspace.
573
+ if (!isNaN(info.x) && !isNaN(info.y)) {
574
+ if (workspace.RTL) {
575
+ var wsWidth = opt_wsWidth || workspace.getWidth();
576
+ comment.moveBy(wsWidth - info.x, info.y);
577
+ } else {
578
+ comment.moveBy(info.x, info.y);
579
+ }
580
+ }
581
+ } finally {
582
+ Blockly.Events.enable();
583
+ }
584
+ Blockly.WorkspaceComment.fireCreateEvent(comment);
585
+
586
+ return comment;
587
+ };
588
+
589
+ /**
590
+ * Encode a comment subtree as XML with XY coordinates.
591
+ * @param {boolean=} opt_noId True if the encoder should skip the comment id.
592
+ * @return {!Element} Tree of XML elements.
593
+ * @package
594
+ */
595
+ Blockly.WorkspaceCommentSvg.prototype.toXmlWithXY = function(opt_noId) {
596
+ var width; // Not used in LTR.
597
+ if (this.workspace.RTL) {
598
+ // Here be performance dragons: This calls getMetrics().
599
+ width = this.workspace.getWidth();
600
+ }
601
+ var element = this.toXml(opt_noId);
602
+ var xy = this.getRelativeToSurfaceXY();
603
+ element.setAttribute('x',
604
+ Math.round(this.workspace.RTL ? width - xy.x : xy.x));
605
+ element.setAttribute('y', Math.round(xy.y));
606
+ element.setAttribute('h', this.getHeight());
607
+ element.setAttribute('w', this.getWidth());
608
+ return element;
609
+ };