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    }