summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Modmuss502019-02-19 19:00:31 +0000
committerGravatar Gegy2019-02-19 21:00:31 +0200
commitaf43eb7a98c0c2dc017b37bba72721c46ecc4afe (patch)
treea460092562d98a176541503d2344a570c0c2e3a2 /src
parentTrack loaded mapping path when opening mappings and not just when saving (diff)
downloadenigma-af43eb7a98c0c2dc017b37bba72721c46ecc4afe.tar.gz
enigma-af43eb7a98c0c2dc017b37bba72721c46ecc4afe.tar.xz
enigma-af43eb7a98c0c2dc017b37bba72721c46ecc4afe.zip
Added Basic Search (#102)
* 3am code for a basic search box, needs some cleanup * Cleanup the code a bit * Add missing header * Fix indentation, + unneeded check
Diffstat (limited to 'src')
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java4
-rw-r--r--src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java158
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java7
3 files changed, 169 insertions, 0 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index 3593e4fa..c419aae8 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -839,4 +839,8 @@ public class Gui {
839 this.deobfPanel.deobfClasses.restoreExpansionState(this.deobfPanel.deobfClasses, stateDeobf); 839 this.deobfPanel.deobfClasses.restoreExpansionState(this.deobfPanel.deobfClasses, stateDeobf);
840 this.obfPanel.obfClasses.restoreExpansionState(this.obfPanel.obfClasses, stateObf); 840 this.obfPanel.obfClasses.restoreExpansionState(this.obfPanel.obfClasses, stateObf);
841 } 841 }
842
843 public PanelDeobf getDeobfPanel() {
844 return deobfPanel;
845 }
842} 846}
diff --git a/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java b/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
new file mode 100644
index 00000000..da09c529
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/gui/dialog/SearchDialog.java
@@ -0,0 +1,158 @@
1/*******************************************************************************
2 * Copyright (c) 2015 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Lesser General Public
5 * License v3.0 which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/lgpl.html
7 * <p>
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11
12package cuchaz.enigma.gui.dialog;
13
14import com.google.common.collect.Lists;
15import cuchaz.enigma.gui.Gui;
16import cuchaz.enigma.translation.representation.entry.ClassEntry;
17import me.xdrop.fuzzywuzzy.FuzzySearch;
18import me.xdrop.fuzzywuzzy.model.ExtractedResult;
19
20import javax.swing.*;
21import javax.swing.border.EmptyBorder;
22import java.awt.*;
23import java.awt.event.*;
24import java.util.List;
25import java.util.function.Consumer;
26import java.util.stream.Collectors;
27
28public class SearchDialog {
29
30 private JTextField searchField;
31 private JList<String> classList;
32 private JFrame frame;
33
34 private Gui parent;
35 private List<ClassEntry> deobfClasses;
36
37 private KeyEventDispatcher keyEventDispatcher;
38
39 public SearchDialog(Gui parent) {
40 this.parent = parent;
41
42 deobfClasses = Lists.newArrayList();
43 this.parent.getController().getDeobfuscator().getSeparatedClasses(Lists.newArrayList(), deobfClasses);
44 deobfClasses.removeIf(ClassEntry::isInnerClass);
45 }
46
47 public void show() {
48 frame = new JFrame("Search");
49 frame.setVisible(false);
50 JPanel pane = new JPanel();
51 pane.setBorder(new EmptyBorder(5, 10, 5, 10));
52
53 addRow(pane, jPanel -> {
54 searchField = new JTextField("", 20);
55
56 searchField.addKeyListener(new KeyAdapter() {
57 @Override
58 public void keyTyped(KeyEvent keyEvent) {
59 updateList();
60 }
61 });
62
63 jPanel.add(searchField);
64 });
65
66 addRow(pane, jPanel -> {
67 classList = new JList<>();
68 classList.setLayoutOrientation(JList.VERTICAL);
69 classList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
70
71 classList.addMouseListener(new MouseAdapter() {
72 @Override
73 public void mouseClicked(MouseEvent mouseEvent) {
74 if(mouseEvent.getClickCount() >= 2){
75 openSelected();
76 }
77 }
78 });
79 jPanel.add(classList);
80 });
81
82
83 keyEventDispatcher = keyEvent -> {
84 if(!frame.isVisible()){
85 return false;
86 }
87 if(keyEvent.getKeyCode() == KeyEvent.VK_DOWN){
88 int next = classList.isSelectionEmpty() ? 0 : classList.getSelectedIndex() + 1;
89 classList.setSelectedIndex(next);
90 }
91 if(keyEvent.getKeyCode() == KeyEvent.VK_UP){
92 int next = classList.isSelectionEmpty() ? classList.getModel().getSize() : classList.getSelectedIndex() - 1;
93 classList.setSelectedIndex(next);
94 }
95 if(keyEvent.getKeyCode() == KeyEvent.VK_ENTER){
96 openSelected();
97 }
98 if(keyEvent.getKeyCode() == KeyEvent.VK_ESCAPE){
99 close();
100 }
101 return false;
102 };
103
104 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(keyEventDispatcher);
105
106 frame.setContentPane(pane);
107 frame.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
108
109 frame.setSize(360, 500);
110 frame.setAlwaysOnTop(true);
111 frame.setResizable(false);
112 frame.setLocationRelativeTo(parent.getFrame());
113 frame.setVisible(true);
114 frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
115
116 searchField.requestFocusInWindow();
117 }
118
119 private void openSelected(){
120 close();
121 if(classList.isSelectionEmpty()){
122 return;
123 }
124 deobfClasses.stream()
125 .filter(classEntry -> classEntry.getSimpleName().equals(classList.getSelectedValue())).
126 findFirst()
127 .ifPresent(classEntry -> {
128 parent.navigateTo(classEntry);
129 parent.getDeobfPanel().deobfClasses.setSelectionClass(classEntry);
130 });
131 }
132
133 private void close(){
134 frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
135 KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(keyEventDispatcher);
136 }
137
138 private void addRow(JPanel pane, Consumer<JPanel> consumer) {
139 JPanel panel = new JPanel(new FlowLayout());
140 consumer.accept(panel);
141 pane.add(panel, BorderLayout.CENTER);
142 }
143
144 //Updates the list of class names
145 private void updateList() {
146 DefaultListModel<String> listModel = new DefaultListModel<>();
147
148 //Basic search using the Fuzzy libary
149 //TODO improve on this, to not just work from string and to keep the ClassEntry
150 List<ExtractedResult> results = FuzzySearch.extractTop(searchField.getText(), deobfClasses.stream().map(ClassEntry::getSimpleName).collect(Collectors.toList()), 25);
151 results.forEach(extractedResult -> listModel.addElement(extractedResult.getString()));
152
153 classList.setModel(listModel);
154 }
155
156
157
158}
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
index dfbfa650..14ad53dc 100644
--- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
+++ b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
@@ -4,6 +4,7 @@ import cuchaz.enigma.config.Config;
4import cuchaz.enigma.config.Themes; 4import cuchaz.enigma.config.Themes;
5import cuchaz.enigma.gui.Gui; 5import cuchaz.enigma.gui.Gui;
6import cuchaz.enigma.gui.dialog.AboutDialog; 6import cuchaz.enigma.gui.dialog.AboutDialog;
7import cuchaz.enigma.gui.dialog.SearchDialog;
7import cuchaz.enigma.throwables.MappingParseException; 8import cuchaz.enigma.throwables.MappingParseException;
8import cuchaz.enigma.translation.mapping.serde.MappingFormat; 9import cuchaz.enigma.translation.mapping.serde.MappingFormat;
9 10
@@ -205,6 +206,12 @@ public class MenuBar extends JMenuBar {
205 themes.add(theme); 206 themes.add(theme);
206 theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel)); 207 theme.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel));
207 } 208 }
209
210 JMenuItem search = new JMenuItem("Search");
211 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK));
212 menu.add(search);
213 search.addActionListener(event -> new SearchDialog(this.gui).show());
214
208 } 215 }
209 } 216 }
210 { 217 {