// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.infomode; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.text.DateFormat; import java.util.Collection; import java.util.HashSet; import java.util.Locale; import java.util.Set; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.gpx.GpxTrack; import org.openstreetmap.josm.data.gpx.GpxTrackSegment; import org.openstreetmap.josm.data.gpx.WayPoint; import org.openstreetmap.josm.tools.GBC; import org.openstreetmap.josm.tools.OpenBrowser; class InfoPanel extends JPanel { private Collection<GpxTrack> tracks; private GpxTrack trk; private DateFormat df; private JLabel label1 = new JLabel(); private JLabel label2 = new JLabel(); private JLabel label3 = new JLabel(); private JLabel label4 = new JLabel(); private JLabel label5 = new JLabel(); private JLabel label6 = new JLabel(); private JButton but1 = new JButton(tr("Delete this")); private JButton but2 = new JButton(tr("Delete this&older")); InfoPanel() { super(new GridBagLayout()); df = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.getDefault()); setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); add(label1, GBC.eol().insets(10, 0, 0, 0)); add(label2, GBC.eol().insets(10, 0, 0, 0)); add(label3, GBC.eol().insets(10, 0, 0, 0)); add(label4, GBC.eol().insets(10, 0, 0, 0)); add(label5, GBC.eol().insets(10, 0, 0, 0)); add(label6, GBC.eol().insets(10, 0, 0, 0)); add(but1, GBC.std().insets(10, 5, 0, 0)); add(but2, GBC.eop().insets(10, 5, 0, 0)); // lightweight hyperlink label6.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { String s = label6.getText(); OpenBrowser.displayUrl(s.substring(9, s.length()-11)); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); but1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (tracks != null) tracks.remove(trk); Main.map.mapView.repaint(); } }); but2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (tracks == null) return; Set<GpxTrack> toRemove = new HashSet<>(); double tm = -1; for (GpxTrackSegment seg : trk.getSegments()) { for (WayPoint S : seg.getWayPoints()) { if (S.time > tm) { tm = S.time; } } } for (GpxTrack track : tracks) { boolean f = true; sg: for (GpxTrackSegment seg : track.getSegments()) { for (WayPoint S : seg.getWayPoints()) { if (S.time > tm) { f = false; break sg; } } } if (f) toRemove.add(track); } tracks.removeAll(toRemove); Main.map.mapView.repaint(); } }); } void setData(WayPoint wp, GpxTrack trk, double vel, Collection<GpxTrack> tracks) { this.tracks = tracks; this.trk = trk; if (wp.time == 0.0) { label1.setText(tr("No timestamp")); but2.setVisible(false); } else { label1.setText(df.format(wp.getTime())); but2.setVisible(true); } if (vel > 0) label2.setText(String.format("%.1f "+tr("km/h"), vel)); else label2.setText(null); String s = (String) trk.getAttributes().get("name"); if (s != null) label3.setText(tr("Track name: ")+s); else label3.setText(null); s = (String) trk.getAttributes().get("desc"); label4.setText(s); s = (String) wp.attr.get("ele"); String s1 = ""; try { s1 = String.format("H=%3.1f ", Double.parseDouble(s)); } catch (Exception e) { Main.warn(e); } s1 = s1+"L="+(int) trk.length(); label5.setText(s1); if (trk.getAttributes().containsKey("url")) { label6.setText(String.format("<html><u>%s</u></html>", trk.getAttributes().get("url").toString())); } else label6.setText(null); } }