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 */ 023 package com.jcoverage.reporting.html; 024 025 import java.io.*; 026 import java.util.*; 027 028 import org.apache.log4j.Logger; 029 030 import com.jcoverage.reporting.Column; 031 import com.jcoverage.reporting.FormattingContext; 032 import com.jcoverage.reporting.Line; 033 import com.jcoverage.reporting.Page; 034 035 /** 036 * 037 */ 038 public 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 }