123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- (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 (
- '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' +
- buff +
- "</div>"
- );
- }
- };
- 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);
- });
- })();
|