package org.rendersnake.tools; import java.io.IOException; import java.io.Writer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.rendersnake.HtmlCanvas; import org.rendersnake.PageContext; import org.rendersnake.Renderable; import org.rendersnake.error.RenderException; import org.rendersnake.ext.servlet.HtmlServletCanvas; import org.rendersnake.internal.CharactersWriteable; /** * DebugHtmlCanvas is a special HtmlCanvas that can render inspector wrappers around component on a HTML page. * Its purpose is to reveal the structure of a page by displaying debugging information. * * @author ernestmicklei */ public class DebugHtmlCanvas extends HtmlServletCanvas { private boolean insideBody = false; public boolean enabled = true; public int renderCount = 0; /** * @param request * @param response * @param out */ public DebugHtmlCanvas(HttpServletRequest request, HttpServletResponse response, Writer out) { super(request, response, out); } @Override public HtmlCanvas render(Renderable component) throws IOException { if (null == component) return this; // For debugging, we hide the exception component to reveal the offending component if (!(component instanceof RenderException)) this.getPageContext().withObject(RenderException.KEY_PAGECONTEXT,component); if (enabled) { renderCount++; if (insideBody) { super.render(new Inspector(component)); } else { super.render(component); } } else { super.render(component); } return this; } @Override public HtmlCanvas body() throws IOException { super.body(); insideBody = true; return this.renderInspectorCss(); } @Override public HtmlCanvas body(CharactersWriteable attrs) throws IOException { super.body(attrs); insideBody = true; return this.renderInspectorCss(); } @Override public HtmlCanvas _body() throws IOException { super._body(); insideBody = false; return this; } private HtmlCanvas renderInspectorCss() throws IOException { Inspector.renderCssOn(this); return this; } /** * Return a new PageContext for storing component-scoped variables. * Create one that logs all set calls. * @return a new LoggingPageContext */ protected PageContext createPageContext() { return new LoggingPageContext(); } }