RenameDataItemAction.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. /*
  2. *+------------------------------------------------------------------------+
  3. *| Licensed Materials - Property of IBM
  4. *| IBM Cognos Products: Viewer
  5. *| (C) Copyright IBM Corp. 2001, 2011
  6. *|
  7. *| US Government Users Restricted Rights - Use, duplication or
  8. *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  9. *|
  10. *+------------------------------------------------------------------------+
  11. */
  12. function RenameDataItemAction()
  13. {
  14. this.m_sAction = "Rename";
  15. this.m_newLabel = "";
  16. this.m_prevLabel= "";
  17. this.m_containerId = "";
  18. this.m_bUndoAdded = false;
  19. }
  20. RenameDataItemAction.prototype = new ModifyReportAction();
  21. RenameDataItemAction.prototype.getUndoHint = function()
  22. {
  23. return RV_RES.IDS_JS_RENAME;
  24. };
  25. RenameDataItemAction.prototype.saveSpecForUndo = function()
  26. {
  27. return true;
  28. };
  29. RenameDataItemAction.prototype.getContainerId = function()
  30. {
  31. return this.m_containerId;
  32. };
  33. RenameDataItemAction.prototype.addActionContextAdditionalParms = function()
  34. {
  35. var tagParams = this.getSelectedCellTags();
  36. return (tagParams +
  37. "<prevName>" + xml_encode(this.m_prevLabel) + "</prevName>" +
  38. "<toName>" + xml_encode(this.m_newLabel) + "</toName>");
  39. };
  40. RenameDataItemAction.prototype.onMouseOver = function(evt)
  41. {
  42. var ctxNode = getCtxNodeFromEvent(evt);
  43. ctxNode.style.cursor = this.canRename() ? "text" : "default";
  44. };
  45. RenameDataItemAction.prototype.onMouseOut = function(evt)
  46. {
  47. var ctxNode = getCtxNodeFromEvent(evt);
  48. ctxNode.style.cursor = "default";
  49. };
  50. RenameDataItemAction.prototype.onDoubleClick = function(evt)
  51. {
  52. if (this.canRename()) {
  53. var ctxNode = getCtxNodeFromEvent(evt);
  54. this.insertTextArea(ctxNode);
  55. }
  56. };
  57. RenameDataItemAction.prototype.canRename = function()
  58. {
  59. if (this.m_oCV.isBlacklisted("RenameFromContextMenu")) {
  60. return false;
  61. }
  62. var selectionController = this.m_oCV.getSelectionController();
  63. var selLength = selectionController.getAllSelectedObjects().length;
  64. if (selLength==1 && !this.m_oCV.isLimitedInteractiveMode()) {
  65. var selObj = selectionController.getAllSelectedObjects()[0];
  66. if (selObj.hasContextInformation()) {
  67. var ctxValue = selObj.getSelectedContextIds()[0][0];
  68. var cellRef = selObj.getCellRef();
  69. return this.checkRenamableConditions(selObj, cellRef, ctxValue, selectionController);
  70. }
  71. }
  72. return false;
  73. };
  74. RenameDataItemAction.prototype.checkRenamableConditions = function(selObj, cellRef, ctxValue, selectionController)
  75. {
  76. if(selObj.isHomeCell()) {
  77. return false;
  78. }
  79. if (selObj.getLayoutType() == 'columnTitle' && selectionController.selectionsHaveCalculationMetadata()) {
  80. if (selObj.getDataContainerType() == 'crosstab' && !selectionController.areSelectionsMeasureOrCalculation()) {
  81. return false;
  82. }
  83. return true;
  84. }
  85. if (selObj.getLayoutType() == 'columnTitle' && selObj.getDataContainerType() == 'crosstab' ) {
  86. return false;
  87. }
  88. if (selObj.getLayoutType() != 'columnTitle') {
  89. return false;
  90. }
  91. if (cellRef.getAttribute("cc") == "true") {
  92. return false;
  93. }
  94. if (cellRef.getAttribute("CTNM") != null && selectionController.getMun(ctxValue) != "") {
  95. return false;
  96. }
  97. return true;
  98. };
  99. RenameDataItemAction.prototype.insertTextArea = function(ctxNode)
  100. {
  101. var label = document.createElement("label");
  102. label.style.height = "1px";
  103. label.style.width = "1px";
  104. label.style.overflow = "hidden";
  105. label.style.position = "absolute";
  106. label.style.left = "0px";
  107. label.style.top = "-500px";
  108. label.setAttribute("for", "rename" + this.m_oCV.getId());
  109. label.id = "renameLabel" + this.m_oCV.getId();
  110. label.innerHTML = RV_RES.IDS_JS_RENAME_LABEL;
  111. var input = document.createElement("input");
  112. input.id = "rename" + this.m_oCV.getId();
  113. input.name = "rename" + this.m_oCV.getId();
  114. input.type = "text";
  115. input.value = ctxNode.childNodes[0].nodeValue;
  116. input.style.backgroundColor = "transparent";
  117. input.style.borderWidth = "0px";
  118. input.style.padding = "0px";
  119. input.style.margin = "0px";
  120. input.setAttribute("role", "textbox");
  121. input.setAttribute("aria-labelledby", "renameLabel" + this.m_oCV.getId());
  122. // calculated the width of the textbox. Get the width of the TD and subtract the width of
  123. // any none inside the TD that's not the currently selection
  124. var width = ctxNode.parentNode.scrollWidth - 10;
  125. var nextSibling = ctxNode.parentNode.firstChild;
  126. while (nextSibling) {
  127. if (nextSibling != ctxNode) {
  128. width -= nextSibling.scrollWidth;
  129. }
  130. nextSibling = nextSibling.nextSibling;
  131. }
  132. input.style.width = width + "px";
  133. input.ctxNode = ctxNode;
  134. input.action = this;
  135. input.originalLabel = ctxNode.childNodes[0].nodeValue;
  136. if(isIE())
  137. {
  138. input.style.fontFamily = ctxNode.currentStyle.fontFamily;
  139. input.style.fontSize = ctxNode.currentStyle.fontSize;
  140. input.style.fontStyle = ctxNode.currentStyle.fontStyle;
  141. input.style.fontVariant = ctxNode.currentStyle.fontVariant;
  142. input.style.fontWeight = ctxNode.currentStyle.fontWeight;
  143. input.attachEvent("onblur", this.onBlur);
  144. input.attachEvent("onkeydown", this.onKeyDown);
  145. input.style.overflow = "hidden";
  146. }
  147. else
  148. {
  149. input.style.font = "inherit";
  150. input.addEventListener("blur", this.onBlur, false);
  151. input.addEventListener("keydown", this.onKeyDown, false);
  152. input.style.overflow = "visible";
  153. }
  154. ctxNode.innerHTML = "";
  155. ctxNode.appendChild(label);
  156. ctxNode.appendChild(input);
  157. input.focus();
  158. input.select();
  159. };
  160. /**
  161. * Returns true if the mouse down event is on the rename input field
  162. * @param {Object} evt
  163. */
  164. RenameDataItemAction.prototype.onMouseDown = function(evt) {
  165. if (evt) {
  166. try {
  167. var node = evt.originalTarget ? evt.originalTarget : evt.srcElement;
  168. if (node && node.getAttribute("id") === "rename" + this.m_oCV.getId()) {
  169. return true;
  170. }
  171. }
  172. catch(ex) {
  173. // sometimes node may not be an HTML element (like a XUL element) and accessing nodeType/nodeName/className will generate an error.
  174. }
  175. }
  176. return false;
  177. };
  178. RenameDataItemAction.prototype.onBlur = function(evt)
  179. {
  180. var node;
  181. if(isIE())
  182. {
  183. node = getNodeFromEvent(evt);
  184. }
  185. else
  186. {
  187. node = this;
  188. }
  189. var ctxNode = node.ctxNode;
  190. var renameAction = node.action;
  191. var newLabel = node.value != "" ? node.value : node.innerHTML;
  192. renameAction.updateLabel(ctxNode, newLabel, node.originalLabel);
  193. };
  194. RenameDataItemAction.prototype.onKeyDown = function(evt)
  195. {
  196. var newLabel = "";
  197. var node = getNodeFromEvent(evt);
  198. if(evt.keyCode == "13")
  199. {
  200. newLabel = node.value != "" ? node.value : node.originalLabel;
  201. }
  202. else if(evt.keyCode == "27")
  203. {
  204. newLabel = node.originalLabel;
  205. }
  206. if(newLabel != "")
  207. {
  208. var ctxNode = node.ctxNode;
  209. var renameAction = node.action;
  210. renameAction.updateLabel(ctxNode, newLabel, node.originalLabel);
  211. return stopEventBubble(evt);
  212. }
  213. else
  214. {
  215. return true;
  216. }
  217. };
  218. RenameDataItemAction.prototype.updateLabel = function(ctxNode, newLabel, originalLabel)
  219. {
  220. this.m_newLabel = newLabel;
  221. this.m_prevLabel= originalLabel;
  222. ctxNode.innerHTML = "";
  223. ctxNode.appendChild(document.createTextNode(newLabel));
  224. var selectionController = this.m_oCV.getSelectionController();
  225. if(selectionController != null && newLabel != originalLabel)
  226. {
  227. var selectionFactory = new CSelectionObjectFactory(selectionController);
  228. this.m_containerId = this.removeNamespace(selectionFactory.getLayoutElementId(ctxNode));
  229. var SelObj = selectionFactory.getSelectionObject(ctxNode.parentNode);
  230. selectionController.m_aSelectedObjects[0] = SelObj;
  231. // reset the focus to the span we just renamed.
  232. var allChildren = SelObj.getCellRef().getElementsByTagName("span");
  233. var span = null;
  234. if (allChildren) {
  235. for (var i = 0; i < allChildren.length; i++) {
  236. span = allChildren[i];
  237. if (span.getAttribute("ctx") != null && span.style.visibility != "hidden") {
  238. span.focus();
  239. break;
  240. }
  241. }
  242. }
  243. this.execute();
  244. }
  245. };
  246. RenameDataItemAction.prototype.buildUrl = function()
  247. {
  248. var urlRequest = "b_action=cognosViewer&ui.action=modifyReport&cv.responseFormat=xml";
  249. var actionContext = this.addActionContext();
  250. urlRequest += "&cv.actionContext=" + encodeURIComponent(actionContext);
  251. if (window.gViewerLogger)
  252. {
  253. window.gViewerLogger.log('Action context', actionContext, "xml");
  254. }
  255. urlRequest += "&ui.object=" + encodeURIComponent(this.m_oCV.envParams["ui.object"]);
  256. if(typeof this.m_oCV.envParams["ui.spec"] != "undefined")
  257. {
  258. urlRequest += "&ui.spec=" + encodeURIComponent(this.m_oCV.envParams["ui.spec"]);
  259. }
  260. if(typeof this.m_oCV.getModelPath() != "")
  261. {
  262. urlRequest += "&modelPath=" + encodeURIComponent(this.m_oCV.getModelPath());
  263. }
  264. return urlRequest;
  265. };
  266. RenameDataItemAction.prototype.keepRAPCache = function()
  267. {
  268. return false;
  269. };
  270. RenameDataItemAction.prototype.reuseQuery = function() { return true; };