1 package org.simantics.document.linking.report.html;
\r
4 import java.io.IOException;
\r
5 import java.io.PrintStream;
\r
7 import java.net.URLDecoder;
\r
8 import java.util.HashMap;
\r
9 import java.util.Map;
\r
11 import org.eclipse.core.runtime.FileLocator;
\r
12 import org.eclipse.core.runtime.Path;
\r
13 import org.eclipse.core.runtime.Platform;
\r
14 import org.osgi.framework.Bundle;
\r
15 import org.simantics.document.linking.Activator;
\r
16 import org.simantics.document.linking.report.Document;
\r
17 import org.simantics.document.linking.report.DocumentElement;
\r
18 import org.simantics.document.linking.report.DocumentItem;
\r
19 import org.simantics.document.linking.report.DocumentTitlePage;
\r
20 import org.simantics.document.linking.report.Table;
\r
21 import org.simantics.document.linking.report.TableOfContents;
\r
22 import org.simantics.document.linking.report.TextItem;
\r
23 import org.simantics.document.linking.report.URLItem;
\r
24 import org.simantics.document.linking.report.base.TextItemImpl;
\r
25 import org.simantics.utils.datastructures.Arrays;
\r
29 * HTML format reporter.
\r
31 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
34 public class HTMLDocument extends HTMLStreamElement implements Document {
\r
37 boolean referCSS = false; // if true, generated report refers to bas css in the plug-in. Otherwise the base css's contents are copied to report file.
\r
39 int currentPage = 0;
\r
40 int currentLine = 1;
\r
42 HTMLStreamElement content;
\r
44 private Map<Class<? extends HTMLElement>, Integer> uniqueIndex = new HashMap<Class<? extends HTMLElement>, Integer>();
\r
48 public String getId() {
\r
52 public HTMLDocument(File file) throws Exception {
\r
54 content = new HTMLStreamElement(this);
\r
57 String getUniqueId(Class<? extends HTMLElement> cls) {
\r
58 Integer index = uniqueIndex.get(cls);
\r
63 uniqueIndex.put(cls,index);
\r
65 return cls.getSimpleName() +"_"+index;
\r
67 String getUniqueId(HTMLElement element) {
\r
68 Class<? extends HTMLElement> cls = element.getClass();
\r
69 return getUniqueId(cls);
\r
72 private static String getDataUrl() throws IOException {
\r
73 Bundle b = Platform.getBundle(Activator.PLUGIN_ID);
\r
74 URL dataUrl = FileLocator.find(b, new Path("report"), null);
\r
75 URL fileUrl = FileLocator.toFileURL(dataUrl);
\r
76 return URLDecoder.decode(fileUrl.getPath(), "UTF-8");
\r
79 private void copyBaseCSS(String cssUrl) throws Exception {
\r
80 File f = new File(URLDecoder.decode(cssUrl, "UTF-8")).getAbsoluteFile();
\r
85 private void header() throws Exception {
\r
86 PrintStream resultOs = os;
\r
87 String cssUrl = getDataUrl() +"/report.css";
\r
88 resultOs.println("<!DOCTYPE html>");
\r
89 resultOs.println("<html lang=\"en\">");
\r
90 resultOs.println("<head>");
\r
91 resultOs.println(" <meta charset=\"utf-8\">");
\r
92 resultOs.println(" <title>Report</title>");
\r
94 resultOs.println(" <link rel=\"stylesheet\" href=\"" + cssUrl + "\" type=\"text/css\">");
\r
95 resultOs.println(" <style>");
\r
97 copyBaseCSS(cssUrl);
\r
100 resultOs.println(" </style>");
\r
101 resultOs.println("</head>");
\r
102 resultOs.println("<body>");
\r
105 private void footer() throws Exception{
\r
106 if (currentTable != null)
\r
107 currentTable.endTable();
\r
111 PrintStream resultOs = os;
\r
112 resultOs.println("</body>");
\r
113 resultOs.println("</html>");
\r
117 public void close() throws Exception {
\r
124 public int getCurrentLine() {
\r
125 return currentLine;
\r
129 public int getAvailableLines() {
\r
130 return Integer.MAX_VALUE;
\r
134 public void nextPage() throws Exception {
\r
135 if (currentPage == 0)
\r
141 @SuppressWarnings("unchecked")
\r
143 public <T extends DocumentElement> T newElement(Class<T> cls,String...options) throws Exception {
\r
144 if (cls == Table.class) {
\r
145 return (T)newTable(Arrays.contains(options, Document.TOC));
\r
146 } else if (cls == TableOfContents.class) {
\r
147 return (T)getOrCreateToc();
\r
148 } else if (cls == DocumentTitlePage.class) {
\r
149 if (titlePage != null)
\r
150 throw new Exception("Document many have only one title page");
\r
151 titlePage = new HTMLTitlePage(this);
\r
152 return (T)titlePage;
\r
157 @SuppressWarnings("unchecked")
\r
159 public <T extends DocumentElement> T nextElement(Class<T> cls,String...options) throws Exception {
\r
160 if (cls == Table.class) {
\r
161 return (T)nextTable(Arrays.contains(options, Document.TOC));
\r
162 } else if (cls == TableOfContents.class) {
\r
163 return (T)getOrCreateToc();
\r
168 @SuppressWarnings("unchecked")
\r
170 public <T extends DocumentElement> T getCurrentElement(Class<T> cls) {
\r
171 if (cls == Table.class) {
\r
172 return (T)getCurrentTable();
\r
173 } else if (cls == TableOfContents.class) {
\r
175 } else if (cls == DocumentTitlePage.class) {
\r
176 return (T)titlePage;
\r
181 @SuppressWarnings("unchecked")
\r
183 public <T extends DocumentItem> T newItem(Class<T> cls, String... options)
\r
185 if (cls == TextItem.class)
\r
186 return (T)new TextItemImpl();
\r
187 if (cls == URLItem.class)
\r
188 return (T)new HTMLURLItemImpl();
\r
192 private HTMLTable currentTable;
\r
195 public Table nextTable(boolean id) throws Exception {
\r
196 if (currentTable != null) {
\r
197 currentTable.endTable();
\r
198 currentTable = new HTMLTable(currentTable,id);
\r
199 return currentTable;
\r
201 return currentTable;
\r
207 public Table newTable(boolean id) throws Exception {
\r
208 if (currentTable != null) {
\r
209 currentTable.endTable();
\r
211 currentTable = new HTMLTable(this,content.os,id);
\r
212 return currentTable;
\r
216 public Table getCurrentTable() {
\r
217 return currentTable;
\r
220 HTMLTocElement toc;
\r
222 public TableOfContents getOrCreateToc() throws Exception{
\r
224 toc = new HTMLTocElement(this);
\r
229 HTMLTitlePage titlePage;
\r