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