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 }