summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/cuchaz/enigma/gui/ClassSelector.java94
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java48
-rw-r--r--src/main/java/cuchaz/enigma/gui/GuiController.java28
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;
22import javax.swing.*; 22import javax.swing.*;
23import javax.swing.event.CellEditorListener; 23import javax.swing.event.CellEditorListener;
24import javax.swing.event.ChangeEvent; 24import javax.swing.event.ChangeEvent;
25import javax.swing.event.TreeSelectionEvent; 25import javax.swing.event.TreeModelEvent;
26import javax.swing.event.TreeModelListener;
26import javax.swing.tree.*; 27import javax.swing.tree.*;
27import java.awt.event.MouseAdapter; 28import java.awt.event.MouseAdapter;
28import java.awt.event.MouseEvent; 29import 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;
24import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; 24import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter;
25import cuchaz.enigma.gui.highlight.OtherHighlightPainter; 25import cuchaz.enigma.gui.highlight.OtherHighlightPainter;
26import cuchaz.enigma.gui.highlight.SelectionHighlightPainter; 26import cuchaz.enigma.gui.highlight.SelectionHighlightPainter;
27import cuchaz.enigma.gui.node.ClassSelectorPackageNode;
27import cuchaz.enigma.gui.panels.PanelDeobf; 28import cuchaz.enigma.gui.panels.PanelDeobf;
28import cuchaz.enigma.gui.panels.PanelEditor; 29import cuchaz.enigma.gui.panels.PanelEditor;
29import cuchaz.enigma.gui.panels.PanelIdentifier; 30import cuchaz.enigma.gui.panels.PanelIdentifier;
@@ -49,7 +50,6 @@ import java.util.Collections;
49import java.util.List; 50import java.util.List;
50import java.util.Vector; 51import java.util.Vector;
51import java.util.function.Function; 52import java.util.function.Function;
52import java.util.function.Supplier;
53 53
54public class Gui { 54public 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
13import com.google.common.collect.Lists; 13import com.google.common.collect.Lists;
14import com.google.common.collect.Queues; 14import com.google.common.collect.Queues;
15
16import com.strobel.decompiler.languages.java.ast.CompilationUnit; 15import com.strobel.decompiler.languages.java.ast.CompilationUnit;
16import cuchaz.enigma.Deobfuscator;
17import cuchaz.enigma.analysis.*;
18import cuchaz.enigma.gui.dialog.ProgressDialog;
19import cuchaz.enigma.mapping.*;
20import cuchaz.enigma.throwables.MappingParseException;
21import cuchaz.enigma.utils.ReadableToken;
17 22
18import java.io.File; 23import java.io.File;
19import java.io.FileWriter;
20import java.io.IOException; 24import java.io.IOException;
21import java.util.Collection; 25import java.util.Collection;
22import java.util.Deque; 26import java.util.Deque;
23import java.util.List; 27import java.util.List;
24import java.util.jar.JarFile; 28import java.util.jar.JarFile;
25 29
26import cuchaz.enigma.Deobfuscator;
27import cuchaz.enigma.analysis.*;
28import cuchaz.enigma.gui.dialog.ProgressDialog;
29import cuchaz.enigma.mapping.*;
30import cuchaz.enigma.throwables.MappingParseException;
31import cuchaz.enigma.utils.ReadableToken;
32
33public class GuiController { 30public 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