/FileExtraction/Java_unseen/dlitz_resin/modules/resin/src/com/caucho/jsf/html/HtmlPanelGridRenderer.java
/*
 * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * Resin Open Source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.jsf.html;

import java.io.*;
import java.util.*;

import javax.faces.*;
import javax.faces.component.*;
import javax.faces.component.html.*;
import javax.faces.context.*;
import javax.faces.render.*;

/**
 * The HTML panel/grid renderer
 */
class HtmlPanelGridRenderer extends Renderer
{
  public static final Renderer RENDERER = new HtmlPanelGridRenderer();

  /**
   * True if the renderer is responsible for rendering the children.
   */
  @Override
  public boolean getRendersChildren()
  {
    return true;
  }
  /**
   * Renders the open tag for the text.
   */
  @Override
  public void encodeBegin(FacesContext context, UIComponent component)
    throws IOException
  {
    ResponseWriter out = context.getResponseWriter();

    String bgcolor = null;
    int border = -1;
    String captionClass = null;
    String captionStyle = null;
    String cellpadding = null;
    String cellspacing = null;
    int columns;
    String columnClasses = null;
    String dir = null;
    String frame = null;
    String headerClass = null;
    String lang = null;
    String onclick = null;
    String ondblclick = null;
    String onkeydown = null;
    String onkeypress = null;
    String onkeyup = null;
    String onmousedown = null;
    String onmousemove = null;
    String onmouseout = null;
    String onmouseover = null;
    String onmouseup = null;
    String rules = null;
    String style = null;
    String styleClass = null;
    String summary = null;
    String title = null;
    String width = null;

    String id = component.getId();
    
    if (component instanceof HtmlPanelGrid) {
      HtmlPanelGrid html = (HtmlPanelGrid) component;

      bgcolor = html.getBgcolor();
      border = html.getBorder();
      captionClass = html.getCaptionClass();
      captionStyle = html.getCaptionStyle();
      cellpadding = html.getCellpadding();
      cellspacing = html.getCellspacing();
      columns = html.getColumns();
      columnClasses = html.getColumnClasses();
      dir = html.getDir();
      frame = html.getFrame();
      headerClass = html.getHeaderClass();
      lang = html.getLang();
      onclick = html.getOnclick();
      ondblclick = html.getOndblclick();
      onkeydown = html.getOnkeydown();
      onkeypress = html.getOnkeypress();
      onkeyup = html.getOnkeyup();
      onmousedown = html.getOnmousedown();
      onmousemove = html.getOnmousemove();
      onmouseout = html.getOnmouseout();
      onmouseover = html.getOnmouseover();
      onmouseup = html.getOnmouseup();
      rules = html.getRules();
      style = html.getStyle();
      styleClass = html.getStyleClass();
      summary = html.getSummary();
      title = html.getTitle();
      width = html.getWidth();
    }
    else {
      Map<String,Object> attrMap = component.getAttributes();
      Integer iValue;
    
      bgcolor = (String) attrMap.get("bgcolor");
      captionClass = (String) attrMap.get("captionClass");
      captionStyle = (String) attrMap.get("captionStyle");
      iValue = (Integer) attrMap.get("columns");
      columns = iValue != null ? iValue : 0;
      headerClass = (String) attrMap.get("headerClass");
      style = (String) attrMap.get("style");
      styleClass = (String) attrMap.get("styleClass");
    }

    String []columnClassArray = null;

    if (columnClasses != null) {
      columnClassArray = columnClasses.split("[ \t,]+");
      
      if (columnClassArray.length == 0)
        columnClassArray = null;
    }

    out.startElement("table", component);

    if (id != null && ! id.startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
      out.writeAttribute("id", component.getClientId(context), "id");

    if (bgcolor != null)
      out.writeAttribute("bgcolor", bgcolor, "bgcolor");

    if (border >= 0)
      out.writeAttribute("border", border, "border");

    if (cellpadding != null)
      out.writeAttribute("cellpadding", cellpadding, "cellpadding");

    if (cellspacing != null)
      out.writeAttribute("cellspacing", cellspacing, "cellspacing");
    
    if (dir != null)
      out.writeAttribute("dir", dir, "dir");
    
    if (frame != null)
      out.writeAttribute("frame", frame, "frame");
    
    if (lang != null)
      out.writeAttribute("lang", lang, "lang");
    
    if (onclick != null)
      out.writeAttribute("onclick", onclick, "onclick");
    
    if (ondblclick != null)
      out.writeAttribute("ondblclick", ondblclick, "ondblclick");
    
    if (onkeydown != null)
      out.writeAttribute("onkeydown", onkeydown, "onkeydown");
    
    if (onkeypress != null)
      out.writeAttribute("onkeypress", onkeypress, "onkeypress");
    
    if (onkeyup != null)
      out.writeAttribute("onkeyup", onkeyup, "onkeyup");
    
    if (onmousedown != null)
      out.writeAttribute("onmousedown", onmousedown, "onmousedown");
    
    if (onmousemove != null)
      out.writeAttribute("onmousemove", onmousemove, "onmousemove");
    
    if (onmouseout != null)
      out.writeAttribute("onmouseout", onmouseout, "onmouseout");
    
    if (onmouseover != null)
      out.writeAttribute("onmouseover", onmouseover, "onmouseover");
    
    if (onmouseup != null)
      out.writeAttribute("onmouseup", onmouseup, "onmouseup");
    
    if (rules != null)
      out.writeAttribute("rules", rules, "rules");
    
    if (style != null)
      out.writeAttribute("style", style, "style");
    
    if (styleClass != null)
      out.writeAttribute("class", styleClass, "styleClass");
    
    if (summary != null)
      out.writeAttribute("summary", summary, "summary");
    
    if (title != null)
      out.writeAttribute("title", title, "title");
    
    if (width != null)
      out.writeAttribute("width", width, "width");

    out.write("\n");

    UIComponent caption = component.getFacet("caption");
    if (caption != null && caption.isRendered()) {
      out.startElement("caption", caption);

      if (captionClass != null)
        out.writeAttribute("class", captionClass, "captionClass");

      if (captionStyle != null)
        out.writeAttribute("style", captionStyle, "captionStyle");

      caption.encodeAll(context);
      
      out.endElement("caption");
    }
    
    UIComponent header = component.getFacet("header");
    if (header != null && header.isRendered()) {
      out.startElement("thead", header);
      
      out.startElement("tr", header);
      out.startElement("th", header);

      if (headerClass != null)
        out.writeAttribute("class", headerClass, "headerClass");

      if (columns > 0)
        out.writeAttribute("colspan", columns, "columns");

      out.writeAttribute("scope", "colgroup", "scope");

      header.encodeAll(context);
      
      out.endElement("th");
      out.endElement("tr");
      
      out.endElement("thead");
      out.write("\n");
    }
  }


  /**
   * Renders the content for the component.
   */
  @Override
  public void encodeChildren(FacesContext context, UIComponent component)
    throws IOException
  {
    String columnClasses;
    String rowClasses;
    int columns = 0;

    ResponseWriter out = context.getResponseWriter();
    
    if (component instanceof HtmlPanelGrid) {
      HtmlPanelGrid html = (HtmlPanelGrid) component;
      
      columnClasses = html.getColumnClasses();
      rowClasses = html.getRowClasses();
      columns = html.getColumns();
    }
    else {
      Map<String,Object> attrMap = component.getAttributes();
    
      columnClasses = (String) attrMap.get("columnClasses");
      rowClasses = (String) attrMap.get("rowClasses");
      Integer iValue = (Integer) attrMap.get("columns");
      columns = iValue != null ? iValue : 0;
    }

    String []columnClassArray = null;

    if (columnClasses != null) {
      columnClassArray = columnClasses.split("[ \t,]+");
      
      if (columnClassArray.length == 0)
        columnClassArray = null;
    }

    String []rowClassArray = null;

    if (rowClasses != null) {
      rowClassArray = rowClasses.split("[ \t,]+");
      
      if (rowClassArray.length == 0)
        rowClassArray = null;
    }

    int size = component.getChildCount();
    if (size == 0)
      return;
    
    if (columns < 1)
      columns = 1;

    List<UIComponent> children = component.getChildren();
    int count = 0;

    out.startElement("tbody", component);
    out.write("\n");

    for (int i = 0; i < size; i++) {
      UIComponent child = children.get(i);

      if (! child.isRendered())
        continue;

      int column = count % columns;
      int row = count / columns;

      if (column == 0) {
        if (count > 0) {
          out.endElement("tr");
          out.write("\n");
        }

        out.startElement("tr", child);

        if (rowClassArray != null) {
          String v = rowClassArray[row % rowClassArray.length];

          out.writeAttribute("class", v, "rowClasses");
        }
      }

      count++;

      out.startElement("td", child);
      if (columnClassArray != null) {
        String v = columnClassArray[column % columnClassArray.length];

        out.writeAttribute("class", v, "columnClasses");
      }
      
      if (child instanceof UIColumn) {
        int subCount = child.getChildCount();

        for (int j = 0; j < subCount; j++) {
          UIComponent subChild = child.getChildren().get(j);

          subChild.encodeAll(context);
        }
      }
      else {
        child.encodeAll(context);
      }
      out.endElement("td");
    }

    if (count > 0) {
      out.endElement("tr");
      out.write("\n");
    }
    
    out.endElement("tbody");
    out.write("\n");
  }

  /**
   * Renders the closing tag for the component.
   */
  @Override
  public void encodeEnd(FacesContext context, UIComponent component)
    throws IOException
  {
    String footerClass;
    int columns;
    
    ResponseWriter out = context.getResponseWriter();
    
    if (component instanceof HtmlPanelGrid) {
      HtmlPanelGrid html = (HtmlPanelGrid) component;
      
      columns = html.getColumns();
      footerClass = html.getFooterClass();
    }
    else {
      Map<String,Object> attrMap = component.getAttributes();
    
      columns = (Integer) attrMap.get("columns");
      footerClass = (String) attrMap.get("footerClass");
    }
    
    UIComponent footer = component.getFacet("footer");
    if (footer != null && footer.isRendered()) {
      out.startElement("tfoot", footer);
      
      out.startElement("tr", footer);
      out.startElement("td", footer);

      if (columns > 0)
        out.writeAttribute("colspan", columns, "columns");

      if (footerClass != null)
        out.writeAttribute("class", footerClass, "footerClass");

      //out.writeAttribute("scope", "colgroup", "scope");

      footer.encodeAll(context);
      
      out.endElement("td");
      out.endElement("tr");
      
      out.endElement("tfoot");
      out.write("\n");
    }

    out.endElement("table");
    out.write("\n");
  }

  public String toString()
  {
    return "HtmlPanelGridRenderer[]";
  }
}
