summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/Gui.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/Gui.java')
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java221
1 files changed, 63 insertions, 158 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index eb26ddd..fee9c9f 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -16,7 +16,6 @@ import java.awt.*;
16import java.awt.event.*; 16import java.awt.event.*;
17import java.io.File; 17import java.io.File;
18import java.io.IOException; 18import java.io.IOException;
19import java.lang.Thread.UncaughtExceptionHandler;
20import java.util.Collection; 19import java.util.Collection;
21import java.util.Collections; 20import java.util.Collections;
22import java.util.List; 21import java.util.List;
@@ -24,8 +23,6 @@ import java.util.Vector;
24import java.util.jar.JarFile; 23import java.util.jar.JarFile;
25 24
26import javax.swing.*; 25import javax.swing.*;
27import javax.swing.event.CaretEvent;
28import javax.swing.event.CaretListener;
29import javax.swing.text.BadLocationException; 26import javax.swing.text.BadLocationException;
30import javax.swing.text.Highlighter; 27import javax.swing.text.Highlighter;
31import javax.swing.tree.DefaultTreeModel; 28import javax.swing.tree.DefaultTreeModel;
@@ -35,7 +32,6 @@ import javax.swing.tree.TreePath;
35import cuchaz.enigma.Constants; 32import cuchaz.enigma.Constants;
36import cuchaz.enigma.ExceptionIgnorer; 33import cuchaz.enigma.ExceptionIgnorer;
37import cuchaz.enigma.analysis.*; 34import cuchaz.enigma.analysis.*;
38import cuchaz.enigma.gui.ClassSelector.ClassSelectionListener;
39import cuchaz.enigma.mapping.*; 35import cuchaz.enigma.mapping.*;
40import de.sciss.syntaxpane.DefaultSyntaxKit; 36import de.sciss.syntaxpane.DefaultSyntaxKit;
41 37
@@ -90,20 +86,17 @@ public class Gui {
90 public Gui() { 86 public Gui() {
91 87
92 // init frame 88 // init frame
93 m_frame = new JFrame(Constants.Name); 89 m_frame = new JFrame(Constants.NAME);
94 final Container pane = m_frame.getContentPane(); 90 final Container pane = m_frame.getContentPane();
95 pane.setLayout(new BorderLayout()); 91 pane.setLayout(new BorderLayout());
96 92
97 if (Boolean.parseBoolean(System.getProperty("enigma.catchExceptions", "true"))) { 93 if (Boolean.parseBoolean(System.getProperty("enigma.catchExceptions", "true"))) {
98 // install a global exception handler to the event thread 94 // install a global exception handler to the event thread
99 CrashDialog.init(m_frame); 95 CrashDialog.init(m_frame);
100 Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 96 Thread.setDefaultUncaughtExceptionHandler((thread, t) -> {
101 @Override 97 t.printStackTrace(System.err);
102 public void uncaughtException(Thread thread, Throwable t) { 98 if (!ExceptionIgnorer.shouldIgnore(t)) {
103 t.printStackTrace(System.err); 99 CrashDialog.show(t);
104 if (!ExceptionIgnorer.shouldIgnore(t)) {
105 CrashDialog.show(t);
106 }
107 } 100 }
108 }); 101 });
109 } 102 }
@@ -116,19 +109,14 @@ public class Gui {
116 m_mappingsFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 109 m_mappingsFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
117 m_mappingsFileChooser.setAcceptAllFileFilterUsed(false); 110 m_mappingsFileChooser.setAcceptAllFileFilterUsed(false);
118 111
119 m_oldMappingsFileChooser= new JFileChooser(); 112 m_oldMappingsFileChooser = new JFileChooser();
120 m_exportSourceFileChooser = new JFileChooser(); 113 m_exportSourceFileChooser = new JFileChooser();
121 m_exportSourceFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 114 m_exportSourceFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
122 m_exportJarFileChooser = new JFileChooser(); 115 m_exportJarFileChooser = new JFileChooser();
123 116
124 // init obfuscated classes list 117 // init obfuscated classes list
125 m_obfClasses = new ClassSelector(ClassSelector.ObfuscatedClassEntryComparator); 118 m_obfClasses = new ClassSelector(ClassSelector.ObfuscatedClassEntryComparator);
126 m_obfClasses.setListener(new ClassSelectionListener() { 119 m_obfClasses.setListener(this::navigateTo);
127 @Override
128 public void onSelectClass(ClassEntry classEntry) {
129 navigateTo(classEntry);
130 }
131 });
132 JScrollPane obfScroller = new JScrollPane(m_obfClasses); 120 JScrollPane obfScroller = new JScrollPane(m_obfClasses);
133 JPanel obfPanel = new JPanel(); 121 JPanel obfPanel = new JPanel();
134 obfPanel.setLayout(new BorderLayout()); 122 obfPanel.setLayout(new BorderLayout());
@@ -137,12 +125,7 @@ public class Gui {
137 125
138 // init deobfuscated classes list 126 // init deobfuscated classes list
139 m_deobfClasses = new ClassSelector(ClassSelector.DeobfuscatedClassEntryComparator); 127 m_deobfClasses = new ClassSelector(ClassSelector.DeobfuscatedClassEntryComparator);
140 m_deobfClasses.setListener(new ClassSelectionListener() { 128 m_deobfClasses.setListener(this::navigateTo);
141 @Override
142 public void onSelectClass(ClassEntry classEntry) {
143 navigateTo(classEntry);
144 }
145 });
146 JScrollPane deobfScroller = new JScrollPane(m_deobfClasses); 129 JScrollPane deobfScroller = new JScrollPane(m_deobfClasses);
147 JPanel deobfPanel = new JPanel(); 130 JPanel deobfPanel = new JPanel();
148 deobfPanel.setLayout(new BorderLayout()); 131 deobfPanel.setLayout(new BorderLayout());
@@ -174,12 +157,7 @@ public class Gui {
174 m_editor.setCaret(new BrowserCaret()); 157 m_editor.setCaret(new BrowserCaret());
175 JScrollPane sourceScroller = new JScrollPane(m_editor); 158 JScrollPane sourceScroller = new JScrollPane(m_editor);
176 m_editor.setContentType("text/java"); 159 m_editor.setContentType("text/java");
177 m_editor.addCaretListener(new CaretListener() { 160 m_editor.addCaretListener(event -> onCaretMove(event.getDot()));
178 @Override
179 public void caretUpdate(CaretEvent event) {
180 onCaretMove(event.getDot());
181 }
182 });
183 m_editor.addKeyListener(new KeyAdapter() { 161 m_editor.addKeyListener(new KeyAdapter() {
184 @Override 162 @Override
185 public void keyPressed(KeyEvent event) { 163 public void keyPressed(KeyEvent event) {
@@ -224,12 +202,7 @@ public class Gui {
224 m_editor.setComponentPopupMenu(popupMenu); 202 m_editor.setComponentPopupMenu(popupMenu);
225 { 203 {
226 JMenuItem menu = new JMenuItem("Rename"); 204 JMenuItem menu = new JMenuItem("Rename");
227 menu.addActionListener(new ActionListener() { 205 menu.addActionListener(event -> startRename());
228 @Override
229 public void actionPerformed(ActionEvent event) {
230 startRename();
231 }
232 });
233 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0)); 206 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, 0));
234 menu.setEnabled(false); 207 menu.setEnabled(false);
235 popupMenu.add(menu); 208 popupMenu.add(menu);
@@ -237,12 +210,7 @@ public class Gui {
237 } 210 }
238 { 211 {
239 JMenuItem menu = new JMenuItem("Show Inheritance"); 212 JMenuItem menu = new JMenuItem("Show Inheritance");
240 menu.addActionListener(new ActionListener() { 213 menu.addActionListener(event -> showInheritance());
241 @Override
242 public void actionPerformed(ActionEvent event) {
243 showInheritance();
244 }
245 });
246 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0)); 214 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, 0));
247 menu.setEnabled(false); 215 menu.setEnabled(false);
248 popupMenu.add(menu); 216 popupMenu.add(menu);
@@ -250,12 +218,7 @@ public class Gui {
250 } 218 }
251 { 219 {
252 JMenuItem menu = new JMenuItem("Show Implementations"); 220 JMenuItem menu = new JMenuItem("Show Implementations");
253 menu.addActionListener(new ActionListener() { 221 menu.addActionListener(event -> showImplementations());
254 @Override
255 public void actionPerformed(ActionEvent event) {
256 showImplementations();
257 }
258 });
259 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0)); 222 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, 0));
260 menu.setEnabled(false); 223 menu.setEnabled(false);
261 popupMenu.add(menu); 224 popupMenu.add(menu);
@@ -263,12 +226,7 @@ public class Gui {
263 } 226 }
264 { 227 {
265 JMenuItem menu = new JMenuItem("Show Calls"); 228 JMenuItem menu = new JMenuItem("Show Calls");
266 menu.addActionListener(new ActionListener() { 229 menu.addActionListener(event -> showCalls());
267 @Override
268 public void actionPerformed(ActionEvent event) {
269 showCalls();
270 }
271 });
272 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0)); 230 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, 0));
273 menu.setEnabled(false); 231 menu.setEnabled(false);
274 popupMenu.add(menu); 232 popupMenu.add(menu);
@@ -276,12 +234,7 @@ public class Gui {
276 } 234 }
277 { 235 {
278 JMenuItem menu = new JMenuItem("Go to Declaration"); 236 JMenuItem menu = new JMenuItem("Go to Declaration");
279 menu.addActionListener(new ActionListener() { 237 menu.addActionListener(event -> navigateTo(m_reference.entry));
280 @Override
281 public void actionPerformed(ActionEvent event) {
282 navigateTo(m_reference.entry);
283 }
284 });
285 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0)); 238 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0));
286 menu.setEnabled(false); 239 menu.setEnabled(false);
287 popupMenu.add(menu); 240 popupMenu.add(menu);
@@ -289,12 +242,7 @@ public class Gui {
289 } 242 }
290 { 243 {
291 JMenuItem menu = new JMenuItem("Go to previous"); 244 JMenuItem menu = new JMenuItem("Go to previous");
292 menu.addActionListener(new ActionListener() { 245 menu.addActionListener(event -> m_controller.openPreviousReference());
293 @Override
294 public void actionPerformed(ActionEvent event) {
295 m_controller.openPreviousReference();
296 }
297 });
298 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0)); 246 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0));
299 menu.setEnabled(false); 247 menu.setEnabled(false);
300 popupMenu.add(menu); 248 popupMenu.add(menu);
@@ -302,12 +250,7 @@ public class Gui {
302 } 250 }
303 { 251 {
304 JMenuItem menu = new JMenuItem("Mark as deobfuscated"); 252 JMenuItem menu = new JMenuItem("Mark as deobfuscated");
305 menu.addActionListener(new ActionListener() { 253 menu.addActionListener(event -> toggleMapping());
306 @Override
307 public void actionPerformed(ActionEvent event) {
308 toggleMapping();
309 }
310 });
311 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, 0)); 254 menu.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T, 0));
312 menu.setEnabled(false); 255 menu.setEnabled(false);
313 popupMenu.add(menu); 256 popupMenu.add(menu);
@@ -398,7 +341,7 @@ public class Gui {
398 } 341 }
399 } 342 }
400 }); 343 });
401 m_tokens = new JList<Token>(); 344 m_tokens = new JList<>();
402 m_tokens.setCellRenderer(new TokenListCellRenderer(m_controller)); 345 m_tokens.setCellRenderer(new TokenListCellRenderer(m_controller));
403 m_tokens.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 346 m_tokens.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
404 m_tokens.setLayoutOrientation(JList.VERTICAL); 347 m_tokens.setLayoutOrientation(JList.VERTICAL);
@@ -450,51 +393,40 @@ public class Gui {
450 { 393 {
451 JMenuItem item = new JMenuItem("Open Jar..."); 394 JMenuItem item = new JMenuItem("Open Jar...");
452 menu.add(item); 395 menu.add(item);
453 item.addActionListener(new ActionListener() { 396 item.addActionListener(event -> {
454 @Override 397 if (m_jarFileChooser.showOpenDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
455 public void actionPerformed(ActionEvent event) { 398 // load the jar in a separate thread
456 if (m_jarFileChooser.showOpenDialog(m_frame) == JFileChooser.APPROVE_OPTION) { 399 new Thread() {
457 // load the jar in a separate thread 400 @Override
458 new Thread() { 401 public void run() {
459 @Override 402 try {
460 public void run() { 403 m_controller.openJar(new JarFile(m_jarFileChooser.getSelectedFile()));
461 try { 404 } catch (IOException ex) {
462 m_controller.openJar(new JarFile(m_jarFileChooser.getSelectedFile())); 405 throw new Error(ex);
463 } catch (IOException ex) {
464 throw new Error(ex);
465 }
466 } 406 }
467 }.start(); 407 }
468 } 408 }.start();
469 } 409 }
470 }); 410 });
471 } 411 }
472 { 412 {
473 JMenuItem item = new JMenuItem("Close Jar"); 413 JMenuItem item = new JMenuItem("Close Jar");
474 menu.add(item); 414 menu.add(item);
475 item.addActionListener(new ActionListener() { 415 item.addActionListener(event -> m_controller.closeJar());
476 @Override
477 public void actionPerformed(ActionEvent event) {
478 m_controller.closeJar();
479 }
480 });
481 m_closeJarMenu = item; 416 m_closeJarMenu = item;
482 } 417 }
483 menu.addSeparator(); 418 menu.addSeparator();
484 { 419 {
485 JMenuItem item = new JMenuItem("Open Mappings..."); 420 JMenuItem item = new JMenuItem("Open Mappings...");
486 menu.add(item); 421 menu.add(item);
487 item.addActionListener(new ActionListener() { 422 item.addActionListener(event -> {
488 @Override 423 if (m_mappingsFileChooser.showOpenDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
489 public void actionPerformed(ActionEvent event) { 424 try {
490 if (m_mappingsFileChooser.showOpenDialog(m_frame) == JFileChooser.APPROVE_OPTION) { 425 m_controller.openMappings(m_mappingsFileChooser.getSelectedFile());
491 try { 426 } catch (IOException ex) {
492 m_controller.openMappings(m_mappingsFileChooser.getSelectedFile()); 427 throw new Error(ex);
493 } catch (IOException ex) { 428 } catch (MappingParseException ex) {
494 throw new Error(ex); 429 JOptionPane.showMessageDialog(m_frame, ex.getMessage());
495 } catch (MappingParseException ex) {
496 JOptionPane.showMessageDialog(m_frame, ex.getMessage());
497 }
498 } 430 }
499 } 431 }
500 }); 432 });
@@ -520,14 +452,11 @@ public class Gui {
520 { 452 {
521 JMenuItem item = new JMenuItem("Save Mappings"); 453 JMenuItem item = new JMenuItem("Save Mappings");
522 menu.add(item); 454 menu.add(item);
523 item.addActionListener(new ActionListener() { 455 item.addActionListener(event -> {
524 @Override 456 try {
525 public void actionPerformed(ActionEvent event) { 457 m_controller.saveMappings(m_mappingsFileChooser.getSelectedFile());
526 try { 458 } catch (IOException ex) {
527 m_controller.saveMappings(m_mappingsFileChooser.getSelectedFile()); 459 throw new Error(ex);
528 } catch (IOException ex) {
529 throw new Error(ex);
530 }
531 } 460 }
532 }); 461 });
533 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK)); 462 item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK));
@@ -536,16 +465,13 @@ public class Gui {
536 { 465 {
537 JMenuItem item = new JMenuItem("Save Mappings As..."); 466 JMenuItem item = new JMenuItem("Save Mappings As...");
538 menu.add(item); 467 menu.add(item);
539 item.addActionListener(new ActionListener() { 468 item.addActionListener(event -> {
540 @Override 469 if (m_mappingsFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
541 public void actionPerformed(ActionEvent event) { 470 try {
542 if (m_mappingsFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) { 471 m_controller.saveMappings(m_mappingsFileChooser.getSelectedFile());
543 try { 472 m_saveMappingsMenu.setEnabled(true);
544 m_controller.saveMappings(m_mappingsFileChooser.getSelectedFile()); 473 } catch (IOException ex) {
545 m_saveMappingsMenu.setEnabled(true); 474 throw new Error(ex);
546 } catch (IOException ex) {
547 throw new Error(ex);
548 }
549 } 475 }
550 } 476 }
551 }); 477 });
@@ -555,24 +481,16 @@ public class Gui {
555 { 481 {
556 JMenuItem item = new JMenuItem("Close Mappings"); 482 JMenuItem item = new JMenuItem("Close Mappings");
557 menu.add(item); 483 menu.add(item);
558 item.addActionListener(new ActionListener() { 484 item.addActionListener(event -> m_controller.closeMappings());
559 @Override
560 public void actionPerformed(ActionEvent event) {
561 m_controller.closeMappings();
562 }
563 });
564 m_closeMappingsMenu = item; 485 m_closeMappingsMenu = item;
565 } 486 }
566 menu.addSeparator(); 487 menu.addSeparator();
567 { 488 {
568 JMenuItem item = new JMenuItem("Export Source..."); 489 JMenuItem item = new JMenuItem("Export Source...");
569 menu.add(item); 490 menu.add(item);
570 item.addActionListener(new ActionListener() { 491 item.addActionListener(event -> {
571 @Override 492 if (m_exportSourceFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
572 public void actionPerformed(ActionEvent event) { 493 m_controller.exportSource(m_exportSourceFileChooser.getSelectedFile());
573 if (m_exportSourceFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
574 m_controller.exportSource(m_exportSourceFileChooser.getSelectedFile());
575 }
576 } 494 }
577 }); 495 });
578 m_exportSourceMenu = item; 496 m_exportSourceMenu = item;
@@ -580,12 +498,9 @@ public class Gui {
580 { 498 {
581 JMenuItem item = new JMenuItem("Export Jar..."); 499 JMenuItem item = new JMenuItem("Export Jar...");
582 menu.add(item); 500 menu.add(item);
583 item.addActionListener(new ActionListener() { 501 item.addActionListener(event -> {
584 @Override 502 if (m_exportJarFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
585 public void actionPerformed(ActionEvent event) { 503 m_controller.exportJar(m_exportJarFileChooser.getSelectedFile());
586 if (m_exportJarFileChooser.showSaveDialog(m_frame) == JFileChooser.APPROVE_OPTION) {
587 m_controller.exportJar(m_exportJarFileChooser.getSelectedFile());
588 }
589 } 504 }
590 }); 505 });
591 m_exportJarMenu = item; 506 m_exportJarMenu = item;
@@ -594,12 +509,7 @@ public class Gui {
594 { 509 {
595 JMenuItem item = new JMenuItem("Exit"); 510 JMenuItem item = new JMenuItem("Exit");
596 menu.add(item); 511 menu.add(item);
597 item.addActionListener(new ActionListener() { 512 item.addActionListener(event -> close());
598 @Override
599 public void actionPerformed(ActionEvent event) {
600 close();
601 }
602 });
603 } 513 }
604 } 514 }
605 { 515 {
@@ -608,12 +518,7 @@ public class Gui {
608 { 518 {
609 JMenuItem item = new JMenuItem("About"); 519 JMenuItem item = new JMenuItem("About");
610 menu.add(item); 520 menu.add(item);
611 item.addActionListener(new ActionListener() { 521 item.addActionListener(event -> AboutDialog.show(m_frame));
612 @Override
613 public void actionPerformed(ActionEvent event) {
614 AboutDialog.show(m_frame);
615 }
616 });
617 } 522 }
618 } 523 }
619 524
@@ -654,7 +559,7 @@ public class Gui {
654 559
655 public void onFinishOpenJar(String jarName) { 560 public void onFinishOpenJar(String jarName) {
656 // update gui 561 // update gui
657 m_frame.setTitle(Constants.Name + " - " + jarName); 562 m_frame.setTitle(Constants.NAME + " - " + jarName);
658 m_classesPanel.removeAll(); 563 m_classesPanel.removeAll();
659 m_classesPanel.add(m_splitClasses); 564 m_classesPanel.add(m_splitClasses);
660 setSource(null); 565 setSource(null);
@@ -674,7 +579,7 @@ public class Gui {
674 579
675 public void onCloseJar() { 580 public void onCloseJar() {
676 // update gui 581 // update gui
677 m_frame.setTitle(Constants.Name); 582 m_frame.setTitle(Constants.NAME);
678 setObfClasses(null); 583 setObfClasses(null);
679 setDeobfClasses(null); 584 setDeobfClasses(null);
680 setSource(null); 585 setSource(null);
@@ -720,14 +625,14 @@ public class Gui {
720 } 625 }
721 626
722 public void showTokens(Collection<Token> tokens) { 627 public void showTokens(Collection<Token> tokens) {
723 Vector<Token> sortedTokens = new Vector<Token>(tokens); 628 Vector<Token> sortedTokens = new Vector<>(tokens);
724 Collections.sort(sortedTokens); 629 Collections.sort(sortedTokens);
725 if (sortedTokens.size() > 1) { 630 if (sortedTokens.size() > 1) {
726 // sort the tokens and update the tokens panel 631 // sort the tokens and update the tokens panel
727 m_tokens.setListData(sortedTokens); 632 m_tokens.setListData(sortedTokens);
728 m_tokens.setSelectedIndex(0); 633 m_tokens.setSelectedIndex(0);
729 } else { 634 } else {
730 m_tokens.setListData(new Vector<Token>()); 635 m_tokens.setListData(new Vector<>());
731 } 636 }
732 637
733 // show the first token 638 // show the first token