Version 1.4.0: new Bundle configuration controls
[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 public void actionPerformed(ActionEvent e) {
64 for (ConfigItem<E> item : items) {
65 item.reload();
66 }
67 }
68 }));
69
70 main.add(createButton("Default", new ActionListener() {
71 public void actionPerformed(ActionEvent e) {
72 Object snap = bundle.takeSnapshot();
73 bundle.reload(true);
74 for (ConfigItem<E> item : items) {
75 item.reload();
76 }
77 bundle.reload(false);
78 bundle.restoreSnapshot(snap);
79 }
80 }));
81
82 main.add(createButton("Save", new ActionListener() {
83 public void actionPerformed(ActionEvent e) {
84 for (ConfigItem<E> item : items) {
85 item.save();
86 }
87
88 try {
89 bundle.updateFile();
90 } catch (IOException e1) {
91 e1.printStackTrace();
92 }
93 }
94 }));
95 }
96
97 /**
98 * Add an action button for this action.
99 *
100 * @param title
101 * the action title
102 * @param listener
103 * the action
104 */
105 private JComponent createButton(String title, ActionListener listener) {
106 JButton button = new JButton(title);
107 button.addActionListener(listener);
108
109 JPanel panel = new JPanel();
110 panel.setLayout(new BorderLayout());
111 panel.setBorder(new EmptyBorder(2, 10, 2, 10));
112 panel.add(button, BorderLayout.CENTER);
113
114 return panel;
115 }
116 }