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        if (isEnlarged) {
056            if (shrinkImage != null)
057                g.drawImage(shrinkImage.getImage(), 0, 0, null);
058        } else {
059            if (enlargeImage != null)
060                g.drawImage(enlargeImage.getImage(), 0, 0, null);
061        }
062    }
063
064    /**
065     * Toggles button state.
066     */
067    public void toggle() {
068        isEnlarged = !isEnlarged;
069        setToolTipText(isEnlarged ? tr("Shrink") : tr("Enlarge"));
070        slippyMapBBoxChooser.resizeSlippyMap();
071    }
072
073    /**
074     * Determines if the slippy map is enlarged.
075     * @return {@code true} if the slippy map is enlarged, {@code false} otherwise
076     */
077    public boolean isEnlarged() {
078        return isEnlarged;
079    }
080
081    @Override
082    public AccessibleContext getAccessibleContext() {
083        if (accessibleContext == null) {
084            accessibleContext = new AccessibleSizeButton();
085        }
086        return accessibleContext;
087    }
088
089    class AccessibleSizeButton extends AccessibleJComponent implements AccessibleAction {
090
091        @Override
092        public int getAccessibleActionCount() {
093            return 1;
094        }
095
096        @Override
097        public String getAccessibleActionDescription(int i) {
098            return "toggle";
099        }
100
101        @Override
102        public boolean doAccessibleAction(int i) {
103            toggle();
104            return true;
105        }
106    }
107}