为extjs的TabPanel 添加右键关闭效果(修改一个bug)

效果图如下:

因为我用的是extjs-4.2.1.883 这个版本,右键菜单的相关源代码需要在发布包下的源代码(examples\ux)下去查找(Ext.ux.BoxReorderer,Ext.ux.TabCloseMenu,Ext.ux.TabReorderer,Ext.ux.TabScrollerMenu)

在首页面配置路径:

Ext.Loader.setConfig({
    enabled: true,
    paths: {
        ‘Ext.app‘: ‘../../extjs4.2/examples/portal/classes‘,
        ‘Ext.ux‘: ‘../../extjs4.2/examples/ux‘
    }
});

添加代码如下:

 {
                                itemId: ‘contentTab‘,
                                xtype: ‘tabpanel‘,
                                region: ‘center‘,
                                margin: ‘2 2 2 0‘,
                                layout: ‘border‘,
                                items: [{
                                    xtype: ‘main‘,
                                    title: ‘首页‘,
                                    region: ‘center‘
                                }],
                                plugins: new Ext.create(‘Ext.ux.TabCloseMenu‘,{
                                    closeTabText: ‘关闭面板‘,
                                    closeOthersTabsText: ‘关闭其他‘,
                                    closeAllTabsText: ‘关闭所有‘
                                })
                            }

右键菜单效果有了,可是我发现只有关闭所有这个菜单项有效,后面debug了下,发现不能保存当前选中标签页的item值,修改下Ext.ux.TabCloseMenu源代码就可以了(添加了个ctab变量来保存item变量的值)

/**
 * Plugin 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.
 */
Ext.define(‘Ext.ux.TabCloseMenu‘, {
    alias: ‘plugin.tabclosemenu‘,
    mixins: {
        observable: ‘Ext.util.Observable‘
    },
    /**
     * @cfg {String} closeTabText
     * The text for closing the current tab.
     */
    closeTabText: ‘Close Tab‘,
    /**
     * @cfg {Boolean} showCloseOthers
     * Indicates whether to show the ‘Close Others‘ option.
     */
    showCloseOthers: true,
    /**
     * @cfg {String} closeOthersTabsText
     * The text for closing all tabs except the current one.
     */
    closeOthersTabsText: ‘Close Other Tabs‘,
    /**
     * @cfg {Boolean} showCloseAll
     * Indicates whether to show the ‘Close All‘ option.
     */
    showCloseAll: true,
    /**
     * @cfg {String} closeAllTabsText
     * The text for closing 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: ‘.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);
        me.ctab=me.item;
        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);
        this.tabPanel.remove(this.ctab);
    },
    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);
                }*/
                if(!excludeActive || item != this.ctab){
                    items.push(item);
                }
            }
        }, this);
        Ext.each(items, function(item){
            this.tabPanel.remove(item);
        }, this);
    }
});

修改后,重新发布,搞定收工!

时间: 2024-10-13 20:55:42

为extjs的TabPanel 添加右键关闭效果(修改一个bug)的相关文章

Arcengine 二次开发添加右键菜单

最近在搞arcengine 二次开发,遇到了好多问题,也通过网上查资料试着慢慢解决了,把解决的步骤记录下来,有需要帮助的可以看一下,也欢迎各位来批评指正. 想给自己的map application在图层上添加右键菜单,谷歌了一下,找到了解决的方法,原文的地址edndoc.esri.com/arcobjects/9.2/NET/1ED14BF2-A0E3-4e56-A70D-B9A7F7EC7880.htm.然后我根据这个添加了自己的右键菜单,又有一些改动. 效果如图所示(有点简陋),仅仅是简单的

Datagrid添加右键菜单

最近的一个项目前台使用的EasyUI,每个界面都有DataGrid控件,按照我们的想法,应该做出来的效果是单击选中,双击可编辑,当然右键也应该出现这些菜单按钮,想的挺好,那么该如何实现呢?一开始不知道如何下手,查了一些资料,也走了很多弯路,主要是查到代码以后不知道写在哪里..导致弄了一天也没有做出来,后来换了一个思路,终于完成了. 首先建一个DataGrid的表格,我是在EasyUI官网上的Demo里面找的行编辑的代码来用,效果如下,单击可以进行行编辑,不过这不是咱们需要的主要功能,咱们需要的知

XP下,文件夹添加右键命令行

原文:XP下,文件夹添加右键命令行 总共有3种方式: --------------------1-------------------------------------------------------- 很多人都很喜欢在CMD命令行下来操作计算机,我也是其中之一.如何快速打开CMD并且定位到指定的路径呢?很多优化软件(比如优化大师)都提供了往右键菜单中加入“CMD快速通道”的功能,当右键点击文件夹时,就打开CMD并定位到该文件夹.网上也有修改注册表来实现的,其实根本不用这么麻烦. 打开“我

VSIX项目,添加右键菜单(二)

1.新建VSIX项目后,里边基本什么都没有 项目上右击,添加新建项 随便起一个名字,例如我的是  RightCmd 2.里边有一个vsct的文件,这个文件相当于MVC里的html,是用于配置显示的. 打开它,里边前几行,有一个引入的文件,vsshlids.h,这个文件,你可以去      项目路径\packages\Microsoft.VSSDK.BuildTools.14.3.25407\tools\vssdk\inc   (注意版本号)下找,里边是vs自带的命令 其中比较关键的几个 guid

给jquery easy-ui 添加右键菜单

版权声明:转自为EasyUI 的Tab 标签添加右键菜单 1 <!doctype html> 2 <html> 3 <head> 4 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 <title>tabs 右键菜单demo QQ:15129679</title> 6 <link rel="

dev gridcontrol添加右键菜单

概述:右键菜单肯定是GridView中经常要使用的一个功能.本文主要描述两个方面:如何在GridView中添加右键菜单,以及如何设置菜单是否可用(enable). 右键菜单肯定是gridview中经常要使用的一个功能.本文主要描述两个方面:如何在GridView中添加右键菜单,以及如何设置菜单是否可用(enable). 一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,

c#如何仅在datatgirdview控件的头部(列名处)添加右键菜单

近期在弄ArcgisAE实习,其中有一个功能是需要操作图层的属性字段的,为了方便操作图层的属性,最好是在图层的属性表中,也就是在显示图层属性的DataGirdView控件的头部添加一个右键菜单来实现相应的功能. 在c#中有个有一个右键菜单的组建contextMenuStrip,在这个控件里面可以添加一些处理属性字段的功能,然后将这个控件赋予给DataGirdView的contextMenuStrip属性就可以了,然而这种方式在DataGirdView控件的任何地方都会将这个右键菜单显示出来,在行

Sublime Text3:添加右键用Sublime Text3 打开文件和文件夹

最近重新装了一下系统,之前安装好的Sublime Text倒是还能用,但是右键没有用Sublime Text 3打开的选项了,于是查了一下解决方案 环境 Win10和Win7都可以 Sublime Text 3最新版本 添加右键打开文件 Win + R,输入regedit,打开注册表 找到HKEY_CLASSESS_ROOT*\Shell, 右击新建项,命名为Sublime Text 3(这里的名字决定在文件上右击,显示的内容),效果如下: 在新建的项Sublime Text 3下,新建字符串值

添加右键菜单

有时我们安装绿色版的软件常常是没有右键菜单的,但是对于一些常用的软件,我们需要添加右键菜单,添加方法,打开记事本,复制以下内容,按照自己的需要修改下所在软件的路径将txt另存为bat格式,双击即可: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\PotPlayer] @="Open with PotPlayer" "Icon"="E:\\Program Files (x86)