/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.brixcms.plugin.menu.tile.subtree; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.model.IModel; import org.apache.wicket.request.Response; import org.apache.wicket.util.string.Strings; import org.brixcms.auth.Action.Context; import org.brixcms.jcr.wrapper.BrixNode; import org.brixcms.plugin.menu.Menu.ChildEntry; import org.brixcms.plugin.menu.Menu.Entry; import org.brixcms.plugin.menu.tile.AbstractMenuRenderer; import org.brixcms.plugin.site.SitePlugin; import java.util.Set; /** * Component used to render the menu * * @author igor.vaynberg */ class MenuRenderer extends AbstractMenuRenderer { private static final long serialVersionUID = 1L; /** * Constructor * * @param id * @param model */ public MenuRenderer(String id, IModel<BrixNode> model) { super(id, model); } /** * {@inheritDoc} */ @Override public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { MenuContainer container = new MenuContainer(); container.load(getModelObject()); Set<ChildEntry> selected = getSelectedItems(container.getMenu()); // how many levels to skip to start rendering int skipLevels = container.getStartAtLevel() != null ? container.getStartAtLevel() : 0; // how many levels should be rendered int renderLevels = container.getRenderLevels() != null ? container.getRenderLevels() : Integer.MAX_VALUE; Response response = getResponse(); renderEntry(container, container.getMenu().getRoot(), response, selected, skipLevels, renderLevels); } private void renderEntry(MenuContainer container, Entry entry, Response response, Set<ChildEntry> selected, int skipLevels, int renderLevels) { if (renderLevels <= 0) { return; } if (skipLevels <= 0) { boolean outer = skipLevels == 0; String klass = ""; if (outer && !Strings.isEmpty(container.getOuterContainerStyleClass())) { klass = " class='" + container.getOuterContainerStyleClass() + "'"; } else if (!outer && !Strings.isEmpty(container.getInnerContainerStyleClass())) { klass = " class='" + container.getInnerContainerStyleClass() + "'"; } response.write("\n<ul"); response.write(klass); response.write(">\n"); } for (ChildEntry e : entry.getChildren()) { BrixNode node = getNode(e); if (node == null || SitePlugin.get().canViewNode(node, Context.PRESENTATION)) { renderChild(container, e, response, selected, skipLevels, renderLevels); } } if (skipLevels <= 0) { response.write("</ul>\n"); } } private void renderChild(MenuContainer container, ChildEntry entry, Response response, Set<ChildEntry> selectedSet, int skipLevels, int renderLevels) { boolean selected = selectedSet.contains(entry); boolean anyChildren = selected && anyChildren(entry); if (skipLevels <= 0) { String listItemCssClass = ""; String anchorCssClass = ""; if (selected && !Strings.isEmpty(container.getSelectedItemStyleClass())) { listItemCssClass = container.getSelectedItemStyleClass(); anchorCssClass = container.getSelectedItemStyleClass(); } if (anyChildren && selected && anyChildSelected(entry, selectedSet) && !Strings.isEmpty(container.getItemWithSelectedChildStyleClass())) { listItemCssClass = container.getItemWithSelectedChildStyleClass(); } if (!Strings.isEmpty(entry.getCssClass())) { if (!Strings.isEmpty(listItemCssClass)) { listItemCssClass += " "; } listItemCssClass += entry.getCssClass(); } response.write("\n<li"); if (!Strings.isEmpty(listItemCssClass)) { response.write(" class=\""); response.write(listItemCssClass); response.write("\""); } response.write(">"); //Rendering for REFERENCE if (entry.getMenuType() == ChildEntry.MenuType.REFERENCE) { final String url = getUrl(entry); response.write("<a"); if (!Strings.isEmpty(anchorCssClass)) { response.write(" class=\""); response.write(anchorCssClass); response.write("\""); } response.write(" href=\""); response.write(url); response.write("\"><span>"); // TODO. escape or not (probably a property would be nice? response.write(entry.getTitle()); response.write("</span></a>"); } //Rendering for CODE else if (entry.getMenuType() == ChildEntry.MenuType.CODE) { response.write(entry.getLabelOrCode()); } //Rendering for LABEL else if (entry.getMenuType() == ChildEntry.MenuType.LABEL) { response.write(Strings.escapeMarkup(entry.getLabelOrCode(), false, true)); } } // only decrement skip levels for child if current is begger than 0 int childSkipLevels = skipLevels - 1; // only decrement render levels when we are already rendering int childRenderLevels = skipLevels <= 0 ? renderLevels - 1 : renderLevels; if (anyChildren) { renderEntry(container, entry, response, selectedSet, childSkipLevels, childRenderLevels); } if (skipLevels == 0) { response.write("</li>\n"); } } }