123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- ///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 '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>';
- },
- 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 '<div class="%%-body">' + buff.join("") + "</div>";
- },
- _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 (
- '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);">' +
- '<div class="%%-body">' +
- this.renderLabelHtml() +
- "</div>" +
- "</div>"
- );
- },
- 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 (
- '<div class="edui-arrow"></div>' +
- '<div class="edui-box edui-icon"></div>' +
- '<div class="edui-box edui-label %%-label">' +
- (this.label || "") +
- "</div>"
- );
- },
- 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);
- })();
|