1 33 34 package com.icesoft.faces.renderkit.dom_html_basic; 35 36 import com.icesoft.faces.component.UIXhtmlComponent; 37 import com.icesoft.faces.context.DOMContext; 38 import com.icesoft.faces.util.DOMUtils; 39 import org.w3c.dom.Element ; 40 import org.w3c.dom.Node ; 41 import org.w3c.dom.Text ; 42 43 import javax.faces.component.UIComponent; 44 import javax.faces.component.UIInput; 45 import javax.faces.component.UIOutput; 46 import javax.faces.context.FacesContext; 47 import java.io.IOException ; 48 import java.util.HashSet ; 49 import java.util.Map ; 50 51 52 public class TextRenderer extends DomBasicInputRenderer { 53 54 public void encodeChildren(FacesContext facesContext, 55 UIComponent uiComponent) { 56 validateParameters(facesContext, uiComponent, null); 57 } 58 59 protected void renderEnd(FacesContext facesContext, UIComponent uiComponent, 60 String currentValue) 61 throws IOException { 62 validateParameters(facesContext, uiComponent, null); 63 if (uiComponent instanceof UIInput) { 64 renderUIInput(facesContext, uiComponent, currentValue); 65 } else if (uiComponent instanceof UIOutput) { 66 renderUIOutput(facesContext, uiComponent, currentValue); 67 } 68 } 69 70 76 private void renderUIOutput(FacesContext facesContext, 77 UIComponent uiComponent, 78 String currentValue) 79 throws IOException { 80 81 DOMContext domContext = 82 DOMContext.attachDOMContext(facesContext, uiComponent); 83 84 boolean requiresContainingSpan = requiresContainingSpan(uiComponent); 85 86 if (requiresContainingSpan) { 87 renderContainingSpan(facesContext, uiComponent, domContext); 88 } else { 89 renderTextNode(domContext); 90 } 91 92 if (currentValue == null) { 93 Text textNode = null; 98 if (requiresContainingSpan) { 99 textNode = (Text ) domContext.getRootNode() 100 .getFirstChild(); 101 } else { 102 textNode = ((Text ) domContext.getRootNode()); 103 } 104 if (textNode != null) { 105 textNode.setData(""); 106 } 107 } else { 108 renderCurrentValue(uiComponent, currentValue, domContext, 109 requiresContainingSpan); 110 } 111 domContext.streamWrite(facesContext, uiComponent); 112 } 113 114 117 private void renderTextNode(DOMContext domContext) { 118 if (!domContext.isInitialized()) { 119 Node root = domContext.getDocument().createTextNode(""); 120 domContext.setRootNode(root); 121 } else if (!(domContext.getRootNode() instanceof Text )) { 122 domContext.getRootNode().getParentNode() 127 .removeChild(domContext.getRootNode()); 128 domContext.setRootNode(domContext.getDocument().createTextNode("")); 129 } 130 } 131 132 137 private void renderContainingSpan(FacesContext facesContext, 138 UIComponent uiComponent, 139 DOMContext domContext) { 140 if (!domContext.isInitialized()) { 141 Node root = domContext.createElement(HTML.SPAN_ELEM); 142 domContext.setRootNode(root); 143 } else if (!(domContext.getRootNode() instanceof Element )) { 144 domContext.getRootNode().getParentNode() 150 .removeChild(domContext.getRootNode()); 151 domContext.setRootNode(domContext.createElement(HTML.SPAN_ELEM)); 152 } 153 Element rootSpan = (Element ) domContext.getRootNode(); 154 setRootElementId(facesContext, rootSpan, uiComponent); 155 String styleClass = 158 (String ) uiComponent.getAttributes().get("styleClass"); 159 if (styleClass != null) { 160 ((Element ) rootSpan).setAttribute("class", styleClass); 161 } 162 PassThruAttributeRenderer 163 .renderAttributes(facesContext, uiComponent, null); 164 } 165 166 172 private void renderCurrentValue(UIComponent uiComponent, 173 String currentValue, 174 DOMContext domContext, 175 boolean requiresContainingSpan) { 176 177 boolean valueTextRequiresEscape = 179 DOMUtils.escapeIsRequired(uiComponent); 180 if (valueTextRequiresEscape) { 181 currentValue = DOMUtils.escapeAnsi(currentValue); 182 } 183 184 Node rootNode = domContext.getRootNode(); 186 if (requiresContainingSpan) { 187 domContext.setCursorParent(rootNode); 188 if (rootNode.getFirstChild() != null 189 && rootNode.getFirstChild() instanceof Text ) { 190 ((Text ) rootNode.getFirstChild()).setData(currentValue); 191 } else { 192 Text text = domContext.getDocument() 193 .createTextNode(currentValue); 194 rootNode.appendChild(text); 195 } 196 } else { 197 ((Text ) rootNode).setData(currentValue); 198 } 199 } 200 201 207 private void renderUIInput(FacesContext facesContext, 208 UIComponent uiComponent, 209 String currentValue) 210 throws IOException { 211 212 DOMContext domContext = 213 DOMContext.attachDOMContext(facesContext, uiComponent); 214 215 if (!domContext.isInitialized()) { 216 Element root = domContext.createElement("input"); 217 domContext.setRootNode(root); 218 setRootElementId(facesContext, root, uiComponent); 219 root.setAttribute("type", "text"); 220 root.setAttribute("name", uiComponent.getClientId(facesContext)); 221 } 222 Element root = (Element ) domContext.getRootNode(); 223 224 String bidi = (String ) uiComponent.getAttributes().get("dir"); 225 if (bidi != null) { 226 root.setAttribute("dir", bidi); 227 } 228 229 if (currentValue != null) { 230 root.setAttribute("value", currentValue); 231 } else { 232 root.removeAttribute("value"); 233 } 234 235 String styleClass = 236 (String ) uiComponent.getAttributes().get("styleClass"); 237 if (styleClass != null) { 238 root.setAttribute("class", styleClass); 239 } 240 241 HashSet excludes = new HashSet (); 242 addJavaScript(facesContext, uiComponent, root, currentValue, excludes); 243 PassThruAttributeRenderer 244 .renderAttributes(facesContext, uiComponent, getExcludesArray(excludes)); 245 domContext.streamWrite(facesContext, uiComponent); 246 247 } 248 249 256 private boolean requiresContainingSpan(UIComponent uiComponent) { 257 258 UIComponent parent = uiComponent.getParent(); 260 if (parent != null && parent instanceof UIXhtmlComponent) { 261 String tag = ((UIXhtmlComponent) parent).getTag(); 262 if (tag != null && tag.equalsIgnoreCase("title")) { 263 return false; 264 } 265 } 266 267 String style = (String ) uiComponent.getAttributes().get("style"); 268 String styleClass = 269 (String ) uiComponent.getAttributes().get("styleClass"); 270 String title = (String ) uiComponent.getAttributes().get("title"); 271 if (styleClass != null 272 || style != null 273 || title != null) { 274 return true; 275 } 276 Map attributes = uiComponent.getAttributes(); 277 if (attributes.size() != 0) { 278 if (PassThruAttributeRenderer 279 .passThruAttributeExists(uiComponent)) { 280 return true; 281 } 282 } 283 if (idNotNull(uiComponent) && !uiComponent.getId().startsWith("_")) { 284 return true; 285 } 286 return false; 287 } 288 289 protected void addJavaScript(FacesContext facesContext, 290 UIComponent uiComponent, Element root, 291 String currentValue, 292 HashSet excludes) { 293 294 295 } 296 } 297 298 | Popular Tags |