+package org.simantics.document.linking.report.html;\r
+\r
+import java.io.PrintStream;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.document.linking.report.Table;\r
+import org.simantics.document.linking.report.TableColumn;\r
+import org.simantics.document.linking.report.TextItem;\r
+import org.simantics.document.linking.report.TableColumn.Alignment;\r
+import org.simantics.document.linking.report.TableRow;\r
+\r
+\r
+public class HTMLTable extends HTMLTextElement implements Table {\r
+ HTMLDocument writer;\r
+ \r
+ List<TableColumn> columns = new ArrayList<TableColumn>();\r
+ \r
+ boolean linesVisible = true;\r
+ boolean headerVisible = true;\r
+ TextItem title = null;\r
+ int currentLine = 0;\r
+ PrintStream os;\r
+ \r
+ String classID;\r
+ \r
+ boolean copyStyle = false;\r
+ \r
+ public HTMLTable(HTMLDocument writer, boolean id) {\r
+ super(id == false ? null : writer.getUniqueId(HTMLTable.class));\r
+ this.writer = writer;\r
+ this.os = writer.os;\r
+ this.classID = writer.getUniqueId(this);\r
+ }\r
+ \r
+ public HTMLTable(HTMLDocument writer, PrintStream os, boolean id) {\r
+ super(id == false ? null : writer.getUniqueId(HTMLTable.class));\r
+ this.writer = writer;\r
+ this.os = os;\r
+ this.classID = writer.getUniqueId(this);\r
+ }\r
+ \r
+ public HTMLTable(HTMLTable table, boolean id) {\r
+ super(id == false ? null : table.writer.getUniqueId(HTMLTable.class));\r
+ this.writer = table.writer;\r
+ this.os = table.os;\r
+ this.columns.addAll(table.columns);\r
+ this.classID = table.classID;\r
+ this.copyStyle = true;\r
+ }\r
+ \r
+ @Override\r
+ public TableColumn addColumn(String name, double width) {\r
+ TableColumn tc = new TableColumn(name, width);\r
+ columns.add(tc);\r
+ return tc;\r
+ }\r
+ \r
+ @Override\r
+ public List<TableColumn> getColumns() {\r
+ return columns;\r
+ }\r
+ \r
+ @Override\r
+ public void setTitle(String title) {\r
+ try {\r
+ this.title = writer.newItem(TextItem.class);\r
+ this.title.setText(title);\r
+ } catch (Exception e) {\r
+ \r
+ }\r
+ }\r
+ \r
+ @Override\r
+ public void setTitle(TextItem title){\r
+ this.title = title;\r
+ }\r
+ \r
+ @Override\r
+ public TableRow writeRow(String... line) throws Exception {\r
+ List<String> list = new ArrayList<String>(line.length);\r
+ for (String s : line)\r
+ list.add(s);\r
+ return writeRow(list);\r
+ }\r
+ \r
+ @Override\r
+ public TableRow writeRow(List<String> line) throws Exception {\r
+ for (int i = 0; i < line.size(); i++) {\r
+ line.set(i, escape(line.get(i)));\r
+ }\r
+ return writeRowRaw(line);\r
+ }\r
+ \r
+ @Override\r
+ public TableRow writeRowItem(List<TextItem> line) throws Exception {\r
+ for (int i = 0; i < line.size(); i++) {\r
+ TextItem text = line.get(i);\r
+ if (text != null) {\r
+ text.setText(escape(text.getText()));\r
+ }\r
+ }\r
+ return writeRowRaw2(line);\r
+ }\r
+ \r
+ @Override\r
+ public TableRow writeRowItem(TextItem... line) throws Exception {\r
+ List<TextItem> list = new ArrayList<TextItem>(line.length);\r
+ for (TextItem s : line)\r
+ list.add(s);\r
+ return writeRowItem(list);\r
+ }\r
+ \r
+ \r
+ public TableRow writeRowRaw(List<String> line) throws Exception {\r
+ if (currentLine == 0)\r
+ startTable();\r
+ String clz = "\"";\r
+ clz += currentLine % 2 == 0 ? "even" : "odd";\r
+ clz += " "+currentTextSize;\r
+ clz += "\"";\r
+ os.println(" <tr class=" + clz+ ">");\r
+ if (line.size() > 1) {\r
+ for (int i = 0; i < line.size(); i++) {\r
+ String s = line.get(i);\r
+ Alignment a = columns.get(i).getAlignment();\r
+ String tdClass = "class=\"" +a.toString()+"\"";\r
+ \r
+ if (s != null)\r
+ os.println(" <td "+tdClass+">" + s + "</td>");\r
+ else\r
+ os.println(" <td> </td>");\r
+ }\r
+ } else if (line.size() == 1){\r
+ String s = line.get(0);\r
+ Alignment a = columns.get(0).getAlignment();\r
+ String tdClass = "class=\"" +a.toString()+"\"";\r
+ if (s != null)\r
+ os.println(" <td "+tdClass + " colspan=\"" + columns.size()+"\">" + s + "</td>");\r
+ else\r
+ os.println(" <td colspan=\"" + columns.size()+"\"> </td>");\r
+ \r
+ } else {\r
+ os.println(" <td colspan=\"" + columns.size()+"\"> </td>");\r
+ }\r
+ os.println(" </tr>");\r
+ currentLine++;\r
+ writer.currentLine++;\r
+ return new HTMLTableRow(null);\r
+ }\r
+ \r
+ public TableRow writeRowRaw2(List<TextItem> line) throws Exception {\r
+ if (currentLine == 0)\r
+ startTable();\r
+ String clz = "\"";\r
+ clz += currentLine % 2 == 0 ? "even" : "odd";\r
+ clz += " "+currentTextSize;\r
+ clz += "\"";\r
+ os.println(" <tr class=" + clz+ ">");\r
+ if (line.size() > 1) {\r
+ for (int i = 0; i < line.size(); i++) {\r
+ TextItem item = line.get(i);\r
+ Alignment a = columns.get(i).getAlignment();\r
+ String tdClass = "class=\"" +a.toString()+"\"";\r
+ \r
+ if (item != null && item.getText() != null)\r
+ os.println(" <td "+tdClass+">" + item.toString() + "</td>");\r
+ else\r
+ os.println(" <td> </td>");\r
+ }\r
+ } else if (line.size() == 1){\r
+ String s = line.get(0).toString();\r
+ Alignment a = columns.get(0).getAlignment();\r
+ String tdClass = "class=\"" +a.toString()+"\"";\r
+ if (s != null)\r
+ os.println(" <td "+tdClass + " colspan=\"" + columns.size()+"\">" + s + "</td>");\r
+ else\r
+ os.println(" <td colspan=\"" + columns.size()+"\"> </td>");\r
+ \r
+ } else {\r
+ os.println(" <td colspan=\"" + columns.size()+"\"> </td>");\r
+ }\r
+ os.println(" </tr>");\r
+ currentLine++;\r
+ writer.currentLine++;\r
+ return new HTMLTableRow(null);\r
+ }\r
+\r
+ @Override\r
+ public boolean isLinesVisible() {\r
+ return linesVisible;\r
+ }\r
+ \r
+ @Override\r
+ public void setLinesVisible(boolean b) {\r
+ this.linesVisible = b;\r
+ }\r
+ \r
+ @Override\r
+ public boolean isHeaderVisible() {\r
+ return headerVisible;\r
+ }\r
+ \r
+ @Override\r
+ public void setHeaderVisible(boolean b) {\r
+ this.headerVisible = b;\r
+ }\r
+ \r
+ void style() {\r
+ for (int i = 0; i < columns.size(); i++) {\r
+ os.println("table."+classID+" th.column"+i+" {");\r
+ os.println(" width: " + ((int)(columns.get(i).getWidth()*100.0)) + "%;");\r
+ os.println("}");\r
+ }\r
+ }\r
+ \r
+ void startTable() {\r
+ \r
+ if (id != null) {\r
+ os.println("<a id=\"" + id + "\"></a>");\r
+ } \r
+ String clz = classID + " " + (linesVisible ? "lines" : "nolines");\r
+ os.println("<table class=\"" + clz +"\" >");\r
+ \r
+ if (headerVisible) {\r
+ if (title != null)\r
+ os.println(" <caption>"+title+"</caption>");\r
+ os.println(" <thead>");\r
+ os.println(" <tr class=MEDIUM>");\r
+ int ci = 0;\r
+ for (TableColumn c : columns) {\r
+ os.println(" <th class=\"column" + ci +"\">" + escape(c.getName()) + "</th>");\r
+ ci++;\r
+ }\r
+ os.println(" </tr>");\r
+ os.println(" </thead>");\r
+ }\r
+ os.println(" <tbody>");\r
+ }\r
+ \r
+ void endTable() throws Exception{\r
+ if (currentLine > 0) {\r
+ os.println(" </tbody>");\r
+ os.println("</table>");\r
+ os.println("<br>");\r
+ if (!copyStyle) {\r
+ os.println("<style>");\r
+ style();\r
+ os.println("</style>");\r
+ }\r
+ }\r
+ }\r
+ \r
+ private String escape(String s) {\r
+ // TODO : escape string\r
+ return s;\r
+ }\r
+ \r
+ \r
+}\r