001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.autofilter;
003
004import java.awt.Color;
005import java.awt.Graphics;
006import java.awt.Graphics2D;
007import java.awt.RenderingHints;
008import java.awt.event.ActionEvent;
009
010import javax.swing.AbstractAction;
011import javax.swing.BorderFactory;
012import javax.swing.JButton;
013
014import org.openstreetmap.josm.actions.JosmAction;
015import org.openstreetmap.josm.actions.PreferencesAction;
016import org.openstreetmap.josm.data.preferences.NamedColorProperty;
017import org.openstreetmap.josm.gui.MainApplication;
018import org.openstreetmap.josm.gui.preferences.display.DrawingPreference;
019
020/**
021 * A button associated to an auto filter. If clicked twice, the filter is reset.
022 * @since 12400
023 */
024public class AutoFilterButton extends JButton {
025
026    private static final NamedColorProperty PROP_COLOR = new NamedColorProperty("auto.filter.button.color", new Color(0, 160, 160));
027
028    private final AutoFilter filter;
029
030    /**
031     * Constructs a new {@code AutoFilterButton}.
032     * @param filter auto filter associated to this button
033     */
034    public AutoFilterButton(final AutoFilter filter) {
035        super(new JosmAction(filter.getLabel(), null, filter.getDescription(), null, false) {
036            @Override
037            public synchronized void actionPerformed(ActionEvent e) {
038                AutoFilterManager afm = AutoFilterManager.getInstance();
039                if (filter.equals(afm.getCurrentAutoFilter())) {
040                    afm.setCurrentAutoFilter(null);
041                    MainApplication.getMap().filterDialog.getFilterModel().executeFilters(true);
042                } else {
043                    afm.setCurrentAutoFilter(filter);
044                }
045            }
046        });
047        this.filter = filter;
048        setForeground(Color.WHITE);
049        setContentAreaFilled(false);
050        setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7));
051    }
052
053    @Override
054    protected void paintComponent(Graphics g) {
055        if (getModel().isPressed()) {
056            g.setColor(PROP_COLOR.get().darker().darker());
057        } else if (getModel().isRollover() || AutoFilterManager.getInstance().getCurrentAutoFilter() == filter) {
058            g.setColor(PROP_COLOR.get().darker());
059        } else {
060            g.setColor(PROP_COLOR.get());
061        }
062        if (g instanceof Graphics2D) {
063            ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
064        }
065        g.fillRoundRect(0, 0, getWidth(), getHeight(), 3, 3);
066        super.paintComponent(g);
067    }
068
069    static AutoFilterButton forOsmKey(String key) {
070        final String name = key + ":";
071        final AutoFilterButton button = new AutoFilterButton(new AutoFilter(key, "", null));
072        button.setAction(new AbstractAction(name) {
073            @Override
074            public void actionPerformed(ActionEvent e) {
075                PreferencesAction.forPreferenceTab("", "null", DrawingPreference.class).actionPerformed(e);
076            }
077        });
078        return button;
079    }
080}