render-contextMenu.xslt 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. Licensed Materials - Property of IBM
  4. IBM Cognos Products: HTS
  5. (C) Copyright IBM Corp. 2005, 2010
  6. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  7. -->
  8. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xtsext="xalan://com.cognos.xts.ext.XTSExt">
  9. <xsl:import href="render-menu.xslt"/>
  10. <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
  11. <xsl:template match="/">
  12. <xsl:call-template name="renderContextMenu"/>
  13. </xsl:template>
  14. <xsl:template name="renderContextMenu">
  15. <xsl:param name="contextMenus" select="/root/input/contextMenu"/>
  16. <script type="text/javascript">
  17. //may not be needed!!!
  18. document.body.onclick = _THIS_conextMenuHide;
  19. var newdiv;
  20. function _THIS_showContextMenu(evt, task_id) {
  21. _THIS_conextMenuHide();
  22. contextMenuTaskId = task_id;
  23. //get the event in a cross-browser fashion
  24. evt = (evt) ? evt : ((event) ? event : null);
  25. evt.cancelBubble = true;
  26. var pos_x = 0;
  27. var pos_y = 0;
  28. if (evt.pageX) {
  29. pos_x = evt.pageX;
  30. pos_y = evt.pageY;
  31. } else if (evt.clientX) {
  32. pos_x = evt.clientX;
  33. pos_y = evt.clientY;
  34. }
  35. newdiv = document.createElement('div');
  36. newdiv.style.position= "absolute";
  37. //cater for scrolling.. Those figures are to make sure that IE and FF behave the same.
  38. var scrollX = getScrollPosX(document.body) - (document.all?4:2);
  39. var scrollY = getScrollPosY(document.body) * (document.all?2:1) - (document.all?15:1);
  40. newdiv.style.left = pos_x + scrollX;
  41. newdiv.style.top = pos_y + scrollY;
  42. newdiv.style.display = 'block';
  43. newdiv.style.height = 1;
  44. newdiv.style.width = 1;
  45. newdiv.onclick= showMenu;
  46. document.body.appendChild(newdiv);
  47. fireClickEvent(newdiv);
  48. }
  49. function fireClickEvent(control) {
  50. if (document.all) {
  51. var evt=window.document.createEventObject();
  52. control.fireEvent("onclick",evt);
  53. }
  54. else {
  55. var clickEvent = window.document.createEvent("MouseEvent");
  56. clickEvent.initEvent("click", false, true);
  57. control.dispatchEvent(clickEvent);
  58. }
  59. }
  60. function showMenu(event) {
  61. var evt = event?event:window.event;
  62. <xsl:variable name="menuName" select="concat('_THIS_',$contextMenus/item[@type='menu']/menu/@id)"/>
  63. ui_menuUpdate(<xsl:value-of select="$menuName"/>);
  64. ui_menuShow(evt,<xsl:value-of select="$menuName"/>);
  65. }
  66. function _THIS_conextMenuHide() {
  67. if (newdiv) {
  68. newdiv.style.display="none";
  69. document.body.removeChild(newdiv);
  70. }
  71. contextMenuTaskId = null;
  72. newdiv = null;
  73. }
  74. var menuHide = new TasksMenu();
  75. var contextMenuTaskId;
  76. function TasksMenu() {
  77. this.id = new Object();
  78. this.addMenus = function(taskId,menus) {
  79. this.id[taskId] = menus;
  80. };
  81. this.contains = function(taskId,menu) {
  82. var menus = this.id[taskId];
  83. for(key in menus) {
  84. if (menus[key] == menu) {
  85. return true;
  86. }
  87. }
  88. return false;
  89. };
  90. this.toString = function() {
  91. var result = "";
  92. for(key in this.id) {
  93. result += "[" + key + ": " + this.id[key] + "]";
  94. }
  95. return result;
  96. };
  97. }
  98. </script>
  99. <xsl:call-template name="doContent">
  100. <xsl:with-param name="items" select="$contextMenus/item[@type='button' or @type='separator' or @type='menu']"/>
  101. </xsl:call-template>
  102. </xsl:template>
  103. <xsl:template name="doContent">
  104. <xsl:param name="items"/>
  105. <xsl:for-each select="$items">
  106. <xsl:choose>
  107. <xsl:when test="./@type='button'">
  108. <div tabindex="0" accessKey="1" class="bannerOptionsButtonNormal" onKeyPress="if (window.event.keyCode == 13){./action}" onclick="{./action}" onmouseover="this.className='bannerOptionsButtonOver';" onmouseout="this.className='bannerOptionsButtonNormal';">
  109. <img border="0" src="_THIS?frag-resource=/{./image}/THIS_" alt="{./name}" title="{./name}"/>
  110. </div>
  111. </xsl:when>
  112. <xsl:when test="./@type='separator'">
  113. <img width="12px" alt="" src="_THIS?frag-resource=/fragments/myinbox/images/sep.gif/THIS_"/>
  114. </xsl:when>
  115. <xsl:when test="./@type='menu'">
  116. <xsl:call-template name="renderMenu">
  117. <xsl:with-param name="menu" select="./menu"/>
  118. <xsl:with-param name="customName" select="concat('_THIS_',./menu/@id)"/>
  119. <xsl:with-param name="menuType" select="'contextMenu'"/>
  120. </xsl:call-template>
  121. </xsl:when>
  122. </xsl:choose>
  123. </xsl:for-each>
  124. </xsl:template>
  125. <xsl:template name="doMenusToHide">
  126. <xsl:param name="contextMenusHide" select="./*[local-name()='menus']"/>
  127. <xsl:param name="task_id"/>
  128. <script type="text/javascript">
  129. var menusList = new Array();
  130. <xsl:for-each select="$contextMenusHide/*">
  131. menusList.push('<xsl:value-of select="xtsext:javascriptencode(string(./@name))"/>');
  132. </xsl:for-each>
  133. menuHide.addMenus('<xsl:value-of select="xtsext:javascriptencode(string($task_id))"/>', menusList);
  134. </script>
  135. </xsl:template>
  136. </xsl:stylesheet>