001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.bbox;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Dimension;
007import java.awt.Graphics;
008import java.awt.event.MouseAdapter;
009import java.awt.event.MouseEvent;
010
011import javax.accessibility.Accessible;
012import javax.accessibility.AccessibleAction;
013import javax.accessibility.AccessibleContext;
014import javax.swing.ImageIcon;
015import javax.swing.JComponent;
016
017import org.openstreetmap.josm.tools.ImageProvider;
018
019/**
020 * Button allowing to control the dimension of a slippy map between two states (normal/enlarged).
021 * @author Tim Haussmann
022 * @since 1390
023 */
024public class SizeButton extends JComponent implements Accessible {
025
026    private final ImageIcon enlargeImage;
027    private final ImageIcon shrinkImage;
028    private boolean isEnlarged;
029    private final SlippyMapBBoxChooser slippyMapBBoxChooser;
030
031    private final transient MouseAdapter mouseAdapter = new MouseAdapter() {
032        @Override
033        public void mouseReleased(MouseEvent e) {
034            if (e.getButton() == MouseEvent.BUTTON1) {
035                toggle();
036            }
037        }
038    };
039
040    /**
041     * Constructs a new {@code SizeButton}.
042     * @param slippyMapBBoxChooser the associated slippy map
043     */
044    public SizeButton(SlippyMapBBoxChooser slippyMapBBoxChooser) {
045        this.slippyMapBBoxChooser = slippyMapBBoxChooser;
046        enlargeImage = ImageProvider.get("view-fullscreen");
047        shrinkImage = ImageProvider.get("view-fullscreen-revert");
048        setPreferredSize(new Dimension(enlargeImage.getIconWidth(), enlargeImage.getIconHeight()));
049        addMouseListener(mouseAdapter);
050        setToolTipText(tr("Enlarge"));
051    }
052
053    @Override
054    protected void paintComponent(Graphics g) {
055        super.paintComponent(g);
056        if (isEnlarged) {
057            if (shrinkImage != null)
058                g.drawImage(shrinkImage.getImage(), 0, 0, null);
059        } else {
060            if (enlargeImage != null)
061                g.drawImage(enlargeImage.getImage(), 0, 0, null);
062        }
063    }
064
065    /**
066     * Toggles button state.
067     */
068    public void toggle() {
069        isEnlarged = !isEnlarged;
070        setToolTipText(isEnlarged ? tr("Shrink") : tr("Enlarge"));
071        slippyMapBBoxChooser.resizeSlippyMap();
072    }
073
074    /**
075     * Determines if the slippy map is enlarged.
076     * @return {@code true} if the slippy map is enlarged, {@code false} otherwise
077     */
078    public boolean isEnlarged() {
079        return isEnlarged;
080    }
081
082    @Override
083    public AccessibleContext getAccessibleContext() {
084        if (accessibleContext == null) {
085            accessibleContext = new AccessibleSizeButton();
086        }
087        return accessibleContext;
088    }
089
090    class AccessibleSizeButton extends AccessibleJComponent implements AccessibleAction {
091
092        @Override
093        public int getAccessibleActionCount() {
094            return 1;
095        }
096
097        @Override
098        public String getAccessibleActionDescription(int i) {
099            return "toggle";
100        }
101
102        @Override
103        public boolean doAccessibleAction(int i) {
104            toggle();
105            return true;
106        }
107    }
108}