summaryrefslogtreecommitdiff
path: root/enigma-swing/src/main/java/cuchaz/enigma/gui/dialog/StatsDialog.java
blob: d8d3acd27e20b60116e284b446feba0965f7eb8e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package cuchaz.enigma.gui.dialog;

import java.awt.*;
import java.util.Arrays;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import javax.swing.*;

import cuchaz.enigma.gui.Gui;
import cuchaz.enigma.gui.stats.StatsMember;
import cuchaz.enigma.gui.util.ScaleUtil;
import cuchaz.enigma.utils.I18n;

public class StatsDialog {

	public static void show(Gui gui) {
		// init frame
		JFrame frame = new JFrame(I18n.translate("menu.file.stats.title"));
		JPanel checkboxesPanel = new JPanel();
		JPanel topLevelPackagePanel = new JPanel();
		JPanel buttonPanel = new JPanel();
		frame.setLayout(new GridLayout(3, 0));
		frame.add(checkboxesPanel);
		frame.add(topLevelPackagePanel);
		frame.add(buttonPanel);

		// show checkboxes
		Map<StatsMember, JCheckBox> checkboxes = Arrays
				.stream(StatsMember.values())
				.collect(Collectors.toMap(m -> m, m -> {
					JCheckBox checkbox = new JCheckBox(I18n.translate("type." + m.name().toLowerCase(Locale.ROOT)));
					checkboxesPanel.add(checkbox);
					return checkbox;
				}));

		// show top-level package option
		JLabel topLevelPackageOption = new JLabel(I18n.translate("menu.file.stats.top_level_package"));
		JTextField topLevelPackage = new JTextField();
		topLevelPackage.setPreferredSize(ScaleUtil.getDimension(200, 25));
		topLevelPackagePanel.add(topLevelPackageOption);
		topLevelPackagePanel.add(topLevelPackage);

		// show generate button
		JButton button = new JButton(I18n.translate("menu.file.stats.generate"));
		buttonPanel.add(button);
		button.setEnabled(false);
		button.addActionListener(action -> {
			frame.dispose();
			generateStats(gui, checkboxes, topLevelPackage.getText());
		});

		// add action listener to each checkbox
		checkboxes.entrySet().forEach(checkbox -> {
			checkbox.getValue().addActionListener(action -> {
				if (!button.isEnabled()) {
					button.setEnabled(true);
				} else if (checkboxes.entrySet().stream().allMatch(entry -> !entry.getValue().isSelected())) {
					button.setEnabled(false);
				}
			});
		});

		// show the frame
		frame.pack();
		frame.setVisible(true);
		frame.setSize(ScaleUtil.getDimension(500, 150));
		frame.setResizable(false);
		frame.setLocationRelativeTo(gui.getFrame());
	}

	private static void generateStats(Gui gui, Map<StatsMember, JCheckBox> checkboxes, String topLevelPackage) {
		// get members from selected checkboxes
		Set<StatsMember> includedMembers = checkboxes
				.entrySet()
				.stream()
				.filter(entry -> entry.getValue().isSelected())
				.map(Map.Entry::getKey)
				.collect(Collectors.toSet());

		// checks if a project is open
		if (gui.getController().project != null) {
			gui.getController().openStats(includedMembers, topLevelPackage);
		}
	}
}