package com.revolsys.swing.dnd.transferable; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.io.StringWriter; import java.util.Arrays; import java.util.Collection; import com.revolsys.record.Record; import com.revolsys.record.io.RecordReader; import com.revolsys.record.io.format.csv.Csv; import com.revolsys.record.schema.RecordDefinition; public class RecordReaderTransferable implements Transferable { public static final DataFlavor DATA_OBJECT_READER_FLAVOR = new DataFlavor(RecordReader.class, "Data Object List"); private static final DataFlavor[] DATA_FLAVORS = { DATA_OBJECT_READER_FLAVOR, DataFlavor.stringFlavor }; private final RecordReader reader; public RecordReaderTransferable(final RecordReader reader) { this.reader = reader; } @Override public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (this.reader == null) { return null; } else if (DATA_OBJECT_READER_FLAVOR.equals(flavor) || MapTransferable.MAP_FLAVOR.equals(flavor)) { return this.reader; } else if (DataFlavor.stringFlavor.equals(flavor)) { final StringWriter out = new StringWriter(); final RecordDefinition recordDefinition = this.reader.getRecordDefinition(); if (recordDefinition != null) { final Collection<String> fieldNames = recordDefinition.getFieldNames(); Csv.writeColumns(out, fieldNames, '\t', '\n'); for (final Record record : this.reader) { if (record != null) { final Collection<Object> values = record.values(); Csv.writeColumns(out, values, '\t', '\n'); } } } final String text = out.toString(); return text; } else { throw new UnsupportedFlavorException(flavor); } } @Override public DataFlavor[] getTransferDataFlavors() { return DATA_FLAVORS; } @Override public boolean isDataFlavorSupported(final DataFlavor dataFlavor) { return Arrays.asList(DATA_FLAVORS).contains(dataFlavor); } }