summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java
diff options
context:
space:
mode:
authorGravatar Thog2017-03-07 21:24:39 +0100
committerGravatar Thog2017-03-07 21:30:02 +0100
commitb4aaff683d78ab92b83f3a7257c33b8e27d1affa (patch)
treef23c9bb0927d83cc7302881266b7df8fd37959c7 /src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java
parentAvoid crash of the matcher when the obf name is invalid (set a deob it using ... (diff)
downloadenigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.tar.gz
enigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.tar.xz
enigma-fork-b4aaff683d78ab92b83f3a7257c33b8e27d1affa.zip
Drop unix case style and implement hashCode when equals is overrided
Also update Guava to version 21
Diffstat (limited to 'src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java')
-rw-r--r--src/main/java/cuchaz/enigma/gui/MemberMatchingGui.java281
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;
17import java.awt.Container; 17import java.awt.Container;
18import java.awt.Dimension; 18import java.awt.Dimension;
19import java.awt.FlowLayout; 19import java.awt.FlowLayout;
20import java.awt.event.ActionEvent;
21import java.awt.event.ActionListener; 20import java.awt.event.ActionListener;
22import java.awt.event.KeyAdapter; 21import java.awt.event.KeyAdapter;
23import java.awt.event.KeyEvent; 22import java.awt.event.KeyEvent;
@@ -30,7 +29,6 @@ import javax.swing.text.Highlighter.HighlightPainter;
30 29
31import cuchaz.enigma.Constants; 30import cuchaz.enigma.Constants;
32import cuchaz.enigma.Deobfuscator; 31import cuchaz.enigma.Deobfuscator;
33import cuchaz.enigma.analysis.EntryReference;
34import cuchaz.enigma.analysis.SourceIndex; 32import cuchaz.enigma.analysis.SourceIndex;
35import cuchaz.enigma.analysis.Token; 33import cuchaz.enigma.analysis.Token;
36import cuchaz.enigma.convert.ClassMatches; 34import 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}