View Javadoc

1   /*
2    * $Id: MenuTools.java,v 1.18 2011/06/16 09:29:41 jbmeslin Exp $
3    * 
4    */
5   package org.rcfaces.core.internal.tools;
6   
7   import java.util.ArrayList;
8   import java.util.Collections;
9   import java.util.Iterator;
10  import java.util.List;
11  import java.util.Map;
12  
13  import javax.faces.component.UIComponent;
14  import javax.faces.component.UISelectItem;
15  
16  import org.rcfaces.core.component.AbstractMenuComponent;
17  import org.rcfaces.core.component.IMenuComponent;
18  import org.rcfaces.core.component.MenuComponent;
19  import org.rcfaces.core.component.MenuItemComponent;
20  import org.rcfaces.core.component.iterator.IMenuItemIterator;
21  import org.rcfaces.core.component.iterator.IMenuIterator;
22  import org.rcfaces.core.internal.manager.IContainerManager;
23  import org.rcfaces.core.internal.tools.CollectionTools.IComponentValueType;
24  import org.rcfaces.core.internal.util.ComponentIterators;
25  import org.rcfaces.core.lang.OrderedSet;
26  
27  /**
28   * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
29   * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
30   */
31  public class MenuTools {
32      private static final String REVISION = "$Revision: 1.18 $";
33  
34      private static final IMenuItemIterator EMPTY_MENU_ITEM_ITERATOR = new MenuItemListIterator(
35              Collections.EMPTY_LIST);
36  
37      private static final IMenuIterator EMPTY_MENU_ITERATOR = new MenuListIterator(
38              Collections.EMPTY_LIST);
39  
40      private static final String MENU_FACET = "popup";
41  
42      public static final IMenuItemIterator listMenuItems(
43              AbstractMenuComponent menu) {
44          return listMenuItems((IContainerManager) menu);
45      }
46  
47      public static final IMenuItemIterator listMenuItems(
48              MenuItemComponent menuItem) {
49          return listMenuItems((IContainerManager) menuItem);
50      }
51  
52      public static final IMenuItemIterator listMenuItems(MenuComponent menu) {
53          return listMenuItems((IContainerManager) menu);
54      }
55  
56      private static IMenuItemIterator listMenuItems(IContainerManager manager) {
57  
58          List list = ComponentIterators.list((UIComponent) manager,
59                  UISelectItem.class);
60          if (list.isEmpty()) {
61              return EMPTY_MENU_ITEM_ITERATOR;
62          }
63  
64          return new MenuItemListIterator(list);
65      }
66  
67      /**
68       * 
69       * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
70       * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
71       */
72      private static final class MenuItemListIterator extends
73              ComponentIterators.ComponentListIterator implements
74              IMenuItemIterator {
75          private static final String REVISION = "$Revision: 1.18 $";
76  
77          public MenuItemListIterator(List list) {
78              super(list);
79          }
80  
81          public final MenuItemComponent next() {
82              return (MenuItemComponent) nextComponent();
83          }
84  
85          public MenuItemComponent[] toArray() {
86              return (MenuItemComponent[]) toArray(new MenuItemComponent[count()]);
87          }
88      }
89  
90      public static IMenuComponent getMenu(MenuItemComponent item) {
91          for (;;) {
92              UIComponent component = item.getParent();
93              if (component == null) {
94                  return null;
95              }
96  
97              if (component instanceof MenuComponent) {
98                  return (MenuComponent) component;
99              }
100 
101             if ((component instanceof MenuItemComponent) == false) {
102                 return null;
103             }
104 
105             item = (MenuItemComponent) component;
106         }
107     }
108 
109     public static IMenuComponent getMenu(UIComponent component) {
110         return searchMenu(component, null);
111     }
112 
113     public static IMenuComponent getMenu(UIComponent component, String menuId) {
114         return searchMenu(component, menuId);
115     }
116 
117     private static IMenuComponent searchMenu(UIComponent container,
118             String menuId) {
119         List children = container.getChildren();
120         if (children.isEmpty()) {
121             return null;
122         }
123 
124         for (Iterator it = children.iterator(); it.hasNext();) {
125             UIComponent child = (UIComponent) it.next();
126 
127             if ((child instanceof IMenuComponent) == false) {
128                 continue;
129             }
130             if (menuId != null && (child instanceof MenuComponent)) {
131                 MenuComponent menuComponent = (MenuComponent) child;
132 
133                 if (menuId.equals(menuComponent.getMenuId()) == false) {
134                     continue;
135                 }
136             }
137 
138             return (IMenuComponent) child;
139         }
140 
141         return null;
142     }
143 
144     /**
145      * 
146      * @author Olivier Oeuillot (latest modification by $Author: jbmeslin $)
147      * @version $Revision: 1.18 $ $Date: 2011/06/16 09:29:41 $
148      */
149     private static final class MenuListIterator extends
150             ComponentIterators.ComponentListIterator implements IMenuIterator {
151         private static final String REVISION = "$Revision: 1.18 $";
152 
153         public MenuListIterator(List list) {
154             super(list);
155         }
156 
157         public final MenuComponent next() {
158             return (MenuComponent) nextComponent();
159         }
160 
161         public MenuComponent[] toArray() {
162             return (MenuComponent[]) toArray(new MenuComponent[count()]);
163         }
164     }
165 
166     public static IMenuIterator listMenus(IContainerManager component) {
167         Map facets = ((UIComponent) component).getFacets();
168         if (facets != null && facets.isEmpty() == false) {
169             List popups = null;
170             int i = 0;
171             for (Iterator it = facets.values().iterator(); it.hasNext();) {
172                 UIComponent child = (UIComponent) it.next();
173 
174                 if ((child instanceof MenuComponent) == false) {
175                     continue;
176                 }
177 
178                 if (popups == null) {
179                     popups = new ArrayList(facets.size() - i);
180                 }
181                 popups.add(child);
182             }
183 
184             if (popups == null) {
185                 return EMPTY_MENU_ITERATOR;
186             }
187 
188             return new MenuListIterator(popups);
189         }
190 
191         List list = ComponentIterators.list((UIComponent) component,
192                 MenuComponent.class);
193         if (list.isEmpty()) {
194             return EMPTY_MENU_ITERATOR;
195         }
196 
197         return new MenuListIterator(list);
198     }
199 
200     public static final IComponentValueType MENU_VALUE_TYPE = new IComponentValueType() {
201         private static final String REVISION = "$Revision: 1.18 $";
202 
203         public Object createNewValue(UIComponent component) {
204             return new OrderedSet();
205         }
206     };
207 }