/**
* Copyright (c) 2009--2016 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.frontend.nav;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.commons.lang.StringEscapeUtils;
import com.redhat.rhn.frontend.html.HtmlTag;
/**
* DialognavRenderer - renders a navigation bar
*
* Renders the navigation inside the content, which is implemented
* as rows of Twitter Bootstrap tabs (nav-tabs)
*
* The navigation is enclosed in a div styled with class
* 'spacewalk-content-nav' and the individual rows can be styled by
* ul:nth-child selectors.
*
* @version $Rev$
*/
public class DialognavRenderer extends Renderable {
private final StringBuffer titleBuf;
/**
* Public constructor
*/
public DialognavRenderer() {
// empty
titleBuf = new StringBuffer();
}
/** {@inheritDoc} */
@Override
public void preNav(StringBuffer sb) {
HtmlTag div = new HtmlTag("div");
div.setAttribute("class", "spacewalk-content-nav");
sb.append(div.renderOpenTag());
}
/** {@inheritDoc} */
@Override
public void preNavLevel(StringBuffer sb, int depth) {
if (!canRender(null, depth)) {
return;
}
HtmlTag ul = new HtmlTag("ul");
if (depth == 0) {
ul.setAttribute("class", "nav nav-tabs");
}
else {
ul.setAttribute("class", "nav nav-tabs nav-tabs-pf");
}
sb.append(ul.renderOpenTag());
}
/** {@inheritDoc} */
@Override
public void preNavNode(StringBuffer sb, int depth) {
}
/** {@inheritDoc} */
@Override
public void navNodeActive(StringBuffer sb,
NavNode node,
NavTreeIndex treeIndex,
Map parameters,
int depth) {
if (!canRender(node, depth)) {
return;
}
titleBuf.append(" - " + node.getName());
renderNode(sb, node, treeIndex, parameters,
"active");
}
/** {@inheritDoc} */
@Override
public void navNodeInactive(StringBuffer sb,
NavNode node,
NavTreeIndex treeIndex,
Map parameters,
int depth) {
if (!canRender(node, depth)) {
return;
}
renderNode(sb, node, treeIndex, parameters, "");
}
private void renderNode(StringBuffer sb, NavNode node,
NavTreeIndex treeIndex, Map parameters,
String cssClass) {
HtmlTag li = new HtmlTag("li");
if (!cssClass.equals("")) {
li.setAttribute("class", cssClass);
}
String href = node.getPrimaryURL();
String allowedFormVars = treeIndex.getTree().getFormvar();
if (allowedFormVars != null) {
StringBuilder formVars;
if (href.indexOf('?') == -1) {
formVars = new StringBuilder("?");
}
else {
formVars = new StringBuilder("&");
}
StringTokenizer st = new StringTokenizer(allowedFormVars);
while (st.hasMoreTokens()) {
if (formVars.length() > 1) {
formVars.append("&");
}
String currentVar = st.nextToken();
String[] values = (String[])parameters.get(currentVar);
// if currentVar is null, values will be null too, so we can
// just check values.
if (values != null) {
formVars.append(currentVar + "=" +
StringEscapeUtils.escapeHtml(values[0]));
}
}
href += formVars.toString();
}
li.addBody(aHref(href, node.getName(), node.getTarget()));
sb.append(li.render());
sb.append("\n");
}
/** {@inheritDoc} */
@Override
public void postNavNode(StringBuffer sb, int depth) {
}
/** {@inheritDoc} */
@Override
public void postNavLevel(StringBuffer sb, int depth) {
if (!canRender(null, depth)) {
return;
}
HtmlTag ul = new HtmlTag("ul");
sb.append(ul.renderCloseTag());
sb.append("\n");
}
/** {@inheritDoc} */
@Override
public void postNav(StringBuffer sb) {
HtmlTag div = new HtmlTag("div");
sb.append(div.renderCloseTag());
sb.append("\n");
}
/** {@inheritDoc} */
@Override
public boolean nodeRenderInline(int depth) {
return false;
}
private static String aHref(String url, String text, String target) {
HtmlTag a = new HtmlTag("a");
if (target != null && !target.equals("")) {
a.setAttribute("target", target);
}
a.setAttribute("href", url);
a.addBody(text);
return a.render();
}
}