diff options
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/ClassSelector.java | 94 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/Gui.java | 48 | ||||
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/GuiController.java | 28 |
3 files changed, 152 insertions, 18 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java index ed0f6c8d..98880cd6 100644 --- a/src/main/java/cuchaz/enigma/gui/ClassSelector.java +++ b/src/main/java/cuchaz/enigma/gui/ClassSelector.java | |||
| @@ -22,7 +22,8 @@ import cuchaz.enigma.throwables.IllegalNameException; | |||
| 22 | import javax.swing.*; | 22 | import javax.swing.*; |
| 23 | import javax.swing.event.CellEditorListener; | 23 | import javax.swing.event.CellEditorListener; |
| 24 | import javax.swing.event.ChangeEvent; | 24 | import javax.swing.event.ChangeEvent; |
| 25 | import javax.swing.event.TreeSelectionEvent; | 25 | import javax.swing.event.TreeModelEvent; |
| 26 | import javax.swing.event.TreeModelListener; | ||
| 26 | import javax.swing.tree.*; | 27 | import javax.swing.tree.*; |
| 27 | import java.awt.event.MouseAdapter; | 28 | import java.awt.event.MouseAdapter; |
| 28 | import java.awt.event.MouseEvent; | 29 | import java.awt.event.MouseEvent; |
| @@ -294,7 +295,7 @@ public class ClassSelector extends JTree { | |||
| 294 | } | 295 | } |
| 295 | } | 296 | } |
| 296 | 297 | ||
| 297 | public Iterable<ClassSelectorPackageNode> packageNodes() { | 298 | public List<ClassSelectorPackageNode> packageNodes() { |
| 298 | List<ClassSelectorPackageNode> nodes = Lists.newArrayList(); | 299 | List<ClassSelectorPackageNode> nodes = Lists.newArrayList(); |
| 299 | DefaultMutableTreeNode root = (DefaultMutableTreeNode)getModel().getRoot(); | 300 | DefaultMutableTreeNode root = (DefaultMutableTreeNode)getModel().getRoot(); |
| 300 | Enumeration<?> children = root.children(); | 301 | Enumeration<?> children = root.children(); |
| @@ -305,7 +306,7 @@ public class ClassSelector extends JTree { | |||
| 305 | return nodes; | 306 | return nodes; |
| 306 | } | 307 | } |
| 307 | 308 | ||
| 308 | public Iterable<ClassSelectorClassNode> classNodes(ClassSelectorPackageNode packageNode) { | 309 | public List<ClassSelectorClassNode> classNodes(ClassSelectorPackageNode packageNode) { |
| 309 | List<ClassSelectorClassNode> nodes = Lists.newArrayList(); | 310 | List<ClassSelectorClassNode> nodes = Lists.newArrayList(); |
| 310 | Enumeration<?> children = packageNode.children(); | 311 | Enumeration<?> children = packageNode.children(); |
| 311 | while (children.hasMoreElements()) { | 312 | while (children.hasMoreElements()) { |
| @@ -351,6 +352,15 @@ public class ClassSelector extends JTree { | |||
| 351 | return null; | 352 | return null; |
| 352 | } | 353 | } |
| 353 | 354 | ||
| 355 | public ClassSelectorPackageNode getPackageNode(ClassSelector selector, ClassEntry entry) | ||
| 356 | { | ||
| 357 | ClassSelectorPackageNode packageNode = getPackageNode(entry); | ||
| 358 | |||
| 359 | if (selector != null && packageNode == null && selector.getPackageNode(entry) != null) | ||
| 360 | return selector.getPackageNode(entry); | ||
| 361 | return packageNode; | ||
| 362 | } | ||
| 363 | |||
| 354 | public ClassEntry getNextClass(ClassEntry entry) { | 364 | public ClassEntry getNextClass(ClassEntry entry) { |
| 355 | boolean foundIt = false; | 365 | boolean foundIt = false; |
| 356 | for (ClassSelectorPackageNode packageNode : packageNodes()) { | 366 | for (ClassSelectorPackageNode packageNode : packageNodes()) { |
| @@ -388,4 +398,82 @@ public class ClassSelector extends JTree { | |||
| 388 | } | 398 | } |
| 389 | } | 399 | } |
| 390 | } | 400 | } |
| 401 | |||
| 402 | public void removeNode(ClassSelectorPackageNode packageNode, ClassEntry entry) | ||
| 403 | { | ||
| 404 | DefaultTreeModel model = (DefaultTreeModel) getModel(); | ||
| 405 | |||
| 406 | if (packageNode == null) | ||
| 407 | return; | ||
| 408 | |||
| 409 | for (int i = 0; i < packageNode.getChildCount(); i++) | ||
| 410 | { | ||
| 411 | DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) packageNode.getChildAt(i); | ||
| 412 | if (childNode.getUserObject() instanceof ClassEntry && childNode.getUserObject().equals(entry)) | ||
| 413 | { | ||
| 414 | model.removeNodeFromParent(childNode); | ||
| 415 | break; | ||
| 416 | } | ||
| 417 | } | ||
| 418 | } | ||
| 419 | |||
| 420 | public void removeNodeIfEmpty(ClassSelectorPackageNode packageNode) | ||
| 421 | { | ||
| 422 | if (packageNode != null && packageNode.getChildCount() == 0) | ||
| 423 | ((DefaultTreeModel) getModel()).removeNodeFromParent(packageNode); | ||
| 424 | } | ||
| 425 | |||
| 426 | public void moveClassTree(ClassEntry oldClassEntry, ClassEntry newClassEntry, ClassSelector otherSelector) | ||
| 427 | { | ||
| 428 | if (otherSelector == null) | ||
| 429 | removeNode(getPackageNode(oldClassEntry), oldClassEntry); | ||
| 430 | insertNode(getOrCreate(newClassEntry), newClassEntry); | ||
| 431 | } | ||
| 432 | |||
| 433 | public ClassSelectorPackageNode getOrCreate(ClassEntry entry) | ||
| 434 | { | ||
| 435 | DefaultTreeModel model = (DefaultTreeModel) getModel(); | ||
| 436 | ClassSelectorPackageNode newPackageNode = getPackageNode(entry); | ||
| 437 | if (newPackageNode == null) | ||
| 438 | { | ||
| 439 | newPackageNode = new ClassSelectorPackageNode(entry.getPackageName()); | ||
| 440 | model.insertNodeInto(newPackageNode, (MutableTreeNode) model.getRoot(), getPlacementIndex(newPackageNode)); | ||
| 441 | } | ||
| 442 | return newPackageNode; | ||
| 443 | } | ||
| 444 | |||
| 445 | public void insertNode(ClassSelectorPackageNode packageNode, ClassEntry entry) | ||
| 446 | { | ||
| 447 | DefaultTreeModel model = (DefaultTreeModel) getModel(); | ||
| 448 | ClassSelectorClassNode classNode = new ClassSelectorClassNode(entry); | ||
| 449 | model.insertNodeInto(classNode, packageNode, getPlacementIndex(packageNode, classNode)); | ||
| 450 | } | ||
| 451 | |||
| 452 | private int getPlacementIndex(ClassSelectorPackageNode newPackageNode, ClassSelectorClassNode classNode) | ||
| 453 | { | ||
| 454 | List<ClassSelectorClassNode> classNodes = classNodes(newPackageNode); | ||
| 455 | classNodes.add(classNode); | ||
| 456 | Collections.sort(classNodes, (a, b) -> a.toString().compareTo(b.toString())); | ||
| 457 | for (int i = 0; i < classNodes.size(); i++) | ||
| 458 | if (classNodes.get(i) == classNode) | ||
| 459 | return i; | ||
| 460 | |||
| 461 | return 0; | ||
| 462 | } | ||
| 463 | |||
| 464 | private int getPlacementIndex(ClassSelectorPackageNode newPackageNode) | ||
| 465 | { | ||
| 466 | List<ClassSelectorPackageNode> packageNodes = packageNodes(); | ||
| 467 | if (!packageNodes.contains(newPackageNode)) | ||
| 468 | { | ||
| 469 | packageNodes.add(newPackageNode); | ||
| 470 | Collections.sort(packageNodes, (a, b) -> a.toString().compareTo(b.toString())); | ||
| 471 | } | ||
| 472 | |||
| 473 | for (int i = 0; i < packageNodes.size(); i++) | ||
| 474 | if (packageNodes.get(i) == newPackageNode) | ||
| 475 | return i; | ||
| 476 | |||
| 477 | return 0; | ||
| 478 | } | ||
| 391 | } | 479 | } |
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java index bc49a3ff..9fd824b8 100644 --- a/src/main/java/cuchaz/enigma/gui/Gui.java +++ b/src/main/java/cuchaz/enigma/gui/Gui.java | |||
| @@ -24,6 +24,7 @@ import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; | |||
| 24 | import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; | 24 | import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; |
| 25 | import cuchaz.enigma.gui.highlight.OtherHighlightPainter; | 25 | import cuchaz.enigma.gui.highlight.OtherHighlightPainter; |
| 26 | import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; | 26 | import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; |
| 27 | import cuchaz.enigma.gui.node.ClassSelectorPackageNode; | ||
| 27 | import cuchaz.enigma.gui.panels.PanelDeobf; | 28 | import cuchaz.enigma.gui.panels.PanelDeobf; |
| 28 | import cuchaz.enigma.gui.panels.PanelEditor; | 29 | import cuchaz.enigma.gui.panels.PanelEditor; |
| 29 | import cuchaz.enigma.gui.panels.PanelIdentifier; | 30 | import cuchaz.enigma.gui.panels.PanelIdentifier; |
| @@ -49,7 +50,6 @@ import java.util.Collections; | |||
| 49 | import java.util.List; | 50 | import java.util.List; |
| 50 | import java.util.Vector; | 51 | import java.util.Vector; |
| 51 | import java.util.function.Function; | 52 | import java.util.function.Function; |
| 52 | import java.util.function.Supplier; | ||
| 53 | 53 | ||
| 54 | public class Gui { | 54 | public class Gui { |
| 55 | 55 | ||
| @@ -762,11 +762,53 @@ public class Gui { | |||
| 762 | DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i); | 762 | DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i); |
| 763 | ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject(); | 763 | ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject(); |
| 764 | ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName()); | 764 | ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName()); |
| 765 | this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName()); | 765 | this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName(), false); |
| 766 | } | 766 | } |
| 767 | } | 767 | } |
| 768 | // class rename | 768 | // class rename |
| 769 | else if (data instanceof ClassEntry) | 769 | else if (data instanceof ClassEntry) |
| 770 | this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName()); | 770 | this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName(), false); |
| 771 | } | ||
| 772 | |||
| 773 | public void moveClassTree(EntryReference<Entry, Entry> deobfReference, String newName) | ||
| 774 | { | ||
| 775 | ClassEntry oldEntry = deobfReference.entry.getClassEntry(); | ||
| 776 | ClassEntry newEntry = new ClassEntry(newName); | ||
| 777 | moveClassTree(deobfReference, newName, oldEntry.getPackageName().equals(Constants.NONE_PACKAGE), | ||
| 778 | newEntry.getClassEntry().getPackageName().equals(Constants.NONE_PACKAGE)); | ||
| 779 | } | ||
| 780 | |||
| 781 | public void moveClassTree(EntryReference<Entry, Entry> deobfReference, String newName, boolean isOldOb, boolean isNewOb) | ||
| 782 | { | ||
| 783 | ClassEntry oldEntry = deobfReference.entry.getClassEntry(); | ||
| 784 | ClassEntry newEntry = new ClassEntry(newName); | ||
| 785 | |||
| 786 | // Ob -> deob | ||
| 787 | if (isOldOb && !isNewOb) | ||
| 788 | { | ||
| 789 | this.deobfPanel.deobfClasses.moveClassTree(oldEntry, newEntry, obfPanel.obfClasses); | ||
| 790 | ClassSelectorPackageNode packageNode = this.obfPanel.obfClasses.getPackageNode(oldEntry); | ||
| 791 | this.obfPanel.obfClasses.removeNode(packageNode, oldEntry); | ||
| 792 | this.obfPanel.obfClasses.removeNodeIfEmpty(packageNode); | ||
| 793 | } | ||
| 794 | // Deob -> ob | ||
| 795 | else if (isNewOb && !isOldOb) | ||
| 796 | { | ||
| 797 | this.obfPanel.obfClasses.moveClassTree(oldEntry, newEntry, deobfPanel.deobfClasses); | ||
| 798 | ClassSelectorPackageNode packageNode = this.deobfPanel.deobfClasses.getPackageNode(oldEntry); | ||
| 799 | this.deobfPanel.deobfClasses.removeNode(packageNode, oldEntry); | ||
| 800 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(packageNode); | ||
| 801 | } | ||
| 802 | // Local move | ||
| 803 | else if (isOldOb) | ||
| 804 | { | ||
| 805 | this.obfPanel.obfClasses.moveClassTree(oldEntry, newEntry, null); | ||
| 806 | this.obfPanel.obfClasses.removeNodeIfEmpty(this.obfPanel.obfClasses.getPackageNode(oldEntry)); | ||
| 807 | } | ||
| 808 | else | ||
| 809 | { | ||
| 810 | this.deobfPanel.deobfClasses.moveClassTree(oldEntry, newEntry, null); | ||
| 811 | this.deobfPanel.deobfClasses.removeNodeIfEmpty(this.deobfPanel.deobfClasses.getPackageNode(oldEntry)); | ||
| 812 | } | ||
| 771 | } | 813 | } |
| 772 | } | 814 | } |
diff --git a/src/main/java/cuchaz/enigma/gui/GuiController.java b/src/main/java/cuchaz/enigma/gui/GuiController.java index cc645d8a..e466f637 100644 --- a/src/main/java/cuchaz/enigma/gui/GuiController.java +++ b/src/main/java/cuchaz/enigma/gui/GuiController.java | |||
| @@ -12,24 +12,21 @@ package cuchaz.enigma.gui; | |||
| 12 | 12 | ||
| 13 | import com.google.common.collect.Lists; | 13 | import com.google.common.collect.Lists; |
| 14 | import com.google.common.collect.Queues; | 14 | import com.google.common.collect.Queues; |
| 15 | |||
| 16 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; | 15 | import com.strobel.decompiler.languages.java.ast.CompilationUnit; |
| 16 | import cuchaz.enigma.Deobfuscator; | ||
| 17 | import cuchaz.enigma.analysis.*; | ||
| 18 | import cuchaz.enigma.gui.dialog.ProgressDialog; | ||
| 19 | import cuchaz.enigma.mapping.*; | ||
| 20 | import cuchaz.enigma.throwables.MappingParseException; | ||
| 21 | import cuchaz.enigma.utils.ReadableToken; | ||
| 17 | 22 | ||
| 18 | import java.io.File; | 23 | import java.io.File; |
| 19 | import java.io.FileWriter; | ||
| 20 | import java.io.IOException; | 24 | import java.io.IOException; |
| 21 | import java.util.Collection; | 25 | import java.util.Collection; |
| 22 | import java.util.Deque; | 26 | import java.util.Deque; |
| 23 | import java.util.List; | 27 | import java.util.List; |
| 24 | import java.util.jar.JarFile; | 28 | import java.util.jar.JarFile; |
| 25 | 29 | ||
| 26 | import cuchaz.enigma.Deobfuscator; | ||
| 27 | import cuchaz.enigma.analysis.*; | ||
| 28 | import cuchaz.enigma.gui.dialog.ProgressDialog; | ||
| 29 | import cuchaz.enigma.mapping.*; | ||
| 30 | import cuchaz.enigma.throwables.MappingParseException; | ||
| 31 | import cuchaz.enigma.utils.ReadableToken; | ||
| 32 | |||
| 33 | public class GuiController { | 30 | public class GuiController { |
| 34 | 31 | ||
| 35 | private Deobfuscator deobfuscator; | 32 | private Deobfuscator deobfuscator; |
| @@ -192,18 +189,26 @@ public class GuiController { | |||
| 192 | } | 189 | } |
| 193 | 190 | ||
| 194 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName) { | 191 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName) { |
| 192 | rename(deobfReference, newName, true); | ||
| 193 | } | ||
| 194 | |||
| 195 | public void rename(EntryReference<Entry, Entry> deobfReference, String newName, boolean refreshClassTree) | ||
| 196 | { | ||
| 195 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); | 197 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); |
| 196 | this.deobfuscator.rename(obfReference.getNameableEntry(), newName); | 198 | this.deobfuscator.rename(obfReference.getNameableEntry(), newName); |
| 197 | this.isDirty = true; | 199 | this.isDirty = true; |
| 198 | refreshClasses(); | 200 | |
| 201 | if (refreshClassTree) | ||
| 202 | this.gui.moveClassTree(deobfReference, newName); | ||
| 199 | refreshCurrentClass(obfReference); | 203 | refreshCurrentClass(obfReference); |
| 204 | |||
| 200 | } | 205 | } |
| 201 | 206 | ||
| 202 | public void removeMapping(EntryReference<Entry, Entry> deobfReference) { | 207 | public void removeMapping(EntryReference<Entry, Entry> deobfReference) { |
| 203 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); | 208 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); |
| 204 | this.deobfuscator.removeMapping(obfReference.getNameableEntry()); | 209 | this.deobfuscator.removeMapping(obfReference.getNameableEntry()); |
| 205 | this.isDirty = true; | 210 | this.isDirty = true; |
| 206 | refreshClasses(); | 211 | this.gui.moveClassTree(deobfReference, obfReference.entry.getName(), false, true); |
| 207 | refreshCurrentClass(obfReference); | 212 | refreshCurrentClass(obfReference); |
| 208 | } | 213 | } |
| 209 | 214 | ||
| @@ -211,7 +216,6 @@ public class GuiController { | |||
| 211 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); | 216 | EntryReference<Entry, Entry> obfReference = this.deobfuscator.obfuscateReference(deobfReference); |
| 212 | this.deobfuscator.markAsDeobfuscated(obfReference.getNameableEntry()); | 217 | this.deobfuscator.markAsDeobfuscated(obfReference.getNameableEntry()); |
| 213 | this.isDirty = true; | 218 | this.isDirty = true; |
| 214 | refreshClasses(); | ||
| 215 | refreshCurrentClass(obfReference); | 219 | refreshCurrentClass(obfReference); |
| 216 | } | 220 | } |
| 217 | 221 | ||