001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.mappaint;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Color;
007import java.awt.Component;
008import java.awt.Graphics;
009import java.awt.event.ActionEvent;
010import java.util.Collections;
011import java.util.Objects;
012
013import javax.swing.AbstractAction;
014import javax.swing.Icon;
015import javax.swing.JColorChooser;
016import javax.swing.JMenu;
017
018import org.openstreetmap.josm.gui.MainApplication;
019import org.openstreetmap.josm.gui.mappaint.StyleSetting.ColorStyleSetting;
020import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
021import org.openstreetmap.josm.tools.ImageProvider;
022import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
023
024/**
025 * A GUI to set a color style
026 * @author Taylor Smock
027 * @since 16842
028 */
029public class ColorStyleSettingGui implements StyleSettingGui {
030
031    private final ColorStyleSetting setting;
032
033    /**
034     * Create a new ColorStyleSettingGui
035     * @param setting The setting to create the GUI for
036     */
037    public ColorStyleSettingGui(ColorStyleSetting setting) {
038        this.setting = Objects.requireNonNull(setting);
039    }
040
041    static class ColorIcon implements Icon {
042
043        private final Color color;
044        private final ImageSizes size;
045
046        ColorIcon(Color color, ImageProvider.ImageSizes size) {
047            this.color = color;
048            this.size = size;
049        }
050
051        @Override
052        public void paintIcon(Component c, Graphics g, int x, int y) {
053            Color current = g.getColor();
054            g.setColor(color);
055            g.drawRect(x, y, getIconWidth(), getIconHeight());
056            g.fillRect(x, y, getIconWidth(), getIconHeight());
057            g.setColor(current); // So that the text is still black
058        }
059
060        @Override
061        public int getIconWidth() {
062            return size.getAdjustedWidth();
063        }
064
065        @Override
066        public int getIconHeight() {
067            return size.getAdjustedHeight();
068        }
069
070    }
071
072    class ColorStyleSettingAction extends AbstractAction {
073        ColorStyleSettingAction() {
074            super(setting.label, new ColorIcon(setting.getValue(), ImageSizes.SMALLICON));
075        }
076
077        @Override
078        public void actionPerformed(ActionEvent e) {
079            setting.setValue(JColorChooser.showDialog(MainApplication.getMainPanel(), tr("Choose a color"), setting.getValue()));
080            MainApplication.worker.submit(new MapPaintStyleLoader(Collections.singleton(setting.parentStyle)));
081        }
082    }
083
084    @Override
085    public void addMenuEntry(JMenu menu) {
086        menu.add(new ColorStyleSettingAction());
087    }
088
089}