Merge branch 'subtree'
[nikiroo-utils.git] / src / be / nikiroo / utils / ui / ConfigItemColor.java
1 package be.nikiroo.utils.ui;
2
3 import java.awt.BorderLayout;
4 import java.awt.Color;
5 import java.awt.Graphics2D;
6 import java.awt.event.ActionEvent;
7 import java.awt.event.ActionListener;
8 import java.awt.event.KeyAdapter;
9 import java.awt.event.KeyEvent;
10 import java.awt.image.BufferedImage;
11 import java.util.HashMap;
12 import java.util.Map;
13
14 import javax.swing.Icon;
15 import javax.swing.ImageIcon;
16 import javax.swing.JButton;
17 import javax.swing.JColorChooser;
18 import javax.swing.JComponent;
19 import javax.swing.JPanel;
20 import javax.swing.JTextField;
21
22 import be.nikiroo.utils.resources.MetaInfo;
23
24 class ConfigItemColor<E extends Enum<E>> extends ConfigItem<E> {
25 private static final long serialVersionUID = 1L;
26
27 private Map<JComponent, JTextField> fields = new HashMap<JComponent, JTextField>();
28 private Map<JComponent, JButton> panels = new HashMap<JComponent, JButton>();
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) {
52 return getInfo().getString(item, true);
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 }
61
62 JButton colorWheel = panels.get(getField(item));
63 if (colorWheel != null) {
64 colorWheel.setIcon(getIcon(17, getFromInfoColor(item)));
65 }
66 }
67
68 @Override
69 protected void setToInfo(Object value, int item) {
70 getInfo().setString((String) value, item);
71 }
72
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 */
83 private int getFromInfoColor(int item) {
84 Integer color = getInfo().getColor(item, true);
85 if (color == null) {
86 return new Color(255, 255, 255, 255).getRGB();
87 }
88
89 return color;
90 }
91
92 @Override
93 protected JComponent createEmptyField(final int item) {
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,
105 getInfo().getName(), initialColor);
106 if (newColor != null) {
107 getInfo().setColor(newColor.getRGB(), item);
108 field.setText(getInfo().getString(item, false));
109 colorWheel.setIcon(getIcon(17,
110 getInfo().getColor(item, true)));
111 }
112 }
113 });
114
115 field.addKeyListener(new KeyAdapter() {
116 @Override
117 public void keyTyped(KeyEvent e) {
118 getInfo().setString(field.getText() + e.getKeyChar(), item);
119 int color = getFromInfoColor(item);
120 colorWheel.setIcon(getIcon(17, color));
121 }
122 });
123
124 pane.add(colorWheel, BorderLayout.WEST);
125 pane.add(field, BorderLayout.CENTER);
126
127 fields.put(pane, field);
128 panels.put(pane, colorWheel);
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 }