From 8df6bc3b8c05af36c2b0ea13ab82890779b8d232 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 14 Oct 2021 17:48:19 +0100 Subject: [PATCH] add paste right-click option to the Add Contact form. GitHub issue #85 --- gui/griffon-app/i18n/messages.properties | 1 + .../com/muwire/gui/AddContactView.groovy | 37 +++++++++++++++++++ .../java/com/muwire/gui/CopyPasteSupport.java | 23 ++++++++++++ 3 files changed, 61 insertions(+) diff --git a/gui/griffon-app/i18n/messages.properties b/gui/griffon-app/i18n/messages.properties index 00cf7448..4b2e89e5 100644 --- a/gui/griffon-app/i18n/messages.properties +++ b/gui/griffon-app/i18n/messages.properties @@ -634,6 +634,7 @@ ADD_CONTACT_TITLE=Add a new contact ADD_CONTACT_BODY=Copy-paste the full MuWire ID of your new contact below. ADD_CONTACT_INVALID_ID_TITLE=Invalid full MuWire ID ADD_CONTACT_INVALID_ID_BODY=You have entered an invalid full MuWire ID. +PASTE=Paste ## My Feed dialog MY_FEED=My Feed diff --git a/gui/griffon-app/views/com/muwire/gui/AddContactView.groovy b/gui/griffon-app/views/com/muwire/gui/AddContactView.groovy index c2fccc75..0f92b3d1 100644 --- a/gui/griffon-app/views/com/muwire/gui/AddContactView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/AddContactView.groovy @@ -2,7 +2,11 @@ package com.muwire.gui import griffon.core.artifact.GriffonView +import javax.swing.JMenuItem +import javax.swing.JPopupMenu import java.awt.event.ActionListener +import java.awt.event.MouseAdapter +import java.awt.event.MouseEvent import static com.muwire.gui.Translator.trans @@ -64,6 +68,39 @@ class AddContactView { } } } + + idArea.addMouseListener(new MouseAdapter() { + @Override + void mousePressed(MouseEvent e) { + if (!CopyPasteSupport.canPasteString()) + return + if (e.isPopupTrigger() || e.button == MouseEvent.BUTTON3) + showPopupMenu(e) + } + + @Override + void mouseReleased(MouseEvent e) { + if (!CopyPasteSupport.canPasteString()) + return + if (e.isPopupTrigger() || e.button == MouseEvent.BUTTON3) + showPopupMenu(e) + } + }) + } + + private void showPopupMenu(MouseEvent event) { + JPopupMenu menu = new JPopupMenu() + JMenuItem paste = new JMenuItem(trans("PASTE")) + paste.addActionListener({doPaste()}) + menu.add(paste) + menu.show(event.getComponent(), event.getX(), event.getY()) + } + + private void doPaste() { + String contents = CopyPasteSupport.pasteFromClipboard() + if (contents == null) + return + idArea.setText(contents) } void mvcGroupInit(Map args) { diff --git a/gui/src/main/java/com/muwire/gui/CopyPasteSupport.java b/gui/src/main/java/com/muwire/gui/CopyPasteSupport.java index e57ea767..14759698 100644 --- a/gui/src/main/java/com/muwire/gui/CopyPasteSupport.java +++ b/gui/src/main/java/com/muwire/gui/CopyPasteSupport.java @@ -3,6 +3,9 @@ package com.muwire.gui; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.io.IOException; +import java.io.InputStream; public class CopyPasteSupport { @@ -21,4 +24,24 @@ public class CopyPasteSupport { StringSelection selection = new StringSelection(str); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, null); } + + /** + * @return what's in the clipboard if it can be represented as a string. This does not handle multi-byte characters. + */ + public static String pasteFromClipboard() { + try { + InputStream is = (InputStream)Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.getTextPlainUnicodeFlavor()); + StringBuilder sb = new StringBuilder(); + int b; + while ((b = is.read()) >= 0) + sb.append((char)b); + return sb.toString(); + } catch (UnsupportedFlavorException| IOException e) { + return null; + } + } + + public static boolean canPasteString() { + return Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(DataFlavor.getTextPlainUnicodeFlavor()); + } }