001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.actionsupport;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Color;
007import java.awt.Font;
008import java.awt.GridBagLayout;
009import java.awt.Toolkit;
010import java.awt.event.ActionEvent;
011import java.awt.event.ActionListener;
012
013import javax.swing.JButton;
014import javax.swing.JLabel;
015import javax.swing.JPanel;
016import javax.swing.border.CompoundBorder;
017import javax.swing.border.EmptyBorder;
018import javax.swing.border.EtchedBorder;
019
020import org.openstreetmap.josm.Main;
021import org.openstreetmap.josm.gui.widgets.UrlLabel;
022import org.openstreetmap.josm.tools.GBC;
023import org.openstreetmap.josm.tools.ImageProvider;
024
025/**
026 * The panel to nag a user ONCE that he/she has to align imagery.
027 *
028 * @author zverik
029 */
030public class AlignImageryPanel extends JPanel {
031    private static final String PREF = "imagery.offsetnagging";
032
033    public AlignImageryPanel(boolean oneLine) {
034        super();
035
036        Font font = getFont().deriveFont(Font.PLAIN, 14.0f);
037        JLabel nagLabel = new JLabel(tr("Aerial imagery might be misaligned. Please check its offset using GPS tracks!"));
038        UrlLabel detailsList = new UrlLabel(tr("http://wiki.openstreetmap.org/wiki/Using_Imagery"), tr("Details..."));
039        nagLabel.setFont(font);
040        detailsList.setFont(font);
041
042        JButton closeButton = new JButton(ImageProvider.get("misc", "black_x"));
043        closeButton.setContentAreaFilled(false);
044        closeButton.setRolloverEnabled(true);
045        closeButton.setBorderPainted(false);
046        closeButton.setToolTipText(tr("Hide this message and never show it again"));
047        closeButton.addActionListener(new ActionListener() {
048            @Override
049            public void actionPerformed( ActionEvent e ) {
050                if (Main.isDisplayingMapView()) {
051                    Main.map.removeTopPanel(AlignImageryPanel.class);
052                    Main.pref.put(PREF, false);
053                }
054            }
055        });
056
057        setLayout(new GridBagLayout());
058        if (!oneLine) { // tune for small screens
059            add(nagLabel, GBC.std(1, 1).fill());
060            add(detailsList, GBC.std(1, 2).fill());
061            add(closeButton, GBC.std(2, 1).span(1,2).anchor(GBC.EAST));
062        } else {
063            add(nagLabel, GBC.std(1,1).fill());
064            add(detailsList, GBC.std(2,1).fill());
065            add(closeButton, GBC.std(3,1).anchor(GBC.EAST));
066        }
067        setBorder(new CompoundBorder(new EtchedBorder(EtchedBorder.LOWERED), new EmptyBorder(12, 12, 12, 12)));
068        setBackground(new Color(224, 236, 249));
069    }
070
071    public static void addNagPanelIfNeeded() {
072        if (Main.isDisplayingMapView() && !Main.pref.getBoolean("expert") && Main.pref.getBoolean(PREF, true) ) {
073            if (Main.map.getTopPanel(AlignImageryPanel.class) == null) {
074                double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
075                AlignImageryPanel p = new AlignImageryPanel(w>1300);
076                Main.map.addTopPanel(p);
077            }
078        }
079    }
080}