/* * Encog(tm) Workbench v3.4 * http://www.heatonresearch.com/encog/ * https://github.com/encog/encog-java-workbench * * Copyright 2008-2016 Heaton Research, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * For more information on Heaton Research copyrights, licenses * and trademarks visit: * http://www.heatonresearch.com/copyright */ package org.encog.workbench.util; import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.encog.workbench.models.TrainingSetTableModel; import java.awt.datatransfer.*; import java.util.*; /** * ExcelAdapter enables Copy-Paste Clipboard functionality on JTables. The * clipboard data format used by the adapter is compatible with the clipboard * format used by Excel. This provides for clipboard interoperability between * enabled JTables and Excel. */ public class ExcelAdapter implements ActionListener { private Clipboard system; private JTable table; private TrainingSetTableModel model; /** * The Excel Adapter is constructed with a JTable on which it enables * Copy-Paste and acts as a Clipboard listener. */ public ExcelAdapter(JTable table) { if( table.getModel() instanceof TrainingSetTableModel ){ model = (TrainingSetTableModel)table.getModel(); }else{ System.out.println( table.getModel() ); throw new RuntimeException( "Table model not supported by " + "ExcelAdapter." ); } this.table = table; KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK, false); // Identifying the copy KeyStroke user can modify this // to copy on some other Key combination. KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, false); // Identifying the Paste KeyStroke user can modify this // to copy on some other Key combination. this.table.registerKeyboardAction(this, "Copy", copy, JComponent.WHEN_FOCUSED); this.table.registerKeyboardAction(this, "Paste", paste, JComponent.WHEN_FOCUSED); system = Toolkit.getDefaultToolkit().getSystemClipboard(); } /** * Public Accessor methods for the Table on which this adapter acts. */ public JTable getJTable() { return table; } public void setJTable(JTable jTable1) { this.table = jTable1; } /** * This method is activated on the Keystrokes we are listening to in this * implementation. Here it listens for Copy and Paste ActionCommands. * Selections comprising non-adjacent cells result in invalid selection and * then copy action cannot be performed. Paste is done by aligning the upper * left corner of the selection with the 1st element in the current * selection of the JTable. */ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().compareTo("Copy") == 0) { StringBuffer sbf = new StringBuffer(); // Check to ensure we have selected only a contiguous block of // cells int numcols = table.getSelectedColumnCount(); int numrows = table.getSelectedRowCount(); int[] rowsselected = table.getSelectedRows(); int[] colsselected = table.getSelectedColumns(); if (!((numrows - 1 == rowsselected[rowsselected.length - 1] - rowsselected[0] && numrows == rowsselected.length) && (numcols - 1 == colsselected[colsselected.length - 1] - colsselected[0] && numcols == colsselected.length))) { JOptionPane.showMessageDialog(null, "Invalid Copy Selection", "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE); return; } for (int i = 0; i < numrows; i++) { for (int j = 0; j < numcols; j++) { sbf.append(table.getValueAt(rowsselected[i], colsselected[j])); if (j < numcols - 1) sbf.append("\t"); } sbf.append("\n"); } StringSelection stsel = new StringSelection(sbf.toString()); system = Toolkit.getDefaultToolkit().getSystemClipboard(); system.setContents(stsel, stsel); } if (e.getActionCommand().compareTo("Paste") == 0) { int startRow = (table.getSelectedRows())[0]; int startCol = (table.getSelectedColumns())[0]; try { String trstring = (String) (system.getContents(this) .getTransferData(DataFlavor.stringFlavor)); StringTokenizer st1 = new StringTokenizer(trstring, "\n"); for (int i = 0; st1.hasMoreTokens(); i++) { String rowstring = st1.nextToken(); StringTokenizer st2 = new StringTokenizer(rowstring, "\t"); for (int j = 0; st2.hasMoreTokens(); j++) { String value = (String) st2.nextToken(); setValue(value, startRow + i, startCol + j); } } } catch (Exception ex) { ex.printStackTrace(); } } } private void setValue( String value, int row, int column ){ if( table.getRowCount() <= row ){ model.addRow(-1); } table.setValueAt( value, row, column ); } }