package com.ibm.nmon.gui.dnd;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.text.DecimalFormat;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.TransferHandler;
import javax.swing.table.TableModel;
import com.ibm.nmon.data.DataTuple;
import com.ibm.nmon.gui.analysis.ByDataSetTableModel;
import com.ibm.nmon.gui.analysis.ByStatisticTableModel;
import com.ibm.nmon.analysis.AnalysisSet;
/**
* Support dragging data to a table from a tree. Also, support copying table data to the clipboard.
*/
public final class TableTransferHandler extends TransferHandler {
private static final long serialVersionUID = 9014181654705663702L;
private static final DecimalFormat FORMAT = new DecimalFormat("0.000");
private final JTable table;
private final AnalysisSet analysisSet;
public TableTransferHandler(JTable table, AnalysisSet analysisSet) {
this.table = table;
this.analysisSet = analysisSet;
}
@Override
public boolean importData(TransferSupport support) {
Object data = null;
try {
data = support.getTransferable().getTransferData(DataTransferable.FLAVORS[0]);
}
catch (Exception e) {
return false;
}
if (data.getClass() != DataTransferable.class) {
return false;
}
DataTransferable transferable = (DataTransferable) data;
for (DataTuple tuple : transferable.getTuples()) {
if (tuple.getField() == null) {
analysisSet.addData(tuple.getDataType());
}
else {
analysisSet.addData(tuple.getDataType(), tuple.getField());
}
}
return true;
}
@Override
public boolean canImport(TransferSupport support) {
boolean supportedFlavor = false;
for (DataFlavor flavor : support.getDataFlavors()) {
if (flavor.isMimeTypeEqual(DataTransferable.FLAVORS[0])) {
supportedFlavor = true;
break;
}
}
return supportedFlavor;
}
@Override
public int getSourceActions(JComponent c) {
return COPY;
}
// note this also handles copy (CTRL-C) from the table
@Override
protected Transferable createTransferable(JComponent c) {
if (c != table) {
return null;
}
return copyTable(false);
}
public Transferable copyAll() {
return copyTable(true);
}
private Transferable copyTable(boolean allRows) {
int columnStartIdx = 0;
TableModel model = table.getModel();
if (model instanceof ByDataSetTableModel) {
// skip metric name
columnStartIdx = 1;
}
else if (model instanceof ByStatisticTableModel) {
columnStartIdx = 0;
}
else {
return null;
}
StringBuilder builder = new StringBuilder(1024);
int rows[] = null;
int n = 0;
if (allRows) {
rows = null;
n = table.getRowCount();
}
else {
rows = table.getSelectedRows();
n = rows.length;
}
for (int i = 0; i < n; i++) {
int row = allRows ? i : rows[i];
for (int j = columnStartIdx; j < table.getColumnCount(); j++) {
Object o = table.getValueAt(row, j);
if (o instanceof Double) {
double d = (Double) o;
if (!Double.isNaN(d)) {
builder.append(FORMAT.format(d));
}
}
else {
builder.append(o.toString());
}
builder.append(',');
}
// remove trailing ','
builder.deleteCharAt(builder.length() - 1);
builder.append('\n');
}
return new StringSelection(builder.toString());
}
}