Bundle: fix memory leak at init/reset
[fanfix.git] / ui / ConfigItemColor.java
CommitLineData
d5026c09
NR
1package be.nikiroo.utils.ui;
2
3import java.awt.BorderLayout;
4import java.awt.Color;
5import java.awt.Graphics2D;
6import java.awt.event.ActionEvent;
7import java.awt.event.ActionListener;
725fb761
NR
8import java.awt.event.KeyAdapter;
9import java.awt.event.KeyEvent;
d5026c09
NR
10import java.awt.image.BufferedImage;
11import java.util.HashMap;
12import java.util.Map;
13
14import javax.swing.Icon;
15import javax.swing.ImageIcon;
16import javax.swing.JButton;
17import javax.swing.JColorChooser;
18import javax.swing.JComponent;
19import javax.swing.JPanel;
20import javax.swing.JTextField;
21
22import be.nikiroo.utils.resources.MetaInfo;
23
8cea9dc5 24class ConfigItemColor<E extends Enum<E>> extends ConfigItem<E> {
d5026c09
NR
25 private static final long serialVersionUID = 1L;
26
27 private Map<JComponent, JTextField> fields = new HashMap<JComponent, JTextField>();
725fb761 28 private Map<JComponent, JButton> panels = new HashMap<JComponent, JButton>();
d5026c09
NR
29
30 /**
31 * Create a new {@link ConfigItemColor} for the given {@link MetaInfo}.
32 *
33 * @param info
34 * the {@link MetaInfo}
35 */
36 public ConfigItemColor(MetaInfo<E> info) {
37 super(info, true);
38 }
39
40 @Override
41 protected Object getFromField(int item) {
42 JTextField field = fields.get(getField(item));
43 if (field != null) {
44 return field.getText();
45 }
46
47 return null;
48 }
49
50 @Override
51 protected Object getFromInfo(int item) {
aa9c3626 52 return getInfo().getString(item, true);
d5026c09
NR
53 }
54
55 @Override
56 protected void setToField(Object value, int item) {
57 JTextField field = fields.get(getField(item));
58 if (field != null) {
59 field.setText(value == null ? "" : value.toString());
60 }
725fb761
NR
61
62 JButton colorWheel = panels.get(getField(item));
63 if (colorWheel != null) {
64 colorWheel.setIcon(getIcon(17, getFromInfoColor(item)));
65 }
d5026c09
NR
66 }
67
68 @Override
69 protected void setToInfo(Object value, int item) {
aa9c3626 70 getInfo().setString((String) value, item);
d5026c09
NR
71 }
72
725fb761
NR
73 /**
74 * Get the colour currently present in the linked info for the given item.
75 *
76 * @param item
77 * the item number to get for an array of values, or -1 to get
78 * the whole value (has no effect if {@link MetaInfo#isArray()}
79 * is FALSE)
80 *
81 * @return a colour
82 */
d5026c09 83 private int getFromInfoColor(int item) {
aa9c3626 84 Integer color = getInfo().getColor(item, true);
d5026c09
NR
85 if (color == null) {
86 return new Color(255, 255, 255, 255).getRGB();
87 }
88
89 return color;
90 }
91
92 @Override
a0376372 93 protected JComponent createEmptyField(final int item) {
d5026c09
NR
94 final JPanel pane = new JPanel(new BorderLayout());
95 final JTextField field = new JTextField();
96
97 final JButton colorWheel = new JButton();
98 colorWheel.setIcon(getIcon(17, getFromInfoColor(item)));
99 colorWheel.addActionListener(new ActionListener() {
100 @Override
101 public void actionPerformed(ActionEvent e) {
102 int icol = getFromInfoColor(item);
103 Color initialColor = new Color(icol, true);
104 Color newColor = JColorChooser.showDialog(ConfigItemColor.this,
aa9c3626 105 getInfo().getName(), initialColor);
d5026c09 106 if (newColor != null) {
aa9c3626
NR
107 getInfo().setColor(newColor.getRGB(), item);
108 field.setText(getInfo().getString(item, false));
109 colorWheel.setIcon(getIcon(17,
110 getInfo().getColor(item, true)));
d5026c09
NR
111 }
112 }
113 });
114
725fb761
NR
115 field.addKeyListener(new KeyAdapter() {
116 @Override
117 public void keyTyped(KeyEvent e) {
aa9c3626 118 getInfo().setString(field.getText() + e.getKeyChar(), item);
725fb761
NR
119 int color = getFromInfoColor(item);
120 colorWheel.setIcon(getIcon(17, color));
121 }
122 });
123
d5026c09
NR
124 pane.add(colorWheel, BorderLayout.WEST);
125 pane.add(field, BorderLayout.CENTER);
126
127 fields.put(pane, field);
725fb761 128 panels.put(pane, colorWheel);
d5026c09
NR
129 return pane;
130 }
131
132 /**
133 * Return an {@link Icon} to use as a colour badge for the colour field
134 * controls.
135 *
136 * @param size
137 * the size of the badge
138 * @param color
139 * the colour of the badge, which can be NULL (will return
140 * transparent white)
141 *
142 * @return the badge
143 */
144 static private Icon getIcon(int size, Integer color) {
145 // Allow null values
146 if (color == null) {
147 color = new Color(255, 255, 255, 255).getRGB();
148 }
149
150 Color c = new Color(color, true);
151 int avg = (c.getRed() + c.getGreen() + c.getBlue()) / 3;
152 Color border = (avg >= 128 ? Color.BLACK : Color.WHITE);
153
154 BufferedImage img = new BufferedImage(size, size,
155 BufferedImage.TYPE_4BYTE_ABGR);
156
157 Graphics2D g = img.createGraphics();
158 try {
159 g.setColor(c);
160 g.fillRect(0, 0, img.getWidth(), img.getHeight());
161 g.setColor(border);
162 g.drawRect(0, 0, img.getWidth() - 1, img.getHeight() - 1);
163 } finally {
164 g.dispose();
165 }
166
167 return new ImageIcon(img);
168 }
169}