MenuMgr.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:5k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.menu.MenuMgr
  9.  * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
  10.  * @singleton
  11.  */
  12. Ext.menu.MenuMgr = function(){
  13.    var menus, active, groups = {}, attached = false, lastShow = new Date();
  14.    // private - called when first menu is created
  15.    function init(){
  16.        menus = {};
  17.        active = new Ext.util.MixedCollection();
  18.        Ext.getDoc().addKeyListener(27, function(){
  19.            if(active.length > 0){
  20.                hideAll();
  21.            }
  22.        });
  23.    }
  24.    // private
  25.    function hideAll(){
  26.        if(active && active.length > 0){
  27.            var c = active.clone();
  28.            c.each(function(m){
  29.                m.hide();
  30.            });
  31.            return true;
  32.        }
  33.        return false;
  34.    }
  35.    // private
  36.    function onHide(m){
  37.        active.remove(m);
  38.        if(active.length < 1){
  39.            Ext.getDoc().un("mousedown", onMouseDown);
  40.            attached = false;
  41.        }
  42.    }
  43.    // private
  44.    function onShow(m){
  45.        var last = active.last();
  46.        lastShow = new Date();
  47.        active.add(m);
  48.        if(!attached){
  49.            Ext.getDoc().on("mousedown", onMouseDown);
  50.            attached = true;
  51.        }
  52.        if(m.parentMenu){
  53.           m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
  54.           m.parentMenu.activeChild = m;
  55.        }else if(last && last.isVisible()){
  56.           m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
  57.        }
  58.    }
  59.    // private
  60.    function onBeforeHide(m){
  61.        if(m.activeChild){
  62.            m.activeChild.hide();
  63.        }
  64.        if(m.autoHideTimer){
  65.            clearTimeout(m.autoHideTimer);
  66.            delete m.autoHideTimer;
  67.        }
  68.    }
  69.    // private
  70.    function onBeforeShow(m){
  71.        var pm = m.parentMenu;
  72.        if(!pm && !m.allowOtherMenus){
  73.            hideAll();
  74.        }else if(pm && pm.activeChild){
  75.            pm.activeChild.hide();
  76.        }
  77.    }
  78.    // private
  79.    function onMouseDown(e){
  80.        if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
  81.            hideAll();
  82.        }
  83.    }
  84.    // private
  85.    function onBeforeCheck(mi, state){
  86.        if(state){
  87.            var g = groups[mi.group];
  88.            for(var i = 0, l = g.length; i < l; i++){
  89.                if(g[i] != mi){
  90.                    g[i].setChecked(false);
  91.                }
  92.            }
  93.        }
  94.    }
  95.    return {
  96.        /**
  97.         * Hides all menus that are currently visible
  98.         * @return {Boolean} success True if any active menus were hidden.
  99.         */
  100.        hideAll : function(){
  101.             return hideAll();  
  102.        },
  103.        // private
  104.        register : function(menu){
  105.            if(!menus){
  106.                init();
  107.            }
  108.            menus[menu.id] = menu;
  109.            menu.on({
  110.                beforehide: onBeforeHide,
  111.                hide: onHide,
  112.                beforeshow: onBeforeShow,
  113.                show: onShow
  114.            });
  115.        },
  116.         /**
  117.          * Returns a {@link Ext.menu.Menu} object
  118.          * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
  119.          * be used to generate and return a new Menu instance.
  120.          * @return {Ext.menu.Menu} The specified menu, or null if none are found
  121.          */
  122.        get : function(menu){
  123.            if(typeof menu == "string"){ // menu id
  124.                if(!menus){  // not initialized, no menus to return
  125.                    return null;
  126.                }
  127.                return menus[menu];
  128.            }else if(menu.events){  // menu instance
  129.                return menu;
  130.            }else if(typeof menu.length == 'number'){ // array of menu items?
  131.                return new Ext.menu.Menu({items:menu});
  132.            }else{ // otherwise, must be a config
  133.                return Ext.create(menu, 'menu');
  134.            }
  135.        },
  136.        // private
  137.        unregister : function(menu){
  138.            delete menus[menu.id];
  139.            menu.un("beforehide", onBeforeHide);
  140.            menu.un("hide", onHide);
  141.            menu.un("beforeshow", onBeforeShow);
  142.            menu.un("show", onShow);
  143.        },
  144.        // private
  145.        registerCheckable : function(menuItem){
  146.            var g = menuItem.group;
  147.            if(g){
  148.                if(!groups[g]){
  149.                    groups[g] = [];
  150.                }
  151.                groups[g].push(menuItem);
  152.                menuItem.on("beforecheckchange", onBeforeCheck);
  153.            }
  154.        },
  155.        // private
  156.        unregisterCheckable : function(menuItem){
  157.            var g = menuItem.group;
  158.            if(g){
  159.                groups[g].remove(menuItem);
  160.                menuItem.un("beforecheckchange", onBeforeCheck);
  161.            }
  162.        },
  163.        getCheckedItem : function(groupId){
  164.            var g = groups[groupId];
  165.            if(g){
  166.                for(var i = 0, l = g.length; i < l; i++){
  167.                    if(g[i].checked){
  168.                        return g[i];
  169.                    }
  170.                }
  171.            }
  172.            return null;
  173.        },
  174.        setCheckedItem : function(groupId, itemId){
  175.            var g = groups[groupId];
  176.            if(g){
  177.                for(var i = 0, l = g.length; i < l; i++){
  178.                    if(g[i].id == itemId){
  179.                        g[i].setChecked(true);
  180.                    }
  181.                }
  182.            }
  183.            return null;
  184.        }
  185.    };
  186. }();