package name.abuchen.portfolio.ui.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.LinkedList; import org.apache.commons.csv.CSVPrinter; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Control; public class TreeViewerCSVExporter extends AbstractCSVExporter { private final TreeViewer viewer; public TreeViewerCSVExporter(TreeViewer viewer) { this.viewer = viewer; } @Override protected Control getControl() { return viewer.getTree(); } @Override protected void writeToFile(File file) throws IOException { try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)) { CSVPrinter printer = new CSVPrinter(writer); printer.setStrategy(STRATEGY); ITreeContentProvider provider = (ITreeContentProvider) viewer.getContentProvider(); int depth = depth(provider); int columnCount = viewer.getTree().getColumnCount(); ColumnLabelProvider[] labels = new ColumnLabelProvider[columnCount]; for (int ii = 0; ii < labels.length; ii++) labels[ii] = (ColumnLabelProvider) viewer.getLabelProvider(ii); // write header String label = viewer.getTree().getColumn(0).getText(); for (int ii = 0; ii < depth; ii++) printer.print(label + " " + (ii + 1)); //$NON-NLS-1$ for (int ii = 1; ii < columnCount; ii++) printer.print(viewer.getTree().getColumn(ii).getText()); printer.println(); // write body LinkedList<String> path = new LinkedList<>(); for (Object element : provider.getElements(null)) { writeLine(printer, provider, labels, depth, path, element); } } } private void writeLine(CSVPrinter printer, ITreeContentProvider provider, ColumnLabelProvider[] labels, final int depth, LinkedList<String> path, Object element) { path.add(labels[0].getText(element)); for (String s : path) printer.print(s); for (int ii = path.size(); ii < depth; ii++) printer.print(""); //$NON-NLS-1$ for (int ii = 1; ii < labels.length; ii++) { String text = labels[ii].getText(element); printer.print(text != null ? text : ""); //$NON-NLS-1$ } printer.println(); if (provider.hasChildren(element)) { for (Object child : provider.getChildren(element)) writeLine(printer, provider, labels, depth, path, child); } path.removeLast(); } private int depth(final ITreeContentProvider tree) { int depth = 0; for (Object element : tree.getElements(null)) depth = Math.max(depth, depth(tree, element, 1)); return depth; } private int depth(final ITreeContentProvider tree, final Object element, final int depth) { if (!tree.hasChildren(element)) return depth; int d = depth; for (Object child : tree.getChildren(element)) d = Math.max(d, depth(tree, child, depth + 1)); return d; } }