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}