123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- ///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) {
- 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);
- 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 = 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);
- })();
|