001//License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.gui.imageinfo; 003 004import java.awt.BorderLayout; 005 006import javax.swing.JCheckBox; 007import javax.swing.JPanel; 008import javax.swing.SwingUtilities; 009 010import org.openstreetmap.josm.data.preferences.AbstractProperty.ValueChangeListener; 011import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage; 012import org.openstreetmap.josm.plugins.streetside.StreetsideDataListener; 013import org.openstreetmap.josm.plugins.streetside.StreetsideImage; 014import org.openstreetmap.josm.plugins.streetside.actions.ImageReloadAction; 015import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils; 016import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils; 017import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton; 018import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox; 019import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties; 020import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL; 021import org.openstreetmap.josm.tools.I18n; 022import org.openstreetmap.josm.tools.Logging; 023 024 025public final class StreetsideViewerPanel extends JPanel 026 implements StreetsideDataListener { 027 028 private static final long serialVersionUID = 4141847503072417190L; 029 030 private JCheckBox highResImageryCheck; 031 private WebLinkAction imgLinkAction; 032 private ImageReloadAction imgReloadAction; 033 private ValueChangeListener<Boolean> imageLinkChangeListener; 034 035 private static ThreeSixtyDegreeViewerPanel threeSixtyDegreeViewerPanel; 036 037 public StreetsideViewerPanel() { 038 039 super(new BorderLayout()); 040 041 SwingUtilities.invokeLater(new Runnable() { 042 @Override 043 public void run() { 044 initializeAndStartGUI(); 045 } 046 }); 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(I18n.tr("Reload")); 067 068 StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction); 069 highResImageryCheck = new JCheckBox(I18n.tr("High resolution")); 070 highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()); 071 highResImageryCheck.addActionListener( 072 action -> StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.put(highResImageryCheck.isSelected()) 073 ); 074 StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.addListener( 075 valueChange -> highResImageryCheck.setSelected(StreetsideProperties.SHOW_HIGH_RES_STREETSIDE_IMAGERY.get()) 076 ); 077 checkPanel.add(highResImageryCheck, BorderLayout.WEST); 078 checkPanel.add(imgReloadButton, BorderLayout.EAST); 079 080 JPanel privacyLink = new JPanel(); 081 082 imgLinkAction = new WebLinkAction(I18n.tr("Report a privacy concern with this image"), null); 083 privacyLink.add(new StreetsideButton(imgLinkAction, true)); 084 checkPanel.add(privacyLink, BorderLayout.PAGE_END); 085 086 add(checkPanel, BorderLayout.PAGE_START); 087 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 088 089 add(privacyLink, BorderLayout.PAGE_END); 090 } 091 092 /* 093 * (non-Javadoc) 094 * 095 * @see 096 * org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#imagesAdded( 097 * ) 098 */ 099 @Override 100 public void imagesAdded() { 101 // Method is not needed, but enforcesd by the interface StreetsideDataListener 102 } 103 104 /* 105 * (non-Javadoc) 106 * 107 * @see org.openstreetmap.josm.plugins.streetside.StreetsideDataListener# 108 * selectedImageChanged(org.openstreetmap.josm.plugins.streetside. 109 * StreetsideAbstractImage, 110 * org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage) 111 */ 112 @Override 113 public synchronized void selectedImageChanged(final StreetsideAbstractImage oldImage, 114 final StreetsideAbstractImage newImage) { 115 116 // method is invoked with null initially by framework 117 if(newImage!=null) { 118 119 Logging.debug(String.format( 120 "Selected Streetside image changed from %s to %s.", 121 oldImage instanceof StreetsideImage ? ((StreetsideImage) oldImage).getId() : "‹none›", 122 newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId() : "‹none›" 123 )); 124 125 //imgIdValue.setEnabled(newImage instanceof StreetsideImage); 126 final String newImageId = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null; 127 if (newImageId != null) { 128 final String bubbleId = CubemapUtils.convertQuaternary2Decimal(newImageId); 129 imageLinkChangeListener = b -> imgLinkAction.setURL( 130 StreetsideURL.MainWebsite.streetsidePrivacyLink(bubbleId) 131 ); 132 imageLinkChangeListener.valueChanged(null); 133 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener); 134 135 136 } else { 137 if (imageLinkChangeListener != null) { 138 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.removeListener(imageLinkChangeListener); 139 imageLinkChangeListener = null; 140 } 141 imgLinkAction.setURL(null); 142 } 143 } 144 } 145 146 public CubemapBox getCubemapBox() { 147 return threeSixtyDegreeViewerPanel.getCubemapBox(); 148 } 149 150 /** 151 * @return the threeSixtyDegreeViewerPanel 152 */ 153 public static ThreeSixtyDegreeViewerPanel getThreeSixtyDegreeViewerPanel() { 154 return threeSixtyDegreeViewerPanel; 155 } 156}