1 package edu.jiangxin.apktoolbox.swing.keeper;
2
3 import edu.jiangxin.apktoolbox.utils.Constants;
4 import edu.jiangxin.apktoolbox.utils.Utils;
5 import org.apache.commons.configuration2.Configuration;
6 import org.apache.commons.lang3.StringUtils;
7 import org.apache.commons.lang3.Strings;
8 import org.apache.logging.log4j.LogManager;
9 import org.apache.logging.log4j.Logger;
10
11 import javax.swing.*;
12 import javax.swing.text.JTextComponent;
13 import java.awt.*;
14 import java.io.File;
15 import java.util.Objects;
16 import java.util.function.BiConsumer;
17
18 public final class UiStateKeeper {
19 private static final Logger logger = LogManager.getLogger(UiStateKeeper.class.getSimpleName());
20 private static final Configuration conf = Utils.getConfiguration();
21
22 public static void save(Container root) {
23 if (root == null) {
24 return;
25 }
26 String prefix = root.getName() == null ? root.getClass().getSimpleName() : root.getName();
27 scan(root, prefix, (c, key) -> {
28 String value = valueOf(c);
29 if (!StringUtils.isEmpty(value)) {
30 conf.setProperty(key, value);
31 }
32 });
33 }
34
35 public static void restore(Container root) {
36 if (root == null) {
37 return;
38 }
39 String prefix = root.getName() == null ? root.getClass().getSimpleName() : root.getName();
40 scan(root, prefix, (c, key) -> {
41 String value = conf.getString(key);
42 if (value != null) {
43 setValue(c, value);
44 }
45 });
46 }
47
48 private static void scan(Container root, String prefix, BiConsumer<Component, String> action) {
49 for (Component c : SwingUtils.getAllComponents(root)) {
50 String name = c.getName();
51 if (StringUtils.isEmpty(name) || !name.startsWith(Constants.KEY_PREFIX)) {
52 continue;
53 }
54 action.accept(c, prefix + "." + Strings.CS.remove(name, Constants.KEY_PREFIX));
55 }
56 }
57
58 private static String valueOf(Component c) {
59 if (c instanceof JTextComponent) {
60 String text = ((JTextComponent) c).getText();
61 logger.info("JTextComponent name={}, text={}", c.getName(), text);
62 return ((JTextComponent) c).getText();
63 }
64 if (c instanceof JCheckBox) {
65 return String.valueOf(((JCheckBox) c).isSelected());
66 }
67 if (c instanceof JRadioButton) {
68 return String.valueOf(((JRadioButton) c).isSelected());
69 }
70 if (c instanceof JComboBox) {
71 return Objects.toString(((JComboBox<?>) c).getSelectedItem(), "");
72 }
73 if (c instanceof JFileChooser) {
74 return ((JFileChooser) c).getSelectedFile() == null ? "" :
75 ((JFileChooser) c).getSelectedFile().getAbsolutePath();
76 }
77 return null;
78 }
79
80 private static void setValue(Component c, String v) {
81 try {
82 if (c instanceof JTextComponent) {
83 ((JTextComponent) c).setText(v);
84 } else if (c instanceof JCheckBox) {
85 ((JCheckBox) c).setSelected(Boolean.parseBoolean(v));
86 } else if (c instanceof JRadioButton) {
87 ((JRadioButton) c).setSelected(Boolean.parseBoolean(v));
88 } else if (c instanceof JComboBox) {
89 ((JComboBox<?>) c).setSelectedItem(v);
90 } else if (c instanceof JFileChooser) {
91 File f = new File(v);
92 if (f.exists()) ((JFileChooser) c).setSelectedFile(f);
93 }
94 } catch (Exception ignored) {
95 logger.error("setValue error, component name={}, value={}", c.getName(), v);
96 }
97 }
98 }