summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/elements
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/elements')
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/CollapsibleTabbedPane.java40
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/MenuBar.java386
-rw-r--r--src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java125
3 files changed, 0 insertions, 551 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/elements/CollapsibleTabbedPane.java b/src/main/java/cuchaz/enigma/gui/elements/CollapsibleTabbedPane.java
deleted file mode 100644
index fb497b1..0000000
--- a/src/main/java/cuchaz/enigma/gui/elements/CollapsibleTabbedPane.java
+++ /dev/null
@@ -1,40 +0,0 @@
1package cuchaz.enigma.gui.elements;
2
3import java.awt.event.MouseEvent;
4
5import javax.swing.JTabbedPane;
6
7public class CollapsibleTabbedPane extends JTabbedPane {
8
9 public CollapsibleTabbedPane() {
10 }
11
12 public CollapsibleTabbedPane(int tabPlacement) {
13 super(tabPlacement);
14 }
15
16 public CollapsibleTabbedPane(int tabPlacement, int tabLayoutPolicy) {
17 super(tabPlacement, tabLayoutPolicy);
18 }
19
20 @Override
21 protected void processMouseEvent(MouseEvent e) {
22 int id = e.getID();
23 if (id == MouseEvent.MOUSE_PRESSED) {
24 if (!isEnabled()) return;
25 int tabIndex = getUI().tabForCoordinate(this, e.getX(), e.getY());
26 if (tabIndex >= 0 && isEnabledAt(tabIndex)) {
27 if (tabIndex == getSelectedIndex()) {
28 if (isFocusOwner() && isRequestFocusEnabled()) {
29 requestFocus();
30 } else {
31 setSelectedIndex(-1);
32 }
33 return;
34 }
35 }
36 }
37 super.processMouseEvent(e);
38 }
39
40}
diff --git a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
deleted file mode 100644
index dc2cf8f..0000000
--- a/src/main/java/cuchaz/enigma/gui/elements/MenuBar.java
+++ /dev/null
@@ -1,386 +0,0 @@
1package cuchaz.enigma.gui.elements;
2
3import cuchaz.enigma.config.Config;
4import cuchaz.enigma.config.Themes;
5import cuchaz.enigma.gui.Gui;
6import cuchaz.enigma.gui.dialog.AboutDialog;
7import cuchaz.enigma.gui.dialog.ChangeDialog;
8import cuchaz.enigma.gui.dialog.ConnectToServerDialog;
9import cuchaz.enigma.gui.dialog.CreateServerDialog;
10import cuchaz.enigma.gui.dialog.StatsDialog;
11import cuchaz.enigma.gui.util.ScaleUtil;
12import cuchaz.enigma.translation.mapping.serde.MappingFormat;
13import cuchaz.enigma.utils.I18n;
14import cuchaz.enigma.utils.Pair;
15
16import java.awt.Desktop;
17import java.awt.event.InputEvent;
18import java.awt.event.KeyEvent;
19import java.io.File;
20import java.io.IOException;
21import java.net.URISyntaxException;
22import java.net.URL;
23import java.nio.file.Files;
24import java.nio.file.Path;
25import java.nio.file.Paths;
26import java.util.*;
27import java.util.List;
28import java.util.stream.Collectors;
29import java.util.stream.IntStream;
30import javax.swing.*;
31
32public class MenuBar extends JMenuBar {
33
34 public final JMenuItem closeJarMenu;
35 public final List<JMenuItem> openMappingsMenus;
36 public final JMenuItem saveMappingsMenu;
37 public final List<JMenuItem> saveMappingsMenus;
38 public final JMenuItem closeMappingsMenu;
39 public final JMenuItem dropMappingsMenu;
40 public final JMenuItem exportSourceMenu;
41 public final JMenuItem exportJarMenu;
42 public final JMenuItem connectToServerMenu;
43 public final JMenuItem startServerMenu;
44 private final Gui gui;
45
46 public MenuBar(Gui gui) {
47 this.gui = gui;
48
49 /*
50 * File menu
51 */
52 {
53 JMenu menu = new JMenu(I18n.translate("menu.file"));
54 this.add(menu);
55 {
56 JMenuItem item = new JMenuItem(I18n.translate("menu.file.jar.open"));
57 menu.add(item);
58 item.addActionListener(event -> {
59 this.gui.jarFileChooser.setVisible(true);
60 String file = this.gui.jarFileChooser.getFile();
61 // checks if the file name is not empty
62 if (file != null) {
63 Path path = Paths.get(this.gui.jarFileChooser.getDirectory()).resolve(file);
64 // checks if the file name corresponds to an existing file
65 if (Files.exists(path)) {
66 gui.getController().openJar(path);
67 }
68 }
69 });
70 }
71 {
72 JMenuItem item = new JMenuItem(I18n.translate("menu.file.jar.close"));
73 menu.add(item);
74 item.addActionListener(event -> this.gui.getController().closeJar());
75 this.closeJarMenu = item;
76 }
77 menu.addSeparator();
78 JMenu openMenu = new JMenu(I18n.translate("menu.file.mappings.open"));
79 menu.add(openMenu);
80 {
81 openMappingsMenus = new ArrayList<>();
82 for (MappingFormat format : MappingFormat.values()) {
83 if (format.getReader() != null) {
84 JMenuItem item = new JMenuItem(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)));
85 openMenu.add(item);
86 item.addActionListener(event -> {
87 if (this.gui.enigmaMappingsFileChooser.showOpenDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
88 File selectedFile = this.gui.enigmaMappingsFileChooser.getSelectedFile();
89 this.gui.getController().openMappings(format, selectedFile.toPath());
90 }
91 });
92 openMappingsMenus.add(item);
93 }
94 }
95 }
96 {
97 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.save"));
98 menu.add(item);
99 item.addActionListener(event -> {
100 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath());
101 });
102 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
103 this.saveMappingsMenu = item;
104 }
105 JMenu saveMenu = new JMenu(I18n.translate("menu.file.mappings.save_as"));
106 menu.add(saveMenu);
107 {
108 saveMappingsMenus = new ArrayList<>();
109 for (MappingFormat format : MappingFormat.values()) {
110 if (format.getWriter() != null) {
111 JMenuItem item = new JMenuItem(I18n.translate("mapping_format." + format.name().toLowerCase(Locale.ROOT)));
112 saveMenu.add(item);
113 item.addActionListener(event -> {
114 // TODO: Use a specific file chooser for it
115 if (this.gui.enigmaMappingsFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
116 this.gui.getController().saveMappings(this.gui.enigmaMappingsFileChooser.getSelectedFile().toPath(), format);
117 this.saveMappingsMenu.setEnabled(true);
118 }
119 });
120 saveMappingsMenus.add(item);
121 }
122 }
123 }
124 {
125 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.close"));
126 menu.add(item);
127 item.addActionListener(event -> {
128 if (this.gui.getController().isDirty()) {
129 this.gui.showDiscardDiag((response -> {
130 if (response == JOptionPane.YES_OPTION) {
131 gui.saveMapping();
132 this.gui.getController().closeMappings();
133 } else if (response == JOptionPane.NO_OPTION)
134 this.gui.getController().closeMappings();
135 return null;
136 }), I18n.translate("prompt.close.save"), I18n.translate("prompt.close.discard"), I18n.translate("prompt.close.cancel"));
137 } else
138 this.gui.getController().closeMappings();
139
140 });
141 this.closeMappingsMenu = item;
142 }
143 {
144 JMenuItem item = new JMenuItem(I18n.translate("menu.file.mappings.drop"));
145 menu.add(item);
146 item.addActionListener(event -> this.gui.getController().dropMappings());
147 this.dropMappingsMenu = item;
148 }
149 menu.addSeparator();
150 {
151 JMenuItem item = new JMenuItem(I18n.translate("menu.file.export.source"));
152 menu.add(item);
153 item.addActionListener(event -> {
154 if (this.gui.exportSourceFileChooser.showSaveDialog(this.gui.getFrame()) == JFileChooser.APPROVE_OPTION) {
155 this.gui.getController().exportSource(this.gui.exportSourceFileChooser.getSelectedFile().toPath());
156 }
157 });
158 this.exportSourceMenu = item;
159 }
160 {
161 JMenuItem item = new JMenuItem(I18n.translate("menu.file.export.jar"));
162 menu.add(item);
163 item.addActionListener(event -> {
164 this.gui.exportJarFileChooser.setVisible(true);
165 if (this.gui.exportJarFileChooser.getFile() != null) {
166 Path path = Paths.get(this.gui.exportJarFileChooser.getDirectory(), this.gui.exportJarFileChooser.getFile());
167 this.gui.getController().exportJar(path);
168 }
169 });
170 this.exportJarMenu = item;
171 }
172 menu.addSeparator();
173 {
174 JMenuItem stats = new JMenuItem(I18n.translate("menu.file.stats"));
175 menu.add(stats);
176 stats.addActionListener(event -> StatsDialog.show(this.gui));
177 }
178 menu.addSeparator();
179 {
180 JMenuItem item = new JMenuItem(I18n.translate("menu.file.exit"));
181 menu.add(item);
182 item.addActionListener(event -> this.gui.close());
183 }
184 }
185
186 /*
187 * Decompiler menu
188 */
189 {
190 JMenu menu = new JMenu(I18n.translate("menu.decompiler"));
191 this.add(menu);
192
193 ButtonGroup decompilerGroup = new ButtonGroup();
194
195 for (Config.Decompiler decompiler : Config.Decompiler.values()) {
196 JRadioButtonMenuItem decompilerButton = new JRadioButtonMenuItem(decompiler.name);
197 decompilerGroup.add(decompilerButton);
198 if (decompiler.equals(Config.getInstance().decompiler)) {
199 decompilerButton.setSelected(true);
200 }
201 menu.add(decompilerButton);
202 decompilerButton.addActionListener(event -> {
203 gui.getController().setDecompiler(decompiler.service);
204
205 try {
206 Config.getInstance().decompiler = decompiler;
207 Config.getInstance().saveConfig();
208 } catch (IOException e) {
209 throw new RuntimeException(e);
210 }
211 });
212 }
213 }
214
215 /*
216 * View menu
217 */
218 {
219 JMenu menu = new JMenu(I18n.translate("menu.view"));
220 this.add(menu);
221 {
222 JMenu themes = new JMenu(I18n.translate("menu.view.themes"));
223 menu.add(themes);
224 ButtonGroup themeGroup = new ButtonGroup();
225 for (Config.LookAndFeel lookAndFeel : Config.LookAndFeel.values()) {
226 JRadioButtonMenuItem themeButton = new JRadioButtonMenuItem(I18n.translate("menu.view.themes." + lookAndFeel.name().toLowerCase(Locale.ROOT)));
227 themeGroup.add(themeButton);
228 if (lookAndFeel.equals(Config.getInstance().lookAndFeel)) {
229 themeButton.setSelected(true);
230 }
231 themes.add(themeButton);
232 themeButton.addActionListener(event -> Themes.setLookAndFeel(gui, lookAndFeel));
233 }
234 }
235 {
236 JMenu languages = new JMenu(I18n.translate("menu.view.languages"));
237 menu.add(languages);
238 ButtonGroup languageGroup = new ButtonGroup();
239 for (String lang : I18n.getAvailableLanguages()) {
240 JRadioButtonMenuItem languageButton = new JRadioButtonMenuItem(I18n.getLanguageName(lang));
241 languageGroup.add(languageButton);
242 if (lang.equals(Config.getInstance().language)) {
243 languageButton.setSelected(true);
244 }
245 languages.add(languageButton);
246 languageButton.addActionListener(event -> {
247 I18n.setLanguage(lang);
248 ChangeDialog.show(this.gui);
249 });
250 }
251 }
252 {
253 JMenu scale = new JMenu(I18n.translate("menu.view.scale"));
254 {
255 ButtonGroup scaleGroup = new ButtonGroup();
256 Map<Float, JRadioButtonMenuItem> map = IntStream.of(100, 125, 150, 175, 200)
257 .mapToObj(scaleFactor -> {
258 float realScaleFactor = scaleFactor / 100f;
259 JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(String.format("%d%%", scaleFactor));
260 menuItem.addActionListener(event -> ScaleUtil.setScaleFactor(realScaleFactor));
261 menuItem.addActionListener(event -> ChangeDialog.show(this.gui));
262 scaleGroup.add(menuItem);
263 scale.add(menuItem);
264 return new Pair<>(realScaleFactor, menuItem);
265 })
266 .collect(Collectors.toMap(x -> x.a, x -> x.b));
267
268 JMenuItem customScale = new JMenuItem(I18n.translate("menu.view.scale.custom"));
269 customScale.addActionListener(event -> {
270 String answer = (String) JOptionPane.showInputDialog(gui.getFrame(), I18n.translate("menu.view.scale.custom.title"), I18n.translate("menu.view.scale.custom.title"),
271 JOptionPane.QUESTION_MESSAGE, null, null, Float.toString(ScaleUtil.getScaleFactor() * 100));
272 if (answer == null) return;
273 float newScale = 1.0f;
274 try {
275 newScale = Float.parseFloat(answer) / 100f;
276 } catch (NumberFormatException ignored) {
277 }
278 ScaleUtil.setScaleFactor(newScale);
279 ChangeDialog.show(this.gui);
280 });
281 scale.add(customScale);
282 ScaleUtil.addListener((newScale, _oldScale) -> {
283 JRadioButtonMenuItem mi = map.get(newScale);
284 if (mi != null) {
285 mi.setSelected(true);
286 } else {
287 scaleGroup.clearSelection();
288 }
289 });
290 JRadioButtonMenuItem mi = map.get(ScaleUtil.getScaleFactor());
291 if (mi != null) {
292 mi.setSelected(true);
293 }
294 }
295 menu.add(scale);
296 }
297 menu.addSeparator();
298 {
299 JMenuItem search = new JMenuItem(I18n.translate("menu.view.search"));
300 search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, InputEvent.SHIFT_MASK));
301 menu.add(search);
302 search.addActionListener(event -> {
303 if (this.gui.getController().project != null) {
304 this.gui.getSearchDialog().show();
305 }
306 });
307 }
308 }
309
310 /*
311 * Collab menu
312 */
313 {
314 JMenu menu = new JMenu(I18n.translate("menu.collab"));
315 this.add(menu);
316 {
317 JMenuItem item = new JMenuItem(I18n.translate("menu.collab.connect"));
318 menu.add(item);
319 item.addActionListener(event -> {
320 if (this.gui.getController().getClient() != null) {
321 this.gui.getController().disconnectIfConnected(null);
322 return;
323 }
324 ConnectToServerDialog.Result result = ConnectToServerDialog.show(this.gui.getFrame());
325 if (result == null) {
326 return;
327 }
328 this.gui.getController().disconnectIfConnected(null);
329 try {
330 this.gui.getController().createClient(result.getUsername(), result.getIp(), result.getPort(), result.getPassword());
331 } catch (IOException e) {
332 JOptionPane.showMessageDialog(this.gui.getFrame(), e.toString(), I18n.translate("menu.collab.connect.error"), JOptionPane.ERROR_MESSAGE);
333 this.gui.getController().disconnectIfConnected(null);
334 }
335 Arrays.fill(result.getPassword(), (char)0);
336 });
337 this.connectToServerMenu = item;
338 }
339 {
340 JMenuItem item = new JMenuItem(I18n.translate("menu.collab.server.start"));
341 menu.add(item);
342 item.addActionListener(event -> {
343 if (this.gui.getController().getServer() != null) {
344 this.gui.getController().disconnectIfConnected(null);
345 return;
346 }
347 CreateServerDialog.Result result = CreateServerDialog.show(this.gui.getFrame());
348 if (result == null) {
349 return;
350 }
351 this.gui.getController().disconnectIfConnected(null);
352 try {
353 this.gui.getController().createServer(result.getPort(), result.getPassword());
354 } catch (IOException e) {
355 JOptionPane.showMessageDialog(this.gui.getFrame(), e.toString(), I18n.translate("menu.collab.server.start.error"), JOptionPane.ERROR_MESSAGE);
356 this.gui.getController().disconnectIfConnected(null);
357 }
358 });
359 this.startServerMenu = item;
360 }
361 }
362
363 /*
364 * Help menu
365 */
366 {
367 JMenu menu = new JMenu(I18n.translate("menu.help"));
368 this.add(menu);
369 {
370 JMenuItem item = new JMenuItem(I18n.translate("menu.help.about"));
371 menu.add(item);
372 item.addActionListener(event -> AboutDialog.show(this.gui.getFrame()));
373 }
374 {
375 JMenuItem item = new JMenuItem(I18n.translate("menu.help.github"));
376 menu.add(item);
377 item.addActionListener(event -> {
378 try {
379 Desktop.getDesktop().browse(new URL("https://github.com/FabricMC/Enigma").toURI());
380 } catch (URISyntaxException | IOException ignored) {
381 }
382 });
383 }
384 }
385 }
386}
diff --git a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java b/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java
deleted file mode 100644
index b92041c..0000000
--- a/src/main/java/cuchaz/enigma/gui/elements/PopupMenuBar.java
+++ /dev/null
@@ -1,125 +0,0 @@
1package cuchaz.enigma.gui.elements;
2
3import cuchaz.enigma.gui.Gui;
4import cuchaz.enigma.utils.I18n;
5
6import javax.swing.*;
7import java.awt.event.InputEvent;
8import java.awt.event.KeyEvent;
9
10public class PopupMenuBar extends JPopupMenu {
11
12 public final JMenuItem renameMenu;
13 public final JMenuItem editJavadocMenu;
14 public final JMenuItem showInheritanceMenu;
15 public final JMenuItem showImplementationsMenu;
16 public final JMenuItem showCallsMenu;
17 public final JMenuItem showCallsSpecificMenu;
18 public final JMenuItem openEntryMenu;
19 public final JMenuItem openPreviousMenu;
20 public final JMenuItem openNextMenu;
21 public final JMenuItem toggleMappingMenu;
22
23 public PopupMenuBar(Gui gui) {
24 {
25 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.rename"));
26 menu.addActionListener(event -> gui.startRename());
27 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK));
28 menu.setEnabled(false);
29 this.add(menu);
30 this.renameMenu = menu;
31 }
32 {
33 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.javadoc"));
34 menu.addActionListener(event -> gui.startDocChange());
35 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, InputEvent.CTRL_DOWN_MASK));
36 menu.setEnabled(false);
37 this.add(menu);
38 this.editJavadocMenu = menu;
39 }
40 {
41 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.inheritance"));
42 menu.addActionListener(event -> gui.showInheritance());
43 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, InputEvent.CTRL_DOWN_MASK));
44 menu.setEnabled(false);
45 this.add(menu);
46 this.showInheritanceMenu = menu;
47 }
48 {
49 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.implementations"));
50 menu.addActionListener(event -> gui.showImplementations());
51 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, InputEvent.CTRL_DOWN_MASK));
52 menu.setEnabled(false);
53 this.add(menu);
54 this.showImplementationsMenu = menu;
55 }
56 {
57 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.calls"));
58 menu.addActionListener(event -> gui.showCalls(true));
59 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
60 menu.setEnabled(false);
61 this.add(menu);
62 this.showCallsMenu = menu;
63 }
64 {
65 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.calls.specific"));
66 menu.addActionListener(event -> gui.showCalls(false));
67 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK + InputEvent.SHIFT_DOWN_MASK));
68 menu.setEnabled(false);
69 this.add(menu);
70 this.showCallsSpecificMenu = menu;
71 }
72 {
73 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.declaration"));
74 menu.addActionListener(event -> gui.getController().navigateTo(gui.cursorReference.entry));
75 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));
76 menu.setEnabled(false);
77 this.add(menu);
78 this.openEntryMenu = menu;
79 }
80 {
81 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.back"));
82 menu.addActionListener(event -> gui.getController().openPreviousReference());
83 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_DOWN_MASK));
84 menu.setEnabled(false);
85 this.add(menu);
86 this.openPreviousMenu = menu;
87 }
88 {
89 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.forward"));
90 menu.addActionListener(event -> gui.getController().openNextReference());
91 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_DOWN_MASK));
92 menu.setEnabled(false);
93 this.add(menu);
94 this.openNextMenu = menu;
95 }
96 {
97 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.mark_deobfuscated"));
98 menu.addActionListener(event -> gui.toggleMapping());
99 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK));
100 menu.setEnabled(false);
101 this.add(menu);
102 this.toggleMappingMenu = menu;
103 }
104 {
105 this.add(new JSeparator());
106 }
107 {
108 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.zoom.in"));
109 menu.addActionListener(event -> gui.editor.offsetEditorZoom(2));
110 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, InputEvent.CTRL_DOWN_MASK));
111 this.add(menu);
112 }
113 {
114 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.zoom.out"));
115 menu.addActionListener(event -> gui.editor.offsetEditorZoom(-2));
116 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, InputEvent.CTRL_DOWN_MASK));
117 this.add(menu);
118 }
119 {
120 JMenuItem menu = new JMenuItem(I18n.translate("popup_menu.zoom.reset"));
121 menu.addActionListener(event -> gui.editor.resetEditorZoom());
122 this.add(menu);
123 }
124 }
125}