/* *+------------------------------------------------------------------------+ *| Licensed Materials - Property of IBM *| IBM Cognos Products: Viewer *| (C) Copyright IBM Corp. 2001, 2011 *| *| US Government Users Restricted Rights - Use, duplication or *| disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *| *+------------------------------------------------------------------------+ */ function RenameDataItemAction() { this.m_sAction = "Rename"; this.m_newLabel = ""; this.m_prevLabel= ""; this.m_containerId = ""; this.m_bUndoAdded = false; } RenameDataItemAction.prototype = new ModifyReportAction(); RenameDataItemAction.prototype.getUndoHint = function() { return RV_RES.IDS_JS_RENAME; }; RenameDataItemAction.prototype.saveSpecForUndo = function() { return true; }; RenameDataItemAction.prototype.getContainerId = function() { return this.m_containerId; }; RenameDataItemAction.prototype.addActionContextAdditionalParms = function() { var tagParams = this.getSelectedCellTags(); return (tagParams + "" + xml_encode(this.m_prevLabel) + "" + "" + xml_encode(this.m_newLabel) + ""); }; RenameDataItemAction.prototype.onMouseOver = function(evt) { var ctxNode = getCtxNodeFromEvent(evt); ctxNode.style.cursor = this.canRename() ? "text" : "default"; }; RenameDataItemAction.prototype.onMouseOut = function(evt) { var ctxNode = getCtxNodeFromEvent(evt); ctxNode.style.cursor = "default"; }; RenameDataItemAction.prototype.onDoubleClick = function(evt) { if (this.canRename()) { var ctxNode = getCtxNodeFromEvent(evt); this.insertTextArea(ctxNode); } }; RenameDataItemAction.prototype.canRename = function() { if (this.m_oCV.isBlacklisted("RenameFromContextMenu")) { return false; } var selectionController = this.m_oCV.getSelectionController(); var selLength = selectionController.getAllSelectedObjects().length; if (selLength==1 && !this.m_oCV.isLimitedInteractiveMode()) { var selObj = selectionController.getAllSelectedObjects()[0]; if (selObj.hasContextInformation()) { var ctxValue = selObj.getSelectedContextIds()[0][0]; var cellRef = selObj.getCellRef(); return this.checkRenamableConditions(selObj, cellRef, ctxValue, selectionController); } } return false; }; RenameDataItemAction.prototype.checkRenamableConditions = function(selObj, cellRef, ctxValue, selectionController) { if(selObj.isHomeCell()) { return false; } if (selObj.getLayoutType() == 'columnTitle' && selectionController.selectionsHaveCalculationMetadata()) { if (selObj.getDataContainerType() == 'crosstab' && !selectionController.areSelectionsMeasureOrCalculation()) { return false; } return true; } if (selObj.getLayoutType() == 'columnTitle' && selObj.getDataContainerType() == 'crosstab' ) { return false; } if (selObj.getLayoutType() != 'columnTitle') { return false; } if (cellRef.getAttribute("cc") == "true") { return false; } if (cellRef.getAttribute("CTNM") != null && selectionController.getMun(ctxValue) != "") { return false; } return true; }; RenameDataItemAction.prototype.insertTextArea = function(ctxNode) { var label = document.createElement("label"); label.style.height = "1px"; label.style.width = "1px"; label.style.overflow = "hidden"; label.style.position = "absolute"; label.style.left = "0px"; label.style.top = "-500px"; label.setAttribute("for", "rename" + this.m_oCV.getId()); label.id = "renameLabel" + this.m_oCV.getId(); label.innerHTML = RV_RES.IDS_JS_RENAME_LABEL; var input = document.createElement("input"); input.id = "rename" + this.m_oCV.getId(); input.name = "rename" + this.m_oCV.getId(); input.type = "text"; input.value = ctxNode.childNodes[0].nodeValue; input.style.backgroundColor = "transparent"; input.style.borderWidth = "0px"; input.style.padding = "0px"; input.style.margin = "0px"; input.setAttribute("role", "textbox"); input.setAttribute("aria-labelledby", "renameLabel" + this.m_oCV.getId()); // calculated the width of the textbox. Get the width of the TD and subtract the width of // any none inside the TD that's not the currently selection var width = ctxNode.parentNode.scrollWidth - 10; var nextSibling = ctxNode.parentNode.firstChild; while (nextSibling) { if (nextSibling != ctxNode) { width -= nextSibling.scrollWidth; } nextSibling = nextSibling.nextSibling; } input.style.width = width + "px"; input.ctxNode = ctxNode; input.action = this; input.originalLabel = ctxNode.childNodes[0].nodeValue; if(isIE()) { input.style.fontFamily = ctxNode.currentStyle.fontFamily; input.style.fontSize = ctxNode.currentStyle.fontSize; input.style.fontStyle = ctxNode.currentStyle.fontStyle; input.style.fontVariant = ctxNode.currentStyle.fontVariant; input.style.fontWeight = ctxNode.currentStyle.fontWeight; input.attachEvent("onblur", this.onBlur); input.attachEvent("onkeydown", this.onKeyDown); input.style.overflow = "hidden"; } else { input.style.font = "inherit"; input.addEventListener("blur", this.onBlur, false); input.addEventListener("keydown", this.onKeyDown, false); input.style.overflow = "visible"; } ctxNode.innerHTML = ""; ctxNode.appendChild(label); ctxNode.appendChild(input); input.focus(); input.select(); }; /** * Returns true if the mouse down event is on the rename input field * @param {Object} evt */ RenameDataItemAction.prototype.onMouseDown = function(evt) { if (evt) { try { var node = evt.originalTarget ? evt.originalTarget : evt.srcElement; if (node && node.getAttribute("id") === "rename" + this.m_oCV.getId()) { return true; } } catch(ex) { // sometimes node may not be an HTML element (like a XUL element) and accessing nodeType/nodeName/className will generate an error. } } return false; }; RenameDataItemAction.prototype.onBlur = function(evt) { var node; if(isIE()) { node = getNodeFromEvent(evt); } else { node = this; } var ctxNode = node.ctxNode; var renameAction = node.action; var newLabel = node.value != "" ? node.value : node.innerHTML; renameAction.updateLabel(ctxNode, newLabel, node.originalLabel); }; RenameDataItemAction.prototype.onKeyDown = function(evt) { var newLabel = ""; var node = getNodeFromEvent(evt); if(evt.keyCode == "13") { newLabel = node.value != "" ? node.value : node.originalLabel; } else if(evt.keyCode == "27") { newLabel = node.originalLabel; } if(newLabel != "") { var ctxNode = node.ctxNode; var renameAction = node.action; renameAction.updateLabel(ctxNode, newLabel, node.originalLabel); return stopEventBubble(evt); } else { return true; } }; RenameDataItemAction.prototype.updateLabel = function(ctxNode, newLabel, originalLabel) { this.m_newLabel = newLabel; this.m_prevLabel= originalLabel; ctxNode.innerHTML = ""; ctxNode.appendChild(document.createTextNode(newLabel)); var selectionController = this.m_oCV.getSelectionController(); if(selectionController != null && newLabel != originalLabel) { var selectionFactory = new CSelectionObjectFactory(selectionController); this.m_containerId = this.removeNamespace(selectionFactory.getLayoutElementId(ctxNode)); var SelObj = selectionFactory.getSelectionObject(ctxNode.parentNode); selectionController.m_aSelectedObjects[0] = SelObj; // reset the focus to the span we just renamed. var allChildren = SelObj.getCellRef().getElementsByTagName("span"); var span = null; if (allChildren) { for (var i = 0; i < allChildren.length; i++) { span = allChildren[i]; if (span.getAttribute("ctx") != null && span.style.visibility != "hidden") { span.focus(); break; } } } this.execute(); } }; RenameDataItemAction.prototype.buildUrl = function() { var urlRequest = "b_action=cognosViewer&ui.action=modifyReport&cv.responseFormat=xml"; var actionContext = this.addActionContext(); urlRequest += "&cv.actionContext=" + encodeURIComponent(actionContext); if (window.gViewerLogger) { window.gViewerLogger.log('Action context', actionContext, "xml"); } urlRequest += "&ui.object=" + encodeURIComponent(this.m_oCV.envParams["ui.object"]); if(typeof this.m_oCV.envParams["ui.spec"] != "undefined") { urlRequest += "&ui.spec=" + encodeURIComponent(this.m_oCV.envParams["ui.spec"]); } if(typeof this.m_oCV.getModelPath() != "") { urlRequest += "&modelPath=" + encodeURIComponent(this.m_oCV.getModelPath()); } return urlRequest; }; RenameDataItemAction.prototype.keepRAPCache = function() { return false; }; RenameDataItemAction.prototype.reuseQuery = function() { return true; };