123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- (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);
- });
- }) ();
|