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 name.abuchen.portfolio.money.Values;
import name.abuchen.portfolio.ui.util.viewers.SharesLabelProvider;
import org.apache.commons.csv.CSVPrinter;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class TableViewerCSVExporter extends AbstractCSVExporter
{
private final TableViewer viewer;
public TableViewerCSVExporter(TableViewer viewer)
{
this.viewer = viewer;
}
@Override
protected Control getControl()
{
return viewer.getTable();
}
@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);
int columnCount = viewer.getTable().getColumnCount();
// write header
for (TableColumn column : viewer.getTable().getColumns())
printer.print(column.getText());
printer.println();
// check for "special" label provider
SharesLabelProvider[] labelProvider = new SharesLabelProvider[columnCount];
for (int ii = 0; ii < columnCount; ii++)
{
CellLabelProvider p = viewer.getLabelProvider(ii);
if (p instanceof SharesLabelProvider)
labelProvider[ii] = (SharesLabelProvider) p;
}
// write body
for (TableItem item : viewer.getTable().getItems())
{
for (int ii = 0; ii < columnCount; ii++)
{
if (labelProvider[ii] != null)
{
Long value = labelProvider[ii].getValue(item.getData());
printer.print(value != null ? Values.Share.format(value) : ""); //$NON-NLS-1$
}
else
printer.print(item.getText(ii));
}
printer.println();
}
}
}
}