From 06efc97fa238cadf70c04a494b166d69358e9b0e Mon Sep 17 00:00:00 2001 From: Gegy Date: Sun, 12 May 2019 11:04:22 +0200 Subject: Quick find fixes (#133) * Correctly offset quick find dialog, select all text on Ctrl+F, and set text to highlighted on open * Support quick find navigation with enter & shift+enter --- .../cuchaz/enigma/gui/EnigmaQuickFindDialog.java | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java (limited to 'src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java') diff --git a/src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java b/src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java new file mode 100644 index 0000000..0c1d4cd --- /dev/null +++ b/src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java @@ -0,0 +1,85 @@ +package cuchaz.enigma.gui; + +import de.sciss.syntaxpane.actions.DocumentSearchData; +import de.sciss.syntaxpane.actions.gui.QuickFindDialog; + +import javax.swing.*; +import javax.swing.text.JTextComponent; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public class EnigmaQuickFindDialog extends QuickFindDialog { + public EnigmaQuickFindDialog(JTextComponent target) { + super(target, DocumentSearchData.getFromEditor(target)); + + JToolBar toolBar = getToolBar(); + JTextField textField = getTextField(toolBar); + + textField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + super.keyPressed(e); + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + JToolBar toolBar = getToolBar(); + boolean next = !e.isShiftDown(); + JButton button = next ? getNextButton(toolBar) : getPrevButton(toolBar); + button.doClick(); + } + } + }); + } + + @Override + public void showFor(JTextComponent target) { + String selectedText = target.getSelectedText(); + + super.showFor(target); + + Container view = target.getParent(); + Point loc = new Point(0, view.getHeight() - getSize().height); + setLocationRelativeTo(view); + SwingUtilities.convertPointToScreen(loc, view); + setLocation(loc); + + JToolBar toolBar = getToolBar(); + JTextField textField = getTextField(toolBar); + + if (selectedText != null) { + textField.setText(selectedText); + } + + textField.selectAll(); + } + + private JToolBar getToolBar() { + return components(getContentPane(), JToolBar.class).findFirst().orElse(null); + } + + private JTextField getTextField(JToolBar toolBar) { + return components(toolBar, JTextField.class).findFirst().orElse(null); + } + + private JButton getNextButton(JToolBar toolBar) { + Stream buttons = components(toolBar, JButton.class); + return buttons.skip(1).findFirst().orElse(null); + } + + private JButton getPrevButton(JToolBar toolBar) { + Stream buttons = components(toolBar, JButton.class); + return buttons.findFirst().orElse(null); + } + + private static Stream components(Container container) { + return IntStream.range(0, container.getComponentCount()) + .mapToObj(container::getComponent); + } + + private static Stream components(Container container, Class type) { + return components(container) + .filter(type::isInstance) + .map(type::cast); + } +} -- cgit v1.2.3