summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz')
-rw-r--r--src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java85
-rw-r--r--src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java2
-rw-r--r--src/main/java/cuchaz/enigma/gui/QuickFindAction.java45
3 files changed, 132 insertions, 0 deletions
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 00000000..0c1d4cd6
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/EnigmaQuickFindDialog.java
@@ -0,0 +1,85 @@
1package cuchaz.enigma.gui;
2
3import de.sciss.syntaxpane.actions.DocumentSearchData;
4import de.sciss.syntaxpane.actions.gui.QuickFindDialog;
5
6import javax.swing.*;
7import javax.swing.text.JTextComponent;
8import java.awt.*;
9import java.awt.event.KeyAdapter;
10import java.awt.event.KeyEvent;
11import java.util.stream.IntStream;
12import java.util.stream.Stream;
13
14public class EnigmaQuickFindDialog extends QuickFindDialog {
15 public EnigmaQuickFindDialog(JTextComponent target) {
16 super(target, DocumentSearchData.getFromEditor(target));
17
18 JToolBar toolBar = getToolBar();
19 JTextField textField = getTextField(toolBar);
20
21 textField.addKeyListener(new KeyAdapter() {
22 @Override
23 public void keyPressed(KeyEvent e) {
24 super.keyPressed(e);
25 if (e.getKeyCode() == KeyEvent.VK_ENTER) {
26 JToolBar toolBar = getToolBar();
27 boolean next = !e.isShiftDown();
28 JButton button = next ? getNextButton(toolBar) : getPrevButton(toolBar);
29 button.doClick();
30 }
31 }
32 });
33 }
34
35 @Override
36 public void showFor(JTextComponent target) {
37 String selectedText = target.getSelectedText();
38
39 super.showFor(target);
40
41 Container view = target.getParent();
42 Point loc = new Point(0, view.getHeight() - getSize().height);
43 setLocationRelativeTo(view);
44 SwingUtilities.convertPointToScreen(loc, view);
45 setLocation(loc);
46
47 JToolBar toolBar = getToolBar();
48 JTextField textField = getTextField(toolBar);
49
50 if (selectedText != null) {
51 textField.setText(selectedText);
52 }
53
54 textField.selectAll();
55 }
56
57 private JToolBar getToolBar() {
58 return components(getContentPane(), JToolBar.class).findFirst().orElse(null);
59 }
60
61 private JTextField getTextField(JToolBar toolBar) {
62 return components(toolBar, JTextField.class).findFirst().orElse(null);
63 }
64
65 private JButton getNextButton(JToolBar toolBar) {
66 Stream<JButton> buttons = components(toolBar, JButton.class);
67 return buttons.skip(1).findFirst().orElse(null);
68 }
69
70 private JButton getPrevButton(JToolBar toolBar) {
71 Stream<JButton> buttons = components(toolBar, JButton.class);
72 return buttons.findFirst().orElse(null);
73 }
74
75 private static Stream<Component> components(Container container) {
76 return IntStream.range(0, container.getComponentCount())
77 .mapToObj(container::getComponent);
78 }
79
80 private static <T extends Component> Stream<T> components(Container container, Class<T> type) {
81 return components(container)
82 .filter(type::isInstance)
83 .map(type::cast);
84 }
85}
diff --git a/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java
index 5ea0bc20..42eaa605 100644
--- a/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java
+++ b/src/main/java/cuchaz/enigma/gui/EnigmaSyntaxKit.java
@@ -34,6 +34,8 @@ public class EnigmaSyntaxKit extends JavaSyntaxKit {
34 configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + ""); 34 configuration.put(LineNumbersRuler.PROPERTY_FOREGROUND, Config.getInstance().lineNumbersForeground + "");
35 configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + ""); 35 configuration.put(LineNumbersRuler.PROPERTY_CURRENT_BACK, Config.getInstance().lineNumbersSelected + "");
36 configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config 36 configuration.put("RightMarginColumn", "999"); //No need to have a right margin, if someone wants it add a config
37
38 configuration.put("Action.quick-find", "cuchaz.enigma.gui.QuickFindAction, menu F");
37 } 39 }
38 40
39 public static void invalidate(){ 41 public static void invalidate(){
diff --git a/src/main/java/cuchaz/enigma/gui/QuickFindAction.java b/src/main/java/cuchaz/enigma/gui/QuickFindAction.java
new file mode 100644
index 00000000..b7fa2eba
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/QuickFindAction.java
@@ -0,0 +1,45 @@
1package cuchaz.enigma.gui;
2
3import de.sciss.syntaxpane.SyntaxDocument;
4import de.sciss.syntaxpane.actions.DefaultSyntaxAction;
5
6import javax.swing.text.JTextComponent;
7import java.awt.event.ActionEvent;
8
9public final class QuickFindAction extends DefaultSyntaxAction {
10 public QuickFindAction() {
11 super("quick-find");
12 }
13
14 @Override
15 public void actionPerformed(JTextComponent target, SyntaxDocument document, int dot, ActionEvent event) {
16 Data data = Data.get(target);
17 data.showFindDialog(target);
18 }
19
20 private static class Data {
21 private static final String KEY = "enigma-find-data";
22 private EnigmaQuickFindDialog findDialog;
23
24 private Data() {
25 }
26
27 public static Data get(JTextComponent target) {
28 Object o = target.getDocument().getProperty(KEY);
29 if (o instanceof Data) {
30 return (Data) o;
31 }
32
33 Data data = new Data();
34 target.getDocument().putProperty(KEY, data);
35 return data;
36 }
37
38 public void showFindDialog(JTextComponent target) {
39 if (findDialog == null) {
40 findDialog = new EnigmaQuickFindDialog(target);
41 }
42 findDialog.showFor(target);
43 }
44 }
45}