summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorGravatar Thog2016-08-23 13:49:24 +0200
committerGravatar Thog2016-08-23 13:49:24 +0200
commit3a50fea029b9f0355cba1bf8f9c5bb941298bc4a (patch)
tree8e5abd22e8aaf4082b7e24d02f559a12c12c8714 /src/main/java
parentDon't trust Procyon for arguments positions (Fix #7) (diff)
downloadenigma-3a50fea029b9f0355cba1bf8f9c5bb941298bc4a.tar.gz
enigma-3a50fea029b9f0355cba1bf8f9c5bb941298bc4a.tar.xz
enigma-3a50fea029b9f0355cba1bf8f9c5bb941298bc4a.zip
Add the ability to rename package and classes in panels
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/cuchaz/enigma/Main.java2
-rw-r--r--src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java8
-rw-r--r--src/main/java/cuchaz/enigma/gui/ClassSelector.java133
-rw-r--r--src/main/java/cuchaz/enigma/gui/Gui.java19
-rw-r--r--src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java10
-rw-r--r--src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java13
-rw-r--r--src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java7
-rw-r--r--src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java5
-rw-r--r--src/main/java/cuchaz/enigma/gui/panels/PanelObf.java5
9 files changed, 165 insertions, 37 deletions
diff --git a/src/main/java/cuchaz/enigma/Main.java b/src/main/java/cuchaz/enigma/Main.java
index a1007cfe..9dad5015 100644
--- a/src/main/java/cuchaz/enigma/Main.java
+++ b/src/main/java/cuchaz/enigma/Main.java
@@ -33,7 +33,7 @@ public class Main {
33 } 33 }
34 34
35 // DEBUG 35 // DEBUG
36 //gui.getController().openDeclaration(new ClassEntry("none/asj")); 36 //gui.getController().openDeclaration(new ClassEntry("net/minecraft/item/Item"));
37 } 37 }
38 38
39 private static File getFile(String path) { 39 private static File getFile(String path) {
diff --git a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java
index ec639001..3cd1705a 100644
--- a/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java
+++ b/src/main/java/cuchaz/enigma/gui/ClassMatchingGui.java
@@ -131,8 +131,8 @@ public class ClassMatchingGui {
131 sourceTypePanel.add(button); 131 sourceTypePanel.add(button);
132 } 132 }
133 133
134 m_sourceClasses = new ClassSelector(ClassSelector.DEOBF_CLASS_COMPARATOR); 134 m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR);
135 m_sourceClasses.setListener(classEntry -> setSourceClass(classEntry)); 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);
138 138
@@ -147,8 +147,8 @@ 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(ClassSelector.DEOBF_CLASS_COMPARATOR); 150 m_destClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR);
151 m_destClasses.setListener(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);
154 154
diff --git a/src/main/java/cuchaz/enigma/gui/ClassSelector.java b/src/main/java/cuchaz/enigma/gui/ClassSelector.java
index 3df90420..ed0f6c8d 100644
--- a/src/main/java/cuchaz/enigma/gui/ClassSelector.java
+++ b/src/main/java/cuchaz/enigma/gui/ClassSelector.java
@@ -14,35 +14,42 @@ import com.google.common.collect.ArrayListMultimap;
14import com.google.common.collect.Lists; 14import com.google.common.collect.Lists;
15import com.google.common.collect.Maps; 15import com.google.common.collect.Maps;
16import com.google.common.collect.Multimap; 16import com.google.common.collect.Multimap;
17import cuchaz.enigma.gui.node.ClassSelectorClassNode;
18import cuchaz.enigma.gui.node.ClassSelectorPackageNode;
19import cuchaz.enigma.mapping.ClassEntry;
20import cuchaz.enigma.throwables.IllegalNameException;
17 21
22import javax.swing.*;
23import javax.swing.event.CellEditorListener;
24import javax.swing.event.ChangeEvent;
25import javax.swing.event.TreeSelectionEvent;
26import javax.swing.tree.*;
18import java.awt.event.MouseAdapter; 27import java.awt.event.MouseAdapter;
19import java.awt.event.MouseEvent; 28import java.awt.event.MouseEvent;
20import java.util.*; 29import java.util.*;
21 30
22import javax.swing.JTree;
23import javax.swing.tree.DefaultMutableTreeNode;
24import javax.swing.tree.DefaultTreeModel;
25import javax.swing.tree.TreePath;
26
27import cuchaz.enigma.gui.node.ClassSelectorClassNode;
28import cuchaz.enigma.gui.node.ClassSelectorPackageNode;
29import cuchaz.enigma.mapping.ClassEntry;
30
31public class ClassSelector extends JTree { 31public class ClassSelector extends JTree {
32 32
33 public static final Comparator<ClassEntry> DEOBF_CLASS_COMPARATOR = (a, b) -> a.getName().compareTo(b.getName()); 33 public static final Comparator<ClassEntry> DEOBF_CLASS_COMPARATOR = (a, b) -> a.getName().compareTo(b.getName());
34 private DefaultMutableTreeNode rootNodes;
34 35
35 public interface ClassSelectionListener { 36 public interface ClassSelectionListener {
36 void onSelectClass(ClassEntry classEntry); 37 void onSelectClass(ClassEntry classEntry);
37 } 38 }
38 39
39 private ClassSelectionListener listener; 40 public interface RenameSelectionListener {
41 void onSelectionRename(Object prevData, Object data, DefaultMutableTreeNode node);
42 }
43
44 private ClassSelectionListener selectionListener;
45 private RenameSelectionListener renameSelectionListener;
40 private Comparator<ClassEntry> comparator; 46 private Comparator<ClassEntry> comparator;
41 47
42 public ClassSelector(Comparator<ClassEntry> comparator) { 48 public ClassSelector(Gui gui, Comparator<ClassEntry> comparator) {
43 this.comparator = comparator; 49 this.comparator = comparator;
44 50
45 // configure the tree control 51 // configure the tree control
52 setEditable(gui != null);
46 setRootVisible(false); 53 setRootVisible(false);
47 setShowsRootHandles(false); 54 setShowsRootHandles(false);
48 setModel(null); 55 setModel(null);
@@ -51,23 +58,109 @@ public class ClassSelector extends JTree {
51 addMouseListener(new MouseAdapter() { 58 addMouseListener(new MouseAdapter() {
52 @Override 59 @Override
53 public void mouseClicked(MouseEvent event) { 60 public void mouseClicked(MouseEvent event) {
54 if (listener != null && event.getClickCount() == 2) { 61 if (selectionListener != null && event.getClickCount() == 2) {
55 // get the selected node 62 // get the selected node
56 TreePath path = getSelectionPath(); 63 TreePath path = getSelectionPath();
57 if (path != null && path.getLastPathComponent() instanceof ClassSelectorClassNode) { 64 if (path != null && path.getLastPathComponent() instanceof ClassSelectorClassNode) {
58 ClassSelectorClassNode node = (ClassSelectorClassNode) path.getLastPathComponent(); 65 ClassSelectorClassNode node = (ClassSelectorClassNode) path.getLastPathComponent();
59 listener.onSelectClass(node.getClassEntry()); 66 selectionListener.onSelectClass(node.getClassEntry());
60 } 67 }
61 } 68 }
62 } 69 }
63 }); 70 });
64 71
72 if (gui != null)
73 {
74 final JTree tree = this;
75
76 final DefaultTreeCellEditor editor = new DefaultTreeCellEditor(tree,
77 (DefaultTreeCellRenderer) tree.getCellRenderer())
78 {
79 @Override public boolean isCellEditable(EventObject event)
80 {
81 return !(event instanceof MouseEvent) && super.isCellEditable(event);
82 }
83 };
84 this.setCellEditor(editor);
85 editor.addCellEditorListener(new CellEditorListener()
86 {
87 @Override public void editingStopped(ChangeEvent e)
88 {
89 String data = editor.getCellEditorValue().toString();
90 TreePath path = getSelectionPath();
91
92 Object realPath = path.getLastPathComponent();
93 if (realPath != null && realPath instanceof DefaultMutableTreeNode && data != null)
94 {
95 DefaultMutableTreeNode node = (DefaultMutableTreeNode) realPath;
96 TreeNode parentNode = node.getParent();
97 if (parentNode == null)
98 return;
99 boolean allowEdit = true;
100 for (int i = 0; i < parentNode.getChildCount(); i++)
101 {
102 TreeNode childNode = parentNode.getChildAt(i);
103 if (childNode != null && childNode.toString().equals(data) && childNode != node)
104 {
105 allowEdit = false;
106 break;
107 }
108 }
109 if (allowEdit && renameSelectionListener != null)
110 {
111 Object prevData = node.getUserObject();
112 Object objectData = node.getUserObject() instanceof ClassEntry ? new ClassEntry(((ClassEntry)prevData).getPackageName() + "/" + data) : data;
113 try
114 {
115 renameSelectionListener.onSelectionRename(node.getUserObject(), objectData, node);
116 node.setUserObject(objectData);
117 } catch (IllegalNameException ex)
118 {
119 JOptionPane.showOptionDialog(gui.getFrame(), ex.getMessage(), "Enigma - Error", JOptionPane.OK_OPTION,
120 JOptionPane.ERROR_MESSAGE, null, new String[] {"Ok"}, "OK");
121 editor.cancelCellEditing();
122 }
123 }
124 else
125 editor.cancelCellEditing();
126 }
127
128 }
129
130 @Override public void editingCanceled(ChangeEvent e)
131 {
132 // NOP
133 }
134 });
135 }
65 // init defaults 136 // init defaults
66 this.listener = null; 137 this.selectionListener = null;
138 this.renameSelectionListener = null;
139 }
140
141 public boolean isDuplicate(Object[] nodes, String data)
142 {
143 int count = 0;
144
145 for (Object node : nodes)
146 {
147 if (node.toString().equals(data))
148 {
149 count++;
150 if (count == 2)
151 return true;
152 }
153 }
154 return false;
155 }
156
157 public void setSelectionListener(ClassSelectionListener val) {
158 this.selectionListener = val;
67 } 159 }
68 160
69 public void setListener(ClassSelectionListener val) { 161 public void setRenameSelectionListener(RenameSelectionListener renameSelectionListener)
70 this.listener = val; 162 {
163 this.renameSelectionListener = renameSelectionListener;
71 } 164 }
72 165
73 public void setClasses(Collection<ClassEntry> classEntries) { 166 public void setClasses(Collection<ClassEntry> classEntries) {
@@ -105,12 +198,12 @@ public class ClassSelector extends JTree {
105 } 198 }
106 }); 199 });
107 200
108 // create the root node and the package nodes 201 // create the rootNodes node and the package nodes
109 DefaultMutableTreeNode root = new DefaultMutableTreeNode(); 202 rootNodes = new DefaultMutableTreeNode();
110 for (String packageName : sortedPackageNames) { 203 for (String packageName : sortedPackageNames) {
111 ClassSelectorPackageNode node = new ClassSelectorPackageNode(packageName); 204 ClassSelectorPackageNode node = new ClassSelectorPackageNode(packageName);
112 packages.put(packageName, node); 205 packages.put(packageName, node);
113 root.add(node); 206 rootNodes.add(node);
114 } 207 }
115 208
116 // put the classes into packages 209 // put the classes into packages
@@ -133,7 +226,7 @@ public class ClassSelector extends JTree {
133 } 226 }
134 227
135 // finally, update the tree control 228 // finally, update the tree control
136 setModel(new DefaultTreeModel(root)); 229 setModel(new DefaultTreeModel(rootNodes));
137 230
138 restoreExpanstionState(this, 0, state); 231 restoreExpanstionState(this, 0, state);
139 } 232 }
diff --git a/src/main/java/cuchaz/enigma/gui/Gui.java b/src/main/java/cuchaz/enigma/gui/Gui.java
index fd59a816..bc49a3ff 100644
--- a/src/main/java/cuchaz/enigma/gui/Gui.java
+++ b/src/main/java/cuchaz/enigma/gui/Gui.java
@@ -36,6 +36,7 @@ import de.sciss.syntaxpane.DefaultSyntaxKit;
36import javax.swing.*; 36import javax.swing.*;
37import javax.swing.text.BadLocationException; 37import javax.swing.text.BadLocationException;
38import javax.swing.text.Highlighter; 38import javax.swing.text.Highlighter;
39import javax.swing.tree.DefaultMutableTreeNode;
39import javax.swing.tree.DefaultTreeModel; 40import javax.swing.tree.DefaultTreeModel;
40import javax.swing.tree.TreeNode; 41import javax.swing.tree.TreeNode;
41import javax.swing.tree.TreePath; 42import javax.swing.tree.TreePath;
@@ -750,4 +751,22 @@ public class Gui {
750 this.frame.validate(); 751 this.frame.validate();
751 this.frame.repaint(); 752 this.frame.repaint();
752 } 753 }
754
755 public void onPanelRename(Object prevData, Object data, DefaultMutableTreeNode node) throws IllegalNameException
756 {
757 // package rename
758 if (data instanceof String)
759 {
760 for (int i = 0; i < node.getChildCount(); i++)
761 {
762 DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
763 ClassEntry prevDataChild = (ClassEntry) childNode.getUserObject();
764 ClassEntry dataChild = new ClassEntry(data + "/" + prevDataChild.getSimpleName());
765 this.controller.rename(new EntryReference<>(prevDataChild, prevDataChild.getName()), dataChild.getName());
766 }
767 }
768 // class rename
769 else if (data instanceof ClassEntry)
770 this.controller.rename(new EntryReference<>((ClassEntry) prevData, ((ClassEntry) prevData).getName()), ((ClassEntry) data).getName());
771 }
753} 772}
diff --git a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java
index 60c6d8e8..30902c44 100644
--- a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java
+++ b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java
@@ -35,7 +35,6 @@ import cuchaz.enigma.analysis.SourceIndex;
35import cuchaz.enigma.analysis.Token; 35import cuchaz.enigma.analysis.Token;
36import cuchaz.enigma.convert.ClassMatches; 36import cuchaz.enigma.convert.ClassMatches;
37import cuchaz.enigma.convert.MemberMatches; 37import cuchaz.enigma.convert.MemberMatches;
38import cuchaz.enigma.gui.ClassSelector.ClassSelectionListener;
39import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter; 38import cuchaz.enigma.gui.highlight.DeobfuscatedHighlightPainter;
40import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter; 39import cuchaz.enigma.gui.highlight.ObfuscatedHighlightPainter;
41import cuchaz.enigma.mapping.ClassEntry; 40import cuchaz.enigma.mapping.ClassEntry;
@@ -139,13 +138,8 @@ public class MemberMatchingGui<T extends Entry> {
139 sourceTypePanel.add(button); 138 sourceTypePanel.add(button);
140 } 139 }
141 140
142 m_sourceClasses = new ClassSelector(ClassSelector.DEOBF_CLASS_COMPARATOR); 141 m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR);
143 m_sourceClasses.setListener(new ClassSelectionListener() { 142 m_sourceClasses.setSelectionListener(this::setSourceClass);
144 @Override
145 public void onSelectClass(ClassEntry classEntry) {
146 setSourceClass(classEntry);
147 }
148 });
149 JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); 143 JScrollPane sourceScroller = new JScrollPane(m_sourceClasses);
150 classesPanel.add(sourceScroller); 144 classesPanel.add(sourceScroller);
151 145
diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java
index e0835725..1c9dad4b 100644
--- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java
+++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorClassNode.java
@@ -20,6 +20,7 @@ public class ClassSelectorClassNode extends DefaultMutableTreeNode {
20 20
21 public ClassSelectorClassNode(ClassEntry classEntry) { 21 public ClassSelectorClassNode(ClassEntry classEntry) {
22 this.classEntry = classEntry; 22 this.classEntry = classEntry;
23 this.setUserObject(classEntry);
23 } 24 }
24 25
25 public ClassEntry getClassEntry() { 26 public ClassEntry getClassEntry() {
@@ -36,6 +37,18 @@ public class ClassSelectorClassNode extends DefaultMutableTreeNode {
36 return other instanceof ClassSelectorClassNode && equals((ClassSelectorClassNode) other); 37 return other instanceof ClassSelectorClassNode && equals((ClassSelectorClassNode) other);
37 } 38 }
38 39
40 @Override public void setUserObject(Object userObject)
41 {
42 String packageName = "";
43 if (classEntry.getPackageName() != null)
44 packageName = classEntry.getPackageName() + "/";
45 if (userObject instanceof String)
46 this.classEntry = new ClassEntry(packageName + userObject);
47 else if (userObject instanceof ClassEntry)
48 this.classEntry = (ClassEntry) userObject;
49 super.setUserObject(classEntry);
50 }
51
39 public boolean equals(ClassSelectorClassNode other) { 52 public boolean equals(ClassSelectorClassNode other) {
40 return this.classEntry.equals(other.classEntry); 53 return this.classEntry.equals(other.classEntry);
41 } 54 }
diff --git a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java
index dfdc765b..ee3009ae 100644
--- a/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java
+++ b/src/main/java/cuchaz/enigma/gui/node/ClassSelectorPackageNode.java
@@ -24,6 +24,13 @@ public class ClassSelectorPackageNode extends DefaultMutableTreeNode {
24 return packageName; 24 return packageName;
25 } 25 }
26 26
27 @Override public void setUserObject(Object userObject)
28 {
29 if (userObject instanceof String)
30 this.packageName = (String) userObject;
31 super.setUserObject(userObject);
32 }
33
27 @Override 34 @Override
28 public String toString() { 35 public String toString() {
29 return this.packageName; 36 return this.packageName;
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
index bba71327..447c51af 100644
--- a/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
+++ b/src/main/java/cuchaz/enigma/gui/panels/PanelDeobf.java
@@ -17,8 +17,9 @@ 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(ClassSelector.DEOBF_CLASS_COMPARATOR); 20 this.deobfClasses = new ClassSelector(gui, ClassSelector.DEOBF_CLASS_COMPARATOR);
21 this.deobfClasses.setListener(gui::navigateTo); 21 this.deobfClasses.setSelectionListener(gui::navigateTo);
22 this.deobfClasses.setRenameSelectionListener(gui::onPanelRename);
22 23
23 this.setLayout(new BorderLayout()); 24 this.setLayout(new BorderLayout());
24 this.add(new JLabel("De-obfuscated Classes"), BorderLayout.NORTH); 25 this.add(new JLabel("De-obfuscated Classes"), BorderLayout.NORTH);
diff --git a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
index 94b384fd..74772a5f 100644
--- a/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
+++ b/src/main/java/cuchaz/enigma/gui/panels/PanelObf.java
@@ -28,8 +28,9 @@ public class PanelObf extends JPanel {
28 return aname.compareTo(bname); 28 return aname.compareTo(bname);
29 }; 29 };
30 30
31 this.obfClasses = new ClassSelector(obfClassComparator); 31 this.obfClasses = new ClassSelector(gui, obfClassComparator);
32 this.obfClasses.setListener(gui::navigateTo); 32 this.obfClasses.setSelectionListener(gui::navigateTo);
33 this.obfClasses.setRenameSelectionListener(gui::onPanelRename);
33 34
34 this.setLayout(new BorderLayout()); 35 this.setLayout(new BorderLayout());
35 this.add(new JLabel("Obfuscated Classes"), BorderLayout.NORTH); 36 this.add(new JLabel("Obfuscated Classes"), BorderLayout.NORTH);