Menu.js 4.3 KB

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