diff options
Diffstat (limited to 'src/main/java/cuchaz')
10 files changed, 85 insertions, 15 deletions
diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 22194ad5..ca387541 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java | |||
| @@ -543,6 +543,10 @@ public class Deobfuscator { | |||
| 543 | } | 543 | } |
| 544 | 544 | ||
| 545 | public void rename(Entry obfEntry, String newName) { | 545 | public void rename(Entry obfEntry, String newName) { |
| 546 | rename(obfEntry, newName, true); | ||
| 547 | } | ||
| 548 | |||
| 549 | public void rename(Entry obfEntry, String newName, boolean clearCache) { | ||
| 546 | if (obfEntry instanceof ClassEntry) { | 550 | if (obfEntry instanceof ClassEntry) { |
| 547 | this.renamer.setClassName((ClassEntry) obfEntry, Descriptor.toJvmName(newName)); | 551 | this.renamer.setClassName((ClassEntry) obfEntry, Descriptor.toJvmName(newName)); |
| 548 | } else if (obfEntry instanceof FieldEntry) { | 552 | } else if (obfEntry instanceof FieldEntry) { |
| @@ -560,7 +564,8 @@ public class Deobfuscator { | |||
| 560 | } | 564 | } |
| 561 | 565 | ||
| 562 | // clear caches | 566 | // clear caches |
| 563 | this.translatorCache.clear(); | 567 | if (clearCache) |
| 568 | this.translatorCache.clear(); | ||
| 564 | } | 569 | } |
| 565 | 570 | ||
| 566 | public void removeMapping(Entry obfEntry) { | 571 | public void removeMapping(Entry obfEntry) { |
diff --git a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java index 3cd1705a..edf1e30b 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java +++ b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java | |||
| @@ -131,7 +131,7 @@ public class ClassMatchingGui { | |||
| 131 | sourceTypePanel.add(button); | 131 | sourceTypePanel.add(button); |
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); | 134 | m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); |
| 135 | m_sourceClasses.setSelectionListener(this::setSourceClass); | 135 | m_sourceClasses.setSelectionListener(this::setSourceClass); |
| 136 | JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); | 136 | JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); |
| 137 | sourcePanel.add(sourceScroller); | 137 | sourcePanel.add(sourceScroller); |
| @@ -147,7 +147,7 @@ public class ClassMatchingGui { | |||
| 147 | destPanel.add(m_top10Matches); | 147 | destPanel.add(m_top10Matches); |
| 148 | m_top10Matches.addActionListener(event -> toggleTop10Matches()); | 148 | m_top10Matches.addActionListener(event -> toggleTop10Matches()); |
| 149 | 149 | ||
| 150 | m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); | 150 | m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); |
| 151 | m_destClasses.setSelectionListener(this::setDestClass); | 151 | m_destClasses.setSelectionListener(this::setDestClass); |
| 152 | JScrollPane destScroller = new JScrollPane(m_destClasses); | 152 | JScrollPane destScroller = new JScrollPane(m_destClasses); |
| 153 | destPanel.add(destScroller); | 153 | destPanel.add(destScroller); |
diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java index 92fcaba0..c6ef0e29 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassSelector.java +++ b/src/main/java/cuchaz/enigma/gui/ClassSelector.java | |||
| @@ -44,7 +44,7 @@ public class ClassSelector extends JTree { | |||
| 44 | private RenameSelectionListener renameSelectionListener; | 44 | private RenameSelectionListener renameSelectionListener; |
| 45 | private Comparator<ClassEntry> comparator; | 45 | private Comparator<ClassEntry> comparator; |
| 46 | 46 | ||
| 47 | public ClassSelector(Gui gui, Comparator<ClassEntry> comparator) { | 47 | public ClassSelector(Gui gui, Comparator<ClassEntry> comparator, boolean isRenamable) { |
| 48 | this.comparator = comparator; | 48 | this.comparator = comparator; |
| 49 | 49 | ||
| 50 | // configure the tree control | 50 | // configure the tree control |
| @@ -77,7 +77,7 @@ public class ClassSelector extends JTree { | |||
| 77 | { | 77 | { |
| 78 | @Override public boolean isCellEditable(EventObject event) | 78 | @Override public boolean isCellEditable(EventObject event) |
| 79 | { | 79 | { |
| 80 | return !(event instanceof MouseEvent) && super.isCellEditable(event); | 80 | return isRenamable && !(event instanceof MouseEvent) && super.isCellEditable(event); |
| 81 | } | 81 | } |
| 82 | }; | 82 | }; |
| 83 | this.setCellEditor(editor); | 83 | this.setCellEditor(editor); |
| @@ -112,7 +112,7 @@ public class ClassSelector extends JTree { | |||
| 112 | try | 112 | try |
| 113 | { | 113 | { |
| 114 | renameSelectionListener.onSelectionRename(node.getUserObject(), objectData, node); | 114 | renameSelectionListener.onSelectionRename(node.getUserObject(), objectData, node); |
| 115 | node.setUserObject(objectData); | 115 | node.setUserObject(objectData); // Make sure that it's modified |
| 116 | } catch (IllegalNameException ex) | 116 | } catch (IllegalNameException ex) |
| 117 | { | 117 | { |
| 118 | JOptionPane.showOptionDialog(gui.getFrame(), ex.getMessage(), "Enigma - Error", JOptionPane.OK_OPTION, | 118 | JOptionPane.showOptionDialog(gui.getFrame(), ex.getMessage(), "Enigma - Error", JOptionPane.OK_OPTION, |
| @@ -447,6 +447,51 @@ public class ClassSelector extends JTree { | |||
| 447 | model.insertNodeInto(classNode, packageNode, getPlacementIndex(packageNode, classNode)); | 447 | model.insertNodeInto(classNode, packageNode, getPlacementIndex(packageNode, classNode)); |
| 448 | } | 448 | } |
| 449 | 449 | ||
| 450 | public void reload() | ||
| 451 | { | ||
| 452 | DefaultTreeModel model = (DefaultTreeModel) getModel(); | ||
| 453 | model.reload(sort(rootNodes)); | ||
| 454 | } | ||
| 455 | |||
| 456 | private DefaultMutableTreeNode sort(DefaultMutableTreeNode node) { | ||
| 457 | |||
| 458 | for(int i = 0; i < node.getChildCount() - 1; i++) { | ||
| 459 | DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); | ||
| 460 | if (child == null) | ||
| 461 | continue; | ||
| 462 | String nt = child.toString(); | ||
| 463 | |||
| 464 | for(int j = i + 1; j <= node.getChildCount() - 1; j++) { | ||
| 465 | DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); | ||
| 466 | if (prevNode == null || prevNode.getUserObject() == null) | ||
| 467 | continue; | ||
| 468 | String np = prevNode.getUserObject().toString(); | ||
| 469 | |||
| 470 | if(nt.compareToIgnoreCase(np) > 0) { | ||
| 471 | node.insert(child, j); | ||
| 472 | node.insert(prevNode, i); | ||
| 473 | } | ||
| 474 | } | ||
| 475 | if(child.getChildCount() > 0) { | ||
| 476 | sort(child); | ||
| 477 | } | ||
| 478 | } | ||
| 479 | |||
| 480 | for(int i = 0; i < node.getChildCount() - 1; i++) { | ||
| 481 | DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); | ||
| 482 | for(int j = i + 1; j <= node.getChildCount() - 1; j++) { | ||
| 483 | DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); | ||
| 484 | |||
| 485 | if(!prevNode.isLeaf() && child.isLeaf()) { | ||
| 486 | node.insert(child, j); | ||
| 487 | node.insert(prevNode, i); | ||
| 488 | } | ||
| 489 | } | ||
| 490 | } | ||
| 491 | |||
| 492 | return node; | ||
| 493 | } | ||
| 494 | |||
| 450 | private int getPlacementIndex(ClassSelectorPackageNode newPackageNode, ClassSelectorClassNode classNode) | 495 | private int getPlacementIndex(ClassSelectorPackageNode newPackageNode, ClassSelectorClassNode classNode) |
| 451 | { | 496 | { |
| 452 | List<ClassSelectorClassNode> classNodes = classNodes(newPackageNode); | 497 | List<ClassSelectorClassNode> classNodes = classNodes(newPackageNode); |
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 2a355075..6d9ea1df 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java | |||
| @@ -778,12 +778,16 @@ public class Gui { | |||
| 778 | DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i); | 778 | DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i); |
| 779 | ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject(); | 779 | ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject(); |
| 780 | ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName()); | 780 | ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName()); |
| 781 | this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName(), false); | 781 | this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName(), false, i + 1 == node.getChildCount()); |
| 782 | childNode.setUserObject(dataChild); | ||
| 782 | } | 783 | } |
| 784 | node.setUserObject(data); | ||
| 785 | // Ob package will never be modified, just reload deob view | ||
| 786 | this.deobfPanel.deobfClasses.reload(); | ||
| 783 | } | 787 | } |
| 784 | // class rename | 788 | // class rename |
| 785 | else if (data instanceof ClassEntry) | 789 | else if (data instanceof ClassEntry) |
| 786 | this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName(), false); | 790 | this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName(), false, true); |
| 787 | } | 791 | } |
| 788 | 792 | ||
| 789 | public void moveClassTree(EntryReference<Entry, Entry> deobfReference, String newName) | 793 | public void moveClassTree(EntryReference<Entry, Entry> deobfReference, String newName) |
| @@ -806,6 +810,8 @@ public class Gui { | |||
| 806 | ClassSelectorPackageNode packageNode = this.obfPanel.obfClasses.getPackageNode(oldEntry); | 810 | ClassSelectorPackageNode packageNode = this.obfPanel.obfClasses.getPackageNode(oldEntry); |
| 807 | this.obfPanel.obfClasses.removeNode(packageNode, oldEntry); | 811 | this.obfPanel.obfClasses.removeNode(packageNode, oldEntry); |
| 808 | this.obfPanel.obfClasses.removeNodeIfEmpty(packageNode); | 812 | this.obfPanel.obfClasses.removeNodeIfEmpty(packageNode); |
| 813 | this.deobfPanel.deobfClasses.reload(); | ||
| 814 | this.obfPanel.obfClasses.reload(); | ||
| 809 | } | 815 | } |
| 810 | // Deob -> ob | 816 | // Deob -> ob |
| 811 | else if (isNewOb && !isOldOb) | 817 | else if (isNewOb && !isOldOb) |
| @@ -814,17 +820,21 @@ public class Gui { | |||
| 814 | ClassSelectorPackageNode packageNode = this.deobfPanel.deobfClasses.getPackageNode(oldEntry); | 820 | ClassSelectorPackageNode packageNode = this.deobfPanel.deobfClasses.getPackageNode(oldEntry); |
| 815 | this.deobfPanel.deobfClasses.removeNode(packageNode, oldEntry); | 821 | this.deobfPanel.deobfClasses.removeNode(packageNode, oldEntry); |
| 816 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(packageNode); | 822 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(packageNode); |
| 823 | this.deobfPanel.deobfClasses.reload(); | ||
| 824 | this.obfPanel.obfClasses.reload(); | ||
| 817 | } | 825 | } |
| 818 | // Local move | 826 | // Local move |
| 819 | else if (isOldOb) | 827 | else if (isOldOb) |
| 820 | { | 828 | { |
| 821 | this.obfPanel.obfClasses.moveClassTree(oldEntry, newEntry, null); | 829 | this.obfPanel.obfClasses.moveClassTree(oldEntry, newEntry, null); |
| 822 | this.obfPanel.obfClasses.removeNodeIfEmpty(this.obfPanel.obfClasses.getPackageNode(oldEntry)); | 830 | this.obfPanel.obfClasses.removeNodeIfEmpty(this.obfPanel.obfClasses.getPackageNode(oldEntry)); |
| 831 | this.obfPanel.obfClasses.reload(); | ||
| 823 | } | 832 | } |
| 824 | else | 833 | else |
| 825 | { | 834 | { |
| 826 | this.deobfPanel.deobfClasses.moveClassTree(oldEntry, newEntry, null); | 835 | this.deobfPanel.deobfClasses.moveClassTree(oldEntry, newEntry, null); |
| 827 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(this.deobfPanel.deobfClasses.getPackageNode(oldEntry)); | 836 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(this.deobfPanel.deobfClasses.getPackageNode(oldEntry)); |
| 837 | this.deobfPanel.deobfClasses.reload(); | ||
| 828 | } | 838 | } |
| 829 | } | 839 | } |
| 830 | } | 840 | } |
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 2d0f7ae2..70fb4cf2 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java | |||
| @@ -193,13 +193,13 @@ public class GuiController { | |||
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName) { | 195 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName) { |
| 196 | rename(deobfReference, newName, true); | 196 | rename(deobfReference, newName, true, true); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName, boolean refreshClassTree) | 199 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName, boolean refreshClassTree, boolean clearTranslationCache) |
| 200 | { | 200 | { |
| 201 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); | 201 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); |
| 202 | this.deobfuscator.rename(obfReference.getNameableEntry(), newName); | 202 | this.deobfuscator.rename(obfReference.getNameableEntry(), newName, clearTranslationCache); |
| 203 | this.isDirty = true; | 203 | this.isDirty = true; |
| 204 | 204 | ||
| 205 | if (refreshClassTree && deobfReference.entry instanceof ClassEntry && !((ClassEntry) deobfReference.entry).isInnerClass()) | 205 | if (refreshClassTree && deobfReference.entry instanceof ClassEntry && !((ClassEntry) deobfReference.entry).isInnerClass()) |
diff --git a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java index 50550910..ecc280d5 100644 --- a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java +++ b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java | |||
| @@ -138,7 +138,7 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 138 | sourceTypePanel.add(button); | 138 | sourceTypePanel.add(button); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); | 141 | m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); |
| 142 | m_sourceClasses.setSelectionListener(this::setSourceClass); | 142 | m_sourceClasses.setSelectionListener(this::setSourceClass); |
| 143 | JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); | 143 | JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); |
| 144 | classesPanel.add(sourceScroller); | 144 | classesPanel.add(sourceScroller); |
diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java index 1c9dad4b..83418267 100644 --- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java +++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java | |||
| @@ -49,6 +49,11 @@ public class ClassSelectorClassNode extends DefaultMutableTreeNode { | |||
| 49 | super.setUserObject(classEntry); | 49 | super.setUserObject(classEntry); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | @Override public Object getUserObject() | ||
| 53 | { | ||
| 54 | return classEntry; | ||
| 55 | } | ||
| 56 | |||
| 52 | public boolean equals(ClassSelectorClassNode other) { | 57 | public boolean equals(ClassSelectorClassNode other) { |
| 53 | return this.classEntry.equals(other.classEntry); | 58 | return this.classEntry.equals(other.classEntry); |
| 54 | } | 59 | } |
diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java index 629d20cd..31b4ebfa 100644 --- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java +++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java | |||
| @@ -33,9 +33,14 @@ public class ClassSelectorPackageNode extends DefaultMutableTreeNode { | |||
| 33 | super.setUserObject(userObject); | 33 | super.setUserObject(userObject); |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | @Override public Object getUserObject() | ||
| 37 | { | ||
| 38 | return packageName; | ||
| 39 | } | ||
| 40 | |||
| 36 | @Override | 41 | @Override |
| 37 | public String toString() { | 42 | public String toString() { |
| 38 | return Descriptor.toJavaName(this.packageName); | 43 | return !packageName.equals("(none)") ? Descriptor.toJavaName(this.packageName) : "(none)"; |
| 39 | } | 44 | } |
| 40 | 45 | ||
| 41 | @Override | 46 | @Override |
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java index 447c51af..4f551756 100644 --- a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java +++ b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java | |||
| @@ -17,7 +17,7 @@ public class PanelDeobf extends JPanel { | |||
| 17 | public PanelDeobf(Gui gui) { | 17 | public PanelDeobf(Gui gui) { |
| 18 | this.gui = gui; | 18 | this.gui = gui; |
| 19 | 19 | ||
| 20 | this.deobfClasses = new ClassSelector(gui, ClassSelector.DEOBF_CLASS_COMPARATOR); | 20 | this.deobfClasses = new ClassSelector(gui, ClassSelector.DEOBF_CLASS_COMPARATOR, true); |
| 21 | this.deobfClasses.setSelectionListener(gui::navigateTo); | 21 | this.deobfClasses.setSelectionListener(gui::navigateTo); |
| 22 | this.deobfClasses.setRenameSelectionListener(gui::onPanelRename); | 22 | this.deobfClasses.setRenameSelectionListener(gui::onPanelRename); |
| 23 | 23 | ||
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java index 74772a5f..27bb70b4 100644 --- a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java +++ b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java | |||
| @@ -28,7 +28,7 @@ public class PanelObf extends JPanel { | |||
| 28 | return aname.compareTo(bname); | 28 | return aname.compareTo(bname); |
| 29 | }; | 29 | }; |
| 30 | 30 | ||
| 31 | this.obfClasses = new ClassSelector(gui, obfClassComparator); | 31 | this.obfClasses = new ClassSelector(gui, obfClassComparator, false); |
| 32 | this.obfClasses.setSelectionListener(gui::navigateTo); | 32 | this.obfClasses.setSelectionListener(gui::navigateTo); |
| 33 | this.obfClasses.setRenameSelectionListener(gui::onPanelRename); | 33 | this.obfClasses.setRenameSelectionListener(gui::onPanelRename); |
| 34 | 34 | ||