1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.tabbedpane;
20
21 import java.util.Iterator;
22 import java.util.List;
23
24 import javax.faces.component.UIComponent;
25 import javax.faces.component.UIForm;
26 import javax.faces.component.UINamingContainer;
27 import javax.faces.component.html.HtmlPanelGroup;
28 import javax.faces.context.FacesContext;
29 import javax.faces.el.EvaluationException;
30 import javax.faces.el.MethodBinding;
31 import javax.faces.event.AbortProcessingException;
32 import javax.faces.event.FacesEvent;
33 import javax.faces.event.PhaseId;
34
35 import org.apache.myfaces.component.AlignProperty;
36 import org.apache.myfaces.component.DataProperties;
37 import org.apache.myfaces.component.EventAware;
38 import org.apache.myfaces.component.PanelProperties;
39 import org.apache.myfaces.component.UniversalProperties;
40 import org.apache.myfaces.component.UserRoleAware;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 public abstract class AbstractHtmlPanelTabbedPane
57 extends HtmlPanelGroup
58 implements UniversalProperties, EventAware, PanelProperties,
59 AlignProperty, DataProperties, UserRoleAware
60
61 {
62
63
64 public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlPanelTabbedPane";
65 public static final String COMPONENT_FAMILY = "javax.faces.Panel";
66 private static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.TabbedPane";
67 private static final int DEFAULT_SELECTEDINDEX = 0;
68 private static final boolean DEFAULT_SERVER_SIDE_TAB_SWITCH = false;
69
70 private MethodBinding _tabChangeListener = null;
71 private static final int DEFAULT_BORDER = Integer.MIN_VALUE;
72
73 public void decode(FacesContext context)
74 {
75 super.decode(context);
76 }
77
78 public void processDecodes(javax.faces.context.FacesContext context)
79 {
80 if (context == null) throw new NullPointerException("context");
81 decode(context);
82
83 int tabIdx = 0;
84 int selectedIndex = getSelectedIndex();
85
86 Iterator it = getFacetsAndChildren();
87
88 while (it.hasNext())
89 {
90 UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
91 if (childOrFacet instanceof HtmlPanelTab) {
92 if (isClientSide() || selectedIndex == tabIdx) {
93 childOrFacet.processDecodes(context);
94 }
95 tabIdx++;
96 } else {
97 childOrFacet.processDecodes(context);
98 }
99 }
100 }
101
102 public void processValidators(FacesContext context)
103 {
104 if (context == null) throw new NullPointerException("context");
105 if (!isRendered()) return;
106
107 int tabIdx = 0;
108 int selectedIndex = getSelectedIndex();
109
110 Iterator it = getFacetsAndChildren();
111
112 while (it.hasNext())
113 {
114 UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
115 if (childOrFacet instanceof HtmlPanelTab) {
116 if (isClientSide() || selectedIndex == tabIdx) {
117 childOrFacet.processValidators(context);
118 }
119 tabIdx++;
120 } else {
121 childOrFacet.processValidators(context);
122 }
123 }
124 }
125
126 public void processUpdates(FacesContext context)
127 {
128 if (context == null) throw new NullPointerException("context");
129 if (!isRendered()) return;
130
131 int tabIdx = 0;
132 int selectedIndex = getSelectedIndex();
133
134 Iterator it = getFacetsAndChildren();
135
136 while (it.hasNext())
137 {
138 UIComponent childOrFacet = getUIComponent((UIComponent) it.next());
139 if (childOrFacet instanceof HtmlPanelTab) {
140 if (isClientSide() || selectedIndex == tabIdx) {
141 childOrFacet.processUpdates(context);
142 }
143 tabIdx++;
144 } else {
145 childOrFacet.processUpdates(context);
146 }
147 }
148 }
149
150 private UIComponent getUIComponent(UIComponent uiComponent)
151 {
152
153 if (uiComponent instanceof UINamingContainer || uiComponent instanceof UIForm)
154 {
155 List children = uiComponent.getChildren();
156 for (int i = 0, len = children.size(); i < len; i++)
157 {
158 uiComponent = getUIComponent((UIComponent)children.get(i));
159 }
160 }
161 return uiComponent;
162 }
163
164 public void addTabChangeListener(TabChangeListener listener)
165 {
166 addFacesListener(listener);
167 }
168
169 public void removeTabChangeListener(TabChangeListener listener)
170 {
171 removeFacesListener(listener);
172 }
173
174
175
176
177
178
179
180
181
182
183
184
185 public MethodBinding getTabChangeListener()
186 {
187 return _tabChangeListener;
188 }
189
190 public void setTabChangeListener(MethodBinding tabChangeListener)
191 {
192 _tabChangeListener = tabChangeListener;
193 }
194
195 public Object saveState(FacesContext context)
196 {
197 Object values[] = new Object[2];
198 values[0] = super.saveState(context);
199 values[1] = saveAttachedState(context, _tabChangeListener);
200 return values;
201 }
202
203 public void restoreState(FacesContext context, Object state)
204 {
205 Object values[] = (Object[])state;
206 super.restoreState(context, values[0]);
207 _tabChangeListener = (MethodBinding)restoreAttachedState(context, values[1]);
208 }
209
210 public void broadcast(FacesEvent event) throws AbortProcessingException
211 {
212 if (event instanceof TabChangeEvent)
213 {
214 TabChangeEvent tabChangeEvent = (TabChangeEvent)event;
215 if (tabChangeEvent.getComponent() == this)
216 {
217 setSelectedIndex(tabChangeEvent.getNewTabIndex());
218 getFacesContext().renderResponse();
219 }
220 }
221 super.broadcast(event);
222
223 MethodBinding tabChangeListenerBinding = getTabChangeListener();
224 if (tabChangeListenerBinding != null)
225 {
226 try
227 {
228 tabChangeListenerBinding.invoke(getFacesContext(), new Object[]{event});
229 }
230 catch (EvaluationException e)
231 {
232 Throwable cause = e.getCause();
233 if (cause != null && cause instanceof AbortProcessingException)
234 {
235 throw (AbortProcessingException)cause;
236 }
237 else
238 {
239 throw e;
240 }
241 }
242 }
243 }
244
245
246
247
248
249 public boolean isClientSide()
250 {
251 return !isServerSideTabSwitch();
252 }
253
254
255
256
257
258 public abstract String getActiveTabVar();
259
260
261
262
263
264
265
266
267 public abstract Boolean getActivePanelTabVar();
268
269
270
271
272
273
274
275 public abstract int getSelectedIndex();
276
277 public abstract void setSelectedIndex(int selectedIndex);
278
279
280
281
282
283
284 public abstract String getActiveTabStyleClass();
285
286
287
288
289
290
291 public abstract String getInactiveTabStyleClass();
292
293
294
295
296
297
298 public abstract String getActiveSubStyleClass();
299
300
301
302
303
304
305 public abstract String getInactiveSubStyleClass();
306
307
308
309
310
311
312 public abstract String getTabContentStyleClass();
313
314
315
316
317
318
319 public abstract String getDisabledTabStyleClass();
320
321
322
323
324
325
326
327 public abstract boolean isServerSideTabSwitch();
328
329 public boolean getServerSideTabSwitch()
330 {
331 return isServerSideTabSwitch();
332 }
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350 public abstract boolean isImmediateTabChange();
351
352 public void queueEvent(FacesEvent event)
353 {
354 if (event != null && event instanceof TabChangeEvent)
355 {
356 if (isImmediateTabChange())
357 {
358 event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
359 }
360 else
361 {
362 event.setPhaseId(PhaseId.INVOKE_APPLICATION);
363 }
364 }
365 super.queueEvent(event);
366 }
367 }