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.java100
1 files changed, 41 insertions, 59 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index 92c68ac..3e85920 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -29,6 +29,7 @@ import cuchaz.enigma.gui.panels.PanelDeobf;
29import cuchaz.enigma.gui.panels.PanelEditor; 29import cuchaz.enigma.gui.panels.PanelEditor;
30import cuchaz.enigma.gui.panels.PanelIdentifier; 30import cuchaz.enigma.gui.panels.PanelIdentifier;
31import cuchaz.enigma.gui.panels.PanelObf; 31import cuchaz.enigma.gui.panels.PanelObf;
32import cuchaz.enigma.gui.util.History;
32import cuchaz.enigma.throwables.IllegalNameException; 33import cuchaz.enigma.throwables.IllegalNameException;
33import cuchaz.enigma.translation.mapping.AccessModifier; 34import cuchaz.enigma.translation.mapping.AccessModifier;
34import cuchaz.enigma.translation.representation.entry.*; 35import cuchaz.enigma.translation.representation.entry.*;
@@ -54,7 +55,8 @@ public class Gui {
54 55
55 private final MenuBar menuBar; 56 private final MenuBar menuBar;
56 // state 57 // state
57 public EntryReference<Entry<?>, Entry<?>> reference; 58 public History<EntryReference<Entry<?>, Entry<?>>> referenceHistory;
59 public EntryReference<Entry<?>, Entry<?>> cursorReference;
58 private boolean shouldNavigateOnClick; 60 private boolean shouldNavigateOnClick;
59 61
60 public FileDialog jarFileChooser; 62 public FileDialog jarFileChooser;
@@ -162,11 +164,11 @@ public class Gui {
162 Object node = path.getLastPathComponent(); 164 Object node = path.getLastPathComponent();
163 if (node instanceof ClassInheritanceTreeNode) { 165 if (node instanceof ClassInheritanceTreeNode) {
164 ClassInheritanceTreeNode classNode = (ClassInheritanceTreeNode) node; 166 ClassInheritanceTreeNode classNode = (ClassInheritanceTreeNode) node;
165 navigateTo(new ClassEntry(classNode.getObfClassName())); 167 controller.navigateTo(new ClassEntry(classNode.getObfClassName()));
166 } else if (node instanceof MethodInheritanceTreeNode) { 168 } else if (node instanceof MethodInheritanceTreeNode) {
167 MethodInheritanceTreeNode methodNode = (MethodInheritanceTreeNode) node; 169 MethodInheritanceTreeNode methodNode = (MethodInheritanceTreeNode) node;
168 if (methodNode.isImplemented()) { 170 if (methodNode.isImplemented()) {
169 navigateTo(methodNode.getMethodEntry()); 171 controller.navigateTo(methodNode.getMethodEntry());
170 } 172 }
171 } 173 }
172 } 174 }
@@ -195,10 +197,10 @@ public class Gui {
195 Object node = path.getLastPathComponent(); 197 Object node = path.getLastPathComponent();
196 if (node instanceof ClassImplementationsTreeNode) { 198 if (node instanceof ClassImplementationsTreeNode) {
197 ClassImplementationsTreeNode classNode = (ClassImplementationsTreeNode) node; 199 ClassImplementationsTreeNode classNode = (ClassImplementationsTreeNode) node;
198 navigateTo(classNode.getClassEntry()); 200 controller.navigateTo(classNode.getClassEntry());
199 } else if (node instanceof MethodImplementationsTreeNode) { 201 } else if (node instanceof MethodImplementationsTreeNode) {
200 MethodImplementationsTreeNode methodNode = (MethodImplementationsTreeNode) node; 202 MethodImplementationsTreeNode methodNode = (MethodImplementationsTreeNode) node;
201 navigateTo(methodNode.getMethodEntry()); 203 controller.navigateTo(methodNode.getMethodEntry());
202 } 204 }
203 } 205 }
204 } 206 }
@@ -225,9 +227,9 @@ public class Gui {
225 if (node instanceof ReferenceTreeNode) { 227 if (node instanceof ReferenceTreeNode) {
226 ReferenceTreeNode<Entry<?>, Entry<?>> referenceNode = ((ReferenceTreeNode<Entry<?>, Entry<?>>) node); 228 ReferenceTreeNode<Entry<?>, Entry<?>> referenceNode = ((ReferenceTreeNode<Entry<?>, Entry<?>>) node);
227 if (referenceNode.getReference() != null) { 229 if (referenceNode.getReference() != null) {
228 navigateTo(referenceNode.getReference()); 230 controller.navigateTo(referenceNode.getReference());
229 } else { 231 } else {
230 navigateTo(referenceNode.getEntry()); 232 controller.navigateTo(referenceNode.getEntry());
231 } 233 }
232 } 234 }
233 } 235 }
@@ -433,13 +435,13 @@ public class Gui {
433 } 435 }
434 } 436 }
435 437
436 private void showReference(EntryReference<Entry<?>, Entry<?>> reference) { 438 private void showCursorReference(EntryReference<Entry<?>, Entry<?>> reference) {
437 if (reference == null) { 439 if (reference == null) {
438 infoPanel.clearReference(); 440 infoPanel.clearReference();
439 return; 441 return;
440 } 442 }
441 443
442 this.reference = reference; 444 this.cursorReference = reference;
443 445
444 EntryReference<Entry<?>, Entry<?>> translatedReference = controller.getDeobfuscator().deobfuscate(reference); 446 EntryReference<Entry<?>, Entry<?>> translatedReference = controller.getDeobfuscator().deobfuscate(reference);
445 447
@@ -526,12 +528,12 @@ public class Gui {
526 Token token = this.controller.getToken(pos); 528 Token token = this.controller.getToken(pos);
527 boolean isToken = token != null; 529 boolean isToken = token != null;
528 530
529 reference = this.controller.getReference(token); 531 cursorReference = this.controller.getReference(token);
530 Entry<?> referenceEntry = reference != null ? reference.entry : null; 532 Entry<?> referenceEntry = cursorReference != null ? cursorReference.entry : null;
531 533
532 if (referenceEntry != null && shouldNavigateOnClick) { 534 if (referenceEntry != null && shouldNavigateOnClick) {
533 shouldNavigateOnClick = false; 535 shouldNavigateOnClick = false;
534 navigateTo(referenceEntry); 536 this.controller.navigateTo(referenceEntry);
535 return; 537 return;
536 } 538 }
537 539
@@ -540,10 +542,10 @@ public class Gui {
540 boolean isMethodEntry = isToken && referenceEntry instanceof MethodEntry && !((MethodEntry) referenceEntry).isConstructor(); 542 boolean isMethodEntry = isToken && referenceEntry instanceof MethodEntry && !((MethodEntry) referenceEntry).isConstructor();
541 boolean isConstructorEntry = isToken && referenceEntry instanceof MethodEntry && ((MethodEntry) referenceEntry).isConstructor(); 543 boolean isConstructorEntry = isToken && referenceEntry instanceof MethodEntry && ((MethodEntry) referenceEntry).isConstructor();
542 boolean isInJar = isToken && this.controller.entryIsInJar(referenceEntry); 544 boolean isInJar = isToken && this.controller.entryIsInJar(referenceEntry);
543 boolean isRenamable = isToken && this.controller.getDeobfuscator().isRenamable(reference); 545 boolean isRenamable = isToken && this.controller.getDeobfuscator().isRenamable(cursorReference);
544 546
545 if (isToken) { 547 if (isToken) {
546 showReference(reference); 548 showCursorReference(cursorReference);
547 } else { 549 } else {
548 infoPanel.clearReference(); 550 infoPanel.clearReference();
549 } 551 }
@@ -554,7 +556,8 @@ public class Gui {
554 this.popupMenu.showCallsMenu.setEnabled(isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry); 556 this.popupMenu.showCallsMenu.setEnabled(isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry);
555 this.popupMenu.showCallsSpecificMenu.setEnabled(isMethodEntry); 557 this.popupMenu.showCallsSpecificMenu.setEnabled(isMethodEntry);
556 this.popupMenu.openEntryMenu.setEnabled(isInJar && (isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry)); 558 this.popupMenu.openEntryMenu.setEnabled(isInJar && (isClassEntry || isFieldEntry || isMethodEntry || isConstructorEntry));
557 this.popupMenu.openPreviousMenu.setEnabled(this.controller.hasPreviousLocation()); 559 this.popupMenu.openPreviousMenu.setEnabled(this.controller.hasPreviousReference());
560 this.popupMenu.openNextMenu.setEnabled(this.controller.hasNextReference());
558 this.popupMenu.toggleMappingMenu.setEnabled(isRenamable); 561 this.popupMenu.toggleMappingMenu.setEnabled(isRenamable);
559 562
560 if (isToken && this.controller.getDeobfuscator().isRemapped(referenceEntry)) { 563 if (isToken && this.controller.getDeobfuscator().isRemapped(referenceEntry)) {
@@ -564,33 +567,12 @@ public class Gui {
564 } 567 }
565 } 568 }
566 569
567 public void navigateTo(Entry<?> entry) {
568 if (!this.controller.entryIsInJar(entry)) {
569 // entry is not in the jar. Ignore it
570 return;
571 }
572 if (reference != null) {
573 this.controller.savePreviousReference(reference);
574 }
575 this.controller.openDeclaration(entry);
576 }
577
578 private void navigateTo(EntryReference<Entry<?>, Entry<?>> reference) {
579 if (!this.controller.entryIsInJar(reference.getLocationClassEntry())) {
580 return;
581 }
582 if (this.reference != null) {
583 this.controller.savePreviousReference(this.reference);
584 }
585 this.controller.openReference(reference);
586 }
587
588 public void startRename() { 570 public void startRename() {
589 571
590 // init the text box 572 // init the text box
591 final JTextField text = new JTextField(); 573 final JTextField text = new JTextField();
592 574
593 EntryReference<Entry<?>, Entry<?>> translatedReference = controller.getDeobfuscator().deobfuscate(reference); 575 EntryReference<Entry<?>, Entry<?>> translatedReference = controller.getDeobfuscator().deobfuscate(cursorReference);
594 text.setText(translatedReference.getNameableName()); 576 text.setText(translatedReference.getNameableName());
595 577
596 text.setPreferredSize(new Dimension(360, text.getPreferredSize().height)); 578 text.setPreferredSize(new Dimension(360, text.getPreferredSize().height));
@@ -631,7 +613,7 @@ public class Gui {
631 String newName = text.getText(); 613 String newName = text.getText();
632 if (saveName && newName != null && !newName.isEmpty()) { 614 if (saveName && newName != null && !newName.isEmpty()) {
633 try { 615 try {
634 this.controller.rename(reference, newName, true); 616 this.controller.rename(cursorReference, newName, true);
635 } catch (IllegalNameException ex) { 617 } catch (IllegalNameException ex) {
636 text.setBorder(BorderFactory.createLineBorder(Color.red, 1)); 618 text.setBorder(BorderFactory.createLineBorder(Color.red, 1));
637 text.setToolTipText(ex.getReason()); 619 text.setToolTipText(ex.getReason());
@@ -643,7 +625,7 @@ public class Gui {
643 // abort the rename 625 // abort the rename
644 JPanel panel = (JPanel) infoPanel.getComponent(0); 626 JPanel panel = (JPanel) infoPanel.getComponent(0);
645 panel.remove(panel.getComponentCount() - 1); 627 panel.remove(panel.getComponentCount() - 1);
646 panel.add(Utils.unboldLabel(new JLabel(reference.getNameableName(), JLabel.LEFT))); 628 panel.add(Utils.unboldLabel(new JLabel(cursorReference.getNameableName(), JLabel.LEFT)));
647 629
648 this.editor.grabFocus(); 630 this.editor.grabFocus();
649 631
@@ -652,24 +634,24 @@ public class Gui {
652 634
653 public void showInheritance() { 635 public void showInheritance() {
654 636
655 if (reference == null) { 637 if (cursorReference == null) {
656 return; 638 return;
657 } 639 }
658 640
659 inheritanceTree.setModel(null); 641 inheritanceTree.setModel(null);
660 642
661 if (reference.entry instanceof ClassEntry) { 643 if (cursorReference.entry instanceof ClassEntry) {
662 // get the class inheritance 644 // get the class inheritance
663 ClassInheritanceTreeNode classNode = this.controller.getClassInheritance((ClassEntry) reference.entry); 645 ClassInheritanceTreeNode classNode = this.controller.getClassInheritance((ClassEntry) cursorReference.entry);
664 646
665 // show the tree at the root 647 // show the tree at the root
666 TreePath path = getPathToRoot(classNode); 648 TreePath path = getPathToRoot(classNode);
667 inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0))); 649 inheritanceTree.setModel(new DefaultTreeModel((TreeNode) path.getPathComponent(0)));
668 inheritanceTree.expandPath(path); 650 inheritanceTree.expandPath(path);
669 inheritanceTree.setSelectionRow(inheritanceTree.getRowForPath(path)); 651 inheritanceTree.setSelectionRow(inheritanceTree.getRowForPath(path));
670 } else if (reference.entry instanceof MethodEntry) { 652 } else if (cursorReference.entry instanceof MethodEntry) {
671 // get the method inheritance 653 // get the method inheritance
672 MethodInheritanceTreeNode classNode = this.controller.getMethodInheritance((MethodEntry) reference.entry); 654 MethodInheritanceTreeNode classNode = this.controller.getMethodInheritance((MethodEntry) cursorReference.entry);
673 655
674 // show the tree at the root 656 // show the tree at the root
675 TreePath path = getPathToRoot(classNode); 657 TreePath path = getPathToRoot(classNode);
@@ -685,7 +667,7 @@ public class Gui {
685 667
686 public void showImplementations() { 668 public void showImplementations() {
687 669
688 if (reference == null) { 670 if (cursorReference == null) {
689 return; 671 return;
690 } 672 }
691 673
@@ -694,11 +676,11 @@ public class Gui {
694 DefaultMutableTreeNode node = null; 676 DefaultMutableTreeNode node = null;
695 677
696 // get the class implementations 678 // get the class implementations
697 if (reference.entry instanceof ClassEntry) 679 if (cursorReference.entry instanceof ClassEntry)
698 node = this.controller.getClassImplementations((ClassEntry) reference.entry); 680 node = this.controller.getClassImplementations((ClassEntry) cursorReference.entry);
699 else // get the method implementations 681 else // get the method implementations
700 if (reference.entry instanceof MethodEntry) 682 if (cursorReference.entry instanceof MethodEntry)
701 node = this.controller.getMethodImplementations((MethodEntry) reference.entry); 683 node = this.controller.getMethodImplementations((MethodEntry) cursorReference.entry);
702 684
703 if (node != null) { 685 if (node != null) {
704 // show the tree at the root 686 // show the tree at the root
@@ -714,18 +696,18 @@ public class Gui {
714 } 696 }
715 697
716 public void showCalls(boolean recurse) { 698 public void showCalls(boolean recurse) {
717 if (reference == null) { 699 if (cursorReference == null) {
718 return; 700 return;
719 } 701 }
720 702
721 if (reference.entry instanceof ClassEntry) { 703 if (cursorReference.entry instanceof ClassEntry) {
722 ClassReferenceTreeNode node = this.controller.getClassReferences((ClassEntry) reference.entry); 704 ClassReferenceTreeNode node = this.controller.getClassReferences((ClassEntry) cursorReference.entry);
723 callsTree.setModel(new DefaultTreeModel(node)); 705 callsTree.setModel(new DefaultTreeModel(node));
724 } else if (reference.entry instanceof FieldEntry) { 706 } else if (cursorReference.entry instanceof FieldEntry) {
725 FieldReferenceTreeNode node = this.controller.getFieldReferences((FieldEntry) reference.entry); 707 FieldReferenceTreeNode node = this.controller.getFieldReferences((FieldEntry) cursorReference.entry);
726 callsTree.setModel(new DefaultTreeModel(node)); 708 callsTree.setModel(new DefaultTreeModel(node));
727 } else if (reference.entry instanceof MethodEntry) { 709 } else if (cursorReference.entry instanceof MethodEntry) {
728 MethodReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) reference.entry, recurse); 710 MethodReferenceTreeNode node = this.controller.getMethodReferences((MethodEntry) cursorReference.entry, recurse);
729 callsTree.setModel(new DefaultTreeModel(node)); 711 callsTree.setModel(new DefaultTreeModel(node));
730 } 712 }
731 713
@@ -735,10 +717,10 @@ public class Gui {
735 } 717 }
736 718
737 public void toggleMapping() { 719 public void toggleMapping() {
738 if (this.controller.getDeobfuscator().isRemapped(reference.entry)) { 720 if (this.controller.getDeobfuscator().isRemapped(cursorReference.entry)) {
739 this.controller.removeMapping(reference); 721 this.controller.removeMapping(cursorReference);
740 } else { 722 } else {
741 this.controller.markAsDeobfuscated(reference); 723 this.controller.markAsDeobfuscated(cursorReference);
742 } 724 }
743 } 725 }
744 726