001/**
002 * www.jcoverage.com
003 * Copyright (C)2003 jcoverage ltd.
004 *
005 * This file is part of jcoverage.
006 *
007 * jcoverage is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published
009 * by the Free Software Foundation; either version 2 of the License,
010 * or (at your option) any later version.
011 *
012 * jcoverage is distributed in the hope that it will be useful, but
013 * WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with jcoverage; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020 * USA
021 *
022 */
023package com.jcoverage.reporting.html;
024
025import java.io.*;
026import java.util.*;
027
028import org.apache.log4j.Logger;
029
030import com.jcoverage.reporting.Column;
031import com.jcoverage.reporting.FormattingContext;
032import com.jcoverage.reporting.Line;
033import com.jcoverage.reporting.Page;
034
035/**
036 *
037 */
038public class ReportTable implements Writable {
039  
040  static Logger logger=Logger.getLogger(ReportTable.class);
041  
042  public final static ColumnRenderer DEFAULT_COLUMN_RENDERER=new DefaultColumnRenderer();
043
044  Page page;
045  Set records;
046  Column[] columns;
047  FormattingContext ctx;
048
049  ColumnRenderer[] columnRenderers;
050  Map registeredDefaultColumnRenderers=new HashMap();
051
052  public ReportTable(Page page,Set records,Column[] columns,FormattingContext ctx) {
053    this.page=page;
054    this.records=records;
055    this.columns=columns;
056    this.ctx=ctx;
057    columnRenderers=new ColumnRenderer[columns.length];
058  }
059
060  public void setColumnRenderer(Column column,ColumnRenderer renderer) {
061    registeredDefaultColumnRenderers.put(column,renderer);
062  }
063
064  public void setColumnRenderer(Column column,ColumnRenderer renderer,int colnum) {
065    if (columns[colnum].equals(column)) {
066      columnRenderers[colnum]=renderer;
067    } else {
068      throw new IllegalArgumentException("Column number does not correspond to given column. Given column is "+column+" but column number corresponds to column "+columns[colnum]);
069    }
070  }
071
072  void fillColumnRenderers() {
073    for (int i=0;i<columnRenderers.length;i++) {
074      if (columnRenderers[i]!=null) {
075        continue;
076      }
077      ColumnRenderer defaultColumnRenderer=(ColumnRenderer)registeredDefaultColumnRenderers.get(columns[i]);
078      if (defaultColumnRenderer!=null) {
079        columnRenderers[i]=defaultColumnRenderer;
080      } else {
081        columnRenderers[i]=DEFAULT_COLUMN_RENDERER;
082      }
083    }
084  }
085
086  public void writeTo(PrintWriter writer) {
087
088    fillColumnRenderers();
089
090    writer.println("<table cellpadding=\"2\" cellspacing=\"0\" width=\"85%\">");
091
092    writer.print("<tr>");
093    for (int i=0;i<columns.length;i++) {
094      columnRenderers[i].renderTitle(ctx,writer,columns[i],i==columns.length-1);
095    }
096    writer.println("</tr>");
097
098    int rownum=0;
099    for (Iterator it=records.iterator();it.hasNext();) {
100
101      String cssClass=(rownum%2==0?"yin":"yang");
102      rownum++;
103
104      Line line=(Line)it.next();
105      Page detail=line.getDetailPage();
106      String href=null;
107
108      if(detail!=null) {
109        href=ctx.getCollator().getPathToPage(ctx,detail,page);
110      }
111      
112      writer.println("<tr class=\""+cssClass+"\">");
113      for (int i=0;i<columns.length;i++) {
114        columnRenderers[i].renderField(ctx,writer,columns[i],line,href);
115      }
116                              
117      writer.println("</tr>");
118    }
119
120    writer.println("</table>");
121
122  }
123
124}