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