ConfigItem: use lock steps label widths
[fanfix.git] / src / be / nikiroo / utils / ui / ConfigItem.java
CommitLineData
d350b96b
NR
1package be.nikiroo.utils.ui;
2
3import java.awt.BorderLayout;
c637d2e0 4import java.awt.Dimension;
d350b96b 5
9e834013 6import javax.swing.JCheckBox;
8517b60c 7import javax.swing.JLabel;
d350b96b
NR
8import javax.swing.JPanel;
9import javax.swing.JTextField;
d350b96b
NR
10
11import be.nikiroo.utils.resources.Bundle;
9e834013
NR
12import be.nikiroo.utils.resources.Meta.Format;
13import be.nikiroo.utils.resources.MetaInfo;
d350b96b
NR
14
15/**
16 * A graphical item that reflect a configuration option from the given
17 * {@link Bundle}.
18 *
19 * @author niki
db31c358 20 *
d350b96b
NR
21 * @param <E>
22 * the type of {@link Bundle} to edit
23 */
24public class ConfigItem<E extends Enum<E>> extends JPanel {
25 private static final long serialVersionUID = 1L;
db31c358 26
9e834013 27 public ConfigItem(final MetaInfo<E> info) {
d350b96b 28 this.setLayout(new BorderLayout());
d350b96b 29
9e834013
NR
30 if (info.getFormat() == Format.BOOLEAN) {
31 final JCheckBox field = new JCheckBox();
32 field.setToolTipText(info.getDescription());
33 Boolean state = info.getBoolean();
34 if (state == null) {
35 info.getDefaultBoolean();
db31c358 36 }
d350b96b 37
9e834013
NR
38 // Should not happen!
39 if (state == null) {
40 System.err
8517b60c
NR
41 .println("No default value given for BOOLEAN parameter \""
42 + info.getName()
43 + "\", we consider it is FALSE");
9e834013
NR
44 state = false;
45 }
d350b96b 46
9e834013
NR
47 field.setSelected(state);
48
8517b60c 49 info.addReloadedListener(new Runnable() {
9e834013
NR
50 @Override
51 public void run() {
8517b60c
NR
52 Boolean state = info.getBoolean();
53 if (state == null) {
54 info.getDefaultBoolean();
55 }
56 if (state == null) {
57 state = false;
58 }
59
60 field.setSelected(state);
61 }
62 });
63 info.addSaveListener(new Runnable() {
64 @Override
65 public void run() {
66 info.setBoolean(field.isSelected());
9e834013
NR
67 }
68 });
69
c637d2e0 70 field.setText(info.getName());
9e834013
NR
71 this.add(field, BorderLayout.CENTER);
72 } else {
73 final JTextField field = new JTextField();
74 field.setToolTipText(info.getDescription());
75 field.setText(info.getString());
76
8517b60c 77 info.addReloadedListener(new Runnable() {
9e834013
NR
78 @Override
79 public void run() {
80 field.setText(info.getString());
81 }
82 });
8517b60c
NR
83 info.addSaveListener(new Runnable() {
84 @Override
85 public void run() {
86 info.setString(field.getText());
87 }
88 });
9e834013 89
c637d2e0 90 this.add(label(info.getName()), BorderLayout.WEST);
9e834013 91 this.add(field, BorderLayout.CENTER);
d350b96b 92 }
d350b96b 93 }
c637d2e0
NR
94
95 /**
96 * Create a label which width is constrained in lock steps.
97 *
98 * @param text
99 * the text of the label
100 *
101 * @return the label
102 */
103 private JLabel label(String text) {
104 final JLabel label = new JLabel(text);
105
106 Dimension ps = label.getPreferredSize();
107 if (ps == null) {
108 ps = label.getSize();
109 }
110
111 int w = ps.width;
112 int step = 80;
113 for (int i = 2 * step; i < 10 * step; i += step) {
114 if (w < i) {
115 w = i;
116 break;
117 }
118 }
119
120 ps.width = w;
121 label.setSize(ps);
122 label.setPreferredSize(ps);
123
124 return label;
125 }
d350b96b 126}