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 8099f1d9c..5bdf88e7e 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -25,6 +25,7 @@ import javax.swing.table.TableModel; import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; @@ -42,7 +43,9 @@ public class DataEditor extends JDialog { private static final Color MYGRAY = new Color(230, 230, 230); private static File lastUsedFileName; private final ValueFormatter addrFormat; + private final ValueFormatter dataFormat; private final int addrBits; + private final int dataBits; private final DataField localDataField; private final JTable table; private boolean ok = false; @@ -64,6 +67,8 @@ public class DataEditor extends JDialog { super(SwingUtilities.windowForComponent(parent), Lang.get("key_Data"), modelIsRunning ? ModalityType.MODELESS : ModalityType.APPLICATION_MODAL); setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.addrBits = addrBits; + this.dataBits = dataBits; + this.dataFormat = dataFormat; if (dataFormat.isSuitedForAddresses()) addrFormat = dataFormat; else @@ -194,6 +199,17 @@ public class DataEditor extends JDialog { } }.setAcceleratorCTRLplus('V').enableAcceleratorIn(table); + new ToolTipAction(Lang.get("menu_copy")) { + @Override + public void actionPerformed(ActionEvent e) { + int[] rows = table.getSelectedRows(); + if (rows.length > 0) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(new DataTransferable(((MyTableModel) table.getModel()).toString(rows)), null); + } + } + }.setAcceleratorCTRLplus('C').enableAcceleratorIn(table); + pack(); if (getWidth() < 150) setSize(new Dimension(150, getHeight())); @@ -377,6 +393,20 @@ public class DataEditor extends JDialog { fireEvent(new TableModelEvent(this, addr / cols)); } } + + public String toString(int[] rows) { + StringBuilder sb = new StringBuilder(); + for (int r : rows) { + int offs = r * cols; + sb.append(addrFormat.formatToEdit(new Value(offs, addrBits))); + for (int c = 0; c < cols; c++) { + long val = dataField.getDataWord(offs + c); + sb.append("\t").append(dataFormat.formatToEdit(new Value(val, dataBits))); + } + sb.append(System.lineSeparator()); + } + return sb.toString(); + } } private static final class MyRenderer extends DefaultTableCellRenderer { @@ -499,4 +529,30 @@ public class DataEditor extends JDialog { } } + private static final class DataTransferable implements Transferable { + private final String data; + + private DataTransferable(String data) { + this.data = data; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[]{DataFlavor.stringFlavor}; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor == DataFlavor.stringFlavor; + } + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { + if (!isDataFlavorSupported(flavor)) + throw new UnsupportedFlavorException(flavor); + + return data; + } + } + }