001//License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.gui.imageinfo; 003 004import java.awt.BorderLayout; 005import java.text.MessageFormat; 006 007import javax.swing.JCheckBox; 008import javax.swing.JPanel; 009import javax.swing.SwingUtilities; 010 011import org.apache.log4j.Logger; 012import org.openstreetmap.josm.data.preferences.AbstractProperty.ValueChangeListener; 013import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage; 014import org.openstreetmap.josm.plugins.streetside.StreetsideDataListener; 015import org.openstreetmap.josm.plugins.streetside.StreetsideImage; 016import org.openstreetmap.josm.plugins.streetside.actions.ImageReloadAction; 017import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder; 018import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils; 019import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils; 020import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton; 021import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox; 022import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties; 023import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL; 024import org.openstreetmap.josm.tools.I18n; 025 026public final class StreetsideViewerPanel extends JPanel 027 implements StreetsideDataListener { 028 029 private static final long serialVersionUID = 4141847503072417190L; 030 031 final static Logger logger = Logger.getLogger(StreetsideViewerPanel.class); 032 033 private JCheckBox highResImageryCheck; 034 private WebLinkAction imgLinkAction; 035 private ImageReloadAction imgReloadAction; 036 private ValueChangeListener<Boolean> imageLinkChangeListener; 037 038 private static ThreeSixtyDegreeViewerPanel threeSixtyDegreeViewerPanel; 039 040 public StreetsideViewerPanel() { 041 042 super(new BorderLayout()); 043 044 SwingUtilities.invokeLater(new Runnable() { 045 @Override 046 public void run() { 047 initializeAndStartGUI(); 048 } 049 }); 050 051 selectedImageChanged(null, null); 052 053 setToolTipText(I18n.tr("Select Microsoft Streetside from the Imagery menu, then click on a blue vector bubble..")); 054 } 055 056 private void initializeAndStartGUI() { 057 058 threeSixtyDegreeViewerPanel = new ThreeSixtyDegreeViewerPanel(); 059 060 GraphicsUtils.PlatformHelper.run(() -> { 061 threeSixtyDegreeViewerPanel.initialize(); 062 }); 063 064 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 065 revalidate(); 066 repaint(); 067 JPanel checkPanel = new JPanel(); 068 069 // TODO: I18n for all languages? 070 imgReloadAction = new ImageReloadAction(/*I18n.tr(*/"Reload"/*)*/); 071 072 StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction); 073 074 // TODO: I18n for all languages? 075 highResImageryCheck = new JCheckBox(/*I18n.tr(*/"High resolution"/*)*/); 076 highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()); 077 highResImageryCheck.addActionListener( 078 action -> StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.put(highResImageryCheck.isSelected()) 079 ); 080 StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.addListener( 081 valueChange -> highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) 082 ); 083 checkPanel.add(highResImageryCheck, BorderLayout.WEST); 084 checkPanel.add(imgReloadButton, BorderLayout.EAST); 085 086 JPanel privacyLink = new JPanel(); 087 088 imgLinkAction = new WebLinkAction("Report a privacy concern with this image", null); 089 privacyLink.add(new StreetsideButton(imgLinkAction, true)); 090 checkPanel.add(privacyLink, BorderLayout.PAGE_END); 091 092 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 093 094 JPanel bottomPanel = new JPanel(); 095 bottomPanel.add(checkPanel, BorderLayout.NORTH); 096 bottomPanel.add(privacyLink, BorderLayout.SOUTH); 097 098 add(bottomPanel, BorderLayout.PAGE_END); 099 } 100 101 /* 102 * (non-Javadoc) 103 * 104 * @see 105 * org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#imagesAdded( 106 * ) 107 */ 108 @Override 109 public void imagesAdded() { 110 // Method is not needed, but enforcesd by the interface StreetsideDataListener 111 } 112 113 /* 114 * (non-Javadoc) 115 * 116 * @see org.openstreetmap.josm.plugins.streetside.StreetsideDataListener# 117 * selectedImageChanged(org.openstreetmap.josm.plugins.streetside. 118 * StreetsideAbstractImage, 119 * org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage) 120 */ 121 @Override 122 public synchronized void selectedImageChanged(final StreetsideAbstractImage oldImage, 123 final StreetsideAbstractImage newImage) { 124 125 // method is invoked with null initially by framework 126 if(newImage!=null) { 127 128 logger.info(String.format( 129 "Selected Streetside image changed from %s to %s.", 130 oldImage instanceof StreetsideImage ? ((StreetsideImage) oldImage).getId() : "‹none›", 131 newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId() : "‹none›" 132 )); 133 134 final String newImageId = CubemapBuilder.getInstance().getCubemap() !=null ? CubemapBuilder.getInstance().getCubemap().getId() : newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null; 135 if (newImageId != null) { 136 final String bubbleId = CubemapUtils.convertQuaternary2Decimal(newImageId); 137 imageLinkChangeListener = b -> imgLinkAction.setURL( 138 StreetsideURL.MainWebsite.streetsidePrivacyLink(bubbleId) 139 ); 140 141 if(StreetsideProperties.DEBUGING_ENABLED.get()) { 142 logger.debug(MessageFormat.format("Privacy link set for Streetside image {0} quadKey {1}", bubbleId, newImageId)); 143 } 144 145 imageLinkChangeListener.valueChanged(null); 146 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener); 147 } else { 148 if (imageLinkChangeListener != null) { 149 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.removeListener(imageLinkChangeListener); 150 imageLinkChangeListener = null; 151 } 152 imgLinkAction.setURL(null); 153 } 154 } 155 } 156 157 public CubemapBox getCubemapBox() { 158 return threeSixtyDegreeViewerPanel.getCubemapBox(); 159 } 160 161 /** 162 * @return the threeSixtyDegreeViewerPanel 163 */ 164 public static ThreeSixtyDegreeViewerPanel getThreeSixtyDegreeViewerPanel() { 165 return threeSixtyDegreeViewerPanel; 166 } 167}