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) { | |
28a82bab | 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) { | |
28a82bab | 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) { |
28a82bab | 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, | |
28a82bab | 105 | getInfo().getName(), initialColor); |
d5026c09 | 106 | if (newColor != null) { |
28a82bab 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) { | |
28a82bab | 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 | } |