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}