X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FConfigItemColor.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fui%2FConfigItemColor.java;h=500efff4b3b802831ad584550ea183f0d0bb9195;hp=0000000000000000000000000000000000000000;hb=d46b7b96f94e88a776bcd2dfd756549ffb300cc9;hpb=c9994f27667bc421bcd448d39e55774fddf5c431 diff --git a/src/be/nikiroo/utils/ui/ConfigItemColor.java b/src/be/nikiroo/utils/ui/ConfigItemColor.java new file mode 100644 index 0000000..500efff --- /dev/null +++ b/src/be/nikiroo/utils/ui/ConfigItemColor.java @@ -0,0 +1,168 @@ +package be.nikiroo.utils.ui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JColorChooser; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import be.nikiroo.utils.resources.MetaInfo; + +class ConfigItemColor> extends ConfigItem { + private static final long serialVersionUID = 1L; + + private Map fields = new HashMap(); + private Map panels = new HashMap(); + + /** + * Create a new {@link ConfigItemColor} for the given {@link MetaInfo}. + * + * @param info + * the {@link MetaInfo} + */ + public ConfigItemColor(MetaInfo info) { + super(info, true); + } + + @Override + protected Object getFromField(int item) { + JTextField field = fields.get(getField(item)); + if (field != null) { + return field.getText(); + } + + return null; + } + + @Override + protected Object getFromInfo(int item) { + return info.getString(item, true); + } + + @Override + protected void setToField(Object value, int item) { + JTextField field = fields.get(getField(item)); + if (field != null) { + field.setText(value == null ? "" : value.toString()); + } + + JButton colorWheel = panels.get(getField(item)); + if (colorWheel != null) { + colorWheel.setIcon(getIcon(17, getFromInfoColor(item))); + } + } + + @Override + protected void setToInfo(Object value, int item) { + info.setString((String) value, item); + } + + /** + * Get the colour currently present in the linked info for the given item. + * + * @param item + * the item number to get for an array of values, or -1 to get + * the whole value (has no effect if {@link MetaInfo#isArray()} + * is FALSE) + * + * @return a colour + */ + private int getFromInfoColor(int item) { + Integer color = info.getColor(item, true); + if (color == null) { + return new Color(255, 255, 255, 255).getRGB(); + } + + return color; + } + + @Override + protected JComponent createEmptyField(final int item) { + final JPanel pane = new JPanel(new BorderLayout()); + final JTextField field = new JTextField(); + + final JButton colorWheel = new JButton(); + colorWheel.setIcon(getIcon(17, getFromInfoColor(item))); + colorWheel.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int icol = getFromInfoColor(item); + Color initialColor = new Color(icol, true); + Color newColor = JColorChooser.showDialog(ConfigItemColor.this, + info.getName(), initialColor); + if (newColor != null) { + info.setColor(newColor.getRGB(), item); + field.setText(info.getString(item, false)); + colorWheel.setIcon(getIcon(17, info.getColor(item, true))); + } + } + }); + + field.addKeyListener(new KeyAdapter() { + @Override + public void keyTyped(KeyEvent e) { + info.setString(field.getText() + e.getKeyChar(), item); + int color = getFromInfoColor(item); + colorWheel.setIcon(getIcon(17, color)); + } + }); + + pane.add(colorWheel, BorderLayout.WEST); + pane.add(field, BorderLayout.CENTER); + + fields.put(pane, field); + panels.put(pane, colorWheel); + return pane; + } + + /** + * Return an {@link Icon} to use as a colour badge for the colour field + * controls. + * + * @param size + * the size of the badge + * @param color + * the colour of the badge, which can be NULL (will return + * transparent white) + * + * @return the badge + */ + static private Icon getIcon(int size, Integer color) { + // Allow null values + if (color == null) { + color = new Color(255, 255, 255, 255).getRGB(); + } + + Color c = new Color(color, true); + int avg = (c.getRed() + c.getGreen() + c.getBlue()) / 3; + Color border = (avg >= 128 ? Color.BLACK : Color.WHITE); + + BufferedImage img = new BufferedImage(size, size, + BufferedImage.TYPE_4BYTE_ABGR); + + Graphics2D g = img.createGraphics(); + try { + g.setColor(c); + g.fillRect(0, 0, img.getWidth(), img.getHeight()); + g.setColor(border); + g.drawRect(0, 0, img.getWidth() - 1, img.getHeight() - 1); + } finally { + g.dispose(); + } + + return new ImageIcon(img); + } +}