1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.ppr;
20
21 import java.io.IOException;
22 import java.util.Iterator;
23
24 import javax.faces.component.UIComponent;
25 import javax.faces.component.UIViewRoot;
26 import javax.faces.context.FacesContext;
27 import javax.faces.context.ResponseWriter;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.apache.myfaces.renderkit.html.ext.HtmlGroupRenderer;
32 import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
33 import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
34
35
36
37
38
39
40
41
42
43
44 public class PPRPanelGroupRenderer extends HtmlGroupRenderer
45 {
46 private static Log log = LogFactory.getLog(PPRPanelGroupRenderer.class);
47
48 private static final String DISABLE_RENDER_CHILDREN = "org.apache.myfaces.PPRPanelGroup.disableRenderChildren";
49
50 public static final String TRANSIENT_MARKER_ATTRIBUTE = "org.apache.myfaces.PPRPanelGroup.transientComponent";
51
52
53
54
55
56
57
58
59
60
61
62 public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException
63 {
64 if (uiComponent.getId() == null || uiComponent.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX)) {
65 throw new IllegalArgumentException("'id' is a required attribute for the PPRPanelGroup");
66 }
67
68
69
70 uiComponent.getAttributes().put(DISABLE_RENDER_CHILDREN, Boolean.TRUE);
71
72
73
74
75
76 for (Iterator iter = uiComponent.getChildren().iterator(); iter.hasNext();) {
77 UIComponent child = (UIComponent) iter.next();
78 if (child.isTransient()) {
79 child.setTransient(false);
80 child.getAttributes().put(TRANSIENT_MARKER_ATTRIBUTE, Boolean.TRUE);
81 }
82 }
83
84 super.encodeBegin(facesContext, uiComponent);
85 }
86
87
88
89
90
91
92
93
94
95 public void encodeChildren(FacesContext context, UIComponent component) throws IOException
96 {
97 Boolean disableRenderChildren = (Boolean) component.getAttributes().get(DISABLE_RENDER_CHILDREN);
98
99 if (disableRenderChildren == null || disableRenderChildren.booleanValue() == false) {
100 RendererUtils.renderChildren(context, component);
101 }
102
103 if (component instanceof PPRPanelGroup)
104 {
105 PPRPanelGroup pprPanelGroup = (PPRPanelGroup) component;
106 if (PPRSupport.isPartialRequest(context) && pprPanelGroup.getAfterUpdateJSHook() != null)
107 {
108
109 ResponseWriter writer = context.getResponseWriter();
110 writer.startElement(HTML.SCRIPT_ELEM, pprPanelGroup);
111 writer.writeAttribute(HTML.SCRIPT_TYPE_ATTR,
112 HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,
113 null);
114 writer.writeText(pprPanelGroup.getAfterUpdateJSHook(),null);
115 writer.endElement(HTML.SCRIPT_ELEM);
116 }
117 }
118 }
119
120
121
122
123
124
125
126
127
128 public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws IOException
129 {
130
131 super.encodeEnd(facesContext, uiComponent);
132 if (uiComponent instanceof PPRPanelGroup) {
133 PPRPanelGroup pprGroup = (PPRPanelGroup) uiComponent;
134
135 final String triggers = pprGroup.getPartialTriggers();
136 final String triggerPattern = pprGroup.getPartialTriggerPattern();
137
138
139
140 if ((triggers != null && triggers.length() > 0) || (triggerPattern != null && triggerPattern.length() > 0) || pprGroup.getPeriodicalUpdate() != null) {
141 if (PPRSupport.isPartialRequest(facesContext)) {
142 return;
143 }
144
145 PPRSupport.initPPR(facesContext, pprGroup);
146 PPRSupport.encodeJavaScript(facesContext, pprGroup);
147 }
148 }
149
150
151
152 uiComponent.getAttributes().put(DISABLE_RENDER_CHILDREN, Boolean.FALSE);
153 }
154
155 }