package zeta.handler.statistic;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.sql.Types;
import java.text.DecimalFormat;
import java.text.Format;
import zeta.ZetaServlet;
import zeta.util.Table;
public class HtmlTableGenerator {
public HtmlTableGenerator(ZetaServlet servlet) {
this(servlet, null, null);
}
public HtmlTableGenerator(ZetaServlet servlet, String linkAddress, String linkColumnName) {
this.servlet = servlet;
this.linkAddress = linkAddress;
this.linkColumnName = linkColumnName;
}
public String generate(Table table) {
if (table == null) return "";
final int rows = table.getRowCount();
int columns = table.getColumnCount();
StringBuffer sb = new StringBuffer(rows*columns*20);
sb.append("\n<style type=\"text/css\">\n.c { text-align:center }\n.r { text-align:right }\n</style>");
sb.append("\n<table border=\"1\" cellspacing=\"0\" width=\"90%\"><colgroup>");
boolean trend = (columns > 0 && table.getColumnName(1) != null && table.getColumnName(1).equals("trend"));
boolean place = (columns > 0 && table.getColumnName(0) != null && table.getColumnName(0).equals("place"));
for (int i = 0; i < columns; ++i) {
sb.append("<col width=\"");
if (place && trend) {
if (i == 2) sb.append(125/columns);
else if (i == 0 || i == 1) sb.append(5);
else if (i == columns-1) sb.append(100/columns);
else sb.append(80/columns);
} else if (place || trend) {
if (i == 1) sb.append(100/columns);
else if (i == 0) sb.append(5);
else sb.append(80/columns);
} else sb.append(100/columns);
sb.append("%\"/>");
}
sb.append("</colgroup>\n<tr bgcolor=\"#dddddd\">");
int linkColumnNameIdx = -1;
for (int i = 0; i < columns; ++i) {
sb.append("<th>");
String s = table.getColumnName(i);
if (s == null) {
s = "";
}
if (s.equals(linkColumnName)) {
linkColumnNameIdx = i;
}
sb.append(s);
sb.append("</th>");
}
sb.append("</tr>\n");
for (int row = 0; row < rows; ++row) {
sb.append("<tr");
generateBackgound(table, row, sb);
sb.append('>');
for (int col = 0; col < columns; ++col) {
sb.append("<td");
switch (table.getAlignment(col)) {
case Table.LEFT:
break;
default:
case Table.CENTER:
sb.append(" class=\"c\"");
break;
case Table.RIGHT:
sb.append(" class=\"r\"");
break;
}
sb.append('>');
generateCell(row, col, (linkColumnNameIdx == col), table, sb);
sb.append("</td>");
}
sb.append("</tr>\n");
}
sb.append("</table>\n");
return sb.toString();
}
protected void generateBackgound(Table table, int row, StringBuffer sb) {
if ((row&1) == 1) {
sb.append(" bgcolor=\"#eeeeee\"");
}
}
protected void generateCell(int row, int col, boolean link, Table table, StringBuffer sb) {
Object value = table.getValue(row, col);
if (value != null) {
if (link && linkAddress != null && linkColumnName != null) {
String s = value.toString();
sb.append("<a href=\"");
sb.append(linkAddress);
sb.append('?');
sb.append(linkColumnName);
sb.append('=');
try {
sb.append(URLEncoder.encode(s, "ISO-8859-1"));
} catch (UnsupportedEncodingException uee) {
}
sb.append("\">");
sb.append(s);
sb.append("</a>");
} else {
Format format = table.getFormat(col);
if (format == null) {
switch (table.getType(col)) {
case Types.DECIMAL :
case Types.INTEGER :
case Types.NUMERIC :
format = new DecimalFormat("#,###");
sb.append(format.format(value));
break;
default:
sb.append(value);
break;
}
} else {
sb.append(format.format(value));
}
}
} else {
sb.append(" ");
}
}
protected ZetaServlet servlet;
private String linkAddress;
private String linkColumnName;
}