001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer; 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 Font font = getFont().deriveFont(Font.PLAIN, 14.0f); 035 JLabel nagLabel = new JLabel(tr("Aerial imagery might be misaligned. Please check its offset using GPS tracks!")); 036 UrlLabel detailsList = new UrlLabel(tr("http://wiki.openstreetmap.org/wiki/Using_Imagery"), tr("Details...")); 037 nagLabel.setLabelFor(detailsList); 038 nagLabel.setFont(font); 039 detailsList.setFont(font); 040 041 JButton closeButton = new JButton(ImageProvider.get("misc", "black_x")); 042 closeButton.setContentAreaFilled(false); 043 closeButton.setRolloverEnabled(true); 044 closeButton.setBorderPainted(false); 045 closeButton.setToolTipText(tr("Hide this message and never show it again")); 046 closeButton.addActionListener(new ActionListener() { 047 @Override 048 public void actionPerformed(ActionEvent e) { 049 if (Main.isDisplayingMapView()) { 050 Main.map.removeTopPanel(AlignImageryPanel.class); 051 Main.pref.put(PREF, false); 052 } 053 } 054 }); 055 056 setLayout(new GridBagLayout()); 057 if (!oneLine) { // tune for small screens 058 add(nagLabel, GBC.std(1, 1).fill()); 059 add(detailsList, GBC.std(1, 2).fill()); 060 add(closeButton, GBC.std(2, 1).span(1, 2).anchor(GBC.EAST)); 061 } else { 062 add(nagLabel, GBC.std(1, 1).fill()); 063 add(detailsList, GBC.std(2, 1).fill()); 064 add(closeButton, GBC.std(3, 1).anchor(GBC.EAST)); 065 } 066 setBorder(new CompoundBorder(new EtchedBorder(EtchedBorder.LOWERED), new EmptyBorder(12, 12, 12, 12))); 067 setBackground(new Color(224, 236, 249)); 068 } 069 070 public static void addNagPanelIfNeeded() { 071 if (Main.isDisplayingMapView() && !Main.pref.getBoolean("expert") && Main.pref.getBoolean(PREF, true)) { 072 if (Main.map.getTopPanel(AlignImageryPanel.class) == null) { 073 double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth(); 074 AlignImageryPanel p = new AlignImageryPanel(w > 1300); 075 Main.map.addTopPanel(p); 076 } 077 } 078 } 079}