1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.navmenu.htmlnavmenu;
20
21 import java.io.IOException;
22 import java.util.Iterator;
23 import java.util.List;
24
25 import javax.faces.component.NamingContainer;
26 import javax.faces.component.UIComponent;
27 import javax.faces.component.UIViewRoot;
28 import javax.faces.component.behavior.ClientBehaviorHolder;
29 import javax.faces.context.FacesContext;
30
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.apache.myfaces.component.AlignProperty;
34 import org.apache.myfaces.component.DataProperties;
35 import org.apache.myfaces.component.EventAware;
36 import org.apache.myfaces.component.PanelProperties;
37 import org.apache.myfaces.component.UniversalProperties;
38 import org.apache.myfaces.component.html.ext.HtmlPanelGroup;
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public abstract class AbstractHtmlPanelNavigationMenu extends HtmlPanelGroup
60 implements NamingContainer, UniversalProperties, EventAware,
61 PanelProperties, AlignProperty, DataProperties, ClientBehaviorHolder
62 {
63 private static final Log log = LogFactory.getLog(AbstractHtmlPanelNavigationMenu.class);
64
65 public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlPanelNavigationMenu";
66 public static final String COMPONENT_FAMILY = "javax.faces.Panel";
67 private static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.NavigationMenu";
68
69 static final String PREVIOUS_VIEW_ROOT = AbstractHtmlPanelNavigationMenu.class.getName() + ".PREVIOUS_VIEW_ROOT";
70 private static final int DEFAULT_BORDER = Integer.MIN_VALUE;
71
72 private boolean _itemOpenActiveStatesRestored = false;
73
74 public void decode(FacesContext context)
75 {
76 super.decode(context);
77
78
79 context.getExternalContext().getRequestMap().put(PREVIOUS_VIEW_ROOT, context.getViewRoot());
80
81 _itemOpenActiveStatesRestored = true;
82 }
83
84 public void encodeBegin(FacesContext context) throws IOException
85 {
86 if (!_itemOpenActiveStatesRestored && getChildCount() > 0)
87 {
88 UIViewRoot previousRoot = (UIViewRoot)context.getExternalContext().getRequestMap().get(PREVIOUS_VIEW_ROOT);
89 if (previousRoot != null)
90 {
91 if(previousRoot.findComponent(getClientId(context)) instanceof AbstractHtmlPanelNavigationMenu)
92 {
93 restoreOpenActiveStates(context, previousRoot, getChildren());
94 }
95 }
96 else
97 {
98
99
100 }
101 }
102
103 super.encodeBegin(context);
104 }
105
106 public void restoreOpenActiveStates(FacesContext facesContext,
107 UIViewRoot previousRoot,
108 List children)
109 {
110 for (Iterator it = children.iterator(); it.hasNext(); )
111 {
112 UIComponent child = (UIComponent)it.next();
113 UIComponent prevItem = (UIComponent)previousRoot.findComponent(child.getClientId(facesContext));
114
115 if (prevItem instanceof HtmlCommandNavigationItem &&
116 child instanceof HtmlCommandNavigationItem)
117 {
118 HtmlCommandNavigationItem previousItem = (HtmlCommandNavigationItem)prevItem;
119 if (previousItem != null)
120 {
121 ((HtmlCommandNavigationItem)child).setOpen(previousItem.isOpen());
122 ((HtmlCommandNavigationItem)child).setActive(previousItem.isActive());
123 }
124 else
125 {
126 log.debug("Navigation item " + child.getClientId(facesContext) + " not found in previous view.");
127 }
128 if (child.getChildCount() > 0)
129 {
130 restoreOpenActiveStates(facesContext, previousRoot, child.getChildren());
131 }
132 }
133 }
134 }
135
136
137
138
139
140
141 public abstract String getItemClass();
142
143
144
145
146
147
148 public abstract String getOpenItemClass();
149
150
151
152
153
154
155 public abstract String getActiveItemClass();
156
157
158
159
160
161
162 public abstract String getSeparatorClass();
163
164
165
166
167
168
169 public abstract String getItemStyle();
170
171
172
173
174
175
176 public abstract String getOpenItemStyle();
177
178
179
180
181
182
183 public abstract String getActiveItemStyle();
184
185
186
187
188
189
190 public abstract String getSeparatorStyle();
191
192
193
194
195
196
197 public abstract String getLayout();
198
199
200
201
202
203
204
205 public abstract Boolean getPreprocessed();
206
207
208
209
210
211
212
213 public abstract boolean isExpandAll();
214
215
216
217
218
219
220
221
222 public abstract boolean isRenderAll();
223
224
225
226
227
228
229
230 public abstract boolean isDisabled();
231
232
233
234
235
236
237 public abstract String getDisabledStyle();
238
239
240
241
242
243
244 public abstract String getDisabledStyleClass();
245
246 }