sideNav.jspf
<%-- Licensed Materials - Property of IBM, 5724-E76, (C) Copyright IBM Corp. 2001, 2004, 2006 - All Rights reserved. NOTE: See notes in Default.jsp for information regarding editing theme JSP fragments. --%> <%-- This JSP renders the navigation bar on the left side of the page. By default, this will continue rendering the navigation where the previous navigation entity left off. --%> <%-- The navigation attributes can be overidden by the page meta data. Instead of using the themePolicy directly, use EL variables initialized to the page meta-data values with the theme policy values as a default in case the attributes aren't specified in the page meta-data. --%> <portal-logic:pageMetaData varname="pageMetaData"> <c:set var="renderSideNavigation"> <c:out value='${pageMetaData["com.ibm.portal.themepolicy.renderSideNavigation"]}' default="${themePolicy.renderSideNavigation}"/> </c:set> <c:set var="sideNavigationStartLevel"> <c:out value='${pageMetaData["com.ibm.portal.themepolicy.sideNavigationStartLevel"]}' default="${themePolicy.sideNavigationStartLevel}"/> </c:set> </portal-logic:pageMetaData> <c-rt:if test = "${renderSideNavigation}"> <portal-logic:if navigationAvailable="yes" screen="Home,LoggedIn,LoggedOut"> <portal-navigation:navigation startLevel="${sideNavigationStartLevel}"> <% int previousNavLevel=0;%> <portal-navigation:navigationLoop> <%-- basic logic required: if node is selected give selected style if node has children, show expand/collapse if node is unselectable(label), don't render anchor if node is external url, open in new window if navlevel changed, open/close uls as needed. --%> <% // variables boolean isNodeSelected = wpsSelectionModel.isNodeSelected(wpsNavNode); String rowCssClass = isNodeSelected ? "wptheme-sideNavItem wptheme-sideNavSelected" : "wptheme-sideNavItem"; boolean nodeHasChildren = wpsNavModel.hasChildren(wpsNavNode); boolean isExpanded = ((Boolean)((com.ibm.portal.state.StateModel)wpsNavModel).getState(wpsNavNode, com.ibm.portal.state.StateType.EXPANSION)).booleanValue() ; boolean openInNewWindow = com.ibm.portal.content.ContentNodeType.EXTERNALURL.equals(wpsNavNode.getContentNode().getContentNodeType()); boolean isLabel = com.ibm.portal.content.ContentNodeType.LABEL.equals(wpsNavNode.getContentNode().getContentNodeType()); int currentNavLevel = wpsNavLevel.intValue(); %> <c:set var="sideNavItemTitle"><portal-fmt:title/></c:set> <%-- ****************** open/close nav levels ****************** --%> <c-rt:choose> <%-- new unordered list is created when current nav level is higher than previous nav level--%> <c-rt:when test="<%=currentNavLevel > previousNavLevel%>"><% for(int i = currentNavLevel; i > previousNavLevel; i--){%> <ul <% if(previousNavLevel==0){%> class="wptheme-sideNav"<%}%> > <%} %></c-rt:when> <%-- unordered list is closed and list item that the list is placed inside is also closed--%> <c-rt:when test="<%=currentNavLevel < previousNavLevel %>"><% for(int i = currentNavLevel; i < previousNavLevel; i++){%></ul></li><%} %></c-rt:when> </c-rt:choose> <li <%if (isNodeSelected) { %> id="portalSelectedNode" onmouseover="wptheme_ContextMenuUtils.sideNavPageMenu.showAffordance(); return false;" onmouseout="wptheme_ContextMenuUtils.sideNavPageMenu.hideAffordance(); return false;" <% } %> > <span class="<%=rowCssClass%>"> <%-- ****************** render expand/collapse ****************** --%> <c-rt:choose> <c-rt:when test="<%=nodeHasChildren && isExpanded %>"> <a href='<portal-navigation:navigationUrl type="collapse"/>'><img alt="<portal-fmt:text key='link.collapse' bundle='nls.engine'/>" title="<portal-fmt:text key='link.collapse' bundle='nls.engine'/>" class="wptheme-sideNavIcon" src="<portal-logic:urlFindInTheme file='images/sideNav/minus.gif' />"></a> </c-rt:when> <c-rt:when test="<%=nodeHasChildren && !isExpanded %>"> <a href='<portal-navigation:navigationUrl type="expand"/>'><img alt="<portal-fmt:text key='link.expand' bundle='nls.engine'/>" title="<portal-fmt:text key='link.expand' bundle='nls.engine'/>" class="wptheme-sideNavIcon" src="<portal-logic:urlFindInTheme file='<%=isRTL ? "images/sideNav/plus_rtl.gif" : "images/sideNav/plus.gif" %>' />"></a> </c-rt:when> <c-rt:otherwise> <img alt="" class="wptheme-sideNavIcon" src="<%=wpsBaseURL%>/images/dot.gif" /> </c-rt:otherwise> </c-rt:choose> <%-- ****************** render node ****************** --%> <c-rt:choose> <c-rt:when test="<%=isLabel%>"> <span class="wptheme-sideNavLabel wptheme-sideNavLevel<%=wpsNavLevel%>"><c:out value='${sideNavItemTitle}' escapeXml='true' /></span> </c-rt:when> <c-rt:otherwise> <a class="<%=rowCssClass%> wptheme-sideNavLevel<%=wpsNavLevel%>" href='<portal-navigation:navigationUrl type="launch"/>' <% if (isNodeSelected) { %>onfocus="wptheme_ContextMenuUtils.sideNavPageMenu.showAffordance();" <% } %> > <c:out value='${sideNavItemTitle}' escapeXml='true' /> </a> <c-rt:if test = "${themePolicy.renderContextMenus}"> <% if(isNodeSelected){%> <a id="wptheme_selected_page_menu" href="javascript:void(0);" onclick="javascript:wptheme_ContextMenuUtils.sideNavPageMenu.show(); return false;" onkeypress="javascript:wptheme_ContextMenuUtils.sideNavPageMenu.show(event); return true;" style="cursor: default;" > <img id="wptheme_selected_page_menu_img" class="wptheme-sideNavMenuLink" src='<portal-logic:urlFindInTheme file="colors/${colorPalette}/menu_selected_disabled.gif"/>' alt="<portal-fmt:text bundle='nls.engine' key='link.page.actions' />" title="<portal-fmt:text bundle='nls.engine' key='link.page.actions' />" /> </a> <script type="text/javascript"> //Register the context menu so that the menu can easily be enabled/disabled. javascriptEventController.register( "wptheme_selected_page_menu" ); //Register the li with the mouseover events to load the menu. javascriptEventController.register( "portalSelectedNode" ); </script> <% } %> <%-- ****************** Show icon for closing transient pages ****************** --%> <portal-dynamicui:closePage> <a href="<% closePageURL.write(escapeXmlWriter); %>" > <img class="wptheme-sideNavMenuLink" src="<portal-logic:urlFindInTheme file='images/NavigationClose.gif'/>" border="0" align="absmiddle"> </a> </portal-dynamicui:closePage> </c-rt:if> </c-rt:otherwise> </c-rt:choose> </span> <%-- the list item is closed if the node does not have children or it is not expanded --%> <c-rt:if test="<%=(!nodeHasChildren || !isExpanded)%>"> </li> </c-rt:if> <%previousNavLevel = currentNavLevel;%> </portal-navigation:navigationLoop> <%-- When no more nodes are left to be processed by the nav loop, it exits but leaves the lists and list items open, there is a check to see if there is more than one level, if true, the lists and list items are closed. There is a </ul> tag after the for loop to close the initial list that is opened. This initial <ul> is created when a side nav page is created --%> <c-rt:if test="<%=previousNavLevel > 0 %>"><% for(int i = previousNavLevel; i > 1; i--){%></ul></li><%} %></ul></c-rt:if> </portal-navigation:navigation> </portal-logic:if> <portal-theme-ext:themeExtension id="com.ibm.portal.theme.plugin.VerticalPageBarItems" > <portal-theme-ext:themeExtensionLoop> <portal-theme-ext:themeExtensionRenderInclude /> </portal-theme-ext:themeExtensionLoop> </portal-theme-ext:themeExtension> </c-rt:if>