?? toc.js
字號:
/******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ // Common scripts for IE and Mozilla.var isMozilla = navigator.userAgent.indexOf('Mozilla') != -1 && parseInt(navigator.appVersion.substring(0,1)) >= 5;var isIE = navigator.userAgent.indexOf('MSIE') != -1;var oldActive;var oldActiveClass = "";// Preload images// **********************************************************// Note: code moved into the jsp, for dynamic image preferences/** * Returns the target node of an event */function getTarget(e) { var target; if (isMozilla) target = e.target; else if (isIE) target = window.event.srcElement; return target;}/** * Returns the next tree node "down" from current one */function getNextDown(node){ var a = getAnchorNode(node); if (!a) return null; // Try visible child first var li = a.parentNode; var ul = getChildNode(li, "UL"); if (ul && ul.className == "expanded") return getDescendantNode(ul, "A"); // Try next sibling var li_sib = getNextSibling(li); if (li_sib != null) return getDescendantNode(li_sib, "A"); // Try looking to parent's sibling while(li_sib == null) { var ul = li.parentNode; li = ul.parentNode; if (li.tagName != "LI") // reached the top, nothing else to do return null; li_sib = getNextSibling(li); } // found the next down sibling return getDescendantNode(li_sib, "A"); }/** * Returns the next tree node "down" from current one */function getNextUp(node){ var a = getAnchorNode(node); if (!a) return null; // Get previous sibling first var li = a.parentNode; var li_sib = getPrevSibling(li); if (li_sib != null) { // try to get the deepest node that preceeds this current node var candidate = getDescendantNode(li_sib, "A"); var nextDown = getNextDown(candidate); while(nextDown != null && nextDown != node){ candidate = nextDown; nextDown = getNextDown(nextDown); } return getDescendantNode(candidate, "A"); ; } else { // get the parent var li = li.parentNode.parentNode; if (li && li.tagName == "LI") return getDescendantNode(li, "A"); else return null; }}/** * Returns the next sibling element */function getNextSibling(node) { var sib = node.nextSibling; while (sib && (sib.nodeType == 3 || sib.tagName=="SCRIPT")) // text or script node sib = sib.nextSibling; return sib;}/** * Returns the next sibling element */function getPrevSibling(node) { var sib = node.previousSibling; while (sib && (sib.nodeType == 3 || sib.tagName=="SCRIPT")) // text or script node sib = sib.previousSibling; return sib;}/** * Returns the child node with specified tag */function getChildNode(parent, childTag){ var list = parent.childNodes; if (list == null) return null; for (var i=0; i<list.length; i++) if (list.item(i).tagName == childTag) return list.item(i); return null;}/** * Returns the descendat node with specified tag (depth-first searches) */function getDescendantNode(parent, childTag){ if (parent == null) return null; if (parent.tagName == childTag) return parent; var list = parent.childNodes; if (list == null) return null; for (var i=0; i<list.length; i++) { var child = list.item(i); if(child.tagName == childTag) return child; child = getDescendantNode(child, childTag); if (child != null) return child; } return null;}/** * Returns the anchor of this click * NOTE: MOZILLA BUG WITH A:focus and A:active styles */function getAnchorNode(node) { if (node == null) return null; if (node.nodeType == 3) //"Node.TEXT_NODE") return node.parentNode; else if (node.tagName == "A") return node; else if (node.tagName == "IMG") return getChildNode(node.parentNode, "A"); return null;}/** * Returns the plus/minus icon for this tree node */function getPlusMinus(node){ if (isPlusMinus(node)) return node; else if (node.nodeType == 3) //"Node.TEXT_NODE") return getChildNode(node.parentNode.parentNode, "IMG"); else if (node.tagName == "IMG") return getChildNode(node.parentNode.parentNode, "IMG"); else if (node.tagName == "A") return getChildNode(node.parentNode, "IMG"); return null;}/** * Returns true when the node is the plus or minus icon */function isPlusMinus(node){ return (node.nodeType != 3 && node.tagName == "IMG" && (node.className == "expanded" || node.className == "collapsed"));}/** * Collapses a tree rooted at the specified element */function collapse(node) { node.className = "collapsed"; node.src = plus.src; node.alt = altTopicClosed; // set the UL as well var ul = getChildNode(node.parentNode, "UL"); if (ul != null) ul.className = "collapsed";}/** * Expands a tree rooted at the specified element */function expand(node) { node.className = "expanded"; node.src = minus.src; node.alt = altTopicOpen; // set the UL as well var ul = getChildNode(node.parentNode, "UL"); if (ul != null){ ul.className = "expanded"; if (ul.id.length > 0){ if (!frames.dynLoadFrame) { return; } var ix = window.location.href.indexOf('?'); if (ix < 0) { return; } var query = window.location.href.substr(ix); frames.dynLoadFrame.location = "tocFragment.jsp" + query + "&path=" + ul.id; } }}/** * Expands the nodes from root to the specified node */function expandPathTo(node, inclusive){ // when the node is a link, get the plus/minus image if (node.tagName == "A") { var img = getChildNode(node.parentNode, "IMG") if (img == null) return; expandPathTo(img, inclusive); return; } if (inclusive && isCollapsed(node)) expand(node); var li = node.parentNode; if (li == null) return; var ul = li.parentNode; if (ul == null) return; li = ul.parentNode; if (li == null) return; var img = getChildNode(li, "IMG"); if (img == null) return; expandPathTo(img, true);}/** * Returns true when this is an expanded tree node */function isExpanded(node) { return node.className == "expanded";}/** * Returns true when this is a collapsed tree node */function isCollapsed(node) { return node.className == "collapsed";}/** * Highlights link */function highlightTopic(topic){ if (isMozilla) window.getSelection().removeAllRanges(); var a = getAnchorNode(topic); if (a != null) { parent.parent.parent.setContentToolbarTitle(tocTitle); if (oldActive) oldActive.className = oldActiveClass; oldActive = a; oldActiveClass = a.className; a.className = "active"; // it looks like the onclick event is not handled in mozilla // *** TO DO: handle failed synchronization, do not select in that case if (isMozilla && a.onclick) a.onclick() //if (isIE) // a.hideFocus = "true"; }}/** * Selects a topic in the tree: expand tree and highlight it * returns true if success */function selectTopic(topic){ if (!topic) return false; // remove the query, if any var i = topic.indexOf('?'); if (i != -1) topic = topic.substring(0, i); var links = document.getElementsByTagName("a"); for (var i=0; i<links.length; i++) { if (topic == links[i].href) { expandPathTo(links[i], false); highlightTopic(links[i]); scrollIntoView(links[i]); return true; } } return false;}/** * Selects a topic in the tree: expand tree and highlight it * returns true if success */function selectTopicById(id){ var topic = document.getElementById(id); if (topic) { expandPathTo(topic, false); highlightTopic(topic); scrollIntoView(topic); return true; } return false;}/** * Scrolls the page to show the specified element */function scrollIntoView(node){ var scroll = getVerticalScroll(node); if (scroll != 0) window.scrollBy(0, scroll);}/** * Scrolls the page to show the specified element */function getVerticalScroll(node){ var nodeTop = node.offsetTop; var nodeBottom = nodeTop + node.offsetHeight; var pageTop = 0; var pageBottom = 0; if (isIE) { pageTop = document.body.scrollTop; pageBottom = pageTop + document.body.clientHeight; } else if (isMozilla) { pageTop = window.pageYOffset; pageBottom = pageTop + window.innerHeight - node.offsetHeight; } var scroll = 0; if (nodeTop >= pageTop ) { if (nodeBottom <= pageBottom) scroll = 0; // already in view else scroll = nodeBottom - pageBottom; } else { scroll = nodeTop - pageTop; } return scroll;}/* * Currently called on IE only */function focusHandler(e){ /*if (isMozilla) return; */ try{ if (oldActive){ // only focus when the element is visible var scroll = getVerticalScroll(oldActive); if (scroll == 0) oldActive.focus(); } } catch(e){}}/** * display topic label in the status line on mouse over topic */function mouseMoveHandler(e) { var overNode = getTarget(e); if (!overNode) return; overNode = getAnchorNode(overNode); if (overNode == null){ window.status = ""; return; } if (isMozilla) e.cancelBubble = false; if (overNode.title == "") { if (overNode.innerText) overNode.title = overNode.innerText; else if (overNode.text) overNode.title = overNode.text; } window.status = overNode.title;}/** * handler for expanding / collapsing topic tree */function mouseClickHandler(e) { var clickedNode = getTarget(e); if (isPlusMinus(clickedNode) ) { if (isCollapsed(clickedNode)) expand(clickedNode); else if (isExpanded(clickedNode)) collapse(clickedNode); } else { var plus_minus = getPlusMinus(clickedNode); if (plus_minus != null) highlightTopic(plus_minus); } if (isMozilla) e.cancelBubble = true; else if (isIE) window.event.cancelBubble = true;}/** * handler for expanding / collapsing topic tree */function mouseDblClickHandler(e) { var clickedNode = getTarget(e); if (!clickedNode) return; var plus_minus = getPlusMinus(clickedNode); if (plus_minus != null) { if (isCollapsed(plus_minus)) expand(plus_minus); else if (isExpanded(plus_minus)) collapse(plus_minus); highlightTopic(plus_minus); } if (isMozilla) e.cancelBubble = true; else if (isIE) window.event.cancelBubble = true;}/** * Handler for key down (arrows) */function keyDownHandler(e){ var key; if (isIE) { key = window.event.keyCode; } else if (isMozilla) { key = e.keyCode; } if (key <37 || key > 40) return true; if (isMozilla) e.cancelBubble = true; else if (isIE) window.event.cancelBubble = true; if (key == 39) { // Right arrow, expand var clickedNode = getTarget(e); if (!clickedNode) return; if (isIE){ if(clickedNode.id!=null){ if(clickedNode.id.charAt(0)=='b'){ if(clickedNode.name!="opened"){ loadTOC(clickedNode.name); return true; } } } } var plus_minus = getPlusMinus(clickedNode); if (plus_minus != null) { if (isCollapsed(plus_minus)) expand(plus_minus); highlightTopic(plus_minus); scrollIntoView(clickedNode); } } else if (key == 37) { // Left arrow,collapse var clickedNode = getTarget(e); if (!clickedNode) return; if(clickedNode.id!=null){ if(clickedNode.id.charAt(0)=='b'){ if(clickedNode.name=="opened"){ loadTOC(" "); return true; } else{ return true; } } } var plus_minus = getPlusMinus(clickedNode); if (plus_minus != null) { if (isExpanded(plus_minus)) collapse(plus_minus); highlightTopic(plus_minus); scrollIntoView(clickedNode); } } else if (key == 40 ) { // down arrow var clickedNode = getTarget(e); if (!clickedNode) return; var next = getNextDown(clickedNode); if (next) next.focus(); } else if (key == 38 ) { // up arrow var clickedNode = getTarget(e); if (!clickedNode) return; var next = getNextUp(clickedNode); if (next) next.focus(); } return true;}if (isMozilla) { document.addEventListener('click', mouseClickHandler, true); document.addEventListener('dblclick', mouseDblClickHandler, true); document.addEventListener('mousemove', mouseMoveHandler, true); document.addEventListener('keydown', keyDownHandler, true);}else if (isIE){ document.onclick = mouseClickHandler; document.ondblclick = mouseDblClickHandler; document.onmousemove = mouseMoveHandler; document.onkeydown = keyDownHandler; //window.onfocus = focusHandler;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -