/** * 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.fulltree; 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; import org.brixcms.plugin.menu.Menu.ChildEntry; import org.brixcms.plugin.menu.tile.AbstractMenuRenderer; import org.brixcms.plugin.site.SitePlugin; import java.util.List; import java.util.Set; /** * Component used to render the menu * * @author igor.vaynberg */ public 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) { NodeAdapter adapter = new NodeAdapter(getModelObject()); Menu menu = new Menu(); menu.load(adapter.getMenuNode()); final Response response = getResponse(); response.write("<ul"); if (!Strings.isEmpty(adapter.getOuterUlCssClass())) { response.write(" class=\""); response.write(adapter.getOuterUlCssClass()); response.write("\""); } response.write(">"); List<ChildEntry> childEntryList = menu.getRoot().getChildren(); ChildEntry firstEntry = childEntryList.get(0); ChildEntry lastEntry = childEntryList.get(childEntryList.size() - 1); for (ChildEntry entry : childEntryList) { renderEntry(entry, adapter, response, getSelectedItems(menu), firstEntry.equals(entry), lastEntry.equals(entry)); } response.write("</ul>"); } private void renderEntry(ChildEntry entry, NodeAdapter adapter, Response response, Set<ChildEntry> selectedItems, boolean isFirst, boolean isLast) { // build css classes string StringBuilder cssClasses = new StringBuilder(); if ((!Strings.isEmpty(adapter.getSelectedLiCssClass()) && isSelected(entry)) || (adapter.getSelectAllParentLi() && anyChildSelected(entry, selectedItems))) { cssClasses.append(adapter.getSelectedLiCssClass()).append(" "); } if (isFirst && !Strings.isEmpty(adapter.getFirstLiCssClass())) { cssClasses.append(adapter.getFirstLiCssClass()).append(" "); } if (isLast && !Strings.isEmpty(adapter.getLastLiCssClass())) { cssClasses.append(adapter.getLastLiCssClass()).append(" "); } if (!Strings.isEmpty(entry.getCssClass())) { cssClasses.append(entry.getCssClass()).append(" "); } if (cssClasses.length() > 0) { cssClasses.deleteCharAt(cssClasses.length() - 1); } response.write("<li"); if (cssClasses.length() > 0) { response.write(" class=\""); response.write(cssClasses); response.write("\""); } response.write(">"); //Rendering for REFERENCE if (entry.getMenuType() == ChildEntry.MenuType.REFERENCE) { response.write("<a"); if (cssClasses.length() > 0) { response.write(" class=\""); response.write(cssClasses); response.write("\""); } response.write(" href=\""); response.write(getUrl(entry)); response.write("\">"); response.write(entry.getTitle()); response.write("</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)); } if (anyChildren(entry)) { response.write("<ul"); if (!Strings.isEmpty(adapter.getInnerUlCssClass())) { response.write(" class=\""); response.write(adapter.getInnerUlCssClass()); response.write("\""); } response.write(">"); List<ChildEntry> childEntryList = entry.getChildren(); ChildEntry firstEntry = childEntryList.get(0); ChildEntry lastEntry = childEntryList.get(childEntryList.size() - 1); for (ChildEntry e : childEntryList) { BrixNode node = getNode(e); if (node == null || SitePlugin.get().canViewNode(node, Context.PRESENTATION)) { renderEntry(e, adapter, response, selectedItems, firstEntry.equals(e), lastEntry.equals(e)); } } response.write("</ul>"); } response.write("</li>"); } }