test: new: CryptUtilsTest
[nikiroo-utils.git] / src / be / nikiroo / utils / ui / ConfigEditor.java
1 package be.nikiroo.utils.ui;
2
3 import java.awt.BorderLayout;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.io.IOException;
7 import java.util.List;
8
9 import javax.swing.BoxLayout;
10 import javax.swing.JButton;
11 import javax.swing.JComponent;
12 import javax.swing.JLabel;
13 import javax.swing.JPanel;
14 import javax.swing.JScrollPane;
15 import javax.swing.border.EmptyBorder;
16
17 import be.nikiroo.utils.resources.Bundle;
18
19 /**
20 * A configuration panel for a {@link Bundle}.
21 * <p>
22 * All the items in the given {@link Bundle} will be displayed in editable
23 * controls, with options to Save, Reset and/or Reset to the application default
24 * values.
25 *
26 * @author niki
27 *
28 * @param <E>
29 * the type of {@link Bundle} to edit
30 */
31 public class ConfigEditor<E extends Enum<E>> extends JPanel {
32 private static final long serialVersionUID = 1L;
33 private List<ConfigItem<E>> items;
34
35 /**
36 * Create a new {@link ConfigEditor} for this {@link Bundle}.
37 *
38 * @param type
39 * a class instance of the item type to work on
40 * @param bundle
41 * the {@link Bundle} to sort through
42 * @param title
43 * the title to display before the options
44 */
45 public ConfigEditor(Class<E> type, final Bundle<E> bundle, String title) {
46 this.setLayout(new BorderLayout());
47 JPanel main = new JPanel();
48
49 JScrollPane scroll = new JScrollPane(main);
50 scroll.getVerticalScrollBar().setUnitIncrement(16);
51 this.add(scroll, BorderLayout.CENTER);
52
53 main.setLayout(new BoxLayout(main, BoxLayout.PAGE_AXIS));
54
55 main.add(new JLabel(title));
56
57 items = ConfigItem.getItems(type, bundle);
58 for (ConfigItem<E> item : items) {
59 main.add(item);
60 }
61
62 main.add(createButton("Reset", new ActionListener() {
63 @Override
64 public void actionPerformed(ActionEvent e) {
65 for (ConfigItem<E> item : items) {
66 item.reload();
67 }
68 }
69 }));
70
71 main.add(createButton("Default", new ActionListener() {
72 @Override
73 public void actionPerformed(ActionEvent e) {
74 Object snap = bundle.takeSnapshot();
75 bundle.reload(true);
76 for (ConfigItem<E> item : items) {
77 item.reload();
78 }
79 bundle.reload(false);
80 bundle.restoreSnapshot(snap);
81 }
82 }));
83
84 main.add(createButton("Save", new ActionListener() {
85 @Override
86 public void actionPerformed(ActionEvent e) {
87 for (ConfigItem<E> item : items) {
88 item.save();
89 }
90
91 try {
92 bundle.updateFile();
93 } catch (IOException e1) {
94 e1.printStackTrace();
95 }
96 }
97 }));
98 }
99
100 /**
101 * Add an action button for this action.
102 *
103 * @param title
104 * the action title
105 * @param listener
106 * the action
107 */
108 private JComponent createButton(String title, ActionListener listener) {
109 JButton button = new JButton(title);
110 button.addActionListener(listener);
111
112 JPanel panel = new JPanel();
113 panel.setLayout(new BorderLayout());
114 panel.setBorder(new EmptyBorder(2, 10, 2, 10));
115 panel.add(button, BorderLayout.CENTER);
116
117 return panel;
118 }
119 }