diff options
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java | 281 |
1 files changed, 122 insertions, 159 deletions
diff --git a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java index ecc280d..671f85f 100644 --- a/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java +++ b/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java | |||
| @@ -17,7 +17,6 @@ import java.awt.BorderLayout; | |||
| 17 | import java.awt.Container; | 17 | import java.awt.Container; |
| 18 | import java.awt.Dimension; | 18 | import java.awt.Dimension; |
| 19 | import java.awt.FlowLayout; | 19 | import java.awt.FlowLayout; |
| 20 | import java.awt.event.ActionEvent; | ||
| 21 | import java.awt.event.ActionListener; | 20 | import java.awt.event.ActionListener; |
| 22 | import java.awt.event.KeyAdapter; | 21 | import java.awt.event.KeyAdapter; |
| 23 | import java.awt.event.KeyEvent; | 22 | import java.awt.event.KeyEvent; |
| @@ -30,7 +29,6 @@ import javax.swing.text.Highlighter.HighlightPainter; | |||
| 30 | 29 | ||
| 31 | import cuchaz.enigma.Constants; | 30 | import cuchaz.enigma.Constants; |
| 32 | import cuchaz.enigma.Deobfuscator; | 31 | import cuchaz.enigma.Deobfuscator; |
| 33 | import cuchaz.enigma.analysis.EntryReference; | ||
| 34 | import cuchaz.enigma.analysis.SourceIndex; | 32 | import cuchaz.enigma.analysis.SourceIndex; |
| 35 | import cuchaz.enigma.analysis.Token; | 33 | import cuchaz.enigma.analysis.Token; |
| 36 | import cuchaz.enigma.convert.ClassMatches; | 34 | import cuchaz.enigma.convert.ClassMatches; |
| @@ -78,39 +76,38 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | // controls | 78 | // controls |
| 81 | private JFrame m_frame; | 79 | private JFrame frame; |
| 82 | private Map<SourceType, JRadioButton> m_sourceTypeButtons; | 80 | private Map<SourceType, JRadioButton> sourceTypeButtons; |
| 83 | private ClassSelector m_sourceClasses; | 81 | private ClassSelector sourceClasses; |
| 84 | private CodeReader m_sourceReader; | 82 | private CodeReader sourceReader; |
| 85 | private CodeReader m_destReader; | 83 | private CodeReader destReader; |
| 86 | private JButton m_matchButton; | 84 | private JButton matchButton; |
| 87 | private JButton m_unmatchableButton; | 85 | private JButton unmatchableButton; |
| 88 | private JLabel m_sourceLabel; | 86 | private JLabel sourceLabel; |
| 89 | private JLabel m_destLabel; | 87 | private JLabel destLabel; |
| 90 | private HighlightPainter m_unmatchedHighlightPainter; | 88 | private HighlightPainter unmatchedHighlightPainter; |
| 91 | private HighlightPainter m_matchedHighlightPainter; | 89 | private HighlightPainter matchedHighlightPainter; |
| 92 | 90 | private ClassMatches classMatches; | |
| 93 | private ClassMatches m_classMatches; | 91 | private MemberMatches<T> memberMatches; |
| 94 | private MemberMatches<T> m_memberMatches; | 92 | private Deobfuscator sourceDeobfuscator; |
| 95 | private Deobfuscator m_sourceDeobfuscator; | 93 | private Deobfuscator destDeobfuscator; |
| 96 | private Deobfuscator m_destDeobfuscator; | 94 | private SaveListener<T> saveListener; |
| 97 | private SaveListener<T> m_saveListener; | 95 | private SourceType sourceType; |
| 98 | private SourceType m_sourceType; | 96 | private ClassEntry obfSourceClass; |
| 99 | private ClassEntry m_obfSourceClass; | 97 | private ClassEntry obfDestClass; |
| 100 | private ClassEntry m_obfDestClass; | 98 | private T obfSourceEntry; |
| 101 | private T m_obfSourceEntry; | 99 | private T obfDestEntry; |
| 102 | private T m_obfDestEntry; | ||
| 103 | 100 | ||
| 104 | public MemberMatchingGui(ClassMatches classMatches, MemberMatches<T> fieldMatches, Deobfuscator sourceDeobfuscator, Deobfuscator destDeobfuscator) { | 101 | public MemberMatchingGui(ClassMatches classMatches, MemberMatches<T> fieldMatches, Deobfuscator sourceDeobfuscator, Deobfuscator destDeobfuscator) { |
| 105 | 102 | ||
| 106 | m_classMatches = classMatches; | 103 | this.classMatches = classMatches; |
| 107 | m_memberMatches = fieldMatches; | 104 | memberMatches = fieldMatches; |
| 108 | m_sourceDeobfuscator = sourceDeobfuscator; | 105 | this.sourceDeobfuscator = sourceDeobfuscator; |
| 109 | m_destDeobfuscator = destDeobfuscator; | 106 | this.destDeobfuscator = destDeobfuscator; |
| 110 | 107 | ||
| 111 | // init frame | 108 | // init frame |
| 112 | m_frame = new JFrame(Constants.NAME + " - Member Matcher"); | 109 | frame = new JFrame(Constants.NAME + " - Member Matcher"); |
| 113 | final Container pane = m_frame.getContentPane(); | 110 | final Container pane = frame.getContentPane(); |
| 114 | pane.setLayout(new BorderLayout()); | 111 | pane.setLayout(new BorderLayout()); |
| 115 | 112 | ||
| 116 | // init classes side | 113 | // init classes side |
| @@ -124,47 +121,38 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 124 | JPanel sourceTypePanel = new JPanel(); | 121 | JPanel sourceTypePanel = new JPanel(); |
| 125 | classesPanel.add(sourceTypePanel); | 122 | classesPanel.add(sourceTypePanel); |
| 126 | sourceTypePanel.setLayout(new BoxLayout(sourceTypePanel, BoxLayout.PAGE_AXIS)); | 123 | sourceTypePanel.setLayout(new BoxLayout(sourceTypePanel, BoxLayout.PAGE_AXIS)); |
| 127 | ActionListener sourceTypeListener = new ActionListener() { | 124 | ActionListener sourceTypeListener = event -> setSourceType(SourceType.valueOf(event.getActionCommand())); |
| 128 | @Override | ||
| 129 | public void actionPerformed(ActionEvent event) { | ||
| 130 | setSourceType(SourceType.valueOf(event.getActionCommand())); | ||
| 131 | } | ||
| 132 | }; | ||
| 133 | ButtonGroup sourceTypeButtons = new ButtonGroup(); | 125 | ButtonGroup sourceTypeButtons = new ButtonGroup(); |
| 134 | m_sourceTypeButtons = Maps.newHashMap(); | 126 | this.sourceTypeButtons = Maps.newHashMap(); |
| 135 | for (SourceType sourceType : SourceType.values()) { | 127 | for (SourceType sourceType : SourceType.values()) { |
| 136 | JRadioButton button = sourceType.newRadio(sourceTypeListener, sourceTypeButtons); | 128 | JRadioButton button = sourceType.newRadio(sourceTypeListener, sourceTypeButtons); |
| 137 | m_sourceTypeButtons.put(sourceType, button); | 129 | this.sourceTypeButtons.put(sourceType, button); |
| 138 | sourceTypePanel.add(button); | 130 | sourceTypePanel.add(button); |
| 139 | } | 131 | } |
| 140 | 132 | ||
| 141 | m_sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); | 133 | sourceClasses = new ClassSelector(null, ClassSelector.DEOBF_CLASS_COMPARATOR, false); |
| 142 | m_sourceClasses.setSelectionListener(this::setSourceClass); | 134 | sourceClasses.setSelectionListener(this::setSourceClass); |
| 143 | JScrollPane sourceScroller = new JScrollPane(m_sourceClasses); | 135 | JScrollPane sourceScroller = new JScrollPane(sourceClasses); |
| 144 | classesPanel.add(sourceScroller); | 136 | classesPanel.add(sourceScroller); |
| 145 | 137 | ||
| 146 | // init readers | 138 | // init readers |
| 147 | DefaultSyntaxKit.initKit(); | 139 | DefaultSyntaxKit.initKit(); |
| 148 | m_sourceReader = new CodeReader(); | 140 | sourceReader = new CodeReader(); |
| 149 | m_sourceReader.setSelectionListener(new CodeReader.SelectionListener() { | 141 | sourceReader.setSelectionListener(reference -> |
| 150 | @Override | 142 | { |
| 151 | public void onSelect(EntryReference<Entry, Entry> reference) { | 143 | if (reference != null) { |
| 152 | if (reference != null) { | 144 | onSelectSource(reference.entry); |
| 153 | onSelectSource(reference.entry); | 145 | } else { |
| 154 | } else { | 146 | onSelectSource(null); |
| 155 | onSelectSource(null); | ||
| 156 | } | ||
| 157 | } | 147 | } |
| 158 | }); | 148 | }); |
| 159 | m_destReader = new CodeReader(); | 149 | destReader = new CodeReader(); |
| 160 | m_destReader.setSelectionListener(new CodeReader.SelectionListener() { | 150 | destReader.setSelectionListener(reference -> |
| 161 | @Override | 151 | { |
| 162 | public void onSelect(EntryReference<Entry, Entry> reference) { | 152 | if (reference != null) { |
| 163 | if (reference != null) { | 153 | onSelectDest(reference.entry); |
| 164 | onSelectDest(reference.entry); | 154 | } else { |
| 165 | } else { | 155 | onSelectDest(null); |
| 166 | onSelectDest(null); | ||
| 167 | } | ||
| 168 | } | 156 | } |
| 169 | }); | 157 | }); |
| 170 | 158 | ||
| @@ -173,14 +161,15 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 173 | @Override | 161 | @Override |
| 174 | public void keyPressed(KeyEvent event) { | 162 | public void keyPressed(KeyEvent event) { |
| 175 | if (event.getKeyCode() == KeyEvent.VK_M) | 163 | if (event.getKeyCode() == KeyEvent.VK_M) |
| 176 | m_matchButton.doClick(); | 164 | matchButton.doClick(); |
| 177 | } | 165 | } |
| 178 | }; | 166 | }; |
| 179 | m_sourceReader.addKeyListener(keyListener); | 167 | sourceReader.addKeyListener(keyListener); |
| 180 | m_destReader.addKeyListener(keyListener); | 168 | destReader.addKeyListener(keyListener); |
| 181 | 169 | ||
| 182 | // init all the splits | 170 | // init all the splits |
| 183 | JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(m_sourceReader), new JScrollPane(m_destReader)); | 171 | JSplitPane splitRight = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, new JScrollPane(sourceReader), new JScrollPane( |
| 172 | destReader)); | ||
| 184 | splitRight.setResizeWeight(0.5); // resize 50:50 | 173 | splitRight.setResizeWeight(0.5); // resize 50:50 |
| 185 | JSplitPane splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, classesPanel, splitRight); | 174 | JSplitPane splitLeft = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, classesPanel, splitRight); |
| 186 | splitLeft.setResizeWeight(0); // let the right side take all the slack | 175 | splitLeft.setResizeWeight(0); // let the right side take all the slack |
| @@ -192,102 +181,92 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 192 | bottomPanel.setLayout(new FlowLayout()); | 181 | bottomPanel.setLayout(new FlowLayout()); |
| 193 | pane.add(bottomPanel, BorderLayout.SOUTH); | 182 | pane.add(bottomPanel, BorderLayout.SOUTH); |
| 194 | 183 | ||
| 195 | m_matchButton = new JButton(); | 184 | matchButton = new JButton(); |
| 196 | m_unmatchableButton = new JButton(); | 185 | unmatchableButton = new JButton(); |
| 197 | 186 | ||
| 198 | m_sourceLabel = new JLabel(); | 187 | sourceLabel = new JLabel(); |
| 199 | bottomPanel.add(m_sourceLabel); | 188 | bottomPanel.add(sourceLabel); |
| 200 | bottomPanel.add(m_matchButton); | 189 | bottomPanel.add(matchButton); |
| 201 | bottomPanel.add(m_unmatchableButton); | 190 | bottomPanel.add(unmatchableButton); |
| 202 | m_destLabel = new JLabel(); | 191 | destLabel = new JLabel(); |
| 203 | bottomPanel.add(m_destLabel); | 192 | bottomPanel.add(destLabel); |
| 204 | 193 | ||
| 205 | // show the frame | 194 | // show the frame |
| 206 | pane.doLayout(); | 195 | pane.doLayout(); |
| 207 | m_frame.setSize(1024, 576); | 196 | frame.setSize(1024, 576); |
| 208 | m_frame.setMinimumSize(new Dimension(640, 480)); | 197 | frame.setMinimumSize(new Dimension(640, 480)); |
| 209 | m_frame.setVisible(true); | 198 | frame.setVisible(true); |
| 210 | m_frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); | 199 | frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
| 211 | 200 | ||
| 212 | m_unmatchedHighlightPainter = new ObfuscatedHighlightPainter(); | 201 | unmatchedHighlightPainter = new ObfuscatedHighlightPainter(); |
| 213 | m_matchedHighlightPainter = new DeobfuscatedHighlightPainter(); | 202 | matchedHighlightPainter = new DeobfuscatedHighlightPainter(); |
| 214 | 203 | ||
| 215 | // init state | 204 | // init state |
| 216 | m_saveListener = null; | 205 | saveListener = null; |
| 217 | m_obfSourceClass = null; | 206 | obfSourceClass = null; |
| 218 | m_obfDestClass = null; | 207 | obfDestClass = null; |
| 219 | m_obfSourceEntry = null; | 208 | obfSourceEntry = null; |
| 220 | m_obfDestEntry = null; | 209 | obfDestEntry = null; |
| 221 | setSourceType(SourceType.getDefault()); | 210 | setSourceType(SourceType.getDefault()); |
| 222 | updateButtons(); | 211 | updateButtons(); |
| 223 | } | 212 | } |
| 224 | 213 | ||
| 225 | protected void setSourceType(SourceType val) { | 214 | protected void setSourceType(SourceType val) { |
| 226 | m_sourceType = val; | 215 | sourceType = val; |
| 227 | updateSourceClasses(); | 216 | updateSourceClasses(); |
| 228 | } | 217 | } |
| 229 | 218 | ||
| 230 | public void setSaveListener(SaveListener<T> val) { | 219 | public void setSaveListener(SaveListener<T> val) { |
| 231 | m_saveListener = val; | 220 | saveListener = val; |
| 232 | } | 221 | } |
| 233 | 222 | ||
| 234 | private void updateSourceClasses() { | 223 | private void updateSourceClasses() { |
| 235 | 224 | ||
| 236 | String selectedPackage = m_sourceClasses.getSelectedPackage(); | 225 | String selectedPackage = sourceClasses.getSelectedPackage(); |
| 237 | 226 | ||
| 238 | List<ClassEntry> deobfClassEntries = Lists.newArrayList(); | 227 | List<ClassEntry> deobfClassEntries = Lists.newArrayList(); |
| 239 | for (ClassEntry entry : m_sourceType.getObfSourceClasses(m_memberMatches)) { | 228 | for (ClassEntry entry : sourceType.getObfSourceClasses(memberMatches)) { |
| 240 | deobfClassEntries.add(m_sourceDeobfuscator.deobfuscateEntry(entry)); | 229 | deobfClassEntries.add(sourceDeobfuscator.deobfuscateEntry(entry)); |
| 241 | } | 230 | } |
| 242 | m_sourceClasses.setClasses(deobfClassEntries); | 231 | sourceClasses.setClasses(deobfClassEntries); |
| 243 | 232 | ||
| 244 | if (selectedPackage != null) { | 233 | if (selectedPackage != null) { |
| 245 | m_sourceClasses.expandPackage(selectedPackage); | 234 | sourceClasses.expandPackage(selectedPackage); |
| 246 | } | 235 | } |
| 247 | 236 | ||
| 248 | for (SourceType sourceType : SourceType.values()) { | 237 | for (SourceType sourceType : SourceType.values()) { |
| 249 | m_sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", | 238 | sourceTypeButtons.get(sourceType).setText(String.format("%s (%d)", |
| 250 | sourceType.name(), sourceType.getObfSourceClasses(m_memberMatches).size() | 239 | sourceType.name(), sourceType.getObfSourceClasses(memberMatches).size() |
| 251 | )); | 240 | )); |
| 252 | } | 241 | } |
| 253 | } | 242 | } |
| 254 | 243 | ||
| 255 | protected void setSourceClass(ClassEntry sourceClass) { | 244 | protected void setSourceClass(ClassEntry sourceClass) { |
| 256 | 245 | ||
| 257 | m_obfSourceClass = m_sourceDeobfuscator.obfuscateEntry(sourceClass); | 246 | obfSourceClass = sourceDeobfuscator.obfuscateEntry(sourceClass); |
| 258 | m_obfDestClass = m_classMatches.getUniqueMatches().get(m_obfSourceClass); | 247 | obfDestClass = classMatches.getUniqueMatches().get(obfSourceClass); |
| 259 | if (m_obfDestClass == null) { | 248 | if (obfDestClass == null) { |
| 260 | throw new Error("No matching dest class for source class: " + m_obfSourceClass); | 249 | throw new Error("No matching dest class for source class: " + obfSourceClass); |
| 261 | } | 250 | } |
| 262 | 251 | ||
| 263 | m_sourceReader.decompileClass(m_obfSourceClass, m_sourceDeobfuscator, false, new Runnable() { | 252 | sourceReader.decompileClass(obfSourceClass, sourceDeobfuscator, false, this::updateSourceHighlights); |
| 264 | @Override | 253 | destReader.decompileClass(obfDestClass, destDeobfuscator, false, this::updateDestHighlights); |
| 265 | public void run() { | ||
| 266 | updateSourceHighlights(); | ||
| 267 | } | ||
| 268 | }); | ||
| 269 | m_destReader.decompileClass(m_obfDestClass, m_destDeobfuscator, false, new Runnable() { | ||
| 270 | @Override | ||
| 271 | public void run() { | ||
| 272 | updateDestHighlights(); | ||
| 273 | } | ||
| 274 | }); | ||
| 275 | } | 254 | } |
| 276 | 255 | ||
| 277 | protected void updateSourceHighlights() { | 256 | protected void updateSourceHighlights() { |
| 278 | highlightEntries(m_sourceReader, m_sourceDeobfuscator, m_memberMatches.matches().keySet(), m_memberMatches.getUnmatchedSourceEntries()); | 257 | highlightEntries(sourceReader, sourceDeobfuscator, memberMatches.matches().keySet(), memberMatches.getUnmatchedSourceEntries()); |
| 279 | } | 258 | } |
| 280 | 259 | ||
| 281 | protected void updateDestHighlights() { | 260 | protected void updateDestHighlights() { |
| 282 | highlightEntries(m_destReader, m_destDeobfuscator, m_memberMatches.matches().values(), m_memberMatches.getUnmatchedDestEntries()); | 261 | highlightEntries(destReader, destDeobfuscator, memberMatches.matches().values(), memberMatches.getUnmatchedDestEntries()); |
| 283 | } | 262 | } |
| 284 | 263 | ||
| 285 | private void highlightEntries(CodeReader reader, Deobfuscator deobfuscator, Collection<T> obfMatchedEntries, Collection<T> obfUnmatchedEntries) { | 264 | private void highlightEntries(CodeReader reader, Deobfuscator deobfuscator, Collection<T> obfMatchedEntries, Collection<T> obfUnmatchedEntries) { |
| 286 | reader.clearHighlights(); | 265 | reader.clearHighlights(); |
| 287 | // matched fields | 266 | // matched fields |
| 288 | updateHighlighted(obfMatchedEntries, deobfuscator, reader, m_matchedHighlightPainter); | 267 | updateHighlighted(obfMatchedEntries, deobfuscator, reader, matchedHighlightPainter); |
| 289 | // unmatched fields | 268 | // unmatched fields |
| 290 | updateHighlighted(obfUnmatchedEntries, deobfuscator, reader, m_unmatchedHighlightPainter); | 269 | updateHighlighted(obfUnmatchedEntries, deobfuscator, reader, unmatchedHighlightPainter); |
| 291 | } | 270 | } |
| 292 | 271 | ||
| 293 | private void updateHighlighted(Collection<T> entries, Deobfuscator deobfuscator, CodeReader reader, HighlightPainter painter) | 272 | private void updateHighlighted(Collection<T> entries, Deobfuscator deobfuscator, CodeReader reader, HighlightPainter painter) |
| @@ -303,8 +282,8 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 303 | } | 282 | } |
| 304 | 283 | ||
| 305 | private boolean isSelectionMatched() { | 284 | private boolean isSelectionMatched() { |
| 306 | return m_obfSourceEntry != null && m_obfDestEntry != null | 285 | return obfSourceEntry != null && obfDestEntry != null |
| 307 | && m_memberMatches.isMatched(m_obfSourceEntry, m_obfDestEntry); | 286 | && memberMatches.isMatched(obfSourceEntry, obfDestEntry); |
| 308 | } | 287 | } |
| 309 | 288 | ||
| 310 | protected void onSelectSource(Entry source) { | 289 | protected void onSelectSource(Entry source) { |
| @@ -324,12 +303,12 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 324 | @SuppressWarnings("unchecked") | 303 | @SuppressWarnings("unchecked") |
| 325 | T sourceEntry = (T) source; | 304 | T sourceEntry = (T) source; |
| 326 | 305 | ||
| 327 | T obfSourceEntry = m_sourceDeobfuscator.obfuscateEntry(sourceEntry); | 306 | T obfSourceEntry = sourceDeobfuscator.obfuscateEntry(sourceEntry); |
| 328 | if (m_memberMatches.hasSource(obfSourceEntry)) { | 307 | if (memberMatches.hasSource(obfSourceEntry)) { |
| 329 | setSource(obfSourceEntry); | 308 | setSource(obfSourceEntry); |
| 330 | 309 | ||
| 331 | // look for a matched dest too | 310 | // look for a matched dest too |
| 332 | T obfDestEntry = m_memberMatches.matches().get(obfSourceEntry); | 311 | T obfDestEntry = memberMatches.matches().get(obfSourceEntry); |
| 333 | if (obfDestEntry != null) { | 312 | if (obfDestEntry != null) { |
| 334 | setDest(obfDestEntry); | 313 | setDest(obfDestEntry); |
| 335 | } | 314 | } |
| @@ -356,12 +335,12 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 356 | @SuppressWarnings("unchecked") | 335 | @SuppressWarnings("unchecked") |
| 357 | T destEntry = (T) dest; | 336 | T destEntry = (T) dest; |
| 358 | 337 | ||
| 359 | T obfDestEntry = m_destDeobfuscator.obfuscateEntry(destEntry); | 338 | T obfDestEntry = destDeobfuscator.obfuscateEntry(destEntry); |
| 360 | if (m_memberMatches.hasDest(obfDestEntry)) { | 339 | if (memberMatches.hasDest(obfDestEntry)) { |
| 361 | setDest(obfDestEntry); | 340 | setDest(obfDestEntry); |
| 362 | 341 | ||
| 363 | // look for a matched source too | 342 | // look for a matched source too |
| 364 | T obfSourceEntry = m_memberMatches.matches().inverse().get(obfDestEntry); | 343 | T obfSourceEntry = memberMatches.matches().inverse().get(obfDestEntry); |
| 365 | if (obfSourceEntry != null) { | 344 | if (obfSourceEntry != null) { |
| 366 | setSource(obfSourceEntry); | 345 | setSource(obfSourceEntry); |
| 367 | } | 346 | } |
| @@ -373,21 +352,21 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 373 | 352 | ||
| 374 | private void setSource(T obfEntry) { | 353 | private void setSource(T obfEntry) { |
| 375 | if (obfEntry == null) { | 354 | if (obfEntry == null) { |
| 376 | m_obfSourceEntry = null; | 355 | obfSourceEntry = null; |
| 377 | m_sourceLabel.setText(""); | 356 | sourceLabel.setText(""); |
| 378 | } else { | 357 | } else { |
| 379 | m_obfSourceEntry = obfEntry; | 358 | obfSourceEntry = obfEntry; |
| 380 | m_sourceLabel.setText(getEntryLabel(obfEntry, m_sourceDeobfuscator)); | 359 | sourceLabel.setText(getEntryLabel(obfEntry, sourceDeobfuscator)); |
| 381 | } | 360 | } |
| 382 | } | 361 | } |
| 383 | 362 | ||
| 384 | private void setDest(T obfEntry) { | 363 | private void setDest(T obfEntry) { |
| 385 | if (obfEntry == null) { | 364 | if (obfEntry == null) { |
| 386 | m_obfDestEntry = null; | 365 | obfDestEntry = null; |
| 387 | m_destLabel.setText(""); | 366 | destLabel.setText(""); |
| 388 | } else { | 367 | } else { |
| 389 | m_obfDestEntry = obfEntry; | 368 | obfDestEntry = obfEntry; |
| 390 | m_destLabel.setText(getEntryLabel(obfEntry, m_destDeobfuscator)); | 369 | destLabel.setText(getEntryLabel(obfEntry, destDeobfuscator)); |
| 391 | } | 370 | } |
| 392 | } | 371 | } |
| 393 | 372 | ||
| @@ -399,39 +378,23 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 399 | 378 | ||
| 400 | private void updateButtons() { | 379 | private void updateButtons() { |
| 401 | 380 | ||
| 402 | GuiTricks.deactivateButton(m_matchButton); | 381 | GuiTricks.deactivateButton(matchButton); |
| 403 | GuiTricks.deactivateButton(m_unmatchableButton); | 382 | GuiTricks.deactivateButton(unmatchableButton); |
| 404 | 383 | ||
| 405 | if (m_obfSourceEntry != null && m_obfDestEntry != null) { | 384 | if (obfSourceEntry != null && obfDestEntry != null) { |
| 406 | if (m_memberMatches.isMatched(m_obfSourceEntry, m_obfDestEntry)) { | 385 | if (memberMatches.isMatched(obfSourceEntry, obfDestEntry)) |
| 407 | GuiTricks.activateButton(m_matchButton, "Unmatch", new ActionListener() { | 386 | GuiTricks.activateButton(matchButton, "Unmatch", event -> unmatch()); |
| 408 | @Override | 387 | else if (!memberMatches.isMatchedSourceEntry(obfSourceEntry) && !memberMatches.isMatchedDestEntry( |
| 409 | public void actionPerformed(ActionEvent event) { | 388 | obfDestEntry)) |
| 410 | unmatch(); | 389 | GuiTricks.activateButton(matchButton, "Match", event -> match()); |
| 411 | } | 390 | } else if (obfSourceEntry != null) |
| 412 | }); | 391 | GuiTricks.activateButton(unmatchableButton, "Set Unmatchable", event -> unmatchable()); |
| 413 | } else if (!m_memberMatches.isMatchedSourceEntry(m_obfSourceEntry) && !m_memberMatches.isMatchedDestEntry(m_obfDestEntry)) { | ||
| 414 | GuiTricks.activateButton(m_matchButton, "Match", new ActionListener() { | ||
| 415 | @Override | ||
| 416 | public void actionPerformed(ActionEvent event) { | ||
| 417 | match(); | ||
| 418 | } | ||
| 419 | }); | ||
| 420 | } | ||
| 421 | } else if (m_obfSourceEntry != null) { | ||
| 422 | GuiTricks.activateButton(m_unmatchableButton, "Set Unmatchable", new ActionListener() { | ||
| 423 | @Override | ||
| 424 | public void actionPerformed(ActionEvent event) { | ||
| 425 | unmatchable(); | ||
| 426 | } | ||
| 427 | }); | ||
| 428 | } | ||
| 429 | } | 392 | } |
| 430 | 393 | ||
| 431 | protected void match() { | 394 | protected void match() { |
| 432 | 395 | ||
| 433 | // update the field matches | 396 | // update the field matches |
| 434 | m_memberMatches.makeMatch(m_obfSourceEntry, m_obfDestEntry, m_sourceDeobfuscator, m_destDeobfuscator); | 397 | memberMatches.makeMatch(obfSourceEntry, obfDestEntry, sourceDeobfuscator, destDeobfuscator); |
| 435 | save(); | 398 | save(); |
| 436 | 399 | ||
| 437 | // update the ui | 400 | // update the ui |
| @@ -445,7 +408,7 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 445 | protected void unmatch() { | 408 | protected void unmatch() { |
| 446 | 409 | ||
| 447 | // update the field matches | 410 | // update the field matches |
| 448 | m_memberMatches.unmakeMatch(m_obfSourceEntry, m_obfDestEntry, m_sourceDeobfuscator, m_destDeobfuscator); | 411 | memberMatches.unmakeMatch(obfSourceEntry, obfDestEntry, sourceDeobfuscator, destDeobfuscator); |
| 449 | save(); | 412 | save(); |
| 450 | 413 | ||
| 451 | // update the ui | 414 | // update the ui |
| @@ -459,7 +422,7 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 459 | protected void unmatchable() { | 422 | protected void unmatchable() { |
| 460 | 423 | ||
| 461 | // update the field matches | 424 | // update the field matches |
| 462 | m_memberMatches.makeSourceUnmatchable(m_obfSourceEntry, m_sourceDeobfuscator); | 425 | memberMatches.makeSourceUnmatchable(obfSourceEntry, sourceDeobfuscator); |
| 463 | save(); | 426 | save(); |
| 464 | 427 | ||
| 465 | // update the ui | 428 | // update the ui |
| @@ -471,8 +434,8 @@ public class MemberMatchingGui<T extends Entry> { | |||
| 471 | } | 434 | } |
| 472 | 435 | ||
| 473 | private void save() { | 436 | private void save() { |
| 474 | if (m_saveListener != null) { | 437 | if (saveListener != null) { |
| 475 | m_saveListener.save(m_memberMatches); | 438 | saveListener.save(memberMatches); |
| 476 | } | 439 | } |
| 477 | } | 440 | } |
| 478 | } | 441 | } |