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}