From f0be2737087ae82c986a44d6d5bb648ed9a758b3 Mon Sep 17 00:00:00 2001 From: Thog Date: Fri, 28 Oct 2016 00:08:07 +0200 Subject: Fix order of packages, hanging of Enigma and classes nodes not renamed when package is renamed (#25) --- src/main/java/cuchaz/enigma/Deobfuscator.java | 7 ++- .../java/cuchaz/enigma/gui/ClassMatchingGui.java | 4 +- src/main/java/cuchaz/enigma/gui/ClassSelector.java | 51 ++++++++++++++++++++-- src/main/java/cuchaz/enigma/gui/Gui.java | 14 +++++- src/main/java/cuchaz/enigma/gui/GuiController.java | 6 +-- .../java/cuchaz/enigma/gui/MemberMatchingGui.java | 2 +- .../enigma/gui/node/ClassSelectorClassNode.java | 5 +++ .../enigma/gui/node/ClassSelectorPackageNode.java | 7 ++- .../java/cuchaz/enigma/gui/panels/PanelDeobf.java | 2 +- .../java/cuchaz/enigma/gui/panels/PanelObf.java | 2 +- 10 files changed, 85 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/main/java/cuchaz/enigma/Deobfuscator.java b/src/main/java/cuchaz/enigma/Deobfuscator.java index 22194ad..ca38754 100644 --- a/src/main/java/cuchaz/enigma/Deobfuscator.java +++ b/src/main/java/cuchaz/enigma/Deobfuscator.java @@ -543,6 +543,10 @@ public class Deobfuscator { } public void rename(Entry obfEntry, String newName) { + rename(obfEntry, newName, true); + } + + public void rename(Entry obfEntry, String newName, boolean clearCache) { if (obfEntry instanceof ClassEntry) { this.renamer.setClassName((ClassEntry) obfEntry, Descriptor.toJvmName(newName)); } else if (obfEntry instanceof FieldEntry) { @@ -560,7 +564,8 @@ public class Deobfuscator { } // clear caches - this.translatorCache.clear(); + if (clearCache) + this.translatorCache.clear(); } 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 3cd1705..edf1e30 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 { sourceTypePanel.add(button); } - m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); + m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); m_sourceClasses.setSelectionListener(this::setSourceClass); JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); sourcePanel.add(sourceScroller); @@ -147,7 +147,7 @@ public class ClassMatchingGui { destPanel.add(m_top10Matches); m_top10Matches.addActionListener(event -> toggleTop10Matches()); - m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); + m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); m_destClasses.setSelectionListener(this::setDestClass); JScrollPane destScroller = new JScrollPane(m_destClasses); destPanel.add(destScroller); diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java index 92fcaba..c6ef0e2 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 { private RenameSelectionListener renameSelectionListener; private Comparator comparator; - public ClassSelector(Gui gui, Comparator comparator) { + public ClassSelector(Gui gui, Comparator comparator, boolean isRenamable) { this.comparator = comparator; // configure the tree control @@ -77,7 +77,7 @@ public class ClassSelector extends JTree { { @Override public boolean isCellEditable(EventObject event) { - return !(event instanceof MouseEvent) && super.isCellEditable(event); + return isRenamable && !(event instanceof MouseEvent) && super.isCellEditable(event); } }; this.setCellEditor(editor); @@ -112,7 +112,7 @@ public class ClassSelector extends JTree { try { renameSelectionListener.onSelectionRename(node.getUserObject(), objectData, node); - node.setUserObject(objectData); + node.setUserObject(objectData); // Make sure that it's modified } catch (IllegalNameException ex) { JOptionPane.showOptionDialog(gui.getFrame(), ex.getMessage(), "Enigma - Error", JOptionPane.OK_OPTION, @@ -447,6 +447,51 @@ public class ClassSelector extends JTree { model.insertNodeInto(classNode, packageNode, getPlacementIndex(packageNode, classNode)); } + public void reload() + { + DefaultTreeModel model = (DefaultTreeModel) getModel(); + model.reload(sort(rootNodes)); + } + + private DefaultMutableTreeNode sort(DefaultMutableTreeNode node) { + + for(int i = 0; i < node.getChildCount() - 1; i++) { + DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); + if (child == null) + continue; + String nt = child.toString(); + + for(int j = i + 1; j <= node.getChildCount() - 1; j++) { + DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); + if (prevNode == null || prevNode.getUserObject() == null) + continue; + String np = prevNode.getUserObject().toString(); + + if(nt.compareToIgnoreCase(np) > 0) { + node.insert(child, j); + node.insert(prevNode, i); + } + } + if(child.getChildCount() > 0) { + sort(child); + } + } + + for(int i = 0; i < node.getChildCount() - 1; i++) { + DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); + for(int j = i + 1; j <= node.getChildCount() - 1; j++) { + DefaultMutableTreeNode prevNode = (DefaultMutableTreeNode) node.getChildAt(j); + + if(!prevNode.isLeaf() && child.isLeaf()) { + node.insert(child, j); + node.insert(prevNode, i); + } + } + } + + return node; + } + private int getPlacementIndex(ClassSelectorPackageNode newPackageNode, ClassSelectorClassNode classNode) { List classNodes = classNodes(newPackageNode); diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index 2a35507..6d9ea1d 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 { DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i); ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject(); ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName()); - this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName(), false); + this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName(), false, i + 1 == node.getChildCount()); + childNode.setUserObject(dataChild); } + node.setUserObject(data); + // Ob package will never be modified, just reload deob view + this.deobfPanel.deobfClasses.reload(); } // class rename else if (data instanceof ClassEntry) - this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName(), false); + this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName(), false, true); } public void moveClassTree(EntryReference deobfReference, String newName) @@ -806,6 +810,8 @@ public class Gui { ClassSelectorPackageNode packageNode = this.obfPanel.obfClasses.getPackageNode(oldEntry); this.obfPanel.obfClasses.removeNode(packageNode, oldEntry); this.obfPanel.obfClasses.removeNodeIfEmpty(packageNode); + this.deobfPanel.deobfClasses.reload(); + this.obfPanel.obfClasses.reload(); } // Deob -> ob else if (isNewOb && !isOldOb) @@ -814,17 +820,21 @@ public class Gui { ClassSelectorPackageNode packageNode = this.deobfPanel.deobfClasses.getPackageNode(oldEntry); this.deobfPanel.deobfClasses.removeNode(packageNode, oldEntry); this.deobfPanel.deobfClasses.removeNodeIfEmpty(packageNode); + this.deobfPanel.deobfClasses.reload(); + this.obfPanel.obfClasses.reload(); } // Local move else if (isOldOb) { this.obfPanel.obfClasses.moveClassTree(oldEntry, newEntry, null); this.obfPanel.obfClasses.removeNodeIfEmpty(this.obfPanel.obfClasses.getPackageNode(oldEntry)); + this.obfPanel.obfClasses.reload(); } else { this.deobfPanel.deobfClasses.moveClassTree(oldEntry, newEntry, null); this.deobfPanel.deobfClasses.removeNodeIfEmpty(this.deobfPanel.deobfClasses.getPackageNode(oldEntry)); + this.deobfPanel.deobfClasses.reload(); } } } diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index 2d0f7ae..70fb4cf 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 { } public void rename(EntryReference deobfReference, String newName) { - rename(deobfReference, newName, true); + rename(deobfReference, newName, true, true); } - public void rename(EntryReference deobfReference, String newName, boolean refreshClassTree) + public void rename(EntryReference deobfReference, String newName, boolean refreshClassTree, boolean clearTranslationCache) { EntryReference obfReference = this.deobfuscator.obfuscateReference(deobfReference); - this.deobfuscator.rename(obfReference.getNameableEntry(), newName); + this.deobfuscator.rename(obfReference.getNameableEntry(), newName, clearTranslationCache); this.isDirty = true; 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 5055091..ecc280d 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 { sourceTypePanel.add(button); } - m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR); + m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); m_sourceClasses.setSelectionListener(this::setSourceClass); JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); 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 1c9dad4..8341826 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 { super.setUserObject(classEntry); } + @Override public Object getUserObject() + { + return classEntry; + } + public boolean equals(ClassSelectorClassNode other) { return this.classEntry.equals(other.classEntry); } diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java index 629d20c..31b4ebf 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 { super.setUserObject(userObject); } + @Override public Object getUserObject() + { + return packageName; + } + @Override public String toString() { - return Descriptor.toJavaName(this.packageName); + return !packageName.equals("(none)") ? Descriptor.toJavaName(this.packageName) : "(none)"; } @Override diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java index 447c51a..4f55175 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 { public PanelDeobf(Gui gui) { this.gui = gui; - this.deobfClasses = new ClassSelector(gui, ClassSelector.DEOBF_CLASS_COMPARATOR); + this.deobfClasses = new ClassSelector(gui, ClassSelector.DEOBF_CLASS_COMPARATOR, true); this.deobfClasses.setSelectionListener(gui::navigateTo); this.deobfClasses.setRenameSelectionListener(gui::onPanelRename); diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java index 74772a5..27bb70b 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 { return aname.compareTo(bname); }; - this.obfClasses = new ClassSelector(gui, obfClassComparator); + this.obfClasses = new ClassSelector(gui, obfClassComparator, false); this.obfClasses.setSelectionListener(gui::navigateTo); this.obfClasses.setRenameSelectionListener(gui::onPanelRename); -- cgit v1.2.3