diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index c797f6e4c..2eeef90d2 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -60,6 +60,10 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib * The delete icon, also used from {@link de.neemann.digital.gui.components.terminal.TerminalDialog} */ public static final Icon ICON_DELETE = IconCreator.create("delete.png"); + /** + * The copy icon, also used from {@link de.neemann.digital.gui.components.terminal.TerminalDialog} + */ + public static final Icon ICON_COPY = IconCreator.create("edit-copy.png"); private static final Icon ICON_UNDO = IconCreator.create("edit-undo.png"); private static final Icon ICON_REDO = IconCreator.create("edit-redo.png"); private static final ArrayList ATTR_LIST = new ArrayList<>(); @@ -431,7 +435,7 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib } private ToolTipAction createCopyAction(ShapeFactory shapeFactory) { - return new ToolTipAction(Lang.get("menu_copy")) { + return new ToolTipAction(Lang.get("menu_copy"), ICON_COPY) { @Override public void actionPerformed(ActionEvent e) { ArrayList elements = getSelectedElements(shapeFactory); 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 5bdf88e7e..99b2d3b1a 100644 --- a/src/main/java/de/neemann/digital/gui/components/DataEditor.java +++ b/src/main/java/de/neemann/digital/gui/components/DataEditor.java @@ -23,10 +23,7 @@ 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.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.datatransfer.*; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; @@ -205,7 +202,7 @@ public class DataEditor extends JDialog { int[] rows = table.getSelectedRows(); if (rows.length > 0) { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - clipboard.setContents(new DataTransferable(((MyTableModel) table.getModel()).toString(rows)), null); + clipboard.setContents(new StringSelection(((MyTableModel) table.getModel()).toString(rows)), null); } } }.setAcceleratorCTRLplus('C').enableAcceleratorIn(table); @@ -529,30 +526,4 @@ 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; - } - } - } diff --git a/src/main/java/de/neemann/digital/gui/components/graphics/MoveFocusTo.java b/src/main/java/de/neemann/digital/gui/components/graphics/MoveFocusTo.java index d69ea4d77..cbf16ad68 100644 --- a/src/main/java/de/neemann/digital/gui/components/graphics/MoveFocusTo.java +++ b/src/main/java/de/neemann/digital/gui/components/graphics/MoveFocusTo.java @@ -12,6 +12,11 @@ import java.awt.event.WindowFocusListener; /** * If added to a window, the focus is transferred to the given window. + *

+ * Should be attached to dialogs which offer no user interaction at all. + * In other words, all windows that exclusively display something. + * As soon as there are menus, buttons or similar, this listener should + * no longer be used. */ public class MoveFocusTo implements WindowFocusListener { private final Window parent; diff --git a/src/main/java/de/neemann/digital/gui/components/terminal/TerminalDialog.java b/src/main/java/de/neemann/digital/gui/components/terminal/TerminalDialog.java index 43ab994dd..d93d42559 100644 --- a/src/main/java/de/neemann/digital/gui/components/terminal/TerminalDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/terminal/TerminalDialog.java @@ -9,13 +9,14 @@ import de.neemann.digital.core.Model; import de.neemann.digital.core.element.ElementAttributes; import de.neemann.digital.core.element.Keys; import de.neemann.digital.gui.components.CircuitComponent; -import de.neemann.digital.gui.components.graphics.MoveFocusTo; import de.neemann.digital.lang.Lang; import de.neemann.gui.Screen; import de.neemann.gui.ToolTipAction; import javax.swing.*; import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import static de.neemann.digital.gui.components.terminal.ConsoleTerminal.MAX_TERMINAL_STORED; @@ -58,6 +59,7 @@ public final class TerminalDialog extends JDialog { width = attr.get(Keys.TERM_WIDTH); textArea = new JTextArea(attr.get(Keys.TERM_HEIGHT), width); textArea.setFont(new Font("monospaced", Font.PLAIN, Screen.getInstance().getFontSize())); + textArea.setEditable(false); getContentPane().add(new JScrollPane(textArea)); JToolBar toolBar = new JToolBar(); @@ -67,13 +69,20 @@ public final class TerminalDialog extends JDialog { textArea.setText(""); } }.setToolTip(Lang.get("menu_terminalDelete_tt")).createJButtonNoText()); + ToolTipAction copyAction = new ToolTipAction(Lang.get("menu_copy"), CircuitComponent.ICON_COPY) { + @Override + public void actionPerformed(ActionEvent e) { + final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + clipboard.setContents(new StringSelection(textArea.getText()), null); + } + }.setToolTip(Lang.get("menu_copy_tt")).setAcceleratorCTRLplus('C'); + toolBar.add(copyAction.createJButtonNoText()); + copyAction.enableAcceleratorIn(textArea); getContentPane().add(toolBar, BorderLayout.NORTH); pack(); - setLocationRelativeTo(null); + setLocationRelativeTo(parent); setVisible(true); - - addWindowFocusListener(new MoveFocusTo(parent)); } /** diff --git a/src/main/resources/icons/edit-copy.png b/src/main/resources/icons/edit-copy.png new file mode 100644 index 000000000..1ada2624f Binary files /dev/null and b/src/main/resources/icons/edit-copy.png differ diff --git a/src/main/resources/icons/edit-copy_hi.png b/src/main/resources/icons/edit-copy_hi.png new file mode 100644 index 000000000..30de435c7 Binary files /dev/null and b/src/main/resources/icons/edit-copy_hi.png differ diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index cf7ae39e5..523187f52 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -1767,6 +1767,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Analyse der aktuellen Schaltung Ausschneiden Kopieren + In die Zwischenablage kopieren Benutzerdefiniert Bibliothek Löschen diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index db8c7bac9..334c4a9db 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -1752,6 +1752,7 @@ Analyses the current circuit Cut Copy + Copy to clipboard Custom Library Delete components diff --git a/src/main/svg/edit-copy.svg b/src/main/svg/edit-copy.svg new file mode 100644 index 000000000..5164240d8 --- /dev/null +++ b/src/main/svg/edit-copy.svg @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Edit Copy + 2005-10-15 + + + Andreas Nilsson + + + + + edit + copy + + + + + + Jakub Steiner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/svg/exp.sh b/src/main/svg/exp.sh index 41136882d..38748a86f 100755 --- a/src/main/svg/exp.sh +++ b/src/main/svg/exp.sh @@ -19,6 +19,7 @@ ./expicon.sh View-zoom-out ./expicon.sh edit-redo ./expicon.sh edit-undo +./expicon.sh edit-copy ./expicon.sh measurement-graph ./expicon.sh dialog-error