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.CubemapBox; 018import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapBuilder; 019import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils; 020import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton; 021import org.openstreetmap.josm.plugins.streetside.utils.GraphicsUtils; 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 private StreetsideViewerHelpPopup streetsideViewerHelp; 041 042 public StreetsideViewerPanel() { 043 044 super(new BorderLayout()); 045 046 SwingUtilities.invokeLater(() -> initializeAndStartGUI()); 047 048 selectedImageChanged(null, null); 049 050 setToolTipText(I18n.tr("Select Microsoft Streetside from the Imagery menu, then click on a blue vector bubble..")); 051 } 052 053 private void initializeAndStartGUI() { 054 055 threeSixtyDegreeViewerPanel = new ThreeSixtyDegreeViewerPanel(); 056 057 GraphicsUtils.PlatformHelper.run(() -> { 058 threeSixtyDegreeViewerPanel.initialize(); 059 }); 060 061 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 062 revalidate(); 063 repaint(); 064 JPanel checkPanel = new JPanel(); 065 066 imgReloadAction = new ImageReloadAction("Reload"); 067 068 StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction); 069 070 highResImageryCheck = new JCheckBox("High resolution"); 071 highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()); 072 highResImageryCheck.addActionListener( 073 action -> StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.put(highResImageryCheck.isSelected()) 074 ); 075 StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.addListener( 076 valueChange -> highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) 077 ); 078 checkPanel.add(highResImageryCheck, BorderLayout.WEST); 079 checkPanel.add(imgReloadButton, BorderLayout.EAST); 080 081 JPanel privacyLink = new JPanel(); 082 083 imgLinkAction = new WebLinkAction("Report a privacy concern with this image", null); 084 privacyLink.add(new StreetsideButton(imgLinkAction, true)); 085 checkPanel.add(privacyLink, BorderLayout.PAGE_END); 086 087 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 088 089 JPanel bottomPanel = new JPanel(); 090 bottomPanel.add(checkPanel, BorderLayout.NORTH); 091 bottomPanel.add(privacyLink, BorderLayout.SOUTH); 092 093 add(bottomPanel, BorderLayout.PAGE_END); 094 } 095 096 /* 097 * (non-Javadoc) 098 * 099 * @see 100 * org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#imagesAdded( 101 * ) 102 */ 103 @Override 104 public void imagesAdded() { 105 // Method is not needed, but enforcesd by the interface StreetsideDataListener 106 } 107 108 /* 109 * (non-Javadoc) 110 * 111 * @see org.openstreetmap.josm.plugins.streetside.StreetsideDataListener# 112 * selectedImageChanged(org.openstreetmap.josm.plugins.streetside. 113 * StreetsideAbstractImage, 114 * org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage) 115 */ 116 @Override 117 public synchronized void selectedImageChanged(final StreetsideAbstractImage oldImage, 118 final StreetsideAbstractImage newImage) { 119 120 // method is invoked with null initially by framework 121 if(newImage!=null) { 122 123 logger.info(String.format( 124 "Selected Streetside image changed from %s to %s.", 125 oldImage instanceof StreetsideImage ? ((StreetsideImage) oldImage).getId() : "‹none›", 126 newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId() : "‹none›" 127 )); 128 129 final String newImageId = CubemapBuilder.getInstance().getCubemap() !=null ? CubemapBuilder.getInstance().getCubemap().getId() : newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null; 130 if (newImageId != null) { 131 final String bubbleId = CubemapUtils.convertQuaternary2Decimal(newImageId); 132 imageLinkChangeListener = b -> imgLinkAction.setURL( 133 StreetsideURL.MainWebsite.streetsidePrivacyLink(bubbleId) 134 ); 135 136 if(StreetsideProperties.DEBUGING_ENABLED.get()) { 137 logger.debug(MessageFormat.format("Privacy link set for Streetside image {0} quadKey {1}", bubbleId, newImageId)); 138 } 139 140 imageLinkChangeListener.valueChanged(null); 141 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener); 142 } else { 143 if (imageLinkChangeListener != null) { 144 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.removeListener(imageLinkChangeListener); 145 imageLinkChangeListener = null; 146 } 147 imgLinkAction.setURL(null); 148 } 149 } 150 } 151 152 public static CubemapBox getCubemapBox() { 153 return threeSixtyDegreeViewerPanel.getCubemapBox(); 154 } 155 156 /** 157 * @return the threeSixtyDegreeViewerPanel 158 */ 159 public static ThreeSixtyDegreeViewerPanel getThreeSixtyDegreeViewerPanel() { 160 return threeSixtyDegreeViewerPanel; 161 } 162}