source: Dev/trunk/src/client/dojox/grid/enhanced/plugins/Menu.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 4.0 KB
Line 
1define([
2        "dojo/_base/declare",
3        "dojo/_base/array",
4        "dojo/_base/lang",
5        "dojo/_base/html",
6        "dojo/_base/event",
7        "dojo/keys",
8        "../_Plugin",
9        "../../EnhancedGrid"
10], function(declare, array, lang, html, evt, keys, _Plugin, EnhancedGrid){
11
12var Menu = declare("dojox.grid.enhanced.plugins.Menu", _Plugin, {
13        // summary:
14        //               Provides context menu support, including header menu, row menu, cell menu and selected region menu
15        // example:
16        // |    <div dojoType="dojox.grid.EnhancedGrid"
17        // |            plugins="{menus:{headerMenu:"headerMenuId", rowMenu:"rowMenuId", cellMenu:"cellMenuId",
18        // |                                               selectedRegionMenu:"selectedRegionMenuId"}}" ...>
19        // |    </div>
20       
21        // name: String
22        //              Plugin name
23        name: "menus",
24
25        // types: [const] String[]
26        //              menu types
27        types: ['headerMenu', 'rowMenu', 'cellMenu', 'selectedRegionMenu'],
28       
29        constructor: function(){
30                var g = this.grid;
31                g.showMenu = lang.hitch(g, this.showMenu);
32                g._setRowMenuAttr = lang.hitch(this, '_setRowMenuAttr');
33                g._setCellMenuAttr = lang.hitch(this, '_setCellMenuAttr');
34                g._setSelectedRegionMenuAttr = lang.hitch(this, '_setSelectedRegionMenuAttr');
35        },
36        onStartUp: function(){
37                var type, option = this.option;
38                for(type in option){
39                        if(array.indexOf(this.types, type) >= 0 && option[type]){
40                                this._initMenu(type, option[type]);
41                        }
42                }
43        },
44        _initMenu: function(/*String*/ menuType, /*String|dijit/Menu*/ menu){
45                var g = this.grid;
46                if(!g[menuType]){//in case already created in _Grid.postCreate()
47                        var m = this._getMenuWidget(menu);
48                        if(!m){return;}
49                        g.set(menuType, m);
50                        if(menuType != "headerMenu"){
51                                m._scheduleOpen = function(){return;};
52                        }else{
53                                g.setupHeaderMenu();
54                        }
55                }
56        },
57        _getMenuWidget: function(/*String|Widget(dijit.Menu)*/menu){
58                // summary:
59                //              Fetch the required menu widget(should already been created)
60                return (menu instanceof dijit.Menu) ? menu : dijit.byId(menu);
61        },
62        _setRowMenuAttr: function(/*Widget(dijit.Menu)*/menu){
63                // summary:
64                //              Set row menu widget
65                this._setMenuAttr(menu, 'rowMenu');
66        },
67        _setCellMenuAttr: function(/*Widget(dijit.Menu)*/menu){
68                // summary:
69                //              Set cell menu widget
70                this._setMenuAttr(menu, 'cellMenu');
71        },
72        _setSelectedRegionMenuAttr: function(/*Widget(dijit.Menu)*/menu){
73                // summary:
74                //              Set row menu widget
75                this._setMenuAttr(menu, 'selectedRegionMenu');
76        },
77        _setMenuAttr: function(/*Widget(dijit.Menu)*/menu, /*String*/menuType){
78                // summary:
79                //              Bind menus to Grid.
80                var g = this.grid, n = g.domNode;
81                if(!menu || !(menu instanceof dijit.Menu)){
82                        console.warn(menuType, " of Grid ", g.id, " is not existed!");
83                        return;
84                }
85                if(g[menuType]){
86                        g[menuType].unBindDomNode(n);
87                }
88                g[menuType] = menu;
89                g[menuType].bindDomNode(n);
90        },
91        showMenu: function(/*Event*/e){
92                // summary:
93                //              Show appropriate context menu
94                //              Fired from dojox.grid.enhanced._Events.onRowContextMenu, 'this' scope - Grid
95
96                // TODO: test Shift-F10
97
98                var inSelectedRegion = (e.cellNode && html.hasClass(e.cellNode, 'dojoxGridRowSelected') ||
99                        e.rowNode && (html.hasClass(e.rowNode, 'dojoxGridRowSelected') || html.hasClass(e.rowNode, 'dojoxGridRowbarSelected')));
100               
101                if(inSelectedRegion && this.selectedRegionMenu){
102                        this.onSelectedRegionContextMenu(e);
103                        return;
104                }
105               
106                var info = {target: e.target, coords: e.keyCode !== keys.F10 && "pageX" in e ? {x: e.pageX, y: e.pageY } : null};
107                if(this.rowMenu && (!this.cellMenu || this.selection.isSelected(e.rowIndex) || e.rowNode && html.hasClass(e.rowNode, 'dojoxGridRowbar'))){
108                        this.rowMenu._openMyself(info);
109                        evt.stop(e);
110                        return;
111                }
112
113                if(this.cellMenu){
114                        this.cellMenu._openMyself(info);
115                }
116                evt.stop(e);
117        },
118        destroy: function(){
119                // summary:
120                //              Destroy all resources.
121                //              _Grid.destroy() will unbind headerMenu
122                var g = this.grid;
123                if(g.headerMenu){g.headerMenu.unBindDomNode(g.viewsHeaderNode);}
124                if(g.rowMenu){g.rowMenu.unBindDomNode(g.domNode);}
125                if(g.cellMenu){g.cellMenu.unBindDomNode(g.domNode);}
126                if(g.selectedRegionMenu){g.selectedRegionMenu.destroy();}
127                this.inherited(arguments);
128        }
129});
130
131EnhancedGrid.registerPlugin(Menu/*name:'menus'*/);
132
133return Menu;
134
135});
Note: See TracBrowser for help on using the repository browser.