An example of importing Embedded Coder code into the mbed IDE. Currently doesn't connect IO to PWM, ADC, and Encoder, instead provides random inputs and measures execution time.
Dependencies: mbed-dsp mbed Nucleo_pmsmfoc
Diff: html/html/rtwhilite.js
- Revision:
- 2:bbc155b0b886
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/html/html/rtwhilite.js Tue Nov 25 07:52:02 2014 +0000 @@ -0,0 +1,1850 @@ +// Copyright 2007-2014 The MathWorks, Inc. + +// Class RTW_Hash ------------------------------------------------------------ +// Internal web browser doesn't change window.location.hash if the link points +// to the same page. +// RTW_Hash remembers the hash value when the page is loaded in the first time +// or a link is clicked. +// removeHiliteByHash cleans the high lighted elements according to the stored +// hash value +function RTW_Hash(aHash) { + if (aHash == null) { + this.fHash = ""; + } else { + this.fHash = aHash; + }; + + this.getHash = function() { + return this.fHash; + } + + this.setHash = function(aHash) { + this.fHash = aHash; + } +} + +RTW_Hash.instance = null; + +// Class RTW_TraceInfo -------------------------------------------------------- +function RTW_TraceInfo(aFileLinks) { + this.fFileLinks = aFileLinks; + this.fLines = new Array(); + this.fTotalLines = 0; // total number of highlighted lines + this.fNumLines = new Array(); + this.fFileIdxCache = new Array(); + this.fDisablePanel = false; + this.fCurrFileIdx = 0; + this.fCurrLineIdx = 0; + this.fCurrCodeNode = null; + this.getHtmlFileName = function(aIndex) { + if (aIndex < this.fFileLinks.length) { + var href = this.fFileLinks[aIndex].href; + return href.substring(href.lastIndexOf('/')+1); + } + } + this.getSrcFileName = function(aIndex) { + var name = this.getHtmlFileName(aIndex); + if (name) + name = RTW_TraceInfo.toSrcFileName(name); + return name; + } + this.getNumFileLinks = function() { + return this.fFileLinks.length; + } + this.setFileLinkColor = function(aIndex, aColor) { + var link = this.fFileLinks[aIndex]; + if (link && link.parentNode && link.parentNode.style) + link.parentNode.style.backgroundColor = aColor; + } + this.highlightFileLink = function(aIndex, aColor) { + for (var i = 0; i < this.fFileLinks.length; ++i) { + this.setFileLinkColor(i, i == aIndex ? aColor : ""); + } + } + this.highlightCurrFileLink = function(aColor) { + this.highlightFileLink(this.fCurrFileIdx); + } + this.highlightLines = function(aCodeNode,aColor) { + this.fCurrCodeNode = aCodeNode; + var lines = this.fLines[this.getHtmlFileName(this.fCurrFileIdx)]; + if (lines && aCodeNode) { + for (var i = 0; i < lines.length; ++i) { + var lineObj = aCodeNode.childNodes[lines[i]-1]; + if (lineObj) + lineObj.style.backgroundColor=aColor; + } + } + } + this.getFileIdx = function(aFile) { + if (this.fFileIdxCache[aFile] != null) + return this.fFileIdxCache[aFile]; + for (var i = 0; i < this.fFileLinks.length; ++i) { + if (this.getHtmlFileName(i) == aFile) { + this.fFileIdxCache[aFile] = i; + return i; + } + } + return null; + } + this.getCurrFileIdx = function() { return this.fCurrFileIdx; } + this.setNumHighlightedLines = function(aFileIdx, aNumLines) { + this.fNumLines[aFileIdx] = aNumLines; + updateNumHighlightedLines(this.fFileLinks[aFileIdx], aNumLines); + } + this.getNumLines = function(aFileIdx) { + return this.fNumLines[aFileIdx] != null ? this.fNumLines[aFileIdx] : 0; + } + this.getNumLinesAll = function() { + var sum = 0; + var len = this.fNumLines.length; + for (var i = 0; i < len; ++i) { + sum += this.getNumLines(i); + } + return sum; + } + this.getPrevButton = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdButtonPrev"); + else + return document.getElementById("rtwIdButtonPrev"); + } + this.getNextButton = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdButtonNext"); + else + return document.getElementById("rtwIdButtonNext"); + } + this.getPanel = function() { + var aFrame = getNavFrame(); + if (typeof aFrame !== "undefined" && aFrame !== null) + return aFrame.document.getElementById("rtwIdTracePanel"); + else + return document.getElementById("rtwIdTracePanel"); + } + this.removeHighlighting = function() { + for (var i = 0; i < this.fFileLinks.length; ++i) { + this.setFileLinkColor(i, ""); + this.setNumHighlightedLines(i, 0); + } + // remove highlight and reset current code node + try { + if (this.fCurrCodeNode != null) + this.highlightLines(getCodeNode(),""); + } catch (e) {}; + this.fCurrCodeNode = null; + if (this.getPrevButton()) { this.getPrevButton().disabled = true; } + if (this.getNextButton()) { this.getNextButton().disabled = true; } + if (this.getPanel()) { this.getPanel().style.display = "none"; } + this.fCurrFileIdx = 0; + this.fCurrLineIdx = 0; + } + this.setCurrLineIdx = function(aLineIdx) { + this.fCurrLineIdx = aLineIdx; + } + this.getCurrLineIdx = function() { return this.fCurrLineIdx; } + this.setCurrent = function(aFileIdx, aLineIdx) { + this.fCurrFileIdx = aFileIdx; + var numLines = this.getNumLines(aFileIdx); + if (!numLines || aLineIdx >= numLines) + this.fCurrLineIdx = -1; + else + this.fCurrLineIdx = aLineIdx; + var allNumLines = this.getNumLinesAll(); + if (this.getPrevButton()) { + this.getPrevButton().disabled = (allNumLines <= 1 || !this.hasPrev()); + } + if (this.getNextButton()) { + this.getNextButton().disabled = (allNumLines <= 1 || !this.hasNext()); + } + if (this.getPanel() && !this.fDisablePanel) { + this.getPanel().style.display = 'block'; + } + } + this.setDisablePanel = function(aDisable) { + this.fDisablePanel = aDisable; + } + this.getPrevFileIdx = function() { + if (this.fCurrLineIdx > 0) + return this.fCurrFileIdx; + for (var i = this.fCurrFileIdx - 1; i >= 0; --i) + if (this.fNumLines[i] > 0) + return i; + return null; + } + // update the navigation bar state + this.updateNavState = function() { + if (this.getPrevButton()) + this.getPrevButton().disabled = !this.hasPrev(); + if (this.getNextButton()) + this.getNextButton().disabled = !this.hasNext(); + setTraceNumber(); + } + this.hasPrev = function() { + return this.getPrevFileIdx() != null; + } + this.getFirstFileIdx = function() { + for (var i = 0; i < this.getNumFileLinks(); ++i) + if (this.fNumLines[i] > 0) + return i; + } + this.getLastFileIdx = function() { + for (var i = this.getNumFileLinks(); i >= 0; --i) + if (this.fNumLines[i] > 0) + return i; + } + this.goFirst = function() { + this.fCurrFileIdx = this.getFirstFileIdx(); + this.fCurrLineIdx = 0; + this.updateNavState(); + } + this.goLast = function() { + this.fCurrFileIdx = this.getLastFileIdx();; + this.fCurrLineIdx = this.getNumLines(this.fCurrFileIdx) - 1; + this.updateNavState(); + } + this.goPrev = function() { + var fileIdx = this.getPrevFileIdx(); + if (fileIdx == null) + return; + if (fileIdx == this.fCurrFileIdx) + --this.fCurrLineIdx; + else { + this.fCurrFileIdx = fileIdx; + this.fCurrLineIdx = this.getNumLines(fileIdx) - 1; + } + this.updateNavState(); + } + this.getNextFileIdx = function() { + if (this.fCurrLineIdx < this.getNumLines(this.fCurrFileIdx) - 1 && this.getNumLines(this.fCurrFileIdx) > 0) + return this.fCurrFileIdx; + for (var i = this.fCurrFileIdx + 1; i < this.getNumFileLinks(); ++i) + if (this.fNumLines[i] > 0) + return i; + return null; + } + this.hasNext = function() { + return this.getNextFileIdx() != null; + } + this.goNext = function() { + var fileIdx = this.getNextFileIdx(); + if (fileIdx == null) + return; + if (fileIdx == this.fCurrFileIdx) + ++this.fCurrLineIdx; + else { + this.fCurrFileIdx = fileIdx; + this.fCurrLineIdx = 0; + } + this.updateNavState(); + } + this.setTotalLines = function(num) { + this.fTotalLines = num; + } + this.getTotalLines = function() { return this.fTotalLines;} + this.setLines = function(aFile, aLines) { + this.fLines[aFile] = aLines; + var index = this.getFileIdx(aFile); + if (index != null) + this.setNumHighlightedLines(index,aLines.length); + } + this.getLines = function(aFile) { + return this.fLines[aFile]; + } + // get current on focus line number + this.getCurrLine = function() { + var file = this.getHtmlFileName(this.getCurrFileIdx()); + var lines = this.fLines[file]; + var line = null; + if (lines) { + var line = lines[this.fCurrLineIdx]; + } + return line; + } + this.getHRef = function(aFileIdx, aLineIdx, offset) { + var file = this.getHtmlFileName(aFileIdx); + var lines = this.fLines[file]; + if (lines) { + var line = lines[aLineIdx]; + line = offset_line(line, offset); + file = file+"#"+line; + } + return file; + } + + this.getCurrentHRef = function(offset) { + return this.getHRef(this.fCurrFileIdx, this.fCurrLineIdx, offset); + } + this.setInitLocation = function(aFile, aLine) { + var fileIdx = this.getFileIdx(aFile); + var lineIdx = null; + if (fileIdx != null && aLine) { + var lines = this.getLines(aFile); + for (var i = 0; i < lines.length; ++i) { + if (lines[i] == aLine) { + lineIdx = i; + break; + } + } + } + if (fileIdx == null || lineIdx == null) + this.setCurrent(0,-1); + else + this.setCurrent(fileIdx,lineIdx); + } +} + +// Static methods in RTW_TraceInfo + +RTW_TraceInfo.getFileLinks = function(docObj) { + var links; + if (docObj && docObj.getElementsByName) + links = docObj.getElementsByName("rtwIdGenFileLinks"); + return links ? links : new Array(); +} + +RTW_TraceInfo.toSrcFileName = function(aHtmlFileName) { + aHtmlFileName = aHtmlFileName.replace(/_c.html$/,".c"); + aHtmlFileName = aHtmlFileName.replace(/_h.html$/,".h"); + aHtmlFileName = aHtmlFileName.replace(/_cpp.html$/,".cpp"); + aHtmlFileName = aHtmlFileName.replace(/_hpp.html$/,".hpp"); + aHtmlFileName = aHtmlFileName.replace(/_cc.html$/,".hpp"); + return aHtmlFileName; +} + +RTW_TraceInfo.instance = null; + +// Class RTW_TraceArgs -------------------------------------------------------- +// file.c:10,20,30&file.h:10,20,30[&color=value] or +// sid=model:1[&color=value] +RTW_TraceArgs = function(aHash) { + this.fColor = null; + this.fFontSize = null; + this.fInitFile = null; + this.fInitLine = null; + this.fSID = null; + this.fFiles = new Array(); + this.fLines = new Array(); + this.fMessage = null; + this.fBlock = null; + this.fUseExternalBrowser = true; + this.fModel2CodeSrc = null; + this.fInCodeTrace = false; + this.fTraceData = null; + this.fFileIdx = []; // filename to fileId + this.fRows = []; // highlighted rows indexed by fileId + this.fIDs = []; // highlighted IDs indexed by fileId + + this.hasSid = function() { + return !(this.fSID == null); + } + this.parseCommand = function(aHash) { + var args = new Array(); + args = aHash.split('&'); + for (var i = 0; i < args.length; ++i) { + var arg = args[i]; + sep = arg.indexOf('='); + if (sep != -1) { + var cmd = arg.substring(0,sep); + var opt = arg.substring(sep+1); + switch (cmd.toLowerCase()) { + case "color": + this.fColor = opt; + break; + case "fontsize": + this.fFontSize = opt; + break; + case "initfile": + this.fInitFile = RTW_TraceArgs.toHtmlFileName(opt); + break; + case "initline": + this.fInitLine = opt; + break; + case "msg": + this.fMessage = opt; + break; + case "block": + this.fBlock = unescape(opt); + break; + case "sid": + this.fSID = opt; + // convert sid to code location + break; + case "model2code_src": + // model2code_src from model or webview + this.fModel2CodeSrc = opt; + break; + case "useexternalbrowser": + this.fUseExternalBrowser = (opt=="true"); + break; + case "incodetrace": + this.fInCodeTrace = (opt=="true"); + break; + case "tracedata": + this.fTraceData = decodeURI(opt); + break; + } + } + } + } + this.parseUrlHash = function(aHash) { + var rows; + if (aHash) { + args = aHash.split('&'); + for (var i = 0; i < args.length; ++i) { + var arg = args[i]; + sep = arg.indexOf(':'); + if (sep != -1) { + var fileLines = arg.split(':'); + var htmlFileName = RTW_TraceArgs.toHtmlFileName(fileLines[0]); + this.fFileIdx[htmlFileName] = i; + this.fFiles.push(htmlFileName); + if (fileLines[1]) { + rows = fileLines[1].split(','); + rows = uniqueRows(rows); + this.fLines.push(rows); + this.fRows[i] = rows; + } + } + } + if (this.fInitFile == null && this.fFiles.length > 0) { + this.fInitFile = this.fFiles[0]; + this.fInitLine = (this.fLines[0] == null ? -1 : this.fLines[0][0]); + } + } + } + this.parseUrlHash2 = function(aHash) { + aHash = decodeURI(aHash); + var rows; + var ids; + if (aHash && aHash.length > 0 && aHash[0] === "[") { + var input = eval(aHash); + var i; + var j; + // set highlight files from url + for (i=0; i<input.length;i++) { + rows = new Array(); + ids = new Array(); + this.fFileIdx[input[i].file] = i; + this.fFiles.push(input[i].file); + ids = input[i].id; + for (j=0; j<ids.length;j++) { + // get row number + if (ids[j].indexOf("c") !== -1) + rows.push(Number(ids[j].substring(0,ids[j].indexOf("c")))); + else + rows.push(Number(ids[j])); + } + rows = uniqueRows(rows); + this.fRows[i] = rows; + this.fIDs[i] = ids; + } + } else { + // reset all states + this.fFiles = []; + this.fRows = []; + this.fIDs = []; + } + return; + } + this.getFileIdx = function(aFileName) { + if (aFileName) { + return this.fFileIdx[aFileName]; + } else { + // return the fileIdx of the current display file + var pathname = top.rtwreport_document_frame.location.pathname; + pathname = pathname.substr(pathname.lastIndexOf("/")+1); + // find the highlight file name + return this.getFileIdx(pathname); + } + } + + this.getColor = function() { return this.fColor; } + this.getFontSize = function() { return this.fFontSize; } + this.getInitFile = function() { return this.fInitFile; } + this.getInitLine = function() { return this.fInitLine; } + this.getNumFiles = function() { return this.fFiles.length; } + this.getSID = function() { return this.fSID; } + this.getFile = function(aIdx) { if (isNaN(aIdx)) return this.fFiles; return this.fFiles[aIdx];} + this.getLines = function(aIdx) { return this.fLines[aIdx]; } + this.getUseExternalBrowser = function() { return this.fUseExternalBrowser; } + this.getInCodeTrace = function() { return this.fInCodeTrace; } + this.getTraceData = function() { return this.fTraceData; } + this.getModel2CodeSrc = function() { return this.fModel2CodeSrc; } + this.setUseExternalBrowser = function(val) { this.fUseExternalBrowser = val; } + this.setInCodeTrace = function(val) { this.fInCodeTrace = val; } + this.setTraceData = function(val) { this.fTraceData = val; } + this.setModel2CodeSrc = function(val) { this.fModel2CodeSrc = val; } + this.getRows = function(aIdx) { return this.fRows[aIdx];} + this.getIDs = function(aIdx) { return this.fIDs[aIdx]; } + this.getBlock = function() { return this.fBlock; } + // constructor + this.parseCommand(aHash); +} + +// Static methods in RTW_TraceArgs + +RTW_TraceArgs.toHtmlFileName = function(aFile) { + f = aFile; + aFile = f.substring(0,f.lastIndexOf('.')) + '_' + f.substring(f.lastIndexOf('.')+1) + ".html"; + return aFile; +} + +RTW_TraceArgs.instance = null; + +RTW_MessageWindow = function(aWindow, aParagraph) { + this.fWindow = aWindow; + this.fParagraph = aParagraph; + + this.print = function(msg) { + this.fParagraph.innerHTML = msg; + if (msg) + this.fWindow.style.display = "block"; + else + this.fWindow.style.display = "none"; + } + this.clear = function() { + this.print(""); + } +} + +// RTW_MessageWindow factory +RTW_MessageWindowFactory = function(aDocObj) { + this.fDocObj = aDocObj; + this.fInstance = null; + + this.getInstance = function() { + if (this.fInstance) + return this.fInstance; + if (!this.fDocObj) + return; + + var table = this.fDocObj.getElementById("rtwIdMsgWindow"); + var paragraph = this.fDocObj.getElementById("rtwIdMsg"); + var button = this.fDocObj.getElementById("rtwIdButtonMsg"); + + if (!table || !paragraph || !button) + return null; + + obj = new RTW_MessageWindow(table,paragraph); + button.onclick = function() { obj.clear(); } + this.fInstance = obj; + return this.fInstance; + } +} + +RTW_MessageWindowFactory.instance = null; +RTW_MessageWindow.factory = function(aDocObj) { + if (!RTW_MessageWindowFactory.instance) + RTW_MessageWindowFactory.instance = new RTW_MessageWindowFactory(aDocObj); + return RTW_MessageWindowFactory.instance.getInstance(); +} + +// Callbacks and helper functions --------------------------------------------- + +// Helper functions +function getCodeNode() { + return rtwSrcFrame().document.getElementById("RTWcode"); +} + +function rtwMidFrame() { + return top.document.getElementById('rtw_midFrame'); +} +function rtwSrcFrame() { + return top.rtwreport_document_frame; +} +function rtwTocFrame() { + return top.rtwreport_contents_frame; +} +function rtwNavToolbarFrame() { + return top.rtwreport_navToolbar_frame; // return rtwTocFrame(); +} +function rtwInspectFrame() { + return top.rtwreport_inspect_frame; // return rtwTocFrame(); +} +function rtwGetFileName(url) { + var slashIdx = url.lastIndexOf('/'); + var hashIdx = url.indexOf('#', slashIdx); + if (hashIdx == -1) + return url.substring(slashIdx+1) + else + return url.substring(slashIdx+1,hashIdx); +} + +// Help function to expand the file group +function expandFileGroup(docObj, tagID) { + if (docObj.getElementById) { + var obj_table = docObj.getElementById(tagID); + var o; + while (obj_table.nodeName != "TABLE") { + if (obj_table.parentNode) { + obj_table = obj_table.parentNode; + } else { + return; + } + } + if (obj_table.style.display == "none") { + var category_table = obj_table.parentNode; + while (category_table.nodeName != "TABLE") { + if (category_table.parentNode) { + category_table = category_table.parentNode; + } else { + return; + } + } + var o = category_table.id + "_button"; + o = docObj.getElementById(o); + if (o && top.rtwreport_contents_frame.rtwFileListShrink) { + top.rtwreport_contents_frame.rtwFileListShrink(o, category_table.id, 0); + } + } + } +} +// Help function to set the background color based on Element's Id in a document +// object +function setBGColorByElementId(docObj, tagID, bgColor) { + var status = false; + if (bgColor == "") { + bgColor = "TRANSPARENT"; + } + + if (docObj.getElementById) { + var obj2Hilite = docObj.getElementById(tagID); + if (obj2Hilite && obj2Hilite.parentNode) { + obj2Hilite.parentNode.style.backgroundColor = bgColor; + status = true; + } + } + return status; +} + +// Help function to set the background color based on Element's name in a document +// object +function setBGColorByElementsName(docObj, tagName, bgColor) { + if (bgColor == "") { + bgColor = "TRANSPARENT"; + } + if (docObj.getElementsByName) { + var objs2Hilite = docObj.getElementsByName(tagName); + for (var objIndex = 0; objIndex < objs2Hilite.length; ++objIndex) { + if (objs2Hilite[objIndex].parentNode) + objs2Hilite[objIndex].parentNode.style.backgroundColor = bgColor; + } + } +} + +// Help function to highlight lines in source file based on Element's name +// Note: Name of docHiliteByElementsName would be better +function hiliteByElementsName(winObj, tagName) { + var hiliteColor = "#aaffff"; + if (winObj.document) + setBGColorByElementsName(winObj.document, tagName, hiliteColor); +} + +// Help function to remove the highlight of lines in source file based on Element's name +function removeHiliteByElementsName(winObj, tagName) { + if (winObj.document) + setBGColorByElementsName(winObj.document, tagName, ""); +} + +// Help function to set the background color based on the URL's hash +function setBGColorByHash(docObj, bgColor) { + if (docObj.location) { + var tagName = docObj.location.hash; + // Use the stored hash value if it exists because the location.hash + // may be wrong in internal web browser + if (RTW_Hash.instance) + tagName = RTW_Hash.instance.getHash(); + if (tagName != null) + tagName = tagName.substring(1); + + var codeNode = docObj.getElementById("RTWcode"); + if (tagName != null && tagName != "") { + if (!isNaN(tagName)) + tagName = Number(tagName) + 10; + setBGColorByElementsName(docObj, tagName, bgColor); + } + } +} + +// Highlight the lines in document frame based on the URL's hash +function hiliteByHash(docObj) { + var hiliteColor = "#aaffff"; + setBGColorByHash(docObj, hiliteColor); +} + +// Remove highlight of lines in document frame based on the URL's hash +function removeHiliteByHash(winObj) { + if (winObj.document) + setBGColorByHash(winObj.document, ""); +} + +// Highlight the filename Element in TOC frame based on the URL's filename +function hiliteByFileName(aHref) { + var status = false; + if (!top.rtwreport_contents_frame) + return status; + var hiliteColor = GlobalConfig.fileLinkHiliteColor; + var fileName = rtwGetFileName(aHref); + if (top.rtwreport_contents_frame.document) { + removeHiliteFileList(top.rtwreport_contents_frame); + status = setBGColorByElementId(top.rtwreport_contents_frame.document, fileName, hiliteColor); + if (status) + expandFileGroup(top.rtwreport_contents_frame.document, fileName); + } + return status; +} + +// Clear the highlights in the code navigation frame. +function removeHiliteCodeNav(winObj) { + removeHiliteTOC(winObj); + removeHiliteFileList(winObj); +} +// Clear the highlights in TOC frame. TOC links are named TOC_List +function removeHiliteTOC(winObj) { + removeHiliteByElementsName(winObj, "TOC_List"); +} +// Clear the highlights in Generated File List. +// The filename links are named rtwIdGenFileLinks, +function removeHiliteFileList(winObj) { + removeHiliteByElementsName(winObj, "rtwIdGenFileLinks"); +} + +// Highlight TOC hyperlinks by their Ids. +function tocHiliteById(id) { + hiliteColor = GlobalConfig.fileLinkHiliteColor; + if (top && top.rtwreport_contents_frame && top.rtwreport_contents_frame.document) { + removeHiliteCodeNav(top.rtwreport_contents_frame); + setBGColorByElementId(top.rtwreport_contents_frame.document, id, hiliteColor); + } +} + +// onClick function to highlight the link itself +function tocHiliteMe(winObj, linkObj, bCleanTrace) { + hiliteColor = GlobalConfig.fileLinkHiliteColor; + // remove the trace info (previous highlighted source code and the navigate + // panel) + // Clean Trace info only when links in TOC clicked. Links of filenames won't + // clean trace info. + if (bCleanTrace) { + if (RTW_TraceInfo.instance) { + RTW_TraceInfo.instance.setDisablePanel(true); + rtwRemoveHighlighting(); + } + closeInspectWindow(); + } + removeHiliteCodeNav(winObj); + if (linkObj.parentNode) { + linkObj.parentNode.style.backgroundColor= hiliteColor; + } +} + +// onClick function to clean the currently highlighed lines in document frame +// based on URL's hash +// Then highlight lines in document frame based on Element's name +// It works for links to some elements in the same page, otherwise, +// rtwFileOnLoad() in loading page does the job. +function docHiliteMe(winObj, elementName) { + // First, remove the highlighted elements by stored hash value + removeHiliteByHash(winObj); + // Store the new hash value defined by elementName + if (RTW_Hash.instance) { + RTW_Hash.instance.setHash("#"+elementName); + } else { + RTW_Hash.instance = new RTW_Hash("#"+elementName); + } + hiliteByElementsName(winObj, elementName); +} + +// Callback for generated file load callback +function rtwFileOnLoad(docObj) { + if (!docObj.location || !docObj.location.href) + return; + // Save the hash value when file is loaded in the first time + if (!RTW_Hash.instance) { + RTW_Hash.instance = new RTW_Hash(docObj.location.hash); + } else { + RTW_Hash.instance.setHash(docObj.location.hash); + } + + updateHyperlinks(); + // highlight lines in source code file according to the URL hash + hiliteByHash(docObj); + // highlight the filename in the TOC frame + if (top.rtwreport_contents_frame) { + if (hiliteByFileName(docObj.location.href)) { + // remove the highlights in the TOC frame if filename is hilite successfully + removeHiliteTOC(top.rtwreport_contents_frame); + } + } + + if (!RTW_TraceInfo.instance) + return; + if (!docObj.getElementById) + return; + if (rtwSrcFrame()) + rtwSrcFrame().focus(); + var fileName = rtwGetFileName(docObj.location.href); + var fileIdx = RTW_TraceInfo.instance.getFileIdx(fileName); + if (fileIdx != null) { + if (fileIdx != RTW_TraceInfo.instance.getCurrFileIdx()) + RTW_TraceInfo.instance.setCurrent(fileIdx,-1); + var codeNode = docObj.getElementById("RTWcode"); + var hiliteColor = RTW_TraceArgs.instance.getColor(); + if (!hiliteColor) { + hiliteColor = "#aaffff"; + } + var fontSize = RTW_TraceArgs.instance.getFontSize(); + if (fontSize) { + codeNode.style.fontSize = fontSize; + } + RTW_TraceInfo.instance.highlightLines(codeNode,hiliteColor); + RTW_TraceInfo.instance.highlightFileLink(fileIdx, GlobalConfig.fileLinkHiliteColor); + } +} + +function Nav(fileIdx1, fileIdx2) { + var filename = top.rtwreport_document_frame.location.pathname.split(/\//); + filename = filename[filename.length-1]; + var currentFileIdx = RTW_TraceInfo.instance.getFileIdx(filename); + if (fileIdx1 === currentFileIdx) { + top.rtwreport_document_frame.document.location.href = RTW_TraceInfo.instance.getCurrentHRef(); + top.initLine = top.rtwreport_document_frame.document.location.hash.substr(1); + addTagToCurrentLine(); + if (top.rtwreport_contents_frame) { + if (hiliteByFileName(top.rtwreport_document_frame.location.href)) + removeHiliteTOC(top.rtwreport_contents_frame); + } + } else { + var aUrl = RTW_TraceInfo.instance.getCurrentHRef(); + if (hasWebviewFrame()) { + top.rtwreport_document_frame.document.location.href=aUrl; + } else { + top.rtwreport_document_frame.document.location.href=aUrl + "+newPage"; + } + } +} +// Callback for "Prev" button +function rtwGoPrev() { + if (RTW_TraceInfo.instance && top.rtwreport_document_frame) { + var prevfileIdx = RTW_TraceInfo.instance.getPrevFileIdx(); + var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx; + rmTagToCurrentLine(); + RTW_TraceInfo.instance.goPrev(); + Nav(prevfileIdx, currfileIdx); + } +} +// Callback for "First" button +function rtwGoFirst() { + if (RTW_TraceInfo.instance && top.rtwreport_document_frame) { + var prevfileIdx = RTW_TraceInfo.instance.getFirstFileIdx(); + var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx; + rmTagToCurrentLine(); + RTW_TraceInfo.instance.goFirst(); + Nav(prevfileIdx, currfileIdx); + } +} + +// Callback for navigation button onclick +var navButtonStatus = (function() { + var isclicked = false; + return { + clicked: function () { + isclicked = true; + return false; + }, + reset: function () { + isclicked = false; + }, + isClicked: function () { + return isclicked; + } + }; +})(); + +// Callback for "Next" button +function rtwGoNext() { + if (RTW_TraceInfo.instance && top.rtwreport_document_frame) { + var nextfileIdx = RTW_TraceInfo.instance.getNextFileIdx(); + var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx; + rmTagToCurrentLine(); + RTW_TraceInfo.instance.goNext(); + Nav(nextfileIdx, currfileIdx); + } +} +// Callback for "Last" button +function rtwGoLast() { + if (RTW_TraceInfo.instance && top.rtwreport_document_frame) { + var nextfileIdx = RTW_TraceInfo.instance.getLastFileIdx(); + var currfileIdx = RTW_TraceInfo.instance.fCurrFileIdx; + rmTagToCurrentLine(); + RTW_TraceInfo.instance.goLast(); + Nav(nextfileIdx, currfileIdx); + } +} + +function addTagToCurrentLine() { + rmHiliteClickedToken(); + tagCurrentLine(true); +} +function rmTagToCurrentLine() { + tagCurrentLine(false); +} +// tag current line by changing the bacgkround color of the line +function tagCurrentLine(addColor) { + if (RTW_TraceInfo.instance) { + var o = top.rtwreport_document_frame.document.getElementById(RTW_TraceInfo.instance.getCurrLine()); + if (o) { + if (addColor) { + o.className = "hiliteCurrentLine"; + } else { + o.className = "hilite"; + } + } + } +} +// Helper function for main document load callback +function rtwMainOnLoadFcn(topDocObj,aLoc,aPanel,forceReload) { + var loc; + var aHash=""; + var lastArgs = null; + var tocDocObj = top.rtwreport_contents_frame.document; + if (typeof forceReload === "undefined") { + forceReload = false; + } + // get the hash value from location. + if (!aLoc) { + loc = topDocObj.location; + if (loc.search || loc.hash) { + if (loc.search) + aHash = loc.search.substring(1); + else + aHash = loc.hash.substring(1); + } + } else { + aHash = aLoc; + if (RTW_TraceArgs.instance) + lastArgs = RTW_TraceArgs.instance; + } + + // parse URL hash value + RTW_TraceArgs.instance = new RTW_TraceArgs(aHash); + // load metrics + load_metrics(); + // use incode traceability + if (RTW_TraceArgs.instance.getInCodeTrace()) { + RTW_TraceArgs.instance.parseUrlHash2(RTW_TraceArgs.instance.getTraceData()); + inCodeTraceOnload(); + return; + } + if (lastArgs !== null) { + RTW_TraceArgs.instance.setUseExternalBrowser(lastArgs.getUseExternalBrowser()); + RTW_TraceArgs.instance.setModel2CodeSrc(lastArgs.getModel2CodeSrc()); + } + + // get highlight url using sid + if (RTW_TraceArgs.instance.hasSid()) { + sid = RTW_TraceArgs.instance.getSID(); + aHash = RTW_Sid2UrlHash.instance.getUrlHash(sid); + } + // parse hash to look for msg=...&block=... pattern + RTW_TraceArgs.instance.parseCommand(aHash); + // parse hash to look for file.c:10,12&file.h:10,12 + RTW_TraceArgs.instance.parseUrlHash(aHash); + + // hide navigation buttons if not in MATLAB + if (RTW_TraceArgs.instance.getUseExternalBrowser() && tocDocObj.getElementById) { + var o = tocDocObj.getElementById("nav_buttons"); + if (o != null) { + o.style.display = "none"; + } + } + + // hide web view frameset if model2code_src is model + if (RTW_TraceArgs.instance.getModel2CodeSrc() === "model") { + var o = top.document.getElementById('rtw_webviewMidFrame'); + if (o) { + o.rows = "100%,0%"; + } + } + + // stop onload when it has been loaded + if (window.location.search.indexOf("loaded=true") > 0 + && top.rtwreport_document_frame.location.href !== "about:blank" && forceReload !== true) { + updateHyperlinks(); + return; + } + + // modify modelref links + update_modelref_report_link(top.rtwreport_contents_frame.document); + try { + // ignore browser security error + update_modelref_report_link(top.rtwreport_document_frame.document); + } catch(e) {}; + + // redirect the page based on the url + var initPage = null; + if (RTW_TraceArgs.instance.getNumFiles()) { + var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj); + RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks); + RTW_TraceInfo.instance.removeHighlighting() + var numFiles = RTW_TraceArgs.instance.getNumFiles(); + var tLines = 0; + for (var i = 0; i < numFiles; ++i) { + RTW_TraceInfo.instance.setLines(RTW_TraceArgs.instance.getFile(i),RTW_TraceArgs.instance.getLines(i)); + tLines += RTW_TraceArgs.instance.getLines(i).length; + } + RTW_TraceInfo.instance.setTotalLines(tLines); + if (aPanel == false) { + RTW_TraceInfo.instance.setDisablePanel(true); + } + var initFile = RTW_TraceArgs.instance.getInitFile(); + RTW_TraceInfo.instance.setInitLocation(initFile,RTW_TraceArgs.instance.getInitLine()); + if (!hasInCodeTrace()) { + initPage = RTW_TraceInfo.instance.getCurrentHRef(); + } else { + initPage = initFile; + } + } else { + // catch error that document frame is in another domain + try { + var fileDocObj = top.rtwreport_document_frame.document; + if (fileDocObj.location && (!fileDocObj.location.href || fileDocObj.location.href == "about:blank")) { + var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage"); + var tracePage = tocDocObj.getElementById("rtwIdTraceability"); + if (summaryPage) { + initPage = summaryPage.href; + } else if (tracePage) { + initPage = tracePage; + } + } + } catch(e) {}; + } + if (RTW_TraceArgs.instance && RTW_TraceArgs.instance.fMessage) { + // display diagnostic message + var linkId = "rtwIdMsgFileLink"; + var msgFile = tocDocObj.getElementById(linkId); + if (msgFile && msgFile.style) { + msgFile.style.display = "block"; + // Highlight the background of msg link + tocHiliteById(linkId); + } + initPage = "rtwmsg.html"; + } + if (initPage) { + var is_same_page = false; + try { + var fileDocObj = top.rtwreport_document_frame.document; + is_same_page = isSamePage(fileDocObj.location.href, initPage); + } catch(e) {}; + if (is_same_page) { + top.rtwreport_document_frame.location.href = initPage; + // Goto the same page won't trigger onload function. + // Call it manuelly to highligh new code location. + rtwFileOnLoad(top.rtwreport_document_frame.document); + } else { + // change current fileDocObj to initPage + top.rtwreport_document_frame.location.href = initPage; + } + } +} + +// Compare if href1(i.e. file:///path/file1.html#222) and href2(i.e.file2.html) are same pages. +// isSamePage return true if file1 == file2. +function isSamePage(href1, href2) { + var page1 = href1.substring(href1.lastIndexOf('/')+1,href1.lastIndexOf('.html')); + var page2 = href2.substring(href2.lastIndexOf('/')+1,href2.lastIndexOf('.html')); + return (page1 == page2); +} + +// Callback for main document loading +function rtwMainOnLoad() { + rtwMainOnLoadFcn(document,null,true, false); + var newUrl; + // modify history state to avoid reload from pressing back + if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser() && + typeof window.history.replaceState === "function") { + if (window.location.search.length > 0) { + if (window.location.search.indexOf("loaded=true") === -1) { + newUrl = document.location.pathname + window.location.search + '&loaded=true'; + } else { + newUrl = document.location.pathname + window.location.search; + } + } else { + newUrl = document.location.pathname + window.location.search + '?loaded=true'; + } + window.history.replaceState("","",newUrl); + } +} + +// Helper function for traceability report +function rtwMainReload(location) { + // remove highlight filename and lines before reloading the page + if (RTW_TraceInfo.instance) + RTW_TraceInfo.instance.removeHighlighting(); + rtwMainOnLoadFcn(document,location,true,true); +} + +function rtwMainReloadNoPanel(location) { + rtwMainOnLoadFcn(document,location,false,true); +} + +// Callback for hyperlink "Remove Highlighting" +function rtwRemoveHighlighting() { + if (RTW_TraceInfo.instance) + RTW_TraceInfo.instance.removeHighlighting(); + if (rtwSrcFrame()) { + rtwSrcFrame().focus(); + } + if (hasInCodeTrace()) { + removeInCodeTraceHighlight(); + } +} + +// Display diagnostic message in document frame +function rtwDisplayMessage() { + var docObj = top.rtwreport_document_frame.document; + var msg = docObj.getElementById(RTW_TraceArgs.instance.fMessage); + if (!msg) { + msg = docObj.getElementById("rtwMsg_notTraceable"); + } + if (msg && msg.style) { + msg.style.display = "block"; // make message visible + var msgstr = msg.innerHTML; + if (RTW_TraceArgs.instance.fBlock) { + // replace '%s' in message with block name + msgstr = msgstr.replace("%s",RTW_TraceArgs.instance.fBlock); + } + msg.innerHTML = msgstr; + } +} + +function updateHyperlinks() { + docObj = top.rtwreport_document_frame; + if (docObj && docObj.document) { + if (RTW_TraceArgs.instance === null || !RTW_TraceArgs.instance.getUseExternalBrowser()) { + var plain_link = docObj.document.getElementById("linkToText_plain"); + if (plain_link && plain_link.href && plain_link.href.indexOf("matlab:coder.internal.editUrlTextFile") === -1 ) { + plain_link.href = "matlab:coder.internal.editUrlTextFile('" + str2StrVar(plain_link.href) + "')"; + } + var alink = docObj.document.getElementById("linkToCS"); + var linkCmd = "matlab:coder.internal.viewCodeConfigsetFromReport"; + if (alink && alink.href && alink.href.indexOf(linkCmd) === -1) { + alink.href = linkCmd+ "('" + str2StrVar(alink.href) + "');"; + } + } else { + var alink = docObj.document.getElementById("linkToCS"); + if (alink && alink.style) { + alink.style.display = "none"; + hidden_link = docObj.document.getElementById("linkToCS_disabled"); + if (hidden_link) + hidden_link.style.display = ""; + } + if (typeof docObj.document.getElementsByClassName === "function") + alinks = docObj.document.getElementsByClassName("callMATLAB"); + else if (typeof docObj.document.getElementsByName === "function") + alinks = docObj.document.getElementsByName("callMATLAB"); + else + alinks = []; + for (i = 0; i < alinks.length; i++) { + alinks[i].href = "javascript:alert('This hyperlink is available only in MATLAB browser.');"; + alinks[i].style.color = "gray"; + } + alink = docObj.document.getElementById("CodeGenAdvCheck"); + if (alink && alink.href && alink.href.indexOf("externalweb=true")===-1) { + alink.href = alink.href + "?externalweb=true"; + } + + if (typeof docObj.document.getElementsByName === "function") + var objs = docObj.document.getElementsByName("MATLAB_link"); + else + objs = []; + for (var objIndex = 0; objIndex < objs.length; ++objIndex) { + objs[objIndex].style.display = "none"; + } + } + } + updateCode2ModelLinks(docObj.document); + // modify modelref links + update_modelref_report_link(top.rtwreport_contents_frame.document); + try { + // ignore browser security error + update_modelref_report_link(top.rtwreport_document_frame.document); + } catch(e) {}; +} + +function update_modelref_report_link(docObj) { + if (docObj.getElementsByName) { + var arg = ""; + if (RTW_TraceArgs.instance && !RTW_TraceArgs.instance.getUseExternalBrowser()) { + arg = "?useExternalBrowser=false"; + } + if (RTW_TraceArgs && RTW_TraceArgs.instance && RTW_TraceArgs.instance.getModel2CodeSrc() != null) { + if (arg.length > 0) + arg = arg + "&model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc(); + else + arg = "?model2code_src=" + RTW_TraceArgs.instance.getModel2CodeSrc(); + } + if (arg.length > 0) { + links = docObj.getElementsByName('external_link'); + for (var link_idx = 0; link_idx < links.length; ++link_idx) { + links[link_idx].href = links[link_idx].href + arg; + } + } + } +} + +function rtwPageOnLoad(id) { + // highlight toc entry + tocHiliteById(id); + // restore elements state + if (top && top.restoreState) { + if (top.rtwreport_contents_frame && top.rtwreport_contents_frame.document) + top.restoreState(top.rtwreport_contents_frame.document); + if (top.rtwreport_document_frame && top.rtwreport_document_frame.document) + top.restoreState(top.rtwreport_document_frame.document); + } + updateHyperlinks(); +} + +// highlight code after changeSys +function rtwChangeSysCallback(sid) { + if (sid == "" || typeof RTW_Sid2UrlHash == "undefined" || !RTW_Sid2UrlHash.instance) + return false; + urlHash = RTW_Sid2UrlHash.instance.getUrlHash(sid); + if (urlHash != undefined) { + if (RTW_TraceArgs && RTW_TraceArgs.instance && + !RTW_TraceArgs.instance.getUseExternalBrowser()) + urlHash = (urlHash == "")? "?useExternalBrowser=false" : + urlHash+"&useExternalBrowser=false"; + rtwMainReload(urlHash, true); + return true; + } else { + // remove highlighting from traceinfo + rtwRemoveHighlighting(); + return false; + } +} + +// eml file onload function: highlight line in eml file +function emlFileOnload(docObj) { + var loc = docObj.location; + if (loc.hash) { + var line = loc.hash.substring(1); + hiliteEmlLine(docObj, line); + } +} + +// highlight line in an eml file. Ynhighlight previously highligted line first. +function hiliteEmlLine(docObj, line) { + var bgColor; + if (top.HiliteCodeStatus) + bgColor = "#66CCFF"; + else + bgColor = "#E8D152"; + // unhighlight + if (typeof docObj.HiliteLine != "undefined") { + trObj = docObj.getElementById("LN_"+docObj.HiliteLine); + if (trObj != null) { + trObj.style.backgroundColor = ""; + } + } + // hilighlight + trObj = docObj.getElementById("LN_"+line); + if (trObj != null) { + trObj.style.backgroundColor = bgColor; + docObj.HiliteLine = line; + } +} +// eml line onclick callback: highlight C code and current line in eml file +function emlLineOnClick(docObj,sid,line) { + if (top) { + top.HiliteCodeStatus = top.rtwChangeSysCallback(sid); + } + hiliteEmlLine(docObj, line); +} + +function updateCode2ModelLinks(docObj) { + var webviewFrame = top.document.getElementById('rtw_webviewMidFrame'); + if (webviewFrame) { + if (RTW_TraceArgs.instance && + (RTW_TraceArgs.instance.getModel2CodeSrc() !== "model" || + RTW_TraceArgs.instance.getUseExternalBrowser()) + ) { + hiliteCmd = "javascript:top.rtwHilite("; + } else { + hiliteCmd = "matlab:coder.internal.code2model("; + } + var objs = docObj.getElementsByName('code2model'); + var o = null; + var str = ''; + var pattern = "'code2model',"; + for (var objIndex = 0; objIndex < objs.length; ++objIndex) { + o = objs[objIndex]; + str = o.href.substring(o.href.indexOf('(')+1); + if (str.indexOf(pattern) > -1) { + str = str.substring(str.indexOf(pattern) + pattern.length); + } + o.href = hiliteCmd + str; + } + } +} + +function rtwHilite(aBlock,aParentSID) { + if (aBlock.indexOf('-') !== -1) { + // remove sid range: model:sid:2-10 => model:sid + var s; + s = aBlock.split(':'); + if (s.length > 0) { + s = s[s.length-1]; + if (s.indexOf('-') != -1) { + aBlock = aBlock.substring(0, aBlock.lastIndexOf(':')); + } + } + } + if (typeof aParentSID === "undefined") { + if (top.RTW_SidParentMap && top.RTW_SidParentMap.instance) + aParentSID = top.RTW_SidParentMap.instance.getParentSid(aBlock); + else + aParentSID = aBlock; + } + top.HiliteCodeStatus = true; + if (hiliteBlockForRTWReport(aBlock,aParentSID) === false) { + if (hiliteBlockForRTWReport(aBlock, aBlock) === false) { + rtwHilite(aParentSID); + } + } +} + +function str2StrVar(str) { + return str.replace(/'/g,"''"); +} +window.onload=rtwMainOnLoad; + +// handle incode traceability highlighting +function inCodeTraceOnload() { + var tocDocObj = top.rtwreport_contents_frame.document; + if (!top.RTW_TraceArgs.instance) { + var summaryPage = tocDocObj.getElementById("rtwIdSummaryPage"); + top.rtwreport_document_frame.location.href = summaryPage.href; + return; + } + + var files = top.RTW_TraceArgs.instance.getFile(); + if (files.length === 0) { + if (top.RTW_TraceArgs.instance) { + var block = top.RTW_TraceArgs.instance.getBlock(); + block = block.replace("<", "<").replace(">", ">"); + } + top.rtwreport_document_frame.document.write("<pre>No traceability information for block " + block + ".</pre>"); + return; + }; + + var fileLinks = RTW_TraceInfo.getFileLinks(tocDocObj); + RTW_TraceInfo.instance = new RTW_TraceInfo(fileLinks); + + // update filelist with num of highlighted lines + var tocDoc = top.rtwreport_contents_frame.document; + var tLines = 0; + for (var i=0; i<files.length;i++) { + var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(files[i]); + if (typeof fileIdx !== "undefined") { + var rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + var linkNode = tocDoc.getElementById(files[i]); + updateNumHighlightedLines(linkNode, rows.length); + RTW_TraceInfo.instance.setLines(files[i], rows); + tLines += rows.length; + } + } + // set number of total lines + RTW_TraceInfo.instance.setTotalLines(tLines); + // update highligthed from + var node = tocDoc.getElementById("rtwIdTraceBlock"); + if (node) node.textContent = RTW_TraceArgs.instance.getBlock(); + // set the initial file and line + fileIdx = top.RTW_TraceArgs.instance.getFileIdx(files[0]); + rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + RTW_TraceInfo.instance.setInitLocation(files[0],rows[0]); + + // highlight first file + top.rtwreport_document_frame.location.href = files[0]; + return; +} + +function updateNumHighlightedLines(linkObj, aNumLines) { + var parent = linkObj.parentNode; + if (parent && parent.childNodes && parent.childNodes.length > 1) { + var spanNodes = parent.getElementsByTagName('span'); + var len = spanNodes.length; + if (len > 0) { + if (aNumLines > 0) { + /* display number of matches */ + spanNodes.item(len-1).innerHTML = " ("+aNumLines+")"; + } else { + /* clear number of matches */ + spanNodes.item(len-1).innerHTML = ""; + } + } + } +} + +function toggleNavSideBar(val) { + if (top.main) { + var tmp = top.main.cols.split(","); + + if (val === "on") { + tmp[tmp.length-1] = "15px"; + } else { + tmp[tmp.length-1] = "0"; + } + top.main.cols = tmp.join(); + if (top.rtwreport_nav_frame) + top.rtwreport_nav_frame.location.href = "nav.html"; + } +}; + +function toggleNavToolBar(val) +{ + var midFrame = rtwMidFrame(); + if (midFrame) { + var tmp1 = midFrame.rows.split(","); + var frameIdx = getNavToolbarFrameIdx(); + if (val === "on") { + tmp1[frameIdx] = "40px"; + } else { + tmp1[frameIdx] = "0"; + } + midFrame.rows = tmp1.join(); + if (top.rtwreport_navToolbar_frame) { + top.rtwreport_navToolbar_frame.location.href = "navToolbar.html"; + } + } +}; + +var GlobalConfig = { + navHiliteColor: "#0000ff", + fileLinkHiliteColor: "#ffff99", + navToolbarBgcolor: "#aaffff", + offset: 10, + hiliteToken: false +}; +var NavSideBarState = { + calLineHeight: 0, + overLink: false, + linkTarget: null, + lastLinkTarget: null, + linkTargetIdx: 0 +} +function drawNavSideBar() { + var rectHeight = 1; + if (!top || !top.rtwreport_document_frame || !top.rtwreport_nav_frame) return; + + if (!top.RTW_TraceArgs.instance) return; + var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(); + if (fileIdx === undefined) return; + var rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + if (rows.length === 0) return; // no highlighted line + + var codeTbl = top.rtwreport_document_frame.document.getElementById("codeTbl"); + if (!codeTbl) return; // no code table + + var nRows = codeTbl.rows.length + 1; + var canvas = top.rtwreport_nav_frame.document.getElementById("canvas"); + canvas.width = top.rtwreport_nav_frame.innerWidth; + canvas.height = top.rtwreport_nav_frame.innerHeight-2; + NavSideBarState.calLineHeight = canvas.height/nRows; + if (canvas.getContext) { + var ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, canvas.width, canvas.height); + // fill background + ctx.fillStyle = GlobalConfig.navToolbarBgcolor; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.fillStyle = GlobalConfig.navHiliteColor; + for (var i=0;i<rows.length;i++) { + ctx.fillRect(0, Number(rows[i])*NavSideBarState.calLineHeight, canvas.width, rectHeight); + } + if (canvas.addEventListener) { + canvas.addEventListener("mousemove", navBarOnMousemove, false); + canvas.addEventListener("click", navBarOnClick, false); + } else if (canvas.attachEvent) { + canvas.attachEvent("mousemove", navBarOnMousemove); + canvas.attachEvent("click", navBarOnClick); + } + } +} + +function navBarOnMousemove(e) { + var y = e.clientY; + var tolerable_range = 5; + if (!top.RTW_TraceArgs.instance || !top.rtwreport_nav_frame) return; + var fileIdx = top.RTW_TraceArgs.instance.getFileIdx(); + var rows = top.RTW_TraceArgs.instance.getRows(fileIdx); + var lineLoc,nextLineLoc; + top.rtwreport_nav_frame.document.body.style.cursor=""; + NavSideBarState.overLink = false; + NavSideBarState.linkTarget = null; + NavSideBarState.linkTargetIdx = null; + for (var i=0;i<rows.length;i++) { + loc = rows[i]*NavSideBarState.calLineHeight; + // if within the tolerable range + if (Math.abs(y-loc) <= tolerable_range) { + top.rtwreport_nav_frame.document.body.style.cursor="pointer"; + var canvas = top.rtwreport_nav_frame.document.getElementById("canvas"); + canvas.title = "navigate to line " + rows[i]; + NavSideBarState.overLink = true; + NavSideBarState.linkTarget = rows[i]; + NavSideBarState.linkTargetIdx = i; + break; + } + } +} + +function navBarOnClick(e) { + if (NavSideBarState.overLink && top.rtwreport_document_frame) { + rmTagToCurrentLine(); // remove current line tag + top.RTW_TraceInfo.instance.setCurrLineIdx(NavSideBarState.linkTargetIdx); + top.rtwreport_document_frame.document.location.href=RTW_TraceInfo.instance.getCurrentHRef(); + top.addTagToCurrentLine(); // add current line tag + RTW_TraceInfo.instance.updateNavState(); + } +} + +function removeInCodeTraceHighlight() { + var docObj = top.rtwreport_document_frame.document; + toggleNavSideBar("off"); + toggleNavToolBar("off"); + var nodes = docObj.getElementsByClassName("hilite"); + // nodes is a live nodeList. Changing className modifies the list. + while(nodes.length) { + nodes[0].className = nodes[0].className.replace("hilite", ""); + } + var nodes = docObj.getElementsByClassName("hiliteCurrentLine"); + // nodes is a live nodeList. Changing className modifies the list. + while(nodes.length) { + nodes[0].className = nodes[0].className.replace("hiliteCurrentLine", ""); + } + // reset RTW_TraceArgs.instance + RTW_TraceArgs.instance = null; + // remove highlight in content panel except the filelink + if (RTW_TraceInfo && RTW_TraceInfo.instance) { + var currFileIdx = RTW_TraceInfo.instance.getCurrFileIdx(); + RTW_TraceInfo.instance.removeHighlighting(); + RTW_TraceInfo.instance.highlightFileLink(currFileIdx); + } +} + +function getInspectWindow() { + var divObj = document.createElement("div"); + divObj.id = "popup_window"; + return divObj; +} +function getInspectData(file, anchorObj) { + var metricsData = null; + var propObj = null; + var type = null; + var size = null; + var cm; + if (top.rtwreport_nav_frame && top.rtwreport_nav_frame.CodeMetrics && + top.rtwreport_nav_frame.CodeMetrics.instance && + top.RTW_TraceArgs && top.RTW_TraceArgs.instance && + !top.RTW_TraceArgs.instance.getUseExternalBrowser()) { + cm = top.rtwreport_nav_frame.CodeMetrics.instance; + } + if (cm && cm.getMetrics) { + metricsData = cm.getMetrics(anchorObj.text); + if (!metricsData) { + // try static token + metricsData = cm.getMetrics(RTW_TraceInfo.toSrcFileName(file) + ":" + anchorObj.text); + } + if (metricsData) { + type = metricsData.type; + if (type === "var") { + type = "Global Variable"; + size = "(" + metricsData.size + " byte)"; + } else if (type === "fcn") { + type = "Function"; + size = "(stack: " + metricsData.stack + " byte, total stack: " + + metricsData.stackTotal + " byte)"; + } + } + } + if (type === null) { + var defObj = top.CodeDefine.instance.def[anchorObj.text]; + if (defObj) { + type = defObj.type; + if (type === "var") { + type = "Variable"; + } else if (type === "fcn") { + type = "Function"; + } else if (type === "type") { + type = "Type"; + } + size = ""; + } + } + var propObj = document.createElement("div"); + propObj.id = "token_property"; + + var ulObj = document.createElement("ul"); + ulObj.className = "popup_attrib_list"; + ulObj.innerHTML = "<li>" + type + ": <var>" + anchorObj.text + "</var></li><li>"+ + size + "</li>"; + propObj.appendChild(ulObj); + + return propObj; +} +function getInspectLink(file, pathname, anchorObj) { + var model = top.reportModel; + var tokenId = anchorObj.id; + var navObj = document.createElement("div"); + navObj.id = "token_usage_nav"; + ulObj = document.createElement("ul"); + ulObj.id = "token_nav_links"; + ulObj.className="popup_attrib_list"; + var defObj = top.CodeDefine.instance.def[anchorObj.text]; + var line = anchorObj.id.substring(0,anchorObj.id.indexOf("c")); + // link to model + if (top.TraceInfoFlag && top.TraceInfoFlag.instance && + top.TraceInfoFlag.instance.traceFlag[RTW_TraceInfo.toSrcFileName(file)+":"+anchorObj.id]) { + ulObj.innerHTML += "<li><a href=\"matlab:rtw.report.code2model(\'" + top.reportModel + + "\',\'"+pathname+"\',\'" + tokenId + "');\">Navigate to model</a></li>"; + } + // link to def/decl + if (defObj) { + var filename = defObj.file.split(/\//); + filename = filename[filename.length-1]; + ulObj.innerHTML += "<li><i>" + anchorObj.text + "</i> defined at <a target='rtwreport_document_frame' onclick=\"top.tokenLinkOnClick(event)\" href='" + defObj.file + "#" + defObj.line + + "'>" + RTW_TraceInfo.toSrcFileName(filename) + " line " + defObj.line + "</a></li>"; + } + navObj.appendChild(ulObj); + return navObj; +} + +var LastHiliteTokenId = null; +function rmHiliteClickedToken() { + if (LastHiliteTokenId) { + var o = top.rtwreport_document_frame.document.getElementById(LastHiliteTokenId); + if (o) { + o.className = o.className.replace("hiliteToken", ""); + } + } +} +function hiliteClickedToken(elem) { + rmHiliteClickedToken(); + LastHiliteTokenId = elem.id; + elem.className += " hiliteToken"; +} + +var initLine = null; +function scrollToInitLine() { + if (initLine) { + var lineElem = top.rtwreport_document_frame.document.getElementById(initLine); + if (lineElem) { + lineElem.scrollIntoView(); + } + } +} + +function scrollToLineBasedOnHash(hashValue) { + // move to the current highlight line if the hash is not empty + if (hashValue === "") { + if (top.RTW_TraceInfo.instance && top.RTW_TraceInfo.instance.getCurrLine() !== null) { + top.rtwreport_document_frame.document.location.href=top.RTW_TraceInfo.instance.getCurrentHRef(); + top.initLine = top.rtwreport_document_frame.document.location.hash.substr(1); + } + } else { + // scroll and hilite line + hashValue = hashValue.substr(1); + if (isNaN(hashValue)) { + // #fcn_name + var pattern = "+newPage"; + if (hashValue.indexOf(pattern) != -1) { + hashValue = hashValue.replace(pattern, ''); + var lineElem = top.rtwreport_document_frame.document.getElementById(hashValue); + initLine = hashValue; // save initLine in case the dom is updated later by anootation + if (lineElem) { + lineElem.scrollIntoView(); + addTagToCurrentLine(); + } + + } else { + var token = null; + pattern = ["var_", "fcn_", "type_"]; + for (var i =0; i < pattern.length; i++) { + if (hashValue.indexOf(pattern[i]) === 0) { + token = hashValue.substr(pattern[i].length); + break; + } + } + if (token !== null && top.CodeDefine && top.CodeDefine.instance) { + var addr = top.CodeDefine.instance.def[token]; + if (addr) { + hilite_line(addr.line); + } + } else { // token id like #line"c"#col + if (hashValue.indexOf("c") !== -1) { + hilite_line(hashValue.substr(0, hashValue.indexOf("c")), hashValue); + } + } + } + } else { // #line + hilite_line(hashValue); + } + } + return false; + // hilite line number and scroll with an offset + function hilite_line(line, tokenId) { + if (isNaN(line)) return; + if (!tokenId) { + tokenId = line; + } + var elem = top.rtwreport_document_frame.document.getElementById(tokenId); + hiliteClickedToken(elem); + initLine = offset_line(line); + scrollToInitLine(); + } +} + +function tokenLinkOnClick(event) { + var alink = event.currentTarget; + if (alink.pathname === top.rtwreport_document_frame.location.pathname) { + event.preventDefault(); + scrollToLineBasedOnHash(alink.hash); + } + return false; +} +function inspectToken(file, pathname, event) { + var height = "70px"; + // show inspect data + if (top.rtwreport_inspect_frame) { + var windowObj = getInspectWindow(); + var propObj = getInspectData(file, event.currentTarget); + var navObj = getInspectLink(file, pathname, event.currentTarget); + if (propObj === null) { + height = "50px"; + } else { + windowObj.appendChild(propObj); + } + windowObj.appendChild(navObj); + var data = top.rtwreport_inspect_frame.document.getElementById("popup_window"); + if (data) { + data.parentNode.replaceChild(windowObj.cloneNode(true), data); + } + } + setInspectWindow(height); + return false; +} +function setInspectWindow(height) { + // show inspect code frame + var midFrame = rtwMidFrame(); + var tmp = midFrame.rows.split(","); + tmp[getInspectFrameIdx()] = height; + midFrame.rows = tmp.join(); +} +function closeInspectWindow() { + setInspectWindow(0); + return false; +} + +// set the trace number in the navigation toolbar +function setTraceNumber() { + if (RTW_TraceInfo.instance) { + var aFrame = rtwNavToolbarFrame(); + if (aFrame) { + var node = aFrame.document.getElementById("rtwIdTraceNumber"); + // calculate current line index over total highlighted lines + var currNum = RTW_TraceInfo.instance.getCurrLineIdx(); + for (var idx=0;idx<RTW_TraceInfo.instance.getCurrFileIdx();idx++) { + currNum += RTW_TraceInfo.instance.getNumLines(idx); + } + if (node) { + node.innerHTML = String(currNum+1) + " of " + String(RTW_TraceInfo.instance.getTotalLines()); + } + } + } +} + +function offset_line(line, offset) { + if (offset == undefined) + offset = GlobalConfig.offset; + if (offset > 0) + line = (line > GlobalConfig.offset ? line - GlobalConfig.offset : 1); + return line; +} + +function load_js(frame, file) { + var h = frame.document.getElementsByTagName("head")[0]; + var o = h.getElementsByTagName('script'); + for (var i=0;i<o.length;++i) { + if (o[i].getAttribute("src") === file) { + h.removeChild(o[i]); + } + } + var s = top.document.createElement("script"); + s.type = "text/javascript"; + s.src = file; + h.appendChild(s); +} + +function reqOnClick(event) { + top.hiliteClickedToken(event.currentTarget); + return true; +} +function resize_NavToolbar_frame() { + resize_frame(getNavToolbarFrameIdx(), rtwNavToolbarFrame().document.height); +} +function resize_Inspect_frame() { + resize_frame(getInspectFrameIdx(), rtwInspectFrame().document.height); +} +function resize_frame(id, height) { + if (height) { + var midFrame = top.rtwMidFrame(); + var tmp = midFrame.rows.split(","); + if (tmp[id] !== "0%" && tmp[id] !== "0") { + tmp[id] = "" + height - 8 + "px"; + midFrame.rows = tmp.join(); + } + } +} +function getNavToolbarFrameIdx() { + return 0; +} +function getInspectFrameIdx() { + return 2; +} +function load_metrics() { + var alink = top.document.createElement("a"); + alink.href = "metrics.js"; + if (top.RTW_TraceArgs && top.RTW_TraceArgs.instance && !top.RTW_TraceArgs.instance.getUseExternalBrowser()) { + try { + load_js(top.rtwreport_nav_frame, alink.href); + } catch (err) {}; + } +} + +function getNavFrame() { + if (hasWebviewFrame()) { + return rtwTocFrame(); + } else { + return rtwNavToolbarFrame(); + } +} + +function hasWebviewFrame() { + if (top.document.getElementById('rtw_webviewMidFrame')) { + return true; + } else { + return false; + } +} +function hasInCodeTrace() { + return (typeof(Html2SrcLink) === "function") && !hasWebviewFrame(); +} +function uniqueRows(rows) { + return rows.sort(function(a,b) {return a-b}).filter( + function(el,idx, arr) { + if (idx===arr.indexOf(el)) return true; return false; + } + ); +}