1
2
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
29
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
70
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
147
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 }