package com.revolsys.swing.map.component; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.BorderFactory; import javax.swing.JLabel; import javax.swing.border.BevelBorder; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Point; import com.revolsys.swing.map.MapPanel; import com.revolsys.swing.map.Viewport2D; import com.revolsys.swing.map.layer.elevation.gridded.GriddedElevationModelLayer; import com.revolsys.swing.parallel.Invoke; import com.revolsys.util.number.Doubles; public class MapPointerElevation extends JLabel implements MouseMotionListener { private static final long serialVersionUID = 1L; private Viewport2D viewport; private final MapPanel map; public MapPointerElevation(final MapPanel map) { this.map = map; this.viewport = map.getViewport(); map.getMouseOverlay().addMouseMotionListener(this); setBorder( BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED), BorderFactory.createEmptyBorder(2, 3, 2, 3))); setText(" "); final int height = getPreferredSize().height; setPreferredSize(new Dimension(100, height)); } @Override public void mouseDragged(final MouseEvent e) { mouseMoved(e); } @Override public void mouseMoved(final MouseEvent e) { final int x = e.getX(); final int y = e.getY(); final Point mapLocation = this.viewport.toModelPoint(x, y); for (final GriddedElevationModelLayer layer : this.map.getProject() .getVisibleDescendants(GriddedElevationModelLayer.class, this.viewport.getScale())) { final double layerElevation = layer.getElevation(mapLocation); if (!Double.isNaN(layerElevation)) { final double elevation = layerElevation; setMapElevation(layer.getGeometryFactory(), elevation); return; } } setMapElevation(null, Double.NaN); } @Override public void removeNotify() { super.removeNotify(); this.viewport = null; } protected void setMapElevation(final GeometryFactory geometryFactory, final double elevation) { Invoke.later(() -> { if (Double.isNaN(elevation)) { setVisible(false); } else { setVisible(true); final String text = Doubles.toString(Doubles.makePrecise(1000, elevation)); setText(text); } }); } @Override public String toString() { return getText(); } }