XHTML formatter: CSS and other improvements v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sat, 04 Jan 2014 23:27:17 +0100
branchv_0
changeset 135 ef432015fdee
parent 134 f2510551b5bf
child 136 c0f9521900bf
XHTML formatter: CSS and other improvements
java/sql-dk/data/info/globalcode/sql/dk/formatter/XhtmlFormatter.css
java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/sql-dk/data/info/globalcode/sql/dk/formatter/XhtmlFormatter.css	Sat Jan 04 23:27:17 2014 +0100
@@ -0,0 +1,42 @@
+body {
+	font-family: sans-serif;
+	font-size: 16px;
+	padding-left: 16px;
+}
+
+pre {
+	background-color: #ddd;
+	padding: 6px;
+	border-radius: 4px;
+	overflow: auto;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+}
+
+table {
+	border-collapse:collapse;
+	box-shadow: 3px 3px 3px grey;
+	margin-top: 10px;
+	margin-bottom: 20px;
+}
+td, th {
+	border: 1px solid black;
+	padding-top: 4px;
+	padding-bottom: 4px;
+	padding-left: 6px;
+	padding-right: 6px;
+	font-weight: normal;
+}
+td.number {
+	text-align: right;
+}
+thead tr {
+	background: #ddd;
+	color:black;
+}
+tbody tr:hover {
+	background-color: #eee;
+	color:black;
+}
\ No newline at end of file
--- a/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java	Sat Jan 04 22:38:59 2014 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/formatting/XhtmlFormatter.java	Sat Jan 04 23:27:17 2014 +0100
@@ -25,9 +25,11 @@
 import info.globalcode.sql.dk.configuration.Properties;
 import info.globalcode.sql.dk.configuration.Property;
 import static info.globalcode.sql.dk.formatting.AbstractXmlFormatter.qname;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Scanner;
 import javax.xml.namespace.QName;
 
 /**
@@ -37,6 +39,7 @@
 public class XhtmlFormatter extends AbstractXmlFormatter {
 
 	public static final String NAME = "xhtml"; // bash-completion:formatter
+	private static final String CSS_FILE = "info/globalcode/sql/dk/formatter/XhtmlFormatter.css";
 	private int resultSetCounter = 0;
 	private int updatesResultCounter = 0;
 
@@ -64,11 +67,25 @@
 
 		printStartElement(qname("head"));
 		printTextElement(qname("title"), null, Constants.PROGRAM_NAME + ": batch results");
+		printCss();
 		printEndElement();
 
 		printStartElement(qname("body"));
 	}
 
+	private void printCss() {
+
+		try (Scanner css = new Scanner(getClass().getClassLoader().getResourceAsStream(CSS_FILE))) {
+			Map<QName, String> attributes = new HashMap<>(1);
+			attributes.put(qname("type"), "text/css");
+			printStartElement(qname("style"), attributes);
+			while (css.hasNext()) {
+				printText(css.nextLine(), true);
+			}
+			printEndElement();
+		}
+	}
+
 	@Override
 	public void writeEndBatch() {
 		super.writeEndBatch();
@@ -81,6 +98,11 @@
 	public void writeStartDatabase(DatabaseDefinition databaseDefinition) {
 		super.writeStartDatabase(databaseDefinition);
 		printTextElement(qname("h1"), null, "Database: " + databaseDefinition.getName());
+
+		printStartElement(qname("p"));
+		printText("This is XHTML output of batch executed at: ", true);
+		printText(new Date().toString(), true);
+		printEndElement();
 	}
 
 	@Override
@@ -101,9 +123,9 @@
 
 			printStartElement(qname("table"));
 
-			printStartElement(qname("theader"));
+			printStartElement(qname("thead"));
 			printStartElement(qname("tr"));
-			printTextElement(qname("td"), null, "number/name");
+			printTextElement(qname("td"), null, "id");
 			printTextElement(qname("td"), null, "type");
 			printTextElement(qname("td"), null, "value");
 			printEndElement();
@@ -121,7 +143,7 @@
 				}
 				printTextElement(qname("td"), null, numberOrName);
 				printTextElement(qname("td"), null, p.getType().name());
-				printTextElement(qname("td"), null, toString(p.getValue()));
+				printTableData(p.getValue());
 				printEndElement();
 			}
 			printEndElement();
@@ -130,12 +152,20 @@
 		}
 	}
 
+	private void printTableData(Object value) {
+		Map<QName, String> attributes = new HashMap<>(1);
+		if (value instanceof Number || value instanceof Boolean) {
+			attributes.put(qname("class"), "number");
+		}
+		printTextElement(qname("td"), attributes, String.valueOf(value));
+	}
+
 	@Override
 	public void writeColumnsHeader(ColumnsHeader header) {
 		super.writeColumnsHeader(header);
 		printTextElement(qname("h3"), null, "Data:");
 		printStartElement(qname("table"));
-		printStartElement(qname("theader"));
+		printStartElement(qname("thead"));
 		printStartElement(qname("tr"));
 		for (ColumnDescriptor cd : header.getColumnDescriptors()) {
 			// TODO: type
@@ -156,7 +186,7 @@
 	@Override
 	public void writeColumnValue(Object value) {
 		super.writeColumnValue(value);
-		printTextElement(qname("td"), null, toString(value));
+		printTableData(value);
 	}
 
 	@Override
@@ -169,7 +199,8 @@
 	public void writeStartResultSet() {
 		super.writeStartResultSet();
 		resultSetCounter++;
-		printTextElement(qname("h2"), null, "Result set " + resultSetCounter);
+		printEmptyElement(qname("hr"), null);
+		printTextElement(qname("h2"), null, "Result set #" + resultSetCounter);
 	}
 
 	@Override
@@ -177,13 +208,16 @@
 		super.writeEndResultSet();
 		printEndElement();
 		printEndElement();
+
+		printTextElement(qname("p"), null, "Record count: " + getCurrentRowCount());
 	}
 
 	@Override
 	public void writeStartUpdatesResult() {
 		super.writeStartUpdatesResult();
 		updatesResultCounter++;
-		printTextElement(qname("h2"), null, "Updates result " + updatesResultCounter);
+		printEmptyElement(qname("hr"), null);
+		printTextElement(qname("h2"), null, "Updates result #" + updatesResultCounter);
 	}
 
 	@Override
@@ -191,8 +225,4 @@
 		super.writeUpdatedRowsCount(updatedRowsCount);
 		printTextElement(qname("p"), null, "Updated rows: " + updatedRowsCount);
 	}
-
-	protected String toString(Object value) {
-		return String.valueOf(value);
-	}
 }