package com.loomis.jsf.component.wiki; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.component.UIForm; import javax.faces.component.html.HtmlOutputLink; import javax.faces.component.html.HtmlPanelGrid; import javax.faces.context.FacesContext; import javax.faces.render.Renderer; import org.apache.myfaces.custom.div.Div; import org.apache.myfaces.custom.inputAjax.HtmlCommandButtonAjax; public class WikiRenderer extends Renderer { @SuppressWarnings("unchecked") @Override public void encodeBegin(FacesContext context, UIComponent component) throws IOException { WikiComponent wikiComponent = (WikiComponent) component; component.getChildren().add(generateDisplayDiv(context, component)); if (wikiComponent.isWikiEnabled()) { component.getChildren().add(generateEditDiv(context, component)); } } @SuppressWarnings("unchecked") public Div generateEditDiv(FacesContext context, UIComponent component) { Div editDiv = new Div(); UIForm form = new UIForm(); HtmlPanelGrid panelGrid = new HtmlPanelGrid(); HtmlCommandButtonAjax button = new HtmlCommandButtonAjax(); HtmlOutputLink cancelLink = new HtmlOutputLink(); cancelLink.setId(getCancelLinkId(context, component)); button.setId(getSubmitButtonId(context, component)); panelGrid.setColumns(3); panelGrid.getChildren().add(component); panelGrid.getChildren().add(button); panelGrid.getChildren().add(cancelLink); form.getChildren().add(panelGrid); editDiv.setId(getEditDivId(context, component)); editDiv.getChildren().add(form); return editDiv; } public Div generateDisplayDiv(FacesContext context, UIComponent component) { Div displayDiv = ((WikiComponent) component).getDisplayDiv(); displayDiv.setId(getDisplayDivId(context, component)); return displayDiv; } @Override public boolean getRendersChildren() { return true; } @Override public void encodeChildren(FacesContext context, UIComponent component) throws IOException { for (Object childObj : component.getChildren()) { UIComponent child = (UIComponent)childObj; if (!child.isRendered()) { continue; } if (child instanceof WikiComponent) { Renderer renderer = ((WikiComponent)child).getParentRenderer(); renderer.encodeBegin(context, child); renderer.encodeChildren(context, child); renderer.encodeEnd(context, child); } else if (getPannelGridId(context, component).equals(component.getId())) { child.encodeBegin(context); encodeChildren(context, child); // You found the pannel! Recurse! child.encodeEnd(context); } else { child.encodeBegin(context); child.encodeChildren(context); child.encodeEnd(context); } } } public static String generateId(String prefix, FacesContext context, UIComponent component) { return prefix + component.getClientId(context).replaceAll(":", "_"); } public static String getDisplayDivId(FacesContext context, UIComponent component) { return generateId("displayDivFor_", context, component); } public static String getEditDivId(FacesContext context, UIComponent component) { return generateId("editDivFor_", context, component); } public static String getManagerName(FacesContext context, UIComponent component) { return generateId("managerFor_", context, component); } public static String getPannelGridId(FacesContext context, UIComponent component) { return generateId("pannelGridFor_", context, component); } public static String getCancelLinkId(FacesContext context, UIComponent component) { return generateId("cancelLinkFor_", context, component); } public static String getSubmitButtonId(FacesContext context, UIComponent component) { return generateId("submitButtonFor_", context, component); } }