The following creates a detailed navigation iView. The page does the following:
● Determines the start level for the detailed navigation.
● Starts an iteration through the children nodes of the selected node on the level above the start level.
● For each node, starts a recursive iteration through all its children nodes.
● For each node in the recursive iteration, displays the appropriate HTML.
<%@ page import = "java.util.*" %>
<%@ page import = "com.sapportals.portal.navigation.*" %>
<%@ page import = "com.sapportals.portal.prt.resource.IResource" %>
<%@ page import = "com.sapportals.portal.prt.runtime.PortalRuntime" %>
<%@ page import = "com.sapportals.portal.navigation.INavigationGenerator"%>
<%@ page import = "com.sapportals.portal.prt.component.IPortalComponentRequest" %>
<%@ taglib uri="NavigationTagLibrary" prefix="nav" %>
<%
NavigationEventsHelperService helperService =
(NavigationEventsHelperService)PortalRuntime.getRuntimeResources()
.getService(NavigationEventsHelperService.KEY);
INavigationGenerator service =
(INavigationGenerator)PortalRuntime.getRuntimeResources()
.getService(INavigationService.KEY);
IPortalComponentRequest currentRequest =
(IPortalComponentRequest) pageContext.getAttribute(
javax.servlet.jsp.PageContext.REQUEST );
IPortalComponentResponse currentResponse =
(IPortalComponentResponse)pageContext.getAttribute(
javax.servlet.jsp.PageContext.RESPONSE);
IPortalComponentContext componentContext =
currentRequest.getComponentContext();
IPortalComponentProfile profile = componentContext.getProfile();
IPortalComponentURI componentURI =
currentRequest.createPortalComponentURI
();
TreeSet openNodes = (TreeSet)currentRequest
.getComponentSession().getValue("LightDTNOpenNodes");
if(openNodes==null) {
openNodes = new TreeSet();
session.putValue("LightDTNOpenNodes",openNodes);
}
String oldIndices = (String) currentRequest
.getComponentSession().getValue("LightDTNRootIndicies");
NavigationNodes path = (NavigationNodes)helperService
.getNavNodesListForPath(
currentRequest,INavigationConstants.NAVIGATION_CONTEXT_ATTR);
boolean nodeIsOpen = false;
boolean nodeIsPressed = false;
boolean nodeInSelectedPath = false;
int nodeID = 0;
Integer nodeIDInteger = null;
int pressedKnobID = 0;
Integer pressedKnobIDInteger = null;
String pressedKnobIDString = (String)currentRequest.
getParameter("LightDTNKnobID");
String urlParameters = "";
boolean previewMode = false;
String mode = (String)componentRequest.getNode().getValue("mode");
if(mode!=null && mode.equals("preview")) {
previewMode = true;
}
componentURI.setContextName(currentRequest.getComponentContext()
.getContextName());
componentURI.setTargetNode(currentRequest.getNode());
if(pressedKnobIDString!=null && !pressedKnobIDString.equals("")) {
pressedKnobID = Integer.parseInt(pressedKnobIDString);
pressedKnobIDInteger = new Integer(pressedKnobID);
}
// Find start level
String strStartLevel = profile.getProperty(
"com.sap.portal.navigation.lightdetailednavigationtree.startLevel");
int startLevel = 3;
try {
startLevel = Integer.parseInt(strStartLevel);
} catch(NumberFormatException e) {
strStartLevel = "3";
}
if(startLevel<1 || previewMode) {
startLevel = 1;
strStartLevel = "1";
}
String indices = "";
ArrayList indicesList = helperService.getNavNodesPathIndexesList(currentRequest);
try {
for(int i=0; i<startLevel-1; i++) {
indices += indicesList.get(i) + ".";
}
} catch(IndexOutOfBoundsException e) {
}
if(oldIndices==null || !indices.equals(oldIndices)) {
openNodes.clear();
}
if(!indices.equals("")) {
currentRequest.getComponentSession().putValue(
"LightDTNRootIndicies",indices);
}
%>
<TABLE Width='100%' Class="lightDTNTable">
<!--Iterate through children of selected node in TLN -->
<nav:iterateSelectedNavNodesLevel level="<%=strStartLevel%>">
<!--For each node, start rescursive iteration -->
<nav:recurseNavNodeChildren currentDepth="currentDepth"
currentNavNode="currentNavNode">
<% nodeInSelectedPath = false; %>
<nav:ifNavNodeInSelectedPath>
<% nodeInSelectedPath = true; %>
</nav:ifNavNodeInSelectedPath>
<% nodeID = currentNavNode.getName().hashCode();
nodeIDInteger = new Integer(nodeID);
nodeIsOpen = openNodes.contains(nodeIDInteger);
nodeIsPressed = (pressedKnobIDInteger!=null &&
pressedKnobID==nodeID);
urlParameters = "LightDTNKnobID=" + nodeID;
if(nodeIsOpen) {
if(nodeIsPressed) {
openNodes.remove(nodeIDInteger);
nodeIsOpen = false;
}
} else {
if(nodeIsPressed) {
openNodes.add(nodeIDInteger);
nodeIsOpen = true;
}
}
if(nodeInSelectedPath && pressedKnobIDInteger==null) {
openNodes.add(nodeIDInteger);
nodeIsOpen = true;
} %>
<!--Display HTML for each node -->
<TR
Style="{display:block;position:relative;left:
<%=((currentDepth.byteValue()-1) * 16)+10%>px}">
<TD Class="lightDTNCell">
<nav:ifNavNodeIsFolder>
<nav:ifNavNodeHasChildren>
<% if(previewMode) { %>
<A class="lightDTNKnob<%
if(nodeIsOpen) { %>Open<% } else { %>Closed<% }
%>" style="display:block;float:left"/>
<% } else { %>
<A href="<%=componentURI%>?<%=urlParameters%>"
class="lightDTNKnob<%
if(nodeIsOpen) { %>Open<% } else { %>Closed<% }
%>" style="display:block;float:left"/>
<% }
if(!nodeIsOpen) { %>
<nav:doNotRecurseNavNodeChildren/>
<% } %>
</nav:ifNavNodeHasChildren>
<nav:ifNotNavNodeHasChildren>
<A class="lightDTNKnobNone" style="display:block;float:left"/>
</nav:ifNotNavNodeHasChildren>
<% if(previewMode) { %>
<A class="lightDTN<%
if(nodeIsOpen) { %>Open<% } else { %>Closed<% }
%>Folder" style="display:block;float:left"/>
<% } else { %>
<A href="<%=componentURI%>?<%=urlParameters%>"
class="lightDTN<%
if(nodeIsOpen) { %>Open<% } else { %>Closed<% }
%>Folder" style="display:block;float:left"/>
<% } %>
</nav:ifNavNodeIsFolder>
<nav:ifNotNavNodeIsFolder>
<nav:doNotRecurseNavNodeChildren/>
<A class="lightDTNKnobNone" style="display:block;float:left"/>
<A class="lightDTNLeaf" style="display:block;float:left"/>
</nav:ifNotNavNodeIsFolder>
<nav:ifNavNodeEqualsLaunchedNavNode>
<% if(previewMode) { %>
<A class="lightDTNTextSelected"
style="float:left"><nav:navNodeTitle/></A>
<% } else { %>
<nav:navNodeAnchor navigationMethod="byURL"
urlParameters="<%=urlParameters%>"
anchorAttributes="class='lightDTNTextSelected'
style='float:left'"/>
<% } %>
</nav:ifNavNodeEqualsLaunchedNavNode>
<nav:ifNotNavNodeEqualsLaunchedNavNode>
<nav:ifNavNodeIsFolder>
<% if(nodeIsOpen) { %>
<A href="<%=componentURI%>?<%=urlParameters%>"
class="lightDTNText"
style='float:left'><nav:navNodeTitle/></A>
<% } else {
if(previewMode) { %>
<A class="lightDTNText"><nav:navNodeTitle/></A>
<% } else { %>
<nav:navNodeAnchor navigationMethod="byURL"
urlParameters="<%=urlParameters%>"
anchorAttributes="class='lightDTNText'
style='float:left'"/>
<% }
} %>
</nav:ifNavNodeIsFolder>
<nav:ifNotNavNodeIsFolder>
<% if(previewMode) { %>
<A class="lightDTNText"
style='float:left'><nav:navNodeTitle/></A>
<% } else { %>
<nav:navNodeAnchor navigationMethod="byURL"
anchorAttributes="class='lightDTNText'
style='float:left'"/>
<% } %>
</nav:ifNotNavNodeIsFolder>
</nav:ifNotNavNodeEqualsLaunchedNavNode>
</TD>
<TR/>
</nav:recurseNavNodeChildren>
</nav:iterateSelectedNavNodesLevel>
</TABLE>