/*
* Copyright (C) 2014 by Array Systems Computing Inc. http://www.array.ca
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.graphbuilder.rcp.dialogs.support;
import org.esa.snap.engine_utilities.db.ProductEntry;
import org.esa.snap.engine_utilities.util.ProductFunctions;
import org.esa.snap.graphbuilder.rcp.utils.ClipboardUtils;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.rcp.nodes.PNode;
import org.esa.snap.rcp.util.Dialogs;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.io.File;
/**
* Table for listing product files
*/
public class FileTable extends JTable {
private final FileTableModel fileModel;
public FileTable() {
this(new FileModel());
}
public FileTable(FileTableModel fileModel) {
this(fileModel, new Dimension(500, 100));
}
public FileTable(FileTableModel fileModel, Dimension dim) {
if (fileModel == null) {
fileModel = new FileModel();
}
this.fileModel = fileModel;
this.setModel(fileModel);
setPreferredScrollableViewportSize(dim);
fileModel.setColumnWidths(getColumnModel());
setColumnSelectionAllowed(true);
setDropMode(DropMode.ON);
setDragEnabled(true);
setComponentPopupMenu(createTablePopup());
setTransferHandler(new ProductSetTransferHandler(fileModel));
}
@Override
public String getToolTipText(MouseEvent e) {
String tip = null;
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
try {
tip = getValueAt(rowIndex, colIndex).toString();
} catch (RuntimeException e1) {
//catch null pointer exception if mouse is over an empty line
}
return tip;
}
public void setFiles(final File[] fileList) {
if (fileList != null) {
fileModel.clear();
for (File file : fileList) {
fileModel.addFile(file);
}
}
}
public void setFiles(final String[] fileList) {
if (fileList != null) {
fileModel.clear();
for (String str : fileList) {
fileModel.addFile(new File(str));
}
}
}
public void setProductEntries(final ProductEntry[] productEntryList) {
if (productEntryList != null) {
fileModel.clear();
for (ProductEntry entry : productEntryList) {
fileModel.addFile(entry);
}
}
}
public int getFileCount() {
int cnt = fileModel.getRowCount();
if (cnt == 1) {
File file = fileModel.getFileAt(0);
if (file.getName().isEmpty())
return 0;
}
return cnt;
}
public File[] getFileList() {
return fileModel.getFileList();
}
public FileTableModel getModel() {
return fileModel;
}
private JPopupMenu createTablePopup() {
final JPopupMenu popup = new JPopupMenu();
final JMenuItem pastelItem = new JMenuItem("Paste");
pastelItem.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
paste();
}
});
popup.add(pastelItem);
return popup;
}
private void paste() {
try {
final File[] fileList = ClipboardUtils.getClipboardFileList();
if (fileList != null) {
setFiles(fileList);
}
} catch (Exception e) {
if (SnapApp.getDefault() != null) {
Dialogs.showError("Unable to paste from clipboard: " + e.getMessage());
}
}
}
public static class ProductSetTransferHandler extends TransferHandler {
private final FileTableModel fileModel;
public ProductSetTransferHandler(FileTableModel model) {
fileModel = model;
}
@Override
public boolean canImport(TransferHandler.TransferSupport info) {
if(info.isDataFlavorSupported(DataFlavor.stringFlavor))
return true;
try {
return (info.getDataFlavors().length > 0 &&
info.getTransferable().getTransferData(info.getDataFlavors()[0]) instanceof PNode);
} catch (Exception e) {
return false;
}
}
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
/**
* Perform the actual import
*/
@Override
public boolean importData(TransferHandler.TransferSupport info) {
if (!info.isDrop()) {
return false;
}
// Get the string that is being dropped.
final Transferable t = info.getTransferable();
try {
if (info.isDataFlavorSupported(DataFlavor.stringFlavor)) {
String data = (String) t.getTransferData(DataFlavor.stringFlavor);
// Wherever there is a newline in the incoming data,
// break it into a separate item in the list.
final String[] values = data.split("\n");
for (String value : values) {
final File file = new File(value);
if (file.exists()) {
if (ProductFunctions.isValidProduct(file)) {
fileModel.addFile(file);
}
}
}
} else {
PNode node = (PNode)t.getTransferData(t.getTransferDataFlavors()[0]);
File file = node.getProduct().getFileLocation();
if (file.exists()) {
fileModel.addFile(file);
}
}
} catch (Exception e) {
return false;
}
return true;
}
// export
@Override
protected Transferable createTransferable(JComponent c) {
final JTable table = (JTable) c;
final int[] rows = table.getSelectedRows();
final StringBuilder listStr = new StringBuilder(256);
for (int row : rows) {
final File file = fileModel.getFileAt(row);
listStr.append(file.getAbsolutePath());
listStr.append('\n');
}
if (rows.length != 0) {
return new StringSelection(listStr.toString());
}
return null;
}
}
}