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}