diff --git a/src/main/java/de/neemann/digital/gui/components/DataEditor.java b/src/main/java/de/neemann/digital/gui/components/DataEditor.java index beb8b2f37..3c9aa34d0 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -23,12 +23,16 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.StringTokenizer; /** * Used to edit ROM data fields. @@ -175,10 +179,24 @@ public class DataEditor extends JDialog { menuBar.add(data); - setJMenuBar(menuBar); } + AbstractAction pasteAction = new AbstractAction("Paste") { + @Override + public void actionPerformed(ActionEvent e) { + Clipboard clpbrd = Toolkit.getDefaultToolkit().getSystemClipboard(); + try { + Object data = clpbrd.getData(DataFlavor.stringFlavor); + new PasteHandler(data.toString(), table).paste(); + } catch (UnsupportedFlavorException | IOException e1) { + new ErrorMessage(Lang.get("msg_errorPastingData")).addCause(e1).show(); + } + } + }; + table.getInputMap().put(KeyStroke.getKeyStroke("control V"), "myPaste"); + table.getActionMap().put("myPaste", pasteAction); + pack(); if (getWidth() < 150) setSize(new Dimension(150, getHeight())); @@ -423,4 +441,62 @@ public class DataEditor extends JDialog { return value; } } + + private static final class PasteHandler { + private final String data; + private final int yOrigin; + private final int xOrigin; + private final MyTableModel model; + + /** + * Creates a new Paste handler + * + * @param data the datastrin give by the systems clipboard + * @param table the tabel to insert the data to + */ + private PasteHandler(String data, JTable table) { + this.data = data; + xOrigin = table.getSelectedColumn(); + yOrigin = table.getSelectedRow(); + model = (MyTableModel) table.getModel(); + } + + /** + * called to handle the paste action + */ + private void paste() { + if (xOrigin >= 0 && yOrigin >= 0) { + StringTokenizer rows = new StringTokenizer(data, "\n\r"); + int y = 0; + while (rows.hasMoreTokens()) { + String line = rows.nextToken(); + StringTokenizer cols = new StringTokenizer(line, "\t"); + int x = 0; + while (cols.hasMoreTokens()) { + String cell = cols.nextToken(); + setData(xOrigin + x, yOrigin + y, cell.trim()); + x++; + } + y++; + } + model.fireEvent(new TableModelEvent(model)); + } + } + + private void setData(int col, int row, String value) { + if (col < model.getColumnCount() && row < model.getRowCount()) { + if (model.isCellEditable(row, col)) { + Class type = model.getColumnClass(col); + if (type == Long.class) { + try { + model.setValueAt(Bits.decode(value), row, col); + } catch (Bits.NumberFormatException e) { + // do nothing on error + } + } + } + } + } + } + } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 543c45517..326e6bde0 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -52,6 +52,7 @@ Ausgänge Veränderbare Attribute Suche + Fehler beim Einfügen von Daten! diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 41e2fee77..53a309131 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -52,7 +52,7 @@ Outputs Attributes search - + Error at pasting data!