diff options
| author | 2022-12-07 19:56:15 +0100 | |
|---|---|---|
| committer | 2022-12-07 18:56:15 +0000 | |
| commit | cec6269e5448faa24ef39070b772ace94a3bd419 (patch) | |
| tree | 1472571835ee7a3a372666db5b4a182082abe53e | |
| parent | Provide fallback anti-aliasing for DEs the JRE doesn't recognize (#466) (diff) | |
| download | enigma-cec6269e5448faa24ef39070b772ace94a3bd419.tar.gz enigma-cec6269e5448faa24ef39070b772ace94a3bd419.tar.xz enigma-cec6269e5448faa24ef39070b772ace94a3bd419.zip | |
Allow filtering of packages in Mapping Stats window (#481)
Co-authored-by: Eli Orona <eliorona@live.com>
3 files changed, 59 insertions, 9 deletions
diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java index 1ab66ef2..5f030382 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java | |||
| @@ -37,13 +37,13 @@ public class StatsDialog { | |||
| 37 | results.put(member, statsGenerator.generate(listener, Collections.singleton(member), "", false)); | 37 | results.put(member, statsGenerator.generate(listener, Collections.singleton(member), "", false)); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | SwingUtilities.invokeLater(() -> show(gui, results)); | 40 | SwingUtilities.invokeLater(() -> show(gui, results, "")); |
| 41 | }); | 41 | }); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | public static void show(Gui gui, Map<StatsMember, StatsResult> results) { | 44 | public static void show(Gui gui, Map<StatsMember, StatsResult> results, String packageName) { |
| 45 | // init frame | 45 | // init frame |
| 46 | JDialog dialog = new JDialog(gui.getFrame(), I18n.translate("menu.file.stats.title"), true); | 46 | JDialog dialog = new JDialog(gui.getFrame(), packageName.isEmpty() ? I18n.translate("menu.file.stats.title") : I18n.translateFormatted("menu.file.stats.title_filtered", packageName), true); |
| 47 | Container contentPane = dialog.getContentPane(); | 47 | Container contentPane = dialog.getContentPane(); |
| 48 | contentPane.setLayout(new GridBagLayout()); | 48 | contentPane.setLayout(new GridBagLayout()); |
| 49 | 49 | ||
| @@ -80,10 +80,30 @@ public class StatsDialog { | |||
| 80 | topLevelPackage.setText(UiConfig.getLastTopLevelPackage()); | 80 | topLevelPackage.setText(UiConfig.getLastTopLevelPackage()); |
| 81 | contentPane.add(topLevelPackage, cb1.pos(0, results.size() + 2).fill(GridBagConstraints.HORIZONTAL).build()); | 81 | contentPane.add(topLevelPackage, cb1.pos(0, results.size() + 2).fill(GridBagConstraints.HORIZONTAL).build()); |
| 82 | 82 | ||
| 83 | // Show filter button | ||
| 84 | JButton filterButton = new JButton(I18n.translate("menu.file.stats.filter")); | ||
| 85 | filterButton.addActionListener(action -> { | ||
| 86 | dialog.dispose(); | ||
| 87 | ProgressDialog.runOffThread(gui.getFrame(), listener -> { | ||
| 88 | UiConfig.setLastTopLevelPackage(topLevelPackage.getText()); | ||
| 89 | UiConfig.save(); | ||
| 90 | |||
| 91 | final StatsGenerator statsGenerator = new StatsGenerator(gui.getController().project); | ||
| 92 | final Map<StatsMember, StatsResult> filteredResults = new HashMap<>(); | ||
| 93 | |||
| 94 | for (StatsMember member : StatsMember.values()) { | ||
| 95 | filteredResults.put(member, statsGenerator.generate(listener, Collections.singleton(member), UiConfig.getLastTopLevelPackage(), false)); | ||
| 96 | } | ||
| 97 | |||
| 98 | SwingUtilities.invokeLater(() -> show(gui, filteredResults, UiConfig.getLastTopLevelPackage())); | ||
| 99 | }); | ||
| 100 | }); | ||
| 101 | contentPane.add(filterButton, cb1.pos(0, results.size() + 3).anchor(GridBagConstraints.EAST).build()); | ||
| 102 | |||
| 83 | // show synthetic members option | 103 | // show synthetic members option |
| 84 | JCheckBox syntheticParametersOption = new JCheckBox(I18n.translate("menu.file.stats.synthetic_parameters")); | 104 | JCheckBox syntheticParametersOption = new JCheckBox(I18n.translate("menu.file.stats.synthetic_parameters")); |
| 85 | syntheticParametersOption.setSelected(UiConfig.shouldIncludeSyntheticParameters()); | 105 | syntheticParametersOption.setSelected(UiConfig.shouldIncludeSyntheticParameters()); |
| 86 | contentPane.add(syntheticParametersOption, cb1.pos(0, results.size() + 3).build()); | 106 | contentPane.add(syntheticParametersOption, cb1.pos(0, results.size() + 4).build()); |
| 87 | 107 | ||
| 88 | // show generate button | 108 | // show generate button |
| 89 | JButton button = new JButton(I18n.translate("menu.file.stats.generate")); | 109 | JButton button = new JButton(I18n.translate("menu.file.stats.generate")); |
| @@ -98,7 +118,7 @@ public class StatsDialog { | |||
| 98 | generateStats(gui, checkboxes, topLevelPackage.getText(), syntheticParametersOption.isSelected()); | 118 | generateStats(gui, checkboxes, topLevelPackage.getText(), syntheticParametersOption.isSelected()); |
| 99 | }); | 119 | }); |
| 100 | 120 | ||
| 101 | contentPane.add(button, cb1.pos(0, results.size() + 4).weightY(1.0).anchor(GridBagConstraints.SOUTHEAST).build()); | 121 | contentPane.add(button, cb1.pos(0, results.size() + 5).weightY(1.0).anchor(GridBagConstraints.SOUTHWEST).build()); |
| 102 | 122 | ||
| 103 | // add action listener to each checkbox | 123 | // add action listener to each checkbox |
| 104 | checkboxes.forEach((key, value) -> value.addActionListener(action -> { | 124 | checkboxes.forEach((key, value) -> value.addActionListener(action -> { |
diff --git a/enigma-swing/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java b/enigma-swing/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java index 99b5572b..5d241665 100644 --- a/enigma-swing/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java +++ b/enigma-swing/src/main/java/cuchaz/enigma/gui/stats/StatsGenerator.java | |||
| @@ -54,15 +54,20 @@ public class StatsGenerator { | |||
| 54 | progress.init(totalWork, I18n.translate("progress.stats")); | 54 | progress.init(totalWork, I18n.translate("progress.stats")); |
| 55 | 55 | ||
| 56 | Map<String, Integer> counts = new HashMap<>(); | 56 | Map<String, Integer> counts = new HashMap<>(); |
| 57 | 57 | String topLevelPackageSlash = topLevelPackage.replace(".", "/"); | |
| 58 | int numDone = 0; | 58 | int numDone = 0; |
| 59 | 59 | ||
| 60 | if (includedMembers.contains(StatsMember.METHODS) || includedMembers.contains(StatsMember.PARAMETERS)) { | 60 | if (includedMembers.contains(StatsMember.METHODS) || includedMembers.contains(StatsMember.PARAMETERS)) { |
| 61 | for (MethodEntry method : entryIndex.getMethods()) { | 61 | for (MethodEntry method : entryIndex.getMethods()) { |
| 62 | progress.step(numDone++, I18n.translate("type.methods")); | 62 | progress.step(numDone++, I18n.translate("type.methods")); |
| 63 | MethodEntry root = entryResolver.resolveEntry(method, ResolutionStrategy.RESOLVE_ROOT).stream().findFirst().orElseThrow(AssertionError::new); | 63 | MethodEntry root = entryResolver |
| 64 | 64 | .resolveEntry(method, ResolutionStrategy.RESOLVE_ROOT) | |
| 65 | if (root == method) { | 65 | .stream() |
| 66 | .findFirst() | ||
| 67 | .orElseThrow(AssertionError::new); | ||
| 68 | ClassEntry clazz = root.getParent(); | ||
| 69 | |||
| 70 | if (root == method && this.mapper.deobfuscate(clazz).getPackageName().startsWith(topLevelPackageSlash)) { | ||
| 66 | if (includedMembers.contains(StatsMember.METHODS) && !((MethodDefEntry) method).getAccess().isSynthetic()) { | 71 | if (includedMembers.contains(StatsMember.METHODS) && !((MethodDefEntry) method).getAccess().isSynthetic()) { |
| 67 | update(counts, method); | 72 | update(counts, method); |
| 68 | totalMappable++; | 73 | totalMappable++; |
| @@ -84,6 +89,29 @@ public class StatsGenerator { | |||
| 84 | if (includedMembers.contains(StatsMember.FIELDS)) { | 89 | if (includedMembers.contains(StatsMember.FIELDS)) { |
| 85 | for (FieldEntry field : entryIndex.getFields()) { | 90 | for (FieldEntry field : entryIndex.getFields()) { |
| 86 | progress.step(numDone++, I18n.translate("type.fields")); | 91 | progress.step(numDone++, I18n.translate("type.fields")); |
| 92 | ClassEntry clazz = field.getParent(); | ||
| 93 | |||
| 94 | if (!((FieldDefEntry) field).getAccess().isSynthetic() && this.mapper.deobfuscate(clazz).getPackageName().startsWith(topLevelPackageSlash)) { | ||
| 95 | update(counts, field); | ||
| 96 | totalMappable++; | ||
| 97 | } | ||
| 98 | } | ||
| 99 | } | ||
| 100 | |||
| 101 | if (includedMembers.contains(StatsMember.CLASSES)) { | ||
| 102 | for (ClassEntry clazz : entryIndex.getClasses()) { | ||
| 103 | progress.step(numDone++, I18n.translate("type.classes")); | ||
| 104 | |||
| 105 | if (this.mapper.deobfuscate(clazz).getPackageName().startsWith(topLevelPackageSlash)) { | ||
| 106 | update(counts, clazz); | ||
| 107 | totalMappable++; | ||
| 108 | } | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | if (includedMembers.contains(StatsMember.FIELDS)) { | ||
| 113 | for (FieldEntry field : entryIndex.getFields()) { | ||
| 114 | progress.step(numDone++, I18n.translate("type.fields")); | ||
| 87 | 115 | ||
| 88 | if (!((FieldDefEntry) field).getAccess().isSynthetic()) { | 116 | if (!((FieldDefEntry) field).getAccess().isSynthetic()) { |
| 89 | update(counts, field); | 117 | update(counts, field); |
diff --git a/enigma/src/main/resources/lang/en_us.json b/enigma/src/main/resources/lang/en_us.json index 4ec2f087..76afebc2 100644 --- a/enigma/src/main/resources/lang/en_us.json +++ b/enigma/src/main/resources/lang/en_us.json | |||
| @@ -28,6 +28,8 @@ | |||
| 28 | "menu.file.export.jar": "Export Jar...", | 28 | "menu.file.export.jar": "Export Jar...", |
| 29 | "menu.file.stats": "Mapping Stats...", | 29 | "menu.file.stats": "Mapping Stats...", |
| 30 | "menu.file.stats.title": "Mapping Stats", | 30 | "menu.file.stats.title": "Mapping Stats", |
| 31 | "menu.file.stats.title_filtered": "Mapping Stats for %s", | ||
| 32 | "menu.file.stats.filter": "Filter", | ||
| 31 | "menu.file.stats.top_level_package": "Top-Level Package:", | 33 | "menu.file.stats.top_level_package": "Top-Level Package:", |
| 32 | "menu.file.stats.synthetic_parameters": "Include Synthetic Parameters", | 34 | "menu.file.stats.synthetic_parameters": "Include Synthetic Parameters", |
| 33 | "menu.file.stats.generate": "Generate Diagram", | 35 | "menu.file.stats.generate": "Generate Diagram", |