package jadx.gui.utils; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JPopupMenu; import javax.swing.KeyStroke; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import javax.swing.text.JTextComponent; import javax.swing.undo.UndoManager; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @SuppressWarnings("serial") public class TextStandardActions { private final JTextComponent textComponent; private final JPopupMenu popup = new JPopupMenu(); private final UndoManager undoManager; private Action undoAction; private Action redoAction; private Action cutAction; private Action copyAction; private Action pasteAction; private Action deleteAction; private Action selectAllAction; public TextStandardActions(JTextComponent textComponent) { this.textComponent = textComponent; this.undoManager = new UndoManager(); initActions(); addPopupItems(); addKeyActions(); registerListeners(); } private void initActions() { undoAction = new AbstractAction(NLS.str("popup.undo")) { @Override public void actionPerformed(ActionEvent ae) { if (undoManager.canUndo()) { undoManager.undo(); } } }; redoAction = new AbstractAction(NLS.str("popup.redo")) { @Override public void actionPerformed(ActionEvent ae) { if (undoManager.canRedo()) { undoManager.redo(); } } }; cutAction = new AbstractAction(NLS.str("popup.cut")) { @Override public void actionPerformed(ActionEvent ae) { textComponent.cut(); } }; copyAction = new AbstractAction(NLS.str("popup.copy")) { @Override public void actionPerformed(ActionEvent ae) { textComponent.copy(); } }; pasteAction = new AbstractAction(NLS.str("popup.paste")) { @Override public void actionPerformed(ActionEvent ae) { textComponent.paste(); } }; deleteAction = new AbstractAction(NLS.str("popup.delete")) { @Override public void actionPerformed(ActionEvent ae) { textComponent.replaceSelection(""); } }; selectAllAction = new AbstractAction(NLS.str("popup.select_all")) { @Override public void actionPerformed(ActionEvent ae) { textComponent.selectAll(); } }; } void addPopupItems() { popup.add(undoAction); popup.add(redoAction); popup.addSeparator(); popup.add(cutAction); popup.add(copyAction); popup.add(pasteAction); popup.add(deleteAction); popup.addSeparator(); popup.add(selectAllAction); } private void addKeyActions() { KeyStroke undoKey = KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK); textComponent.getInputMap().put(undoKey, undoAction); KeyStroke redoKey = KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK); textComponent.getInputMap().put(redoKey, redoAction); } private void registerListeners() { textComponent.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if (e.getModifiers() == InputEvent.BUTTON3_MASK && e.getSource() == textComponent) { process(e); } } }); textComponent.getDocument().addUndoableEditListener(new UndoableEditListener() { public void undoableEditHappened(UndoableEditEvent event) { undoManager.addEdit(event.getEdit()); } }); } private void process(MouseEvent e) { 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 && undoManager.canUndo()); redoAction.setEnabled(enabled && editable && undoManager.canRedo()); cutAction.setEnabled(enabled && editable && marked); copyAction.setEnabled(enabled && marked); pasteAction.setEnabled(enabled && editable && pasteAvailable); deleteAction.setEnabled(enabled && editable && marked); 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); } }