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