X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/2e847cf21b8ab9d15fa167b315ca5b2fa92638fc..7a654f8d43fdb43d78b63d90528bed6e86b608cc:/examples/ux/TabCloseMenu.js diff --git a/examples/ux/TabCloseMenu.js b/examples/ux/TabCloseMenu.js index 559f2c9c..a896450d 100644 --- a/examples/ux/TabCloseMenu.js +++ b/examples/ux/TabCloseMenu.js @@ -1,58 +1,217 @@ -/*! - * Ext JS Library 3.1.1 - * Copyright(c) 2006-2010 Ext JS, LLC - * licensing@extjs.com - * http://www.extjs.com/license +/** + * @class Ext.ux.TabCloseMenu + * Plugin (ptype = 'tabclosemenu') for adding a close context menu to tabs. Note that the menu respects + * the closable configuration on the tab. As such, commands like remove others and remove all will not + * remove items that are not closable. + * + * @constructor + * @param {Object} config The configuration options + * @ptype tabclosemenu */ -/** - * @class Ext.ux.TabCloseMenu - * @extends Object - * Plugin (ptype = 'tabclosemenu') for adding a close context menu to tabs. - * - * @ptype tabclosemenu - */ -Ext.ux.TabCloseMenu = function(){ - var tabs, menu, ctxItem; - this.init = function(tp){ - tabs = tp; - tabs.on('contextmenu', onContextMenu); - }; - - function onContextMenu(ts, item, e){ - if(!menu){ // create context menu on first right click - menu = new Ext.menu.Menu({ - items: [{ - id: tabs.id + '-close', - text: 'Close Tab', - handler : function(){ - tabs.remove(ctxItem); - } - },{ - id: tabs.id + '-close-others', - text: 'Close Other Tabs', - handler : function(){ - tabs.items.each(function(item){ - if(item.closable && item != ctxItem){ - tabs.remove(item); - } - }); - } - }]}); - } - ctxItem = item; - var items = menu.items; - items.get(tabs.id + '-close').setDisabled(!item.closable); - var disableOthers = true; - tabs.items.each(function(){ - if(this != item && this.closable){ - disableOthers = false; - return false; - } - }); - items.get(tabs.id + '-close-others').setDisabled(disableOthers); - e.stopEvent(); - menu.showAt(e.getPoint()); - } -}; - -Ext.preg('tabclosemenu', Ext.ux.TabCloseMenu); +Ext.define('Ext.tab.TabCloseMenu', { + alias: 'plugin.tabclosemenu', + alternateClassName: 'Ext.ux.TabCloseMenu', + + mixins: { + observable: 'Ext.util.Observable' + }, + + /** + * @cfg {String} closeTabText + * The text for closing the current tab. Defaults to 'Close Tab'. + */ + closeTabText: 'Close Tab', + + /** + * @cfg {Boolean} showCloseOthers + * Indicates whether to show the 'Close Others' option. Defaults to true. + */ + showCloseOthers: true, + + /** + * @cfg {String} closeOtherTabsText + * The text for closing all tabs except the current one. Defaults to 'Close Other Tabs'. + */ + closeOthersTabsText: 'Close Other Tabs', + + /** + * @cfg {Boolean} showCloseAll + * Indicates whether to show the 'Close All' option. Defaults to true. + */ + showCloseAll: true, + + /** + * @cfg {String} closeAllTabsText + *

The text for closing all tabs. Defaults to 'Close All Tabs'. + */ + closeAllTabsText: 'Close All Tabs', + + /** + * @cfg {Array} extraItemsHead + * An array of additional context menu items to add to the front of the context menu. + */ + extraItemsHead: null, + + /** + * @cfg {Array} extraItemsTail + * An array of additional context menu items to add to the end of the context menu. + */ + extraItemsTail: null, + + //public + constructor: function (config) { + this.addEvents( + 'aftermenu', + 'beforemenu'); + + this.mixins.observable.constructor.call(this, config); + }, + + init : function(tabpanel){ + this.tabPanel = tabpanel; + this.tabBar = tabpanel.down("tabbar"); + + this.mon(this.tabPanel, { + scope: this, + afterlayout: this.onAfterLayout, + single: true + }); + }, + + onAfterLayout: function() { + this.mon(this.tabBar.el, { + scope: this, + contextmenu: this.onContextMenu, + delegate: 'div.x-tab' + }); + }, + + onBeforeDestroy : function(){ + Ext.destroy(this.menu); + this.callParent(arguments); + }, + + // private + onContextMenu : function(event, target){ + var me = this, + menu = me.createMenu(), + disableAll = true, + disableOthers = true, + tab = me.tabBar.getChildByElement(target), + index = me.tabBar.items.indexOf(tab); + + me.item = me.tabPanel.getComponent(index); + menu.child('*[text="' + me.closeTabText + '"]').setDisabled(!me.item.closable); + + if (me.showCloseAll || me.showCloseOthers) { + me.tabPanel.items.each(function(item) { + if (item.closable) { + disableAll = false; + if (item != me.item) { + disableOthers = false; + return false; + } + } + return true; + }); + + if (me.showCloseAll) { + menu.child('*[text="' + me.closeAllTabsText + '"]').setDisabled(disableAll); + } + + if (me.showCloseOthers) { + menu.child('*[text="' + me.closeOthersTabsText + '"]').setDisabled(disableOthers); + } + } + + event.preventDefault(); + me.fireEvent('beforemenu', menu, me.item, me); + + menu.showAt(event.getXY()); + }, + + createMenu : function() { + var me = this; + + if (!me.menu) { + var items = [{ + text: me.closeTabText, + scope: me, + handler: me.onClose + }]; + + if (me.showCloseAll || me.showCloseOthers) { + items.push('-'); + } + + if (me.showCloseOthers) { + items.push({ + text: me.closeOthersTabsText, + scope: me, + handler: me.onCloseOthers + }); + } + + if (me.showCloseAll) { + items.push({ + text: me.closeAllTabsText, + scope: me, + handler: me.onCloseAll + }); + } + + if (me.extraItemsHead) { + items = me.extraItemsHead.concat(items); + } + + if (me.extraItemsTail) { + items = items.concat(me.extraItemsTail); + } + + me.menu = Ext.create('Ext.menu.Menu', { + items: items, + listeners: { + hide: me.onHideMenu, + scope: me + } + }); + } + + return me.menu; + }, + + onHideMenu: function () { + var me = this; + + me.item = null; + me.fireEvent('aftermenu', me.menu, me); + }, + + onClose : function(){ + this.tabPanel.remove(this.item); + }, + + onCloseOthers : function(){ + this.doClose(true); + }, + + onCloseAll : function(){ + this.doClose(false); + }, + + doClose : function(excludeActive){ + var items = []; + + this.tabPanel.items.each(function(item){ + if(item.closable){ + if(!excludeActive || item != this.item){ + items.push(item); + } + } + }, this); + + Ext.each(items, function(item){ + this.tabPanel.remove(item); + }, this); + } +});