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.CubemapBuilder;
016import org.openstreetmap.josm.plugins.streetside.cubemap.CubemapUtils;
017import org.openstreetmap.josm.plugins.streetside.cubemap.GraphicsUtils;
018import org.openstreetmap.josm.plugins.streetside.gui.boilerplate.StreetsideButton;
019import org.openstreetmap.josm.plugins.streetside.utils.CubemapBox;
020import org.openstreetmap.josm.plugins.streetside.utils.StreetsideProperties;
021import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL;
022import org.openstreetmap.josm.tools.I18n;
023import org.openstreetmap.josm.tools.Logging;
024
025
026public final class StreetsideViewerPanel extends JPanel
027                implements StreetsideDataListener {
028
029        private static final long serialVersionUID = 4141847503072417190L;
030
031        private JCheckBox highResImageryCheck;
032        private WebLinkAction imgLinkAction;
033        private ImageReloadAction imgReloadAction;
034        private ValueChangeListener<Boolean> imageLinkChangeListener;
035
036        private static ThreeSixtyDegreeViewerPanel threeSixtyDegreeViewerPanel;
037
038        public StreetsideViewerPanel() {
039
040                super(new BorderLayout());
041
042                SwingUtilities.invokeLater(new Runnable() {
043                     @Override
044                     public void run() {
045                         initializeAndStartGUI();
046                     }
047                 });
048
049                selectedImageChanged(null, null);
050
051                setToolTipText(I18n.tr("Select Microsoft Streetside from the Imagery menu, then click on a blue vector bubble.."));
052        }
053
054        private void initializeAndStartGUI() {
055
056                threeSixtyDegreeViewerPanel = new ThreeSixtyDegreeViewerPanel();
057
058                GraphicsUtils.PlatformHelper.run(() -> {
059                threeSixtyDegreeViewerPanel.initialize();
060                });
061
062                add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER);
063                revalidate();
064                repaint();
065            JPanel checkPanel = new JPanel();
066
067            imgReloadAction = new ImageReloadAction(I18n.tr("Reload"));
068
069            StreetsideButton imgReloadButton = new StreetsideButton(imgReloadAction);
070                  highResImageryCheck = new JCheckBox(I18n.tr("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(I18n.tr("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(checkPanel, BorderLayout.PAGE_START);
088            add(threeSixtyDegreeViewerPanel, BorderLayout.CENTER);
089
090            JPanel bottomPanel = new JPanel();
091            bottomPanel.add(checkPanel, BorderLayout.NORTH);
092            bottomPanel.add(privacyLink, BorderLayout.SOUTH);
093
094            add(bottomPanel, BorderLayout.PAGE_END);
095        }
096
097        /*
098         * (non-Javadoc)
099         *
100         * @see
101         * org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#imagesAdded(
102         * )
103         */
104        @Override
105        public void imagesAdded() {
106                // Method is not needed, but enforcesd by the interface StreetsideDataListener
107        }
108
109        /*
110         * (non-Javadoc)
111         *
112         * @see org.openstreetmap.josm.plugins.streetside.StreetsideDataListener#
113         * selectedImageChanged(org.openstreetmap.josm.plugins.streetside.
114         * StreetsideAbstractImage,
115         * org.openstreetmap.josm.plugins.streetside.StreetsideAbstractImage)
116         */
117        @Override
118        public synchronized void selectedImageChanged(final StreetsideAbstractImage oldImage,
119                        final StreetsideAbstractImage newImage) {
120
121                // method is invoked with null initially by framework
122                if(newImage!=null) {
123
124                    Logging.debug(String.format(
125                      "Selected Streetside image changed from %s to %s.",
126                      oldImage instanceof StreetsideImage ? ((StreetsideImage) oldImage).getId() : "‹none›",
127                      newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId() : "‹none›"
128                    ));
129
130                    //imgIdValue.setEnabled(newImage instanceof StreetsideImage);
131                    //final String newImageId = newImage instanceof StreetsideImage ? ((StreetsideImage) newImage).getId(): null;
132                    final String newImageId = CubemapBuilder.getInstance().getCubemap() !=null ? CubemapBuilder.getInstance().getCubemap().getId() : 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
139                      Logging.debug(I18n.tr("Privacy link invoked for Streetside image {0}", bubbleId));
140
141                      imageLinkChangeListener.valueChanged(null);
142                      StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.addListener(imageLinkChangeListener);
143
144
145                    } else {
146                      if (imageLinkChangeListener != null) {
147                        StreetsideProperties.CUBEMAP_LINK_TO_BLUR_EDITOR.removeListener(imageLinkChangeListener);
148                        imageLinkChangeListener = null;
149                      }
150                      imgLinkAction.setURL(null);
151                    }
152                  }
153        }
154
155        public CubemapBox getCubemapBox() {
156                return threeSixtyDegreeViewerPanel.getCubemapBox();
157        }
158
159        /**
160         * @return the threeSixtyDegreeViewerPanel
161         */
162        public static ThreeSixtyDegreeViewerPanel getThreeSixtyDegreeViewerPanel() {
163                return threeSixtyDegreeViewerPanel;
164        }
165}