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 }