1 33 34 package com.icesoft.faces.component.menubar; 35 36 import com.icesoft.faces.component.InvalidComponentTypeException; 37 import com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer; 38 39 import javax.faces.component.UIComponent; 40 import javax.faces.context.FacesContext; 41 import javax.faces.el.MethodBinding; 42 import javax.faces.event.ActionListener; 43 import java.io.IOException ; 44 import java.util.List ; 45 46 public class MenuItemsRenderer extends DomBasicRenderer { 47 48 public boolean getRendersChildren() { 49 return true; 50 } 51 52 public void encodeChildren(FacesContext context, UIComponent component) 53 throws IOException { 54 MenuItems menuItems = (MenuItems) component; 55 List children = (List ) menuItems.getValue(); 56 ActionListener[] als = menuItems.getActionListeners(); 59 MethodBinding almb = menuItems.getActionListener(); 60 MethodBinding amb = menuItems.getAction(); 61 setParentsRecursive(component, children, als, almb, amb); 62 renderRecursive(context, children); 63 } 64 65 private void renderRecursive(FacesContext context, List children) 66 throws IOException { 67 for (int i = 0; i < children.size(); i++) { 68 UIComponent nextChildMenuNode = (UIComponent) children.get(i); 69 encodeParentAndChildren(context, nextChildMenuNode); 70 } 71 } 72 73 private void setParentsRecursive(UIComponent parent, List children, 74 ActionListener[] als, 75 MethodBinding almb, MethodBinding amb) { 76 for (int i = 0; i < children.size(); i++) { 77 UIComponent nextChild = null; 78 if (!((nextChild = 79 (UIComponent) children.get(i)) instanceof MenuItemBase)) { 80 throw new InvalidComponentTypeException( 81 "MenuItemsRenderer expects MenuItemBase children"); 82 } 83 nextChild.setParent(parent); 84 85 if( nextChild instanceof MenuItemBase ) { 87 MenuItemBase nextChildMenuItemBase = (MenuItemBase) nextChild; 88 if (null != als) { 89 for(int j = 0; j < als.length; j++) { 90 nextChildMenuItemBase.removeActionListener(als[j]); 91 nextChildMenuItemBase.addActionListener(als[j]); 92 } 93 } 94 if (null != almb) { 95 nextChildMenuItemBase.setActionListener(almb); 96 } 97 if (null != amb) { 98 nextChildMenuItemBase.setAction(amb); 99 } 100 } 101 102 List grandChildren = nextChild.getChildren(); 103 setParentsRecursive(nextChild, grandChildren, als, almb, amb); 104 } 105 } 106 } 107 | Popular Tags |