///import core ///import uicore ///import ui\popup.js ///import ui\stateful.js (function() { var utils = baidu.editor.utils, domUtils = baidu.editor.dom.domUtils, uiUtils = baidu.editor.ui.uiUtils, UIBase = baidu.editor.ui.UIBase, Popup = baidu.editor.ui.Popup, Stateful = baidu.editor.ui.Stateful, CellAlignPicker = baidu.editor.ui.CellAlignPicker, Menu = (baidu.editor.ui.Menu = function(options) { this.initOptions(options); this.initMenu(); }); var menuSeparator = { renderHtml: function() { return '
'; }, postRender: function() {}, queryAutoHide: function() { return true; } }; Menu.prototype = { items: null, uiName: "menu", initMenu: function() { this.items = this.items || []; this.initPopup(); this.initItems(); }, initItems: function() { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item == "-") { this.items[i] = this.getSeparator(); } else if (!(item instanceof MenuItem)) { item.editor = this.editor; item.theme = this.editor.options.theme; this.items[i] = this.createItem(item); } } }, getSeparator: function() { return menuSeparator; }, createItem: function(item) { //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 item.menu = this; return new MenuItem(item); }, _Popup_getContentHtmlTpl: Popup.prototype.getContentHtmlTpl, getContentHtmlTpl: function() { if (this.items.length == 0) { return this._Popup_getContentHtmlTpl(); } var buff = []; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; buff[i] = item.renderHtml(); } return '
' + buff.join("") + "
"; }, _Popup_postRender: Popup.prototype.postRender, postRender: function() { var me = this; for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; item.ownerMenu = this; item.postRender(); } domUtils.on(this.getDom(), "mouseover", function(evt) { evt = evt || event; var rel = evt.relatedTarget || evt.fromElement; var el = me.getDom(); if (!uiUtils.contains(el, rel) && el !== rel) { me.fireEvent("over"); } }); this._Popup_postRender(); }, queryAutoHide: function(el) { if (el) { if (uiUtils.contains(this.getDom(), el)) { return false; } for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.queryAutoHide(el) === false) { return false; } } } }, clearItems: function() { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; clearTimeout(item._showingTimer); clearTimeout(item._closingTimer); if (item.subMenu) { item.subMenu.destroy(); } } this.items = []; }, destroy: function() { if (this.getDom()) { domUtils.remove(this.getDom()); } this.clearItems(); }, dispose: function() { this.destroy(); } }; utils.inherits(Menu, Popup); /** * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 * @type {Function} */ var MenuItem = (baidu.editor.ui.MenuItem = function(options) { this.initOptions(options); this.initUIBase(); this.Stateful_init(); if (this.subMenu && !(this.subMenu instanceof Menu)) { if (options.className && options.className.indexOf("aligntd") != -1) { var me = this; //获取单元格对齐初始状态 this.subMenu.selected = this.editor.queryCommandValue("cellalignment"); this.subMenu = new Popup({ content: new CellAlignPicker(this.subMenu), parentMenu: me, editor: me.editor, destroy: function() { if (this.getDom()) { domUtils.remove(this.getDom()); } } }); this.subMenu.addListener("postRenderAfter", function() { domUtils.on(this.getDom(), "mouseover", function() { me.addState("opened"); }); }); } else { this.subMenu = new Menu(this.subMenu); } } }); MenuItem.prototype = { label: "", subMenu: null, ownerMenu: null, uiName: "menuitem", alwalysHoverable: true, getHtmlTpl: function() { return ( '
' + '
' + this.renderLabelHtml() + "
" + "
" ); }, postRender: function() { var me = this; this.addListener("over", function() { me.ownerMenu.fireEvent("submenuover", me); if (me.subMenu) { me.delayShowSubMenu(); } }); if (this.subMenu) { this.getDom().className += " edui-hassubmenu"; this.subMenu.render(); this.addListener("out", function() { me.delayHideSubMenu(); }); this.subMenu.addListener("over", function() { clearTimeout(me._closingTimer); me._closingTimer = null; me.addState("opened"); }); this.ownerMenu.addListener("hide", function() { me.hideSubMenu(); }); this.ownerMenu.addListener("submenuover", function(t, subMenu) { if (subMenu !== me) { me.delayHideSubMenu(); } }); this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; this.subMenu.queryAutoHide = function(el) { if (el && uiUtils.contains(me.getDom(), el)) { return false; } return this._bakQueryAutoHide(el); }; } this.getDom().style.tabIndex = "-1"; uiUtils.makeUnselectable(this.getDom()); this.Stateful_postRender(); }, delayShowSubMenu: function() { var me = this; if (!me.isDisabled()) { me.addState("opened"); clearTimeout(me._showingTimer); clearTimeout(me._closingTimer); me._closingTimer = null; me._showingTimer = setTimeout(function() { me.showSubMenu(); }, 250); } }, delayHideSubMenu: function() { var me = this; if (!me.isDisabled()) { me.removeState("opened"); clearTimeout(me._showingTimer); if (!me._closingTimer) { me._closingTimer = setTimeout(function() { if (!me.hasState("opened")) { me.hideSubMenu(); } me._closingTimer = null; }, 400); } } }, renderLabelHtml: function() { return ( '
' + '
' + '
' + (this.label || "") + "
" ); }, getStateDom: function() { return this.getDom(); }, queryAutoHide: function(el) { if (this.subMenu && this.hasState("opened")) { return this.subMenu.queryAutoHide(el); } }, _onClick: function(event, this_) { if (this.hasState("disabled")) return; if (this.fireEvent("click", event, this_) !== false) { if (this.subMenu) { this.showSubMenu(); } else { Popup.postHide(event); } } }, showSubMenu: function() { var rect = uiUtils.getClientRect(this.getDom()); rect.right -= 5; rect.left += 2; rect.width -= 7; rect.top -= 4; rect.bottom += 4; rect.height += 8; this.subMenu.showAnchorRect(rect, true, true); }, hideSubMenu: function() { this.subMenu.hide(); } }; utils.inherits(MenuItem, UIBase); utils.extend(MenuItem.prototype, Stateful, true); })();