package org.richfaces.renderkit.html; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.faces.application.ResourceDependencies; import javax.faces.application.ResourceDependency; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import org.richfaces.component.AbstractDropDownMenu; import org.richfaces.component.AbstractMenuGroup; import org.richfaces.component.AbstractMenuItem; import org.richfaces.component.AbstractMenuSeparator; import org.richfaces.component.Mode; import org.richfaces.component.Positioning; import org.richfaces.renderkit.RenderKitUtils; import org.richfaces.renderkit.RenderKitUtils.ScriptHashVariableWrapper; import org.richfaces.renderkit.RendererBase; @ResourceDependencies({ @ResourceDependency(library = "javax.faces", name = "jsf.js"), @ResourceDependency(library = "org.richfaces", name = "jquery.js"), @ResourceDependency(library = "org.richfaces", name = "richfaces.js"), @ResourceDependency(library = "org.richfaces", name = "richfaces-queue.reslib"), @ResourceDependency(library = "org.richfaces", name = "richfaces-base-component.js"), @ResourceDependency(library = "org.richfaces", name = "jquery.position.js"), @ResourceDependency(library = "org.richfaces", name = "richfaces-event.js"), @ResourceDependency(library = "org.richfaces", name = "popup.js"), @ResourceDependency(library = "org.richfaces", name = "menuKeyNavigation.js"), @ResourceDependency(library = "org.richfaces", name = "menu-base.js"), @ResourceDependency(library = "org.richfaces", name = "menu.js"), @ResourceDependency(library = "org.richfaces", name = "menugroup.js"), @ResourceDependency(library = "org.richfaces", name = "menuitem.js"), @ResourceDependency(library = "org.richfaces", name = "dropdownmenu.ecss", target = "head") }) public abstract class DropDownMenuRendererBase extends RendererBase { public static final String RENDERER_TYPE = "org.richfaces.DropDownMenuRenderer"; public static final int DEFAULT_MIN_POPUP_WIDTH = 250; public static final String DEFAULT_SHOWEVENT = "mouseover"; @Override public void renderChildren(FacesContext facesContext, UIComponent component) throws IOException { AbstractDropDownMenu dropDownMenu = (AbstractDropDownMenu) component; for (UIComponent child : dropDownMenu.getChildren()) { if (child.isRendered() && (child instanceof AbstractMenuGroup || child instanceof AbstractMenuItem || child instanceof AbstractMenuSeparator || UIComponent.isCompositeComponent(child))) { child.encodeAll(facesContext); } } } protected boolean isDisabled(FacesContext facesContext, UIComponent component) { if (component instanceof AbstractDropDownMenu) { return ((AbstractDropDownMenu) component).isDisabled(); } return false; } protected UIComponent getLabelFacet(FacesContext facesContext, UIComponent component) { UIComponent facet = null; AbstractDropDownMenu ddmenu = (AbstractDropDownMenu) component; if (ddmenu != null) { facet = ddmenu.getFacet(AbstractDropDownMenu.Facets.labelDisabled.toString()); if (!ddmenu.isDisabled() || facet == null) { facet = ddmenu.getFacet(AbstractDropDownMenu.Facets.label.toString()); } } return facet; } public List<Map<String, Object>> getMenuGroups(FacesContext facesContext, UIComponent component) { List<Map<String, Object>> results = new ArrayList<Map<String, Object>>(); List<AbstractMenuGroup> groups = new ArrayList<AbstractMenuGroup>(); if (component instanceof AbstractDropDownMenu) { if (component.isRendered() && !((AbstractDropDownMenu) component).isDisabled()) { getMenuGroups(component, groups); } } for (AbstractMenuGroup group : groups) { if (group.isRendered() && !group.isDisabled()) { Map<String, Object> map = new HashMap<String, Object>(); map.put("id", group.getClientId(facesContext)); RenderKitUtils.addToScriptHash(map, "onhide", group.getOnhide(), null, ScriptHashVariableWrapper.eventHandler); RenderKitUtils.addToScriptHash(map, "onshow", group.getOnshow(), null, ScriptHashVariableWrapper.eventHandler); RenderKitUtils.addToScriptHash(map, "verticalOffset", group.getVerticalOffset(), "0"); RenderKitUtils.addToScriptHash(map, "horizontalOffset", group.getHorizontalOffset(), "0"); Positioning jointPoint = group.getJointPoint(); if (jointPoint == null) { jointPoint = org.richfaces.component.Positioning.DEFAULT; } RenderKitUtils.addToScriptHash(map, "jointPoint", jointPoint.getValue(), org.richfaces.component.Positioning.DEFAULT.getValue()); Positioning direction = group.getDirection(); if (direction == null) { direction = org.richfaces.component.Positioning.DEFAULT; } RenderKitUtils.addToScriptHash(map, "direction", direction.getValue(), org.richfaces.component.Positioning.DEFAULT.getValue()); RenderKitUtils.addToScriptHash(map, "cssRoot", component.getAttributes().get("cssRoot"), "ddm"); results.add(map); } } return results; } protected int getPopupWidth(UIComponent component) { int width = ((AbstractDropDownMenu) component).getPopupWidth(); if (width <= 0) { width = DEFAULT_MIN_POPUP_WIDTH; } return width; } protected Mode getMode(UIComponent component) { Mode mode = ((AbstractDropDownMenu) component).getMode(); if (mode == null) { mode = Mode.server; } return mode; } protected Positioning getJointPoint(UIComponent component) { Positioning jointPoint = ((AbstractDropDownMenu) component).getJointPoint(); if (jointPoint == null) { jointPoint = org.richfaces.component.Positioning.DEFAULT; } return jointPoint; } protected Positioning getDirection(UIComponent component) { Positioning direction = ((AbstractDropDownMenu) component).getDirection(); if (direction == null) { direction = org.richfaces.component.Positioning.DEFAULT; } return direction; } private void getMenuGroups(UIComponent component, List<AbstractMenuGroup> list) { if (component != null && list != null) { for (UIComponent c : component.getChildren()) { if (c instanceof AbstractMenuGroup) { list.add((AbstractMenuGroup) c); } getMenuGroups(c, list); } } } protected String getShowEvent(UIComponent component) { String value = ((AbstractDropDownMenu) component).getShowEvent(); if (value == null || "".equals(value)) { value = DEFAULT_SHOWEVENT; } return value; } }