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 }