(function() { var UI = baidu.editor.ui, UIBase = UI.UIBase, uiUtils = UI.uiUtils, utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils; var allMenus = [], //存储所有快捷菜单 timeID, isSubMenuShow = false; //是否有子pop显示 var ShortCutMenu = (UI.ShortCutMenu = function(options) { this.initOptions(options); this.initShortCutMenu(); }); ShortCutMenu.postHide = hideAllMenu; ShortCutMenu.prototype = { isHidden: true, SPACE: 5, initShortCutMenu: function() { this.items = this.items || []; this.initUIBase(); this.initItems(); this.initEvent(); allMenus.push(this); }, initEvent: function() { var me = this, doc = me.editor.document; domUtils.on(doc, "mousemove", function(e) { if (me.isHidden === false) { //有pop显示就不隐藏快捷菜单 if (me.getSubMenuMark() || me.eventType == "contextmenu") return; var flag = true, el = me.getDom(), wt = el.offsetWidth, ht = el.offsetHeight, distanceX = wt / 2 + me.SPACE, //距离中心X标准 distanceY = ht / 2, //距离中心Y标准 x = Math.abs(e.screenX - me.left), //离中心距离横坐标 y = Math.abs(e.screenY - me.top); //离中心距离纵坐标 clearTimeout(timeID); timeID = setTimeout(function() { if (y > 0 && y < distanceY) { me.setOpacity(el, "1"); } else if (y > distanceY && y < distanceY + 70) { me.setOpacity(el, "0.5"); flag = false; } else if (y > distanceY + 70 && y < distanceY + 140) { me.hide(); } if (flag && x > 0 && x < distanceX) { me.setOpacity(el, "1"); } else if (x > distanceX && x < distanceX + 70) { me.setOpacity(el, "0.5"); } else if (x > distanceX + 70 && x < distanceX + 140) { me.hide(); } }); } }); //ie\ff下 mouseout不准 if (browser.chrome) { domUtils.on(doc, "mouseout", function(e) { var relatedTgt = e.relatedTarget || e.toElement; if (relatedTgt == null || relatedTgt.tagName == "HTML") { me.hide(); } }); } me.editor.addListener("afterhidepop", function() { if (!me.isHidden) { isSubMenuShow = true; } }); }, initItems: function() { if (utils.isArray(this.items)) { for (var i = 0, len = this.items.length; i < len; i++) { var item = this.items[i].toLowerCase(); if (UI[item]) { this.items[i] = new UI[item](this.editor); this.items[i].className += " edui-shortcutsubmenu "; } } } }, setOpacity: function(el, value) { if (browser.ie && browser.version < 9) { el.style.filter = "alpha(opacity = " + parseFloat(value) * 100 + ");"; } else { el.style.opacity = value; } }, getSubMenuMark: function() { isSubMenuShow = false; var layerEle = uiUtils.getFixedLayer(); var list = domUtils.getElementsByTagName(layerEle, "div", function(node) { return domUtils.hasClass(node, "edui-shortcutsubmenu edui-popup"); }); for (var i = 0, node; (node = list[i++]); ) { if (node.style.display != "none") { isSubMenuShow = true; } } return isSubMenuShow; }, show: function(e, hasContextmenu) { var me = this, offset = {}, el = this.getDom(), fixedlayer = uiUtils.getFixedLayer(); function setPos(offset) { if (offset.left < 0) { offset.left = 0; } if (offset.top < 0) { offset.top = 0; } el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; } function setPosByCxtMenu(menu) { if (!menu.tagName) { menu = menu.getDom(); } offset.left = parseInt(menu.style.left); offset.top = parseInt(menu.style.top); offset.top -= el.offsetHeight + 15; setPos(offset); } me.eventType = e.type; el.style.cssText = "display:block;left:-9999px"; if (e.type == "contextmenu" && hasContextmenu) { var menu = domUtils.getElementsByTagName( fixedlayer, "div", "edui-contextmenu" )[0]; if (menu) { setPosByCxtMenu(menu); } else { me.editor.addListener("aftershowcontextmenu", function(type, menu) { setPosByCxtMenu(menu); }); } } else { offset = uiUtils.getViewportOffsetByEvent(e); offset.top -= el.offsetHeight + me.SPACE; offset.left += me.SPACE + 20; setPos(offset); me.setOpacity(el, 0.2); } me.isHidden = false; me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; me.top = e.screenY - el.offsetHeight / 2 - me.SPACE; if (me.editor) { el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; fixedlayer.style.zIndex = el.style.zIndex - 1; } }, hide: function() { if (this.getDom()) { this.getDom().style.display = "none"; } this.isHidden = true; }, postRender: function() { if (utils.isArray(this.items)) { for (var i = 0, item; (item = this.items[i++]); ) { item.postRender(); } } }, getHtmlTpl: function() { var buff; if (utils.isArray(this.items)) { buff = []; for (var i = 0; i < this.items.length; i++) { buff[i] = this.items[i].renderHtml(); } buff = buff.join(""); } else { buff = this.items; } return ( '
" ); } }; utils.inherits(ShortCutMenu, UIBase); function hideAllMenu(e) { var tgt = e.target || e.srcElement, cur = domUtils.findParent( tgt, function(node) { return ( domUtils.hasClass(node, "edui-shortcutmenu") || domUtils.hasClass(node, "edui-popup") ); }, true ); if (!cur) { for (var i = 0, menu; (menu = allMenus[i++]); ) { menu.hide(); } } } domUtils.on(document, "mousedown", function(e) { hideAllMenu(e); }); domUtils.on(window, "scroll", function(e) { hideAllMenu(e); }); })();