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.BorderFactory; 011import javax.swing.JButton; 012 013import org.openstreetmap.josm.actions.JosmAction; 014import org.openstreetmap.josm.data.preferences.NamedColorProperty; 015import org.openstreetmap.josm.gui.MainApplication; 016 017/** 018 * A button associated to an auto filter. If clicked twice, the filter is reset. 019 * @since 12400 020 */ 021public class AutoFilterButton extends JButton { 022 023 private static final NamedColorProperty PROP_COLOR = new NamedColorProperty("auto.filter.button.color", new Color(0, 160, 160)); 024 025 private final AutoFilter filter; 026 027 /** 028 * Constructs a new {@code AutoFilterButton}. 029 * @param filter auto filter associated to this button 030 */ 031 public AutoFilterButton(final AutoFilter filter) { 032 super(new JosmAction(filter.getLabel(), null, filter.getDescription(), null, false) { 033 @Override 034 public synchronized void actionPerformed(ActionEvent e) { 035 AutoFilterManager afm = AutoFilterManager.getInstance(); 036 if (filter.equals(afm.getCurrentAutoFilter())) { 037 afm.setCurrentAutoFilter(null); 038 MainApplication.getMap().filterDialog.getFilterModel().executeFilters(true); 039 } else { 040 afm.setCurrentAutoFilter(filter); 041 } 042 } 043 }); 044 this.filter = filter; 045 setForeground(Color.WHITE); 046 setContentAreaFilled(false); 047 setBorder(BorderFactory.createEmptyBorder(7, 7, 7, 7)); 048 } 049 050 @Override 051 protected void paintComponent(Graphics g) { 052 if (getModel().isPressed()) { 053 g.setColor(PROP_COLOR.get().darker().darker()); 054 } else if (getModel().isRollover() || AutoFilterManager.getInstance().getCurrentAutoFilter() == filter) { 055 g.setColor(PROP_COLOR.get().darker()); 056 } else { 057 g.setColor(PROP_COLOR.get()); 058 } 059 if (g instanceof Graphics2D) { 060 ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 061 } 062 g.fillRoundRect(0, 0, getWidth(), getHeight(), 3, 3); 063 super.paintComponent(g); 064 } 065}