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}