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