Commit | Line | Data |
---|---|---|
d5026c09 NR |
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; | |
725fb761 NR |
8 | import java.awt.event.KeyAdapter; |
9 | import java.awt.event.KeyEvent; | |
d5026c09 NR |
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 | ||
8cea9dc5 | 24 | class 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) { | |
b5313d03 | 52 | return info.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) { | |
70 | info.setString((String) value, item); | |
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 NR |
83 | private int getFromInfoColor(int item) { |
84 | Integer color = info.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 | |
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, | |
105 | info.getName(), initialColor); | |
106 | if (newColor != null) { | |
107 | info.setColor(newColor.getRGB(), item); | |
108 | field.setText(info.getString(item, false)); | |
109 | colorWheel.setIcon(getIcon(17, info.getColor(item, true))); | |
110 | } | |
111 | } | |
112 | }); | |
113 | ||
725fb761 NR |
114 | field.addKeyListener(new KeyAdapter() { |
115 | @Override | |
116 | public void keyTyped(KeyEvent e) { | |
117 | info.setString(field.getText() + e.getKeyChar(), item); | |
118 | int color = getFromInfoColor(item); | |
119 | colorWheel.setIcon(getIcon(17, color)); | |
120 | } | |
121 | }); | |
122 | ||
d5026c09 NR |
123 | pane.add(colorWheel, BorderLayout.WEST); |
124 | pane.add(field, BorderLayout.CENTER); | |
125 | ||
126 | fields.put(pane, field); | |
725fb761 | 127 | panels.put(pane, colorWheel); |
d5026c09 NR |
128 | return pane; |
129 | } | |
130 | ||
131 | /** | |
132 | * Return an {@link Icon} to use as a colour badge for the colour field | |
133 | * controls. | |
134 | * | |
135 | * @param size | |
136 | * the size of the badge | |
137 | * @param color | |
138 | * the colour of the badge, which can be NULL (will return | |
139 | * transparent white) | |
140 | * | |
141 | * @return the badge | |
142 | */ | |
143 | static private Icon getIcon(int size, Integer color) { | |
144 | // Allow null values | |
145 | if (color == null) { | |
146 | color = new Color(255, 255, 255, 255).getRGB(); | |
147 | } | |
148 | ||
149 | Color c = new Color(color, true); | |
150 | int avg = (c.getRed() + c.getGreen() + c.getBlue()) / 3; | |
151 | Color border = (avg >= 128 ? Color.BLACK : Color.WHITE); | |
152 | ||
153 | BufferedImage img = new BufferedImage(size, size, | |
154 | BufferedImage.TYPE_4BYTE_ABGR); | |
155 | ||
156 | Graphics2D g = img.createGraphics(); | |
157 | try { | |
158 | g.setColor(c); | |
159 | g.fillRect(0, 0, img.getWidth(), img.getHeight()); | |
160 | g.setColor(border); | |
161 | g.drawRect(0, 0, img.getWidth() - 1, img.getHeight() - 1); | |
162 | } finally { | |
163 | g.dispose(); | |
164 | } | |
165 | ||
166 | return new ImageIcon(img); | |
167 | } | |
168 | } |