MenuMgr.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:6k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.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.        }
  32.    }
  33.    // private
  34.    function onHide(m){
  35.        active.remove(m);
  36.        if(active.length < 1){
  37.            Ext.getDoc().un("mousedown", onMouseDown);
  38.            attached = false;
  39.        }
  40.    }
  41.    // private
  42.    function onShow(m){
  43.        var last = active.last();
  44.        lastShow = new Date();
  45.        active.add(m);
  46.        if(!attached){
  47.            Ext.getDoc().on("mousedown", onMouseDown);
  48.            attached = true;
  49.        }
  50.        if(m.parentMenu){
  51.           m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
  52.           m.parentMenu.activeChild = m;
  53.        }else if(last && last.isVisible()){
  54.           m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
  55.        }
  56.    }
  57.    // private
  58.    function onBeforeHide(m){
  59.        if(m.activeChild){
  60.            m.activeChild.hide();
  61.        }
  62.        if(m.autoHideTimer){
  63.            clearTimeout(m.autoHideTimer);
  64.            delete m.autoHideTimer;
  65.        }
  66.    }
  67.    // private
  68.    function onBeforeShow(m){
  69.        var pm = m.parentMenu;
  70.        if(!pm && !m.allowOtherMenus){
  71.            hideAll();
  72.        }else if(pm && pm.activeChild){
  73.            pm.activeChild.hide();
  74.        }
  75.    }
  76.    // private
  77.    function onMouseDown(e){
  78.        if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){
  79.            hideAll();
  80.        }
  81.    }
  82.    // private
  83.    function onBeforeCheck(mi, state){
  84.        if(state){
  85.            var g = groups[mi.group];
  86.            for(var i = 0, l = g.length; i < l; i++){
  87.                if(g[i] != mi){
  88.                    g[i].setChecked(false);
  89.                }
  90.            }
  91.        }
  92.    }
  93.    return {
  94.        /**
  95.         * Hides all menus that are currently visible
  96.         */
  97.        hideAll : function(){
  98.             hideAll();  
  99.        },
  100.        // private
  101.        register : function(menu){
  102.            if(!menus){
  103.                init();
  104.            }
  105.            menus[menu.id] = menu;
  106.            menu.on("beforehide", onBeforeHide);
  107.            menu.on("hide", onHide);
  108.            menu.on("beforeshow", onBeforeShow);
  109.            menu.on("show", onShow);
  110.            var g = menu.group;
  111.            if(g && menu.events["checkchange"]){
  112.                if(!groups[g]){
  113.                    groups[g] = [];
  114.                }
  115.                groups[g].push(menu);
  116.                menu.on("checkchange", onCheck);
  117.            }
  118.        },
  119.         /**
  120.          * Returns a {@link Ext.menu.Menu} object
  121.          * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
  122.          * be used to generate and return a new Menu instance.
  123.          * @return {Ext.menu.Menu} The specified menu, or null if none are found
  124.          */
  125.        get : function(menu){
  126.            if(typeof menu == "string"){ // menu id
  127.                if(!menus){  // not initialized, no menus to return
  128.                    return null;
  129.                }
  130.                return menus[menu];
  131.            }else if(menu.events){  // menu instance
  132.                return menu;
  133.            }else if(typeof menu.length == 'number'){ // array of menu items?
  134.                return new Ext.menu.Menu({items:menu});
  135.            }else{ // otherwise, must be a config
  136.                return Ext.create(menu, 'menu');
  137.            }
  138.        },
  139.        // private
  140.        unregister : function(menu){
  141.            delete menus[menu.id];
  142.            menu.un("beforehide", onBeforeHide);
  143.            menu.un("hide", onHide);
  144.            menu.un("beforeshow", onBeforeShow);
  145.            menu.un("show", onShow);
  146.            var g = menu.group;
  147.            if(g && menu.events["checkchange"]){
  148.                groups[g].remove(menu);
  149.                menu.un("checkchange", onCheck);
  150.            }
  151.        },
  152.        // private
  153.        registerCheckable : function(menuItem){
  154.            var g = menuItem.group;
  155.            if(g){
  156.                if(!groups[g]){
  157.                    groups[g] = [];
  158.                }
  159.                groups[g].push(menuItem);
  160.                menuItem.on("beforecheckchange", onBeforeCheck);
  161.            }
  162.        },
  163.        // private
  164.        unregisterCheckable : function(menuItem){
  165.            var g = menuItem.group;
  166.            if(g){
  167.                groups[g].remove(menuItem);
  168.                menuItem.un("beforecheckchange", onBeforeCheck);
  169.            }
  170.        },
  171.        getCheckedItem : function(groupId){
  172.            var g = groups[groupId];
  173.            if(g){
  174.                for(var i = 0, l = g.length; i < l; i++){
  175.                    if(g[i].checked){
  176.                        return g[i];
  177.                    }
  178.                }
  179.            }
  180.            return null;
  181.        },
  182.        setCheckedItem : function(groupId, itemId){
  183.            var g = groups[groupId];
  184.            if(g){
  185.                for(var i = 0, l = g.length; i < l; i++){
  186.                    if(g[i].id == itemId){
  187.                        g[i].setChecked(true);
  188.                    }
  189.                }
  190.            }
  191.            return null;
  192.        }
  193.    };
  194. }();