From cc4aeb977e86214e96005606faec58dd48cc5127 Mon Sep 17 00:00:00 2001 From: 4pr0n Date: Mon, 26 May 2014 00:43:47 -0700 Subject: [PATCH] Added right-click context menu to text box Closes #1 --- .../ripme/ui/ContextMenuMouseListener.java | 131 ++++++++++++++++++ .../com/rarchives/ripme/ui/MainWindow.java | 1 + 2 files changed, 132 insertions(+) create mode 100644 src/main/java/com/rarchives/ripme/ui/ContextMenuMouseListener.java diff --git a/src/main/java/com/rarchives/ripme/ui/ContextMenuMouseListener.java b/src/main/java/com/rarchives/ripme/ui/ContextMenuMouseListener.java new file mode 100644 index 00000000..aa0ead24 --- /dev/null +++ b/src/main/java/com/rarchives/ripme/ui/ContextMenuMouseListener.java @@ -0,0 +1,131 @@ +package com.rarchives.ripme.ui; + +import java.awt.Toolkit; +import java.awt.datatransfer.DataFlavor; +import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.JPopupMenu; +import javax.swing.text.JTextComponent; + +/** + * Listens for mouse events & displays a contextual pop-up menu. + * Copied verbatim from http://stackoverflow.com/a/2793959 + * @author Bozhidar Batsov + */ +public class ContextMenuMouseListener extends MouseAdapter { + private JPopupMenu popup = new JPopupMenu(); + + private Action cutAction; + private Action copyAction; + private Action pasteAction; + private Action undoAction; + private Action selectAllAction; + + private JTextComponent textComponent; + private String savedString = ""; + private Actions lastActionSelected; + + private enum Actions { UNDO, CUT, COPY, PASTE, SELECT_ALL }; + + @SuppressWarnings("serial") + public ContextMenuMouseListener() { + undoAction = new AbstractAction("Undo") { + + @Override + public void actionPerformed(ActionEvent ae) { + textComponent.setText(""); + textComponent.replaceSelection(savedString); + + lastActionSelected = Actions.UNDO; + } + }; + + popup.add(undoAction); + popup.addSeparator(); + + cutAction = new AbstractAction("Cut") { + + @Override + public void actionPerformed(ActionEvent ae) { + lastActionSelected = Actions.CUT; + savedString = textComponent.getText(); + textComponent.cut(); + } + }; + + popup.add(cutAction); + + copyAction = new AbstractAction("Copy") { + + @Override + public void actionPerformed(ActionEvent ae) { + lastActionSelected = Actions.COPY; + textComponent.copy(); + } + }; + + popup.add(copyAction); + + pasteAction = new AbstractAction("Paste") { + + @Override + public void actionPerformed(ActionEvent ae) { + lastActionSelected = Actions.PASTE; + savedString = textComponent.getText(); + textComponent.paste(); + } + }; + + popup.add(pasteAction); + popup.addSeparator(); + + selectAllAction = new AbstractAction("Select All") { + + @Override + public void actionPerformed(ActionEvent ae) { + lastActionSelected = Actions.SELECT_ALL; + textComponent.selectAll(); + } + }; + + popup.add(selectAllAction); + } + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getModifiers() == InputEvent.BUTTON3_MASK) { + if (!(e.getSource() instanceof JTextComponent)) { + return; + } + + textComponent = (JTextComponent) e.getSource(); + textComponent.requestFocus(); + + boolean enabled = textComponent.isEnabled(); + boolean editable = textComponent.isEditable(); + boolean nonempty = !(textComponent.getText() == null || textComponent.getText().equals("")); + boolean marked = textComponent.getSelectedText() != null; + + boolean pasteAvailable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null).isDataFlavorSupported(DataFlavor.stringFlavor); + + undoAction.setEnabled(enabled && editable && (lastActionSelected == Actions.CUT || lastActionSelected == Actions.PASTE)); + cutAction.setEnabled(enabled && editable && marked); + copyAction.setEnabled(enabled && marked); + pasteAction.setEnabled(enabled && editable && pasteAvailable); + selectAllAction.setEnabled(enabled && nonempty); + + int nx = e.getX(); + + if (nx > 500) { + nx = nx - popup.getSize().width; + } + + popup.show(e.getComponent(), nx, e.getY() - popup.getSize().height); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index 899d1b8d..14f67e70 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -204,6 +204,7 @@ public class MainWindow implements Runnable, RipStatusHandler { } ripTextfield = new JTextField("", 20); + ripTextfield.addMouseListener(new ContextMenuMouseListener()); ImageIcon ripIcon = new ImageIcon(mainIcon); ripButton = new JButton("Rip", ripIcon); stopButton = new JButton("Stop");