/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.nebula.widgets.xviewer.util.XViewerException;
import org.eclipse.nebula.widgets.xviewer.util.internal.HtmlUtil;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLib;
import org.eclipse.nebula.widgets.xviewer.util.internal.XViewerLog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.TreeItem;
/**
* @author Donald G. Dunne
*/
public class XViewerTreeReport {
protected final XViewer xViewer;
protected final String title;
public XViewerTreeReport(String title, XViewer treeViewer) {
this.title = title;
this.xViewer = treeViewer;
}
public XViewerTreeReport(XViewer xViewer) {
this(XViewerText.get("XViewerTreeReport.title"), xViewer); //$NON-NLS-1$
}
public void open() {
open(xViewer.getTree().getItems(), null);
}
public void open(String defaultFilename) {
open(xViewer.getTree().getItems(), defaultFilename);
}
public String getHtml() throws XViewerException {
return getHtml(xViewer.getTree().getItems());
}
public void open(TreeItem items[], String defaultFilename) {
try {
String html = getHtml(items);
final FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell().getShell(), SWT.SAVE);
dialog.setFilterExtensions(new String[] {"*.html"}); //$NON-NLS-1$
if (defaultFilename != null && !defaultFilename.equals("")) { //$NON-NLS-1$
dialog.setFileName(defaultFilename);
}
String filename = dialog.open();
if (filename == null || filename.equals("")) { //$NON-NLS-1$
return;
}
try {
XViewerLib.writeStringToFile(html, new File(filename));
} catch (IOException ex) {
XViewerLog.log(Activator.class, Level.SEVERE, ex);
return;
}
Program.launch(filename);
} catch (Exception ex) {
XViewerLog.logAndPopup(Activator.class, Level.SEVERE, ex);
}
}
private Map<XViewerColumn, Integer> xColToColumnIndex = null;
public String getHtml(TreeItem items[]) throws XViewerException {
StringBuffer sb = new StringBuffer("<html><body>"); //$NON-NLS-1$
sb.append(HtmlUtil.beginMultiColumnTable(100, 1));
List<XViewerColumn> columns = xViewer.getCustomizeMgr().getCurrentTableColumnsInOrder();
List<String> headerStrs = new ArrayList<String>(50);
List<XViewerColumn> showCols = new ArrayList<XViewerColumn>(50);
xColToColumnIndex = xViewer.getCustomizeMgr().getCurrentTableColumnsIndex();
for (XViewerColumn xCol : columns) {
if (xCol.isShow()) {
showCols.add(xCol);
headerStrs.add(xCol.getName());
}
}
sb.append(HtmlUtil.addHeaderRowMultiColumnTable(headerStrs.toArray(new String[headerStrs.size()])));
// Get column widths and column name and setup the columns
IXViewerLabelProvider labelProv = (IXViewerLabelProvider) xViewer.getLabelProvider();
ArrayList<String[]> list = new ArrayList<String[]>();
for (TreeItem item : items) {
addRow(item, list, labelProv, showCols, 1);
}
for (String[] strs : list) {
sb.append(HtmlUtil.addRowMultiColumnTable(strs));
}
sb.append(HtmlUtil.endMultiColumnTable());
sb.append("</body></html>"); //$NON-NLS-1$
return sb.toString();
}
private void addRow(TreeItem item, List<String[]> rowData, IXViewerLabelProvider labelProv, List<XViewerColumn> showCols, int level) throws XViewerException {
List<String> cellData = new ArrayList<String>(showCols.size());
boolean firstCell = true;
for (XViewerColumn xCol : showCols) {
StringBuffer str = new StringBuffer();
if (firstCell) {
for (int y = 1; y < level; y++) {
str.append("__INSERT_TAB_HERE__"); //$NON-NLS-1$
}
firstCell = false;
}
str.append(labelProv.getColumnText(item.getData(), xColToColumnIndex.get(xCol)));
String html = HtmlUtil.textToHtml(str.toString());
html = html.replaceAll("__INSERT_TAB_HERE__", " "); //$NON-NLS-1$ //$NON-NLS-2$
cellData.add(html);
}
rowData.add(cellData.toArray(new String[cellData.size()]));
if (item.getExpanded()) {
for (TreeItem i : item.getItems()) {
addRow(i, rowData, labelProv, showCols, level + 1);
}
}
}
}