001//License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.gui.imageinfo; 003 004import java.awt.BorderLayout; 005import java.util.Collection; 006 007import javax.swing.JCheckBox; 008import javax.swing.JPanel; 009import javax.swing.SwingUtilities; 010 011import org.openstreetmap.josm.data.SelectionChangedListener; 012import org.openstreetmap.josm.data.osm.DataSet; 013import org.openstreetmap.josm.data.osm.OsmPrimitive; 014import org.openstreetmap.josm.data.preferences.AbstractProperty.ValueChangeListener; 015import org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage; 016import org.openstreetmap.josm.plugins.streetside.StreetsideDataListener; 017import org.openstreetmap.josm.plugins.streetside.StreetsideImage; 018import org.openstreetmap.josm.plugins.streetside.actions.ImageReloadAction; 019import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils; 020import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils; 021import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton; 022import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox; 023import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties; 024import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL; 025import org.openstreetmap.josm.tools.I18n; 026import org.openstreetmap.josm.tools.Logging; 027 028 029public final class StreetsideViewerPanel extends JPanel 030 implements StreetsideDataListener, SelectionChangedListener { 031 032 private static final long serialVersionUID = 4141847503072417190L; 033 034 private JCheckBox highResImageryCheck; 035 private WebLinkAction imgLinkAction; 036 private ImageReloadAction imgReloadAction; 037 private ValueChangeListener<Boolean> imageLinkChangeListener; 038 039 private static ThreeSixtyDegreeViewerPanel threeSixtyDegreeViewerPanel; 040 041 public StreetsideViewerPanel() { 042 043 super(new BorderLayout()); 044 045 SwingUtilities.invokeLater(new Runnable() { 046 @Override 047 public void run() { 048 initializeAndStartGUI(); 049 } 050 }); 051 052 selectedImageChanged(null, null); 053 054 setToolTipText(I18n.tr("Select Microsoft Streetside from the Imagery menu, then click on a blue vector bubble..")); 055 } 056 057 private void initializeAndStartGUI() { 058 059 DataSet.addSelectionListener(this); 060 061 threeSixtyDegreeViewerPanel = new ThreeSixtyDegreeViewerPanel(); 062 063 GraphicsUtils.PlatformHelper.run(() -> { 064 threeSixtyDegreeViewerPanel.initialize(); 065 }); 066 067 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 068 revalidate(); 069 repaint(); 070 JPanel checkPanel = new JPanel(); 071 072 imgReloadAction = new ImageReloadAction(I18n.tr("Reload")); 073 074 StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction); 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(I18n.tr("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(checkPanel, BorderLayout.PAGE_START); 093 add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER); 094 095 add(privacyLink, BorderLayout.PAGE_END); 096 } 097 098 /* 099 * (non-Javadoc) 100 * 101 * @see 102 * org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#imagesAdded( 103 * ) 104 */ 105 @Override 106 public void imagesAdded() { 107 // Method is not needed, but enforcesd by the interface StreetsideDataListener 108 } 109 110 /* 111 * (non-Javadoc) 112 * 113 * @see org.openstreetmap.josm.plugins.streetside.StreetsideDataListener# 114 * selectedImageChanged(org.openstreetmap.josm.plugins.streetside. 115 * StreetsideAbstractImage, 116 * org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage) 117 */ 118 @Override 119 public synchronized void selectedImageChanged(final StreetsideAbstractImage oldImage, 120 final StreetsideAbstractImage newImage) { 121 122 // method is invoked with null initially by framework 123 if(newImage!=null) { 124 125 Logging.debug(String.format( 126 "Selected Streetside image changed from %s to %s.", 127 oldImage instanceof StreetsideImage ? ((StreetsideImage) oldImage).getId() : "‹none›", 128 newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId() : "‹none›" 129 )); 130 131 //imgIdValue.setEnabled(newImage instanceof StreetsideImage); 132 final String newImageId = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null; 133 if (newImageId != null) { 134 final String bubbleId = CubemapUtils.convertQuaternary2Decimal(newImageId); 135 imageLinkChangeListener = b -> imgLinkAction.setURL( 136 StreetsideURL.MainWebsite.streetsidePrivacyLink(bubbleId) 137 ); 138 imageLinkChangeListener.valueChanged(null); 139 StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener); 140 141 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 /* 153 * (non-Javadoc) 154 * 155 * @see 156 * org.openstreetmap.josm.data.SelectionChangedListener#selectionChanged(java. 157 * util.Collection) 158 */ 159 @Override 160 public synchronized void selectionChanged(final Collection<? extends OsmPrimitive> sel) { 161 Logging.debug(String.format("Selection changed. %d primitives are selected.", sel == null ? 0 : sel.size())); 162 } 163 164 public CubemapBox getCubemapBox() { 165 return threeSixtyDegreeViewerPanel.getCubemapBox(); 166 } 167 168 /** 169 * @return the threeSixtyDegreeViewerPanel 170 */ 171 public static ThreeSixtyDegreeViewerPanel getThreeSixtyDegreeViewerPanel() { 172 return threeSixtyDegreeViewerPanel; 173 } 174}