/*******************************************************************************
* Copyright (c) 2017 Rogue Wave Software Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Rogue Wave Software Inc. - initial implementation
*******************************************************************************/
package org.eclipse.php.profile.ui.report;
import java.io.PrintWriter;
import java.util.Random;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.php.profile.ui.views.IHTMLPresentableTreeElement;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Tree;
/**
* Tree viewer to HTML.
*/
public class TreeViewer2HTML {
private PrintWriter fWriter;
private TreeViewer fTreeViewer;
private Tree fTree;
private ITableLabelProvider fLabelProvider;
private ITreeContentProvider fContentProvider;
private String fTableId;
public TreeViewer2HTML(TreeViewer treeViewer, PrintWriter writer) {
fTreeViewer = treeViewer;
fTree = treeViewer.getTree();
fLabelProvider = (ITableLabelProvider) treeViewer.getLabelProvider();
fContentProvider = (ITreeContentProvider) treeViewer
.getContentProvider();
fTableId = Integer.toHexString(new Random().nextInt()).substring(0, 3)
.toUpperCase();
fWriter = writer;
}
/**
* Prints header's section of the table
*
* @param Tree
* tree
* @param StringBuffer
* string buffer to append the output to
*/
private void generateTableHeader() {
fWriter.println("<tr>"); //$NON-NLS-1$
int columnsNum = fTree.getColumnCount();
for (int i = 0; i < columnsNum; ++i) {
fWriter.print("<th>"); //$NON-NLS-1$
fWriter.print(fTree.getColumn(i).getText());
fWriter.println("</th>"); //$NON-NLS-1$
}
fWriter.println("</tr>"); //$NON-NLS-1$
}
/**
* Generates table row
*
* @param Object
* [] current items
* @param int number of tabs
* @param String
* row id prefix (initial=table's prefix, then id_0, id_0_0,
* id_1, etc...)
*/
private void generateTableRow(Object[] items, int tabs, String idPrefix) {
if (items == null || items.length == 0) {
return;
}
StringBuffer tabsBuf = new StringBuffer();
for (int i = 0; i < tabs; ++i) {
tabsBuf.append(" "); //$NON-NLS-1$
}
for (int i = 0; i < items.length; ++i) {
int numColumns = fTree.getColumnCount();
String newId = idPrefix + "_" + i; //$NON-NLS-1$
fWriter.print("<tr id="); //$NON-NLS-1$
fWriter.print(newId);
if (items[i] instanceof IHTMLPresentableTreeElement) {
fWriter.print(" class=\""); //$NON-NLS-1$
fWriter.print(((IHTMLPresentableTreeElement) items[i])
.getTableRowClass());
fWriter.print("\""); //$NON-NLS-1$
}
fWriter.println(">"); //$NON-NLS-1$
for (int j = 0; j < numColumns; ++j) {
String text = fLabelProvider.getColumnText(items[i], j);
fWriter.print("\t<td"); //$NON-NLS-1$
if (text == null) {
fWriter.print(" align=right"); //$NON-NLS-1$
text = "-"; //$NON-NLS-1$
} else {
switch (fTree.getColumn(j).getAlignment()) {
case SWT.LEFT:
fWriter.print(" align=left"); //$NON-NLS-1$
break;
case SWT.CENTER:
fWriter.print(" align=center"); //$NON-NLS-1$
break;
case SWT.RIGHT:
fWriter.print(" align=right"); //$NON-NLS-1$
break;
}
}
fWriter.print(">"); //$NON-NLS-1$
if (j == 0) {
fWriter.print(tabsBuf);
if (fContentProvider.hasChildren(items[i])) {
fWriter.print("<a href=\"#\""); //$NON-NLS-1$
if (items[i] instanceof IHTMLPresentableTreeElement) {
fWriter.print(" class=\""); //$NON-NLS-1$
fWriter
.print(((IHTMLPresentableTreeElement) items[i])
.getTableLinkClass());
fWriter.print("\""); //$NON-NLS-1$
}
fWriter.print(" onclick=\"return toggle('"); //$NON-NLS-1$
fWriter.print(newId);
fWriter.print("');\">"); //$NON-NLS-1$
fWriter.print("<img id=\""); //$NON-NLS-1$
fWriter.print(newId);
fWriter.print("_s\" class=\"fold\" src=\""); //$NON-NLS-1$
fWriter.print(HTMLReporter.IMAGES_DIR);
fWriter.print("/minus.png\"/>"); //$NON-NLS-1$
}
fWriter.print("<img class=\"type\" src=\""); //$NON-NLS-1$
fWriter.print(HTMLReporter.IMAGES_DIR);
fWriter.print("/"); //$NON-NLS-1$
if (items[i] instanceof IHTMLPresentableTreeElement) {
fWriter.print(((IHTMLPresentableTreeElement) items[i])
.getImageURL());
}
fWriter.print("\"/>"); //$NON-NLS-1$
}
fWriter.print(text);
fWriter.println("</td>"); //$NON-NLS-1$
}
fWriter.println("</tr>"); //$NON-NLS-1$
generateTableRow(fContentProvider.getChildren(items[i]), tabs + 1,
newId);
}
}
/**
* Generates table rows
*/
private void generateTableRows() {
generateTableRow(fContentProvider.getChildren(fTreeViewer.getInput()),
0, fTableId);
}
/**
* Generate HTML table from the tree viewer
*/
private void generateTable() {
fWriter.print("<table class=\"tree\" id="); //$NON-NLS-1$
fWriter.print(fTableId);
fWriter.println(">"); //$NON-NLS-1$
fWriter
.println("<colgroup><col width=\"200\" /><col width=\"0*\" /></colgroup>"); //$NON-NLS-1$
generateTableHeader();
generateTableRows();
fWriter.println("</table>"); //$NON-NLS-1$
}
/**
* Converts TreeViewer viewer to HTML table representation.
*
* @param TreeViewer
* viewer
* @param OutputStream
* stream to write the output to
*/
public static void process(TreeViewer treeViewer, PrintWriter writer) {
TreeViewer2HTML treeViewer2HTML = new TreeViewer2HTML(treeViewer,
writer);
treeViewer2HTML.generateTable();
}
}