Fix #6913 - add more documentation to code
[roojs1] / Roo / bootstrap / menu / Manager.js
1 /**
2  * @class Roo.bootstrap.MenuMgr
3  * @licence LGPL
4  * Provides a common registry of all menu items on a page so that they can be easily accessed by id.
5  * @static
6  */
7 Roo.bootstrap.menu.Manager = function(){
8    var menus, active, groups = {}, attached = false, lastShow = new Date();
9
10    // private - called when first menu is created
11    function init(){
12        menus = {};
13        active = new Roo.util.MixedCollection();
14        Roo.get(document).addKeyListener(27, function(){
15            if(active.length > 0){
16                hideAll();
17            }
18        });
19    }
20
21    // private
22    function hideAll(){
23        if(active && active.length > 0){
24            var c = active.clone();
25            c.each(function(m){
26                m.hide();
27            });
28        }
29    }
30
31    // private
32    function onHide(m){
33        active.remove(m);
34        if(active.length < 1){
35            Roo.get(document).un("mouseup", onMouseDown);
36             
37            attached = false;
38        }
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           Roo.get(document).on("mouseup", onMouseDown);
48            
49            attached = true;
50        }
51        if(m.parentMenu){
52           //m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);
53           m.parentMenu.activeChild = m;
54        }else if(last && last.isVisible()){
55           //m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);
56        }
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
70    // private
71    function onBeforeShow(m){
72        var pm = m.parentMenu;
73        if(!pm && !m.allowOtherMenus){
74            hideAll();
75        }else if(pm && pm.activeChild && active != m){
76            pm.activeChild.hide();
77        }
78    }
79
80    // private this should really trigger on mouseup..
81    function onMouseDown(e){
82         Roo.log("on Mouse Up");
83         
84         if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".dropdown-menu") && !e.getTarget('.user-menu')){
85             Roo.log("MenuManager hideAll");
86             hideAll();
87             e.stopEvent();
88         }
89         
90         
91    }
92
93    // private
94    function onBeforeCheck(mi, state){
95        if(state){
96            var g = groups[mi.group];
97            for(var i = 0, l = g.length; i < l; i++){
98                if(g[i] != mi){
99                    g[i].setChecked(false);
100                }
101            }
102        }
103    }
104
105    return {
106
107        /**
108         * Hides all menus that are currently visible
109         */
110        hideAll : function(){
111             hideAll();  
112        },
113
114        // private
115        register : function(menu){
116            if(!menus){
117                init();
118            }
119            menus[menu.id] = menu;
120            menu.on("beforehide", onBeforeHide);
121            menu.on("hide", onHide);
122            menu.on("beforeshow", onBeforeShow);
123            menu.on("show", onShow);
124            var g = menu.group;
125            if(g && menu.events["checkchange"]){
126                if(!groups[g]){
127                    groups[g] = [];
128                }
129                groups[g].push(menu);
130                menu.on("checkchange", onCheck);
131            }
132        },
133
134         /**
135          * Returns a {@link Roo.menu.Menu} object
136          * @param {String/Object} menu The string menu id, an existing menu object reference, or a Menu config that will
137          * be used to generate and return a new Menu instance.
138          */
139        get : function(menu){
140            if(typeof menu == "string"){ // menu id
141                return menus[menu];
142            }else if(menu.events){  // menu instance
143                return menu;
144            }
145            /*else if(typeof menu.length == 'number'){ // array of menu items?
146                return new Roo.bootstrap.Menu({items:menu});
147            }else{ // otherwise, must be a config
148                return new Roo.bootstrap.Menu(menu);
149            }
150            */
151            return false;
152        },
153
154        // private
155        unregister : function(menu){
156            delete menus[menu.id];
157            menu.un("beforehide", onBeforeHide);
158            menu.un("hide", onHide);
159            menu.un("beforeshow", onBeforeShow);
160            menu.un("show", onShow);
161            var g = menu.group;
162            if(g && menu.events["checkchange"]){
163                groups[g].remove(menu);
164                menu.un("checkchange", onCheck);
165            }
166        },
167
168        // private
169        registerCheckable : function(menuItem){
170            var g = menuItem.group;
171            if(g){
172                if(!groups[g]){
173                    groups[g] = [];
174                }
175                groups[g].push(menuItem);
176                menuItem.on("beforecheckchange", onBeforeCheck);
177            }
178        },
179
180        // private
181        unregisterCheckable : function(menuItem){
182            var g = menuItem.group;
183            if(g){
184                groups[g].remove(menuItem);
185                menuItem.un("beforecheckchange", onBeforeCheck);
186            }
187        }
188    };
189 }();