summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/gui/Gui.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/gui/Gui.java')
-rw-r--r--src/cuchaz/enigma/gui/Gui.java158
1 files changed, 91 insertions, 67 deletions
diff --git a/src/cuchaz/enigma/gui/Gui.java b/src/cuchaz/enigma/gui/Gui.java
index 43a0cda..341c149 100644
--- a/src/cuchaz/enigma/gui/Gui.java
+++ b/src/cuchaz/enigma/gui/Gui.java
@@ -68,6 +68,7 @@ import com.google.common.collect.Lists;
68import cuchaz.enigma.Constants; 68import cuchaz.enigma.Constants;
69import cuchaz.enigma.analysis.BehaviorReferenceTreeNode; 69import cuchaz.enigma.analysis.BehaviorReferenceTreeNode;
70import cuchaz.enigma.analysis.ClassInheritanceTreeNode; 70import cuchaz.enigma.analysis.ClassInheritanceTreeNode;
71import cuchaz.enigma.analysis.EntryReference;
71import cuchaz.enigma.analysis.FieldReferenceTreeNode; 72import cuchaz.enigma.analysis.FieldReferenceTreeNode;
72import cuchaz.enigma.analysis.MethodInheritanceTreeNode; 73import cuchaz.enigma.analysis.MethodInheritanceTreeNode;
73import cuchaz.enigma.analysis.ReferenceTreeNode; 74import cuchaz.enigma.analysis.ReferenceTreeNode;
@@ -76,7 +77,6 @@ import cuchaz.enigma.mapping.ArgumentEntry;
76import cuchaz.enigma.mapping.ClassEntry; 77import cuchaz.enigma.mapping.ClassEntry;
77import cuchaz.enigma.mapping.ConstructorEntry; 78import cuchaz.enigma.mapping.ConstructorEntry;
78import cuchaz.enigma.mapping.Entry; 79import cuchaz.enigma.mapping.Entry;
79import cuchaz.enigma.mapping.EntryPair;
80import cuchaz.enigma.mapping.FieldEntry; 80import cuchaz.enigma.mapping.FieldEntry;
81import cuchaz.enigma.mapping.IllegalNameException; 81import cuchaz.enigma.mapping.IllegalNameException;
82import cuchaz.enigma.mapping.MappingParseException; 82import cuchaz.enigma.mapping.MappingParseException;
@@ -160,7 +160,7 @@ public class Gui
160 private JMenuItem m_showCallsMenu; 160 private JMenuItem m_showCallsMenu;
161 161
162 // state 162 // state
163 private EntryPair<? extends Entry> m_selectedEntryPair; 163 private EntryReference<Entry,Entry> m_reference;
164 private JFileChooser m_jarFileChooser; 164 private JFileChooser m_jarFileChooser;
165 private JFileChooser m_mappingsFileChooser; 165 private JFileChooser m_mappingsFileChooser;
166 166
@@ -192,6 +192,10 @@ public class Gui
192 String selected = m_obfClasses.getSelectedValue(); 192 String selected = m_obfClasses.getSelectedValue();
193 if( selected != null ) 193 if( selected != null )
194 { 194 {
195 if( m_reference != null )
196 {
197 m_controller.savePreviousReference( m_reference );
198 }
195 m_controller.openDeclaration( new ClassEntry( selected ) ); 199 m_controller.openDeclaration( new ClassEntry( selected ) );
196 } 200 }
197 } 201 }
@@ -218,6 +222,10 @@ public class Gui
218 String selected = m_deobfClasses.getSelectedValue(); 222 String selected = m_deobfClasses.getSelectedValue();
219 if( selected != null ) 223 if( selected != null )
220 { 224 {
225 if( m_reference != null )
226 {
227 m_controller.savePreviousReference( m_reference );
228 }
221 m_controller.openDeclaration( new ClassEntry( selected ) ); 229 m_controller.openDeclaration( new ClassEntry( selected ) );
222 } 230 }
223 } 231 }
@@ -234,7 +242,7 @@ public class Gui
234 m_infoPanel.setLayout( new GridLayout( 4, 1, 0, 0 ) ); 242 m_infoPanel.setLayout( new GridLayout( 4, 1, 0, 0 ) );
235 m_infoPanel.setPreferredSize( new Dimension( 0, 100 ) ); 243 m_infoPanel.setPreferredSize( new Dimension( 0, 100 ) );
236 m_infoPanel.setBorder( BorderFactory.createTitledBorder( "Identifier Info" ) ); 244 m_infoPanel.setBorder( BorderFactory.createTitledBorder( "Identifier Info" ) );
237 clearEntryPair(); 245 clearReference();
238 246
239 // init editor 247 // init editor
240 DefaultSyntaxKit.initKit(); 248 DefaultSyntaxKit.initKit();
@@ -273,7 +281,7 @@ public class Gui
273 break; 281 break;
274 282
275 case KeyEvent.VK_P: 283 case KeyEvent.VK_P:
276 m_controller.openPreviousLocation(); 284 m_controller.openPreviousReference();
277 break; 285 break;
278 286
279 case KeyEvent.VK_C: 287 case KeyEvent.VK_C:
@@ -357,7 +365,7 @@ public class Gui
357 @Override 365 @Override
358 public void actionPerformed( ActionEvent event ) 366 public void actionPerformed( ActionEvent event )
359 { 367 {
360 m_controller.openPreviousLocation(); 368 m_controller.openPreviousReference();
361 } 369 }
362 } ); 370 } );
363 menu.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_P, 0 ) ); 371 menu.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_P, 0 ) );
@@ -386,6 +394,10 @@ public class Gui
386 Object node = path.getLastPathComponent(); 394 Object node = path.getLastPathComponent();
387 if( node instanceof ClassInheritanceTreeNode ) 395 if( node instanceof ClassInheritanceTreeNode )
388 { 396 {
397 if( m_reference != null )
398 {
399 m_controller.savePreviousReference( m_reference );
400 }
389 m_controller.openDeclaration( new ClassEntry( ((ClassInheritanceTreeNode)node).getObfClassName() ) ); 401 m_controller.openDeclaration( new ClassEntry( ((ClassInheritanceTreeNode)node).getObfClassName() ) );
390 } 402 }
391 else if( node instanceof MethodInheritanceTreeNode ) 403 else if( node instanceof MethodInheritanceTreeNode )
@@ -393,6 +405,10 @@ public class Gui
393 MethodInheritanceTreeNode methodNode = (MethodInheritanceTreeNode)node; 405 MethodInheritanceTreeNode methodNode = (MethodInheritanceTreeNode)node;
394 if( methodNode.isImplemented() ) 406 if( methodNode.isImplemented() )
395 { 407 {
408 if( m_reference != null )
409 {
410 m_controller.savePreviousReference( m_reference );
411 }
396 m_controller.openDeclaration( methodNode.getMethodEntry() ); 412 m_controller.openDeclaration( methodNode.getMethodEntry() );
397 } 413 }
398 } 414 }
@@ -424,7 +440,11 @@ public class Gui
424 Object node = path.getLastPathComponent(); 440 Object node = path.getLastPathComponent();
425 if( node instanceof ReferenceTreeNode ) 441 if( node instanceof ReferenceTreeNode )
426 { 442 {
427 ReferenceTreeNode<Entry> referenceNode = ((ReferenceTreeNode<Entry>)node); 443 if( m_reference != null )
444 {
445 m_controller.savePreviousReference( m_reference );
446 }
447 ReferenceTreeNode<Entry,Entry> referenceNode = ((ReferenceTreeNode<Entry,Entry>)node);
428 if( referenceNode.getReference() != null ) 448 if( referenceNode.getReference() != null )
429 { 449 {
430 m_controller.openReference( referenceNode.getReference() ); 450 m_controller.openReference( referenceNode.getReference() );
@@ -715,6 +735,10 @@ public class Gui
715 735
716 public void showToken( Token token ) 736 public void showToken( Token token )
717 { 737 {
738 if( token == null )
739 {
740 throw new IllegalArgumentException( "Token cannot be null!" );
741 }
718 m_editor.setCaretPosition( token.start ); 742 m_editor.setCaretPosition( token.start );
719 m_editor.grabFocus(); 743 m_editor.grabFocus();
720 } 744 }
@@ -752,7 +776,7 @@ public class Gui
752 } 776 }
753 } 777 }
754 778
755 private void clearEntryPair( ) 779 private void clearReference( )
756 { 780 {
757 m_infoPanel.removeAll(); 781 m_infoPanel.removeAll();
758 JLabel label = new JLabel( "No identifier selected" ); 782 JLabel label = new JLabel( "No identifier selected" );
@@ -763,76 +787,75 @@ public class Gui
763 redraw(); 787 redraw();
764 } 788 }
765 789
766 @SuppressWarnings( "unchecked" ) 790 private void showReference( EntryReference<Entry,Entry> reference )
767 private void showEntryPair( EntryPair<? extends Entry> pair )
768 { 791 {
769 if( pair == null ) 792 if( reference == null )
770 { 793 {
771 clearEntryPair(); 794 clearReference();
772 return; 795 return;
773 } 796 }
774 797
775 m_selectedEntryPair = pair; 798 m_reference = reference;
776 799
777 m_infoPanel.removeAll(); 800 m_infoPanel.removeAll();
778 if( pair.deobf instanceof ClassEntry ) 801 if( reference.entry instanceof ClassEntry )
779 { 802 {
780 showClassEntryPair( (EntryPair<ClassEntry>)pair ); 803 showClassEntry( (ClassEntry)m_reference.entry );
781 } 804 }
782 else if( pair.deobf instanceof FieldEntry ) 805 else if( m_reference.entry instanceof FieldEntry )
783 { 806 {
784 showFieldEntryPair( (EntryPair<FieldEntry>)pair ); 807 showFieldEntry( (FieldEntry)m_reference.entry );
785 } 808 }
786 else if( pair.deobf instanceof MethodEntry ) 809 else if( m_reference.entry instanceof MethodEntry )
787 { 810 {
788 showMethodEntryPair( (EntryPair<MethodEntry>)pair ); 811 showMethodEntry( (MethodEntry)m_reference.entry );
789 } 812 }
790 else if( pair.deobf instanceof ConstructorEntry ) 813 else if( m_reference.entry instanceof ConstructorEntry )
791 { 814 {
792 showConstructorEntryPair( (EntryPair<ConstructorEntry>)pair ); 815 showConstructorEntry( (ConstructorEntry)m_reference.entry );
793 } 816 }
794 else if( pair.deobf instanceof ArgumentEntry ) 817 else if( m_reference.entry instanceof ArgumentEntry )
795 { 818 {
796 showArgumentEntryPair( (EntryPair<ArgumentEntry>)pair ); 819 showArgumentEntry( (ArgumentEntry)m_reference.entry );
797 } 820 }
798 else 821 else
799 { 822 {
800 throw new Error( "Unknown entry type: " + pair.deobf.getClass().getName() ); 823 throw new Error( "Unknown entry type: " + m_reference.entry.getClass().getName() );
801 } 824 }
802 825
803 redraw(); 826 redraw();
804 } 827 }
805 828
806 private void showClassEntryPair( EntryPair<ClassEntry> pair ) 829 private void showClassEntry( ClassEntry entry )
807 { 830 {
808 addNameValue( m_infoPanel, "Class", pair.deobf.getName() ); 831 addNameValue( m_infoPanel, "Class", entry.getName() );
809 } 832 }
810 833
811 private void showFieldEntryPair( EntryPair<FieldEntry> pair ) 834 private void showFieldEntry( FieldEntry entry )
812 { 835 {
813 addNameValue( m_infoPanel, "Field", pair.deobf.getName() ); 836 addNameValue( m_infoPanel, "Field", entry.getName() );
814 addNameValue( m_infoPanel, "Class", pair.deobf.getClassEntry().getName() ); 837 addNameValue( m_infoPanel, "Class", entry.getClassEntry().getName() );
815 } 838 }
816 839
817 private void showMethodEntryPair( EntryPair<MethodEntry> pair ) 840 private void showMethodEntry( MethodEntry entry )
818 { 841 {
819 addNameValue( m_infoPanel, "Method", pair.deobf.getName() ); 842 addNameValue( m_infoPanel, "Method", entry.getName() );
820 addNameValue( m_infoPanel, "Class", pair.deobf.getClassEntry().getName() ); 843 addNameValue( m_infoPanel, "Class", entry.getClassEntry().getName() );
821 addNameValue( m_infoPanel, "Signature", pair.deobf.getSignature() ); 844 addNameValue( m_infoPanel, "Signature", entry.getSignature() );
822 } 845 }
823 846
824 private void showConstructorEntryPair( EntryPair<ConstructorEntry> pair ) 847 private void showConstructorEntry( ConstructorEntry entry )
825 { 848 {
826 addNameValue( m_infoPanel, "Constructor", pair.deobf.getClassEntry().getName() ); 849 addNameValue( m_infoPanel, "Constructor", entry.getClassEntry().getName() );
827 addNameValue( m_infoPanel, "Signature", pair.deobf.getSignature() ); 850 addNameValue( m_infoPanel, "Signature", entry.getSignature() );
828 } 851 }
829 852
830 private void showArgumentEntryPair( EntryPair<ArgumentEntry> pair ) 853 private void showArgumentEntry( ArgumentEntry entry )
831 { 854 {
832 addNameValue( m_infoPanel, "Argument", pair.deobf.getName() ); 855 addNameValue( m_infoPanel, "Argument", entry.getName() );
833 addNameValue( m_infoPanel, "Class", pair.deobf.getClassEntry().getName() ); 856 addNameValue( m_infoPanel, "Class", entry.getClassEntry().getName() );
834 addNameValue( m_infoPanel, "Method", pair.deobf.getMethodEntry().getName() ); 857 addNameValue( m_infoPanel, "Method", entry.getMethodEntry().getName() );
835 addNameValue( m_infoPanel, "Index", Integer.toString( pair.deobf.getIndex() ) ); 858 addNameValue( m_infoPanel, "Index", Integer.toString( entry.getIndex() ) );
836 } 859 }
837 860
838 private void addNameValue( JPanel container, String name, String value ) 861 private void addNameValue( JPanel container, String name, String value )
@@ -853,19 +876,19 @@ public class Gui
853 Token token = m_controller.getToken( pos ); 876 Token token = m_controller.getToken( pos );
854 boolean isToken = token != null; 877 boolean isToken = token != null;
855 878
856 m_selectedEntryPair = m_controller.getEntryPair( token ); 879 m_reference = m_controller.getDeobfReference( token );
857 boolean isClassEntry = isToken && m_selectedEntryPair.obf instanceof ClassEntry; 880 boolean isClassEntry = isToken && m_reference.entry instanceof ClassEntry;
858 boolean isFieldEntry = isToken && m_selectedEntryPair.obf instanceof FieldEntry; 881 boolean isFieldEntry = isToken && m_reference.entry instanceof FieldEntry;
859 boolean isMethodEntry = isToken && m_selectedEntryPair.obf instanceof MethodEntry; 882 boolean isMethodEntry = isToken && m_reference.entry instanceof MethodEntry;
860 boolean isConstructorEntry = isToken && m_selectedEntryPair.obf instanceof ConstructorEntry; 883 boolean isConstructorEntry = isToken && m_reference.entry instanceof ConstructorEntry;
861 884
862 if( isToken ) 885 if( isToken )
863 { 886 {
864 showEntryPair( m_selectedEntryPair ); 887 showReference( m_reference );
865 } 888 }
866 else 889 else
867 { 890 {
868 clearEntryPair(); 891 clearReference();
869 } 892 }
870 893
871 m_renameMenu.setEnabled( isToken ); 894 m_renameMenu.setEnabled( isToken );
@@ -878,11 +901,11 @@ public class Gui
878 private void startRename( ) 901 private void startRename( )
879 { 902 {
880 // get the class name 903 // get the class name
881 String className = m_selectedEntryPair.deobf.getName(); 904 ClassEntry classEntry = m_reference.entry.getClassEntry();
882 int pos = className.lastIndexOf( '$' ); 905 String className = classEntry.getName();
883 if( pos >= 0 ) 906 if( classEntry.isInnerClass() )
884 { 907 {
885 className = className.substring( pos + 1 ); 908 className = classEntry.getInnerClassName();
886 } 909 }
887 910
888 // init the text box 911 // init the text box
@@ -924,7 +947,7 @@ public class Gui
924 { 947 {
925 try 948 try
926 { 949 {
927 m_controller.rename( m_selectedEntryPair.obf, newName ); 950 m_controller.rename( m_reference, newName );
928 } 951 }
929 catch( IllegalNameException ex ) 952 catch( IllegalNameException ex )
930 { 953 {
@@ -937,7 +960,7 @@ public class Gui
937 // abort the rename 960 // abort the rename
938 JPanel panel = (JPanel)m_infoPanel.getComponent( 0 ); 961 JPanel panel = (JPanel)m_infoPanel.getComponent( 0 );
939 panel.remove( panel.getComponentCount() - 1 ); 962 panel.remove( panel.getComponentCount() - 1 );
940 panel.add( unboldLabel( new JLabel( m_selectedEntryPair.deobf.getName(), JLabel.LEFT ) ) ); 963 panel.add( unboldLabel( new JLabel( m_reference.entry.getName(), JLabel.LEFT ) ) );
941 964
942 m_editor.grabFocus(); 965 m_editor.grabFocus();
943 966
@@ -946,15 +969,15 @@ public class Gui
946 969
947 private void showInheritance( ) 970 private void showInheritance( )
948 { 971 {
949 if( m_selectedEntryPair == null ) 972 if( m_reference == null )
950 { 973 {
951 return; 974 return;
952 } 975 }
953 976
954 if( m_selectedEntryPair.obf instanceof ClassEntry ) 977 if( m_reference.entry instanceof ClassEntry )
955 { 978 {
956 // get the class inheritance 979 // get the class inheritance
957 ClassInheritanceTreeNode classNode = m_controller.getClassInheritance( (ClassEntry)m_selectedEntryPair.obf ); 980 ClassInheritanceTreeNode classNode = m_controller.getClassInheritance( (ClassEntry)m_reference.entry );
958 981
959 // show the tree at the root 982 // show the tree at the root
960 TreePath path = getPathToRoot( classNode ); 983 TreePath path = getPathToRoot( classNode );
@@ -962,10 +985,10 @@ public class Gui
962 m_inheritanceTree.expandPath( path ); 985 m_inheritanceTree.expandPath( path );
963 m_inheritanceTree.setSelectionRow( m_inheritanceTree.getRowForPath( path ) ); 986 m_inheritanceTree.setSelectionRow( m_inheritanceTree.getRowForPath( path ) );
964 } 987 }
965 else if( m_selectedEntryPair.obf instanceof MethodEntry ) 988 else if( m_reference.entry instanceof MethodEntry )
966 { 989 {
967 // get the method inheritance 990 // get the method inheritance
968 MethodInheritanceTreeNode classNode = m_controller.getMethodInheritance( (MethodEntry)m_selectedEntryPair.obf ); 991 MethodInheritanceTreeNode classNode = m_controller.getMethodInheritance( (MethodEntry)m_reference.entry );
969 992
970 // show the tree at the root 993 // show the tree at the root
971 TreePath path = getPathToRoot( classNode ); 994 TreePath path = getPathToRoot( classNode );
@@ -980,24 +1003,24 @@ public class Gui
980 1003
981 private void showCalls( ) 1004 private void showCalls( )
982 { 1005 {
983 if( m_selectedEntryPair == null ) 1006 if( m_reference == null )
984 { 1007 {
985 return; 1008 return;
986 } 1009 }
987 1010
988 if( m_selectedEntryPair.obf instanceof FieldEntry ) 1011 if( m_reference.entry instanceof FieldEntry )
989 { 1012 {
990 FieldReferenceTreeNode node = m_controller.getFieldReferences( (FieldEntry)m_selectedEntryPair.obf ); 1013 FieldReferenceTreeNode node = m_controller.getFieldReferences( (FieldEntry)m_reference.entry );
991 m_callsTree.setModel( new DefaultTreeModel( node ) ); 1014 m_callsTree.setModel( new DefaultTreeModel( node ) );
992 } 1015 }
993 else if( m_selectedEntryPair.obf instanceof MethodEntry ) 1016 else if( m_reference.entry instanceof MethodEntry )
994 { 1017 {
995 BehaviorReferenceTreeNode node = m_controller.getMethodReferences( (MethodEntry)m_selectedEntryPair.obf ); 1018 BehaviorReferenceTreeNode node = m_controller.getMethodReferences( (MethodEntry)m_reference.entry );
996 m_callsTree.setModel( new DefaultTreeModel( node ) ); 1019 m_callsTree.setModel( new DefaultTreeModel( node ) );
997 } 1020 }
998 else if( m_selectedEntryPair.obf instanceof ConstructorEntry ) 1021 else if( m_reference.entry instanceof ConstructorEntry )
999 { 1022 {
1000 BehaviorReferenceTreeNode node = m_controller.getMethodReferences( (ConstructorEntry)m_selectedEntryPair.obf ); 1023 BehaviorReferenceTreeNode node = m_controller.getMethodReferences( (ConstructorEntry)m_reference.entry );
1001 m_callsTree.setModel( new DefaultTreeModel( node ) ); 1024 m_callsTree.setModel( new DefaultTreeModel( node ) );
1002 } 1025 }
1003 1026
@@ -1021,11 +1044,12 @@ public class Gui
1021 1044
1022 private void openDeclaration( ) 1045 private void openDeclaration( )
1023 { 1046 {
1024 if( m_selectedEntryPair == null ) 1047 if( m_reference == null )
1025 { 1048 {
1026 return; 1049 return;
1027 } 1050 }
1028 m_controller.openDeclaration( m_selectedEntryPair.obf ); 1051 m_controller.savePreviousReference( m_reference );
1052 m_controller.openDeclaration( m_reference.entry );
1029 } 1053 }
1030 1054
1031 private void close( ) 1055 private void close( )