1 package com.icesoft.faces.component.panelcollapsible; 2 3 import java.io.IOException ; 4 import java.util.Iterator ; 5 import java.util.Map ; 6 7 import javax.faces.component.UIComponent; 8 import javax.faces.context.FacesContext; 9 import javax.faces.event.ActionEvent; 10 11 import org.apache.commons.logging.Log; 12 import org.apache.commons.logging.LogFactory; 13 import org.w3c.dom.Element ; 14 15 import com.icesoft.faces.component.util.CustomComponentUtils; 16 import com.icesoft.faces.context.DOMContext; 17 import com.icesoft.faces.renderkit.dom_html_basic.DomBasicRenderer; 18 import com.icesoft.faces.renderkit.dom_html_basic.FormRenderer; 19 import com.icesoft.faces.renderkit.dom_html_basic.HTML; 20 21 public class PanelCollapsibleRenderer extends DomBasicRenderer { 22 23 private static Log log = LogFactory.getLog(PanelCollapsibleRenderer.class); 24 25 26 public boolean getRendersChildren() { 27 return true; 28 } 29 30 public void decode(FacesContext context, UIComponent component) { 31 super.decode(context, component); 32 PanelCollapsibleState state = PanelCollapsibleState.getState(context, component); 33 state.setChangedViaDecode(false); 34 try { 35 PanelCollapsible panelCollapsible = (PanelCollapsible) component; 36 37 Map map = 38 context.getExternalContext().getRequestParameterMap(); 39 String baseId =component.getClientId(context)+ "Expanded"; 40 if (map.containsKey(baseId) && (map.get(baseId) != null && !map.get(baseId).equals(""))) { 41 if ("true".equals(map.get(baseId).toString().trim())) { 42 panelCollapsible.setExpanded(Boolean.FALSE); 43 44 } else { 45 panelCollapsible.setExpanded(Boolean.TRUE); 46 } 47 ActionEvent ae = new ActionEvent(component); 48 component.queueEvent(ae); 49 50 51 } 52 } catch (Exception e) { 53 e.printStackTrace(); 54 throw new RuntimeException (e); 55 } 56 } 57 58 public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException { 59 PanelCollapsible panelCollapsible = (PanelCollapsible) uiComponent; 60 PanelCollapsibleState state = PanelCollapsibleState.getState(facesContext, uiComponent); 61 String base = panelCollapsible.getStyleClass(); 62 boolean open = panelCollapsible.getExpanded().booleanValue(); 63 boolean disabled = panelCollapsible.isDisabled(); 64 StringBuffer classModeSuffix = new StringBuffer (16); 65 String style = panelCollapsible.getStyle(); 66 67 boolean fireEffect = false; 68 69 70 String baseID = uiComponent.getClientId(facesContext); 71 if( !state.isFirstTime() && 72 !state.isChangedViaDecode() && 73 state.isLastExpandedValue() != open){ 74 fireEffect = true; 75 } 76 77 78 DOMContext domContext = DOMContext.attachDOMContext(facesContext, uiComponent); 79 if (!domContext.isInitialized()) { 80 Element rootSpan = domContext.createElement(HTML.DIV_ELEM); 81 domContext.setRootNode(rootSpan); 82 setRootElementId(facesContext, rootSpan, uiComponent); 83 } 84 Element root = (Element ) domContext.getRootNode(); 85 root.setAttribute(HTML.CLASS_ATTR, panelCollapsible.getStyleClass()); 86 root.setAttribute(HTML.STYLE_ATTR, style); 87 88 Element header = domContext.createElement(HTML.DIV_ELEM); 89 90 header.setAttribute(HTML.CLASS_ATTR, panelCollapsible.getHeaderClass()); 91 92 UIComponent form = findForm(uiComponent); 93 94 if(panelCollapsible.getToggleOnClick().equals(Boolean.TRUE)){ 95 if(!disabled) 96 FormRenderer.addHiddenField(facesContext, uiComponent.getClientId(facesContext)+ "Expanded"); 97 98 header.setAttribute(HTML.ONCLICK_ATTR, 99 "document.forms['"+ form.getClientId(facesContext) +"']" + 100 "['"+ uiComponent.getClientId(facesContext)+ "Expanded"+"'].value='"+ 101 panelCollapsible.getExpanded()+"'; " + 102 "iceSubmit(document.forms['"+ form.getClientId(facesContext) +"'],this,event); return false;"); 103 104 } 109 String script = "Ice.PanelCollapsible.collapse('" + baseID + "_content');"; 110 if(panelCollapsible.getExpanded().booleanValue()){ 111 } 113 114 117 header.setAttribute(HTML.ID_ATTR, baseID + "_header"); 118 119 root.appendChild(header); 120 UIComponent headerFacet = uiComponent.getFacet("header"); 121 if(headerFacet != null){ 122 try{ 123 124 domContext.setCursorParent(header); 126 127 domContext.streamWrite(facesContext, uiComponent, 128 domContext.getRootNode(),header); 129 130 CustomComponentUtils.renderChild(facesContext,headerFacet); 131 }catch(Exception e){ 133 e.printStackTrace(); 134 } 135 }else{ 136 log.error("No Header facet found in Panel collapsible"); 137 } 138 144 Element container = domContext.createElement(HTML.DIV_ELEM); 145 container.setAttribute(HTML.ID_ATTR, baseID + "_content"); 146 root.appendChild(container); 147 container.setAttribute(HTML.CLASS_ATTR, panelCollapsible.getContentClass()); 148 149 150 state.setLastExpandedValue(open); 160 state.setChangedViaDecode(false); 161 state.setFirstTime(false); 162 domContext.setCursorParent(container); 163 164 } 165 166 167 public void encodeEnd(FacesContext facesContext, UIComponent uiComponenet) throws IOException { 168 169 DOMContext.getDOMContext(facesContext, uiComponenet).stepOver(); 170 171 } 172 173 public void encodeChildren(FacesContext facesContext, UIComponent uiComponent) 174 throws IOException { 175 validateParameters(facesContext, uiComponent, null); 176 PanelCollapsible panelCollapsible = (PanelCollapsible) uiComponent; 177 DOMContext domContext = 178 DOMContext.getDOMContext(facesContext, uiComponent); 179 if(panelCollapsible.getExpanded().booleanValue()){ 180 Iterator children = uiComponent.getChildren().iterator(); 181 while (children.hasNext()) { 182 UIComponent nextChild = (UIComponent) children.next(); 183 if (nextChild.isRendered()) { 184 encodeParentAndChildren(facesContext, nextChild); 185 } 186 } 187 } 188 domContext.stepOver(); 190 domContext.streamWrite(facesContext, uiComponent); 191 192 } 193 194 } 195 196 | Popular Tags |