All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.myfaces.custom.navmenu.htmlnavmenu.HtmlNavigationMenuRenderer Maven / Gradle / Ivy

Go to download

JSF components and utilities that can be used with any JSF implementation. This library is based on the JSF1.1 version of Tomahawk, but with minor source code and build changes to take advantage of JSF2.1 features. A JSF2.1 implementation is required to use this version of the Tomahawk library.

The newest version!
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.myfaces.custom.navmenu.htmlnavmenu;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.component.UIGraphic;
import javax.faces.component.UIOutput;
import javax.faces.component.UISelectItems;
import javax.faces.component.UIViewRoot;
import javax.faces.component.behavior.ClientBehavior;
import javax.faces.component.behavior.ClientBehaviorHolder;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.el.ValueBinding;
import javax.faces.event.ActionListener;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.event.ComponentSystemEventListener;
import javax.faces.event.ListenerFor;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.myfaces.custom.navmenu.NavigationMenuItem;
import org.apache.myfaces.custom.navmenu.NavigationMenuUtils;
import org.apache.myfaces.custom.navmenu.UINavigationMenuItem;
import org.apache.myfaces.renderkit.html.ext.HtmlLinkRenderer;
import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils;
import org.apache.myfaces.shared_tomahawk.renderkit.html.util.ResourceUtils;
import org.apache.myfaces.tomahawk.application.PreRenderViewAddResourceEvent;
import org.apache.myfaces.tomahawk.util.TomahawkResourceUtils;

/**
 * Many thanks to the guys from Swiss Federal Institute of Intellectual Property & Marc Bouquet
 * for helping to develop this component.
 *
 * @JSFRenderer
 *   renderKitId = "HTML_BASIC" 
 *   family = "javax.faces.Panel"
 *   type = "org.apache.myfaces.NavigationMenu"
 *   
 * @JSFRenderer
 *   renderKitId = "HTML_BASIC" 
 *   family = "javax.faces.Command"
 *   type = "org.apache.myfaces.NavigationMenu"
 *
 * @author Thomas Spiegl
 * @author Manfred Geiler
 */
@ListenerFor(systemEventClass=PreRenderViewAddResourceEvent.class)
public class HtmlNavigationMenuRenderer extends HtmlLinkRenderer
    implements ComponentSystemEventListener
{
    private static final Log log = LogFactory.getLog(HtmlNavigationMenuRenderer.class);

    public static final String RENDERER_TYPE = "org.apache.myfaces.NavigationMenu";

    private static final Integer ZERO_INTEGER = new Integer(0);

    private static final String HORIZ_MENU_SCRIPT = "HMenuIEHover.js";

    public void processEvent(ComponentSystemEvent event)
    {
        if (event.getComponent() instanceof HtmlPanelNavigationMenu)
        {
            HtmlPanelNavigationMenu panelNav = (HtmlPanelNavigationMenu) event.getComponent();
            if (HtmlNavigationMenuRendererUtils.isListLayout(panelNav))
            {
                if (panelNav.isRenderAll())
                {
                    addResourcesToHeader(FacesContext.getCurrentInstance());
                }
            }
        }
    }

    public boolean getRendersChildren() {
        return true;
    }

    public void decode(FacesContext facesContext, UIComponent component) {
        if (component instanceof HtmlCommandNavigationItem) {
            //HtmlCommandNavigation
            super.decode(facesContext, component);
        }
        else
        {
            HtmlRendererUtils.decodeClientBehaviors(facesContext, component);
        }
    }

    public void encodeBegin(FacesContext facesContext, UIComponent component) throws IOException {
        if (component instanceof HtmlCommandNavigationItem) {
            //HtmlCommandNavigationItem
            super.encodeBegin(facesContext, component);
        }
    }

    public void encodeChildren(FacesContext facesContext, UIComponent component) throws IOException {
        if (component instanceof HtmlCommandNavigationItem) {
            //HtmlCommandNavigationItem
            super.encodeChildren(facesContext, component);
        }
    }

    public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {
        if (component instanceof HtmlCommandNavigationItem) {
            //HtmlCommandNavigationItem
            super.encodeEnd(facesContext, component);
            return;
        }
        else
        {
            Map> behaviors = null;
            if (component instanceof ClientBehaviorHolder)
            {
                behaviors = ((ClientBehaviorHolder) component).getClientBehaviors();
                if (!behaviors.isEmpty())
                {
                    ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, facesContext.getResponseWriter());
                }
            }
        }
        RendererUtils.checkParamValidity(facesContext, component, HtmlPanelNavigationMenu.class);
        HtmlPanelNavigationMenu panelNav = (HtmlPanelNavigationMenu) component;

        if (HtmlNavigationMenuRendererUtils.isListLayout(panelNav)) {
            boolean preprocess = true;
            boolean clientStateSaving = facesContext.getApplication().getStateManager().isSavingStateInClient(facesContext);
            if (clientStateSaving) {
                // client statesaving
                HtmlPanelNavigationMenu panelNavPrev = findPreviousPanelNav(facesContext, panelNav);
                if (panelNavPrev != null) {
                    preprocess = false;
                    if (!panelNavPrev.equals(panelNav)) {
                        // substitute panelnav
                        UIComponent parent = panelNav.getParent();
                        int insertPos = parent.getChildren().indexOf(panelNav);
                        parent.getChildren().set(insertPos, panelNavPrev);
                        panelNavPrev.setParent(parent);
                        panelNav.setParent(null);
                        panelNav = panelNavPrev;
                    }
                }
            }
            else {
                // server statesaving
                if (panelNav.getPreprocessed() != null && panelNav.getPreprocessed().booleanValue())
                    preprocess = false;
            }
            if (preprocess) {
                panelNav.setPreprocessed(Boolean.TRUE);
                preprocessNavigationItems(facesContext, panelNav, panelNav.getChildren(), new UniqueId());
                if (!clientStateSaving) {
                    HtmlPanelNavigationMenu panelNavPrev = findPreviousPanelNav(facesContext, panelNav);
                    if (panelNavPrev != null) {
                        restoreOpenActiveStates(facesContext, panelNav, panelNavPrev.getChildren());
                    }
                }
            }
            // render list
            if (log.isDebugEnabled())
                HtmlNavigationMenuRendererUtils.debugTree(log, facesContext, panelNav.getChildren(), 0);
            renderListLayout(facesContext, panelNav);
        }
        else {
            renderTableLayout(facesContext, panelNav);
        }
    }

    private void restoreOpenActiveStates(FacesContext facesContext,
                                         HtmlPanelNavigationMenu panelNav, List children) {
        for (int i = 0, size = children.size(); i < size; i++) {
            UIComponent uiComponent = (UIComponent) children.get(i);
            if (uiComponent instanceof HtmlCommandNavigationItem) {
                HtmlCommandNavigationItem prevItem = (HtmlCommandNavigationItem) uiComponent;
                if (prevItem.isOpen() || prevItem.isActive()) {
                    HtmlCommandNavigationItem item = (HtmlCommandNavigationItem) panelNav.findComponent(uiComponent.getClientId(facesContext));
                    if (item != null) {
                        if (item.getActiveDirectly() != null && item.getActiveDirectly().booleanValue()) {
                            item.setActive(prevItem.isActive());
                        }
                        else {
                            copyValueBinding(prevItem, item, "active");
                        }

                        if (item.getOpenDirectly() != null && item.getOpenDirectly().booleanValue()) {
                            item.setOpen(prevItem.isOpen());
                        }
                        else {
                            copyValueBinding(prevItem, item, "open");
                        }
                        if (!panelNav.isExpandAll() || prevItem.isActive())
                            item.toggleOpen();
                        if (prevItem.isOpen())
                            restoreOpenActiveStates(facesContext, panelNav, prevItem.getChildren());
                    }
                }
            }
        }
    }

    private HtmlPanelNavigationMenu findPreviousPanelNav(FacesContext facesContext, HtmlPanelNavigationMenu panelNav) {
        UIViewRoot previousViewRoot = findPreviousRoot(facesContext);
        if (previousViewRoot != null) {
            return (HtmlPanelNavigationMenu) previousViewRoot.findComponent(panelNav.getClientId(facesContext));
        }
        return null;
    }

    private UIViewRoot findPreviousRoot(FacesContext facesContext) {
        return (UIViewRoot) facesContext.getExternalContext().getRequestMap().get(HtmlPanelNavigationMenu.PREVIOUS_VIEW_ROOT);
    }

    protected void renderListLayout(FacesContext facesContext, HtmlPanelNavigationMenu panelNav) throws IOException {
        //if (panelNav.isRenderAll())
        //    addResourcesToHeader(facesContext);

        ResponseWriter writer = facesContext.getResponseWriter();
        if (panelNav.getChildCount() > 0) {
            HtmlRendererUtils.writePrettyLineSeparator(facesContext);
            writer.startElement(HTML.UL_ELEM, panelNav);

            Map> behaviors = panelNav.getClientBehaviors();
            
            if (behaviors != null && !behaviors.isEmpty())
            {
                writer.writeAttribute(HTML.ID_ATTR, panelNav.getClientId(facesContext),null);
                HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, panelNav, behaviors);
                HtmlRendererUtils.renderHTMLAttributes(writer, panelNav, HTML.UL_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS); 

            }
            else
            {
                HtmlRendererUtils.writeIdIfNecessary(writer, panelNav, facesContext);
                HtmlRendererUtils.renderHTMLAttributes(writer, panelNav, HTML.UL_PASSTHROUGH_ATTRIBUTES);
            }

            //iterate over the tree and toggleOpen if viewId in item.getActiveOnVieIds()
            activeOnViewId(panelNav, facesContext.getViewRoot().getViewId());
            //iterate over the tree and set every item open if expandAll
            if (panelNav.isExpandAll()) {
                expandAll(panelNav);
            }

            HtmlNavigationMenuRendererUtils.renderChildrenListLayout(facesContext, writer, panelNav, panelNav.getChildren(), 0);

            HtmlRendererUtils.writePrettyLineSeparator(facesContext);
            writer.endElement(HTML.UL_ELEM);
        }
        else {
            if (log.isWarnEnabled()) log.warn("PanelNavaigationMenu without children.");
        }
    }

    private void renderTableLayout(FacesContext facesContext, HtmlPanelNavigationMenu panelNav) throws IOException {
        ResponseWriter writer = facesContext.getResponseWriter();

        if (panelNav.getChildCount() > 0) {
            HtmlRendererUtils.writePrettyLineSeparator(facesContext);
            writer.startElement(HTML.TABLE_ELEM, panelNav);
            Map> behaviors = panelNav.getClientBehaviors();
            
            if (behaviors != null && !behaviors.isEmpty())
            {
                writer.writeAttribute(HTML.ID_ATTR, panelNav.getClientId(facesContext),null);
                HtmlRendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, panelNav, behaviors);
                HtmlRendererUtils.renderHTMLAttributes(writer, panelNav, HTML.TABLE_PASSTHROUGH_ATTRIBUTES_WITHOUT_EVENTS); 
            }
            else
            {
                HtmlRendererUtils.writeIdIfNecessary(writer, panelNav, facesContext);
                HtmlRendererUtils.renderHTMLAttributes(writer, panelNav, HTML.TABLE_PASSTHROUGH_ATTRIBUTES);                
            }
            if (panelNav.getStyle() == null && panelNav.getStyleClass() == null) {
                writer.writeAttribute(HTML.BORDER_ATTR, ZERO_INTEGER, null);
            }

            HtmlNavigationMenuRendererUtils.renderChildrenTableLayout(facesContext, writer, panelNav, panelNav.getChildren(), 0);

            HtmlRendererUtils.writePrettyLineSeparator(facesContext);
            writer.endElement(HTML.TABLE_ELEM);
        }
        else {
            if (log.isWarnEnabled()) log.warn("PanelNavaigationMenu without children.");
        }
    }

    private void addResourcesToHeader(FacesContext context) {
        //AddResource addResource = AddResourceFactory.getInstance(context);
        //addResource.addJavaScriptAtPosition(context, AddResource.HEADER_BEGIN, HtmlPanelNavigationMenu.class, HORIZ_MENU_SCRIPT);
        TomahawkResourceUtils.addOutputScriptResource(context,
                "oam.custom.navmenu.htmlnavmenu", HORIZ_MENU_SCRIPT);
    }

    /**
     * look for UINavigationMenuItem && UISelectItems & create components
     */
    private void preprocessNavigationItems(FacesContext facesContext, UIComponent parent,
                                           List children, UniqueId uniqueId) {
        for (int i = 0; i < children.size(); i++) {
            UIComponent child = (UIComponent) children.get(i);

            if (child instanceof HtmlCommandNavigationItem) {
                HtmlCommandNavigationItem navMenuItem = (HtmlCommandNavigationItem) child;
                preprocessNavigationItems(facesContext, navMenuItem, navMenuItem.getChildren(), uniqueId);
            }
            else if (child instanceof UINavigationMenuItem) {
                UINavigationMenuItem uiNavMenuItem = (UINavigationMenuItem) child;
                createHtmlCommandNavigationItem(facesContext, parent, i, uiNavMenuItem, uniqueId);
            }
            else if (child instanceof UISelectItems) {
                List list = new ArrayList();
                if (child.getId() == null) {
                    child.setId("testit");
                }
                NavigationMenuUtils.addNavigationMenuItems((UISelectItems) child, list);
                addUINavigationMenuItems(facesContext, parent, children, i + 1, list);
            }
        }
    }

    private void addUINavigationMenuItems(FacesContext facesContext, UIComponent parent, List children, int startIndex, List menuItems) {
        String clientId = parent.getClientId(facesContext);
        clientId = clientId.replaceAll(":", "_");
        for (int j = 0, sizej = menuItems.size(); j < sizej; j++) {
            NavigationMenuItem navigationMenuItem = (NavigationMenuItem) menuItems.get(j);
            UINavigationMenuItem uiNavigationMenuItem =
                (UINavigationMenuItem) facesContext.getApplication().createComponent(UINavigationMenuItem.COMPONENT_TYPE);
            uiNavigationMenuItem.setId(clientId + "_uinavmitem" + (startIndex + j));
            uiNavigationMenuItem.getClientId(facesContext); // create clientid
            children.add(startIndex++, uiNavigationMenuItem);
            uiNavigationMenuItem.setParent(parent);
            if (navigationMenuItem.getAction() != null) {
                uiNavigationMenuItem.setAction(HtmlNavigationMenuRendererUtils.getMethodBinding(facesContext, navigationMenuItem.getAction(), false));
            }
            if (navigationMenuItem.getActionListener() != null) {
                uiNavigationMenuItem.setActionListener(HtmlNavigationMenuRendererUtils.getMethodBinding(facesContext,
                                                                                                        navigationMenuItem.getActionListener(), true));
            }
            uiNavigationMenuItem.setIcon(navigationMenuItem.getIcon());
            uiNavigationMenuItem.setRendered(navigationMenuItem.isRendered());
            uiNavigationMenuItem.setActiveOnViewIds(navigationMenuItem.getActiveOnViewIds());
            uiNavigationMenuItem.setSplit(navigationMenuItem.isSplit());
            uiNavigationMenuItem.setItemLabel(navigationMenuItem.getLabel());
            uiNavigationMenuItem.setOpen(navigationMenuItem.isOpen());
            uiNavigationMenuItem.setActive(navigationMenuItem.isActive());
            uiNavigationMenuItem.setValue(navigationMenuItem.getValue());
            HtmlNavigationMenuRendererUtils.setAttributeValue(facesContext, uiNavigationMenuItem,
                                                              "externalLink", navigationMenuItem.getExternalLink());
            //uiNavigationMenuItem.setExternalLink(navigationMenuItem.getExternalLink());
            uiNavigationMenuItem.setTransient(false);
            uiNavigationMenuItem.setTarget(navigationMenuItem.getTarget());
            uiNavigationMenuItem.setDisabled(navigationMenuItem.isDisabled());
            uiNavigationMenuItem.setDisabledStyle(navigationMenuItem.getDisabledStyle());
            uiNavigationMenuItem.setDisabledStyleClass(navigationMenuItem.getDisabledStyleClass());

            if (navigationMenuItem.getNavigationMenuItems() != null && navigationMenuItem.getNavigationMenuItems().length > 0)
            {
                addUINavigationMenuItems(facesContext, uiNavigationMenuItem, uiNavigationMenuItem.getChildren(), 0,
                                         Arrays.asList(navigationMenuItem.getNavigationMenuItems()));
            }
        }
    }

    private HtmlPanelNavigationMenu getParentPanelNavigation(UIComponent uiComponent) {
        if (uiComponent instanceof HtmlPanelNavigationMenu) {
            return (HtmlPanelNavigationMenu) uiComponent;
        }
        UIComponent parent = uiComponent.getParent();

        // search HtmlPanelNavigation
        UIComponent p = parent;
        while (p != null && !(p instanceof HtmlPanelNavigationMenu)) {
            p = p.getParent();
        }
        // p is now the HtmlPanelNavigation
        if (p == null) {
            log.error("HtmlCommandNavigation without parent HtmlPanelNavigation ?!");
            return null;
        }
        return (HtmlPanelNavigationMenu) p;
    }

    private void createHtmlCommandNavigationItem(FacesContext facesContext, UIComponent parent, int i,
                                                 UINavigationMenuItem uiNavMenuItem, UniqueId uniqueId) {
        HtmlPanelNavigationMenu menu = getParentPanelNavigation(parent);
        // Create HtmlCommandNavigationItem
        HtmlCommandNavigationItem newItem = (HtmlCommandNavigationItem)
            facesContext.getApplication().createComponent(HtmlCommandNavigationItem.COMPONENT_TYPE);
        String parentId = parent.getClientId(facesContext);
        parentId = parentId.replaceAll(":", "_");
        int id = uniqueId.next();
        newItem.setId(parentId + "_item" + id);
        newItem.getClientId(facesContext); // create clientid
        newItem.setRendererType(RENDERER_TYPE);
        parent.getChildren().add(i + 1, newItem);
        newItem.setParent(parent);
        // set action & actionListner
        newItem.setAction(uiNavMenuItem.getAction());
        newItem.setActionListener(uiNavMenuItem.getActionListener());
        ActionListener[] listeners = uiNavMenuItem.getActionListeners();
        for (int j = 0; j < listeners.length; j++) {
            newItem.addActionListener(listeners[j]);
        }
        // value
        newItem.setValue(uiNavMenuItem.getValue());
        // immeditate
        if (!copyValueBinding(uiNavMenuItem, newItem, "immediate"))
            newItem.setImmediate(uiNavMenuItem.isImmediate());
        // transient, rendered
        if (!copyValueBinding(uiNavMenuItem, newItem, "transient"))
            newItem.setTransient(uiNavMenuItem.isTransient());
        if (!copyValueBinding(uiNavMenuItem, newItem, "rendered"))
            newItem.setRendered(uiNavMenuItem.isRendered());
        if (!copyValueBinding(uiNavMenuItem, newItem, "externalLink"))
            newItem.setExternalLink(uiNavMenuItem.getExternalLink());
        if (!copyValueBinding(uiNavMenuItem, newItem, "activeOnViewIds"))
            newItem.setActiveOnViewIds(uiNavMenuItem.getActiveOnViewIds());

        if (uiNavMenuItem.isOpen() && ! menu.isExpandAll())
            newItem.toggleOpen();

        if (uiNavMenuItem.getActiveDirectly() != null) {
            newItem.setActive(uiNavMenuItem.isActive());
        }
        else {
            newItem.setValueBinding("active", uiNavMenuItem.getValueBinding("active"));
        }

        if (!copyValueBinding(uiNavMenuItem, newItem, "target"))
            newItem.setTarget(uiNavMenuItem.getTarget());
        if (!copyValueBinding(uiNavMenuItem, newItem, "disabled"))
            newItem.setDisabled(uiNavMenuItem.isDisabled());
        if (!copyValueBinding(uiNavMenuItem, newItem, "disabledStyle"))
            newItem.setDisabledStyle(uiNavMenuItem.getDisabledStyle());
        if (!copyValueBinding(uiNavMenuItem, newItem, "disabledStyleClass"))
            newItem.setDisabledStyleClass(uiNavMenuItem.getDisabledStyleClass());

        if (uiNavMenuItem.getActiveOnViewIdsDirectly() != null) {
            newItem.setActiveOnViewIds(uiNavMenuItem.getActiveOnViewIdsDirectly());
        }

        // If the parent-Element is disabled the child is disabled as well
        if (parent instanceof HtmlPanelNavigationMenu) {
            if (newItem.getDisabledStyle() == null) {
                newItem.setDisabledStyle(
                    ((HtmlPanelNavigationMenu) parent).getDisabledStyle()
                );
            }
            if (newItem.getDisabledStyleClass() == null) {
                newItem.setDisabledStyleClass(
                    ((HtmlPanelNavigationMenu) parent).getDisabledStyleClass()
                );
            }
            if (((HtmlPanelNavigationMenu) parent).isDisabled()) {
                newItem.setDisabled(true);
            }
        }
        if (parent instanceof HtmlCommandNavigationItem) {
            if (newItem.getDisabledStyle() == null) {
                newItem.setDisabledStyle(
                    ((HtmlCommandNavigationItem) parent).getDisabledStyle()
                );
            }
            if (newItem.getDisabledStyleClass() == null) {
                newItem.setDisabledStyleClass(
                    ((HtmlCommandNavigationItem) parent).getDisabledStyleClass()
                );
            }
            if (((HtmlCommandNavigationItem) parent).isDisabled()) {
                newItem.setDisabled(true);
            }
        }

        if (uiNavMenuItem.getIcon() != null) {
            UIGraphic uiGraphic = (UIGraphic) facesContext.getApplication().createComponent(UIGraphic.COMPONENT_TYPE);
            uiGraphic.setId(parentId + "_img" + id);
            uiGraphic.getClientId(facesContext);
            newItem.getChildren().add(uiGraphic);
            uiGraphic.setParent(newItem);
            if (NavigationMenuUtils.isValueReference(uiNavMenuItem.getIcon())) {
                uiGraphic.setValueBinding("value",
                                          facesContext.getApplication().createValueBinding(uiNavMenuItem.getIcon()));
            }
            else {
                uiGraphic.setValue(uiNavMenuItem.getIcon());
            }
        }

        else {
            // Create and add UIOutput
            UIOutput uiOutput = (UIOutput) facesContext.getApplication().createComponent(UIOutput.COMPONENT_TYPE);
            uiOutput.setId(parentId + "_txt" + id);
            uiOutput.getClientId(facesContext); // create clientid
            newItem.getChildren().add(uiOutput);
            uiOutput.setParent(newItem);
            if (uiNavMenuItem.getItemLabel() != null) {
                if (NavigationMenuUtils.isValueReference(uiNavMenuItem.getItemLabel())) {
                    uiOutput.setValueBinding("value",
                                             facesContext.getApplication().createValueBinding(uiNavMenuItem.getItemLabel()));
                }
                else {
                    uiOutput.setValue(uiNavMenuItem.getItemLabel());
                }
            }
            else {
                Object value = uiNavMenuItem.getValue();
                if (value != null &&
                    NavigationMenuUtils.isValueReference(value.toString())) {
                    uiOutput.setValueBinding("value",
                                             facesContext.getApplication().createValueBinding(value.toString()));
                }
                else {
                    uiOutput.setValue(uiNavMenuItem.getValue());
                }
            }
        }
        // process next level
        log.debug("Instance of UINavigationMenuItem, preprocess childrens");
        preprocessNavigationItems(facesContext, newItem, uiNavMenuItem.getChildren(), uniqueId);
    }

    private boolean copyValueBinding(UIComponent source, UIComponent target, String binding) {
        ValueBinding valueBinding = source.getValueBinding(binding);
        if (valueBinding == null)
            return false;
        target.setValueBinding(binding, valueBinding);
        return true;
    }

// protected

    protected String getStyle(FacesContext facesContext, UIComponent link) {
        if (!(link instanceof HtmlCommandNavigationItem)) {
            throw new IllegalArgumentException("expected instance of " + HtmlCommandNavigationItem.class.getName());
        }

        UIComponent navPanel = HtmlNavigationMenuRendererUtils.getPanel(link);

        HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) link;
        if (navItem.isActive()) {
            return ((HtmlPanelNavigationMenu) navPanel).getActiveItemStyle();
        }
        else if (navItem.isOpen()) {
            return ((HtmlPanelNavigationMenu) navPanel).getOpenItemStyle();
        }
        else {
            return ((HtmlPanelNavigationMenu) navPanel).getItemStyle();
        }
    }

    protected String getStyleClass(FacesContext facesContext, UIComponent link) {
        if (!(link instanceof HtmlCommandNavigationItem)) {
            throw new IllegalArgumentException();
        }

        UIComponent navPanel = HtmlNavigationMenuRendererUtils.getPanel(link);

        HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) link;
        if (navItem.isActive()) {
            return ((HtmlPanelNavigationMenu) navPanel).getActiveItemClass();
        }
        else if (navItem.isOpen()) {
            return ((HtmlPanelNavigationMenu) navPanel).getOpenItemClass();
        }
        else {
            return ((HtmlPanelNavigationMenu) navPanel).getItemClass();
        }
    }

    private static class UniqueId {
        private int _id;

        public int next() {
            return _id++;
        }

        public void decrease() {
            _id--;
        }
    }

    private void expandAll(UIComponent parent) {
        //Recurse over all Children setOpen if child is HtmlCommandNavigationItem
        if (parent instanceof HtmlCommandNavigationItem) {
            HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) parent;
            navItem.setOpen(true);
        }
        List children = parent.getChildren();
        UIComponent child;
        for (int i = 0; i < children.size(); i++) {
            child = (UIComponent) children.get(i);
            expandAll(child);
        }
    }

    private void activeOnViewId(UIComponent parent, String viewId) {
        //Recurse over all Children setOpen if child is HtmlCommandNavigationItem
        if (parent instanceof HtmlCommandNavigationItem) {
            HtmlCommandNavigationItem navItem = (HtmlCommandNavigationItem) parent;
            String[] viewIds = navItem.getActiveOnVieIds();
            for (int i = 0; i < viewIds.length; i++) {
                if (viewId.equals(viewIds[i])) {
                    navItem.toggleOpen();
                    navItem.setActive(true);
                    return;
                }
            }
            ;
        }
        List children = parent.getChildren();
        UIComponent child;
        for (int i = 0; i < children.size(); i++) {
            child = (UIComponent) children.get(i);
            activeOnViewId(child, viewId);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy