1 | define([ |
---|
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 | |
---|
12 | var 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 | |
---|
131 | EnhancedGrid.registerPlugin(Menu/*name:'menus'*/); |
---|
132 | |
---|
133 | return Menu; |
---|
134 | |
---|
135 | }); |
---|