Menu.js 4.1 KB

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