123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 'use strict';
- goog.provide('Blockly.ContextMenu');
- goog.require('goog.dom');
- goog.require('goog.events');
- goog.require('goog.style');
- goog.require('goog.ui.Menu');
- goog.require('goog.ui.MenuItem');
- Blockly.ContextMenu.currentBlock = null;
- Blockly.ContextMenu.show = function(e, options, rtl) {
- Blockly.WidgetDiv.show(Blockly.ContextMenu, rtl, null);
- if (!options.length) {
- Blockly.ContextMenu.hide();
- return;
- }
-
- var menu = new goog.ui.Menu();
- menu.setRightToLeft(rtl);
- for (var i = 0, option; option = options[i]; i++) {
- var menuItem = new goog.ui.MenuItem(option.text);
- menuItem.setRightToLeft(rtl);
- menu.addChild(menuItem, true);
- menuItem.setEnabled(option.enabled);
- if (option.enabled) {
- goog.events.listen(menuItem, goog.ui.Component.EventType.ACTION,
- option.callback);
- menuItem.handleContextMenu = function(e) {
-
- goog.events.dispatchEvent(this, goog.ui.Component.EventType.ACTION);
- };
- }
- }
- goog.events.listen(menu, goog.ui.Component.EventType.ACTION,
- Blockly.ContextMenu.hide);
-
- var windowSize = goog.dom.getViewportSize();
- var scrollOffset = goog.style.getViewportPageOffset(document);
- var div = Blockly.WidgetDiv.DIV;
- menu.render(div);
- var menuDom = menu.getElement();
- Blockly.addClass_(menuDom, 'blocklyContextMenu');
-
- Blockly.bindEventWithChecks_(menuDom, 'contextmenu', null, Blockly.noEvent);
-
- var menuSize = goog.style.getSize(menuDom);
-
- var x = e.clientX + scrollOffset.x;
- var y = e.clientY + scrollOffset.y;
-
- if (e.clientY + menuSize.height >= windowSize.height) {
- y -= menuSize.height;
- }
-
- if (rtl) {
- if (menuSize.width >= e.clientX) {
- x += menuSize.width;
- }
- } else {
- if (e.clientX + menuSize.width >= windowSize.width) {
- x -= menuSize.width;
- }
- }
- Blockly.WidgetDiv.position(x, y, windowSize, scrollOffset, rtl);
- menu.setAllowAutoFocus(true);
-
-
- setTimeout(function() {menuDom.focus();}, 1);
- Blockly.ContextMenu.currentBlock = null;
- };
- Blockly.ContextMenu.hide = function() {
- Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu);
- Blockly.ContextMenu.currentBlock = null;
- };
- Blockly.ContextMenu.callbackFactory = function(block, xml) {
- return function() {
- Blockly.Events.disable();
- try {
- var newBlock = Blockly.Xml.domToBlock(xml, block.workspace);
-
- var xy = block.getRelativeToSurfaceXY();
- if (block.RTL) {
- xy.x -= Blockly.SNAP_RADIUS;
- } else {
- xy.x += Blockly.SNAP_RADIUS;
- }
- xy.y += Blockly.SNAP_RADIUS * 2;
- newBlock.moveBy(xy.x, xy.y);
- } finally {
- Blockly.Events.enable();
- }
- if (Blockly.Events.isEnabled() && !newBlock.isShadow()) {
- Blockly.Events.fire(new Blockly.Events.Create(newBlock));
- }
- newBlock.select();
- };
- };
|