package com.revolsys.swing.map.component;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.beans.PropertyChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
import com.revolsys.geometry.cs.CoordinateSystem;
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.parallel.Invoke;
import com.revolsys.util.Property;
import com.revolsys.util.number.Doubles;
public class MapPointerLocation extends JLabel implements MouseMotionListener {
private static final long serialVersionUID = 1L;
private final boolean geographics;
private GeometryFactory geometryFactory;
private String title;
private Viewport2D viewport;
private Point mapLocation;
private PropertyChangeListener geometryFactoryListener;
public MapPointerLocation(final MapPanel map, final boolean geographics) {
this.viewport = map.getViewport();
this.geographics = geographics;
setGeometryFactory(this.viewport.getGeometryFactory());
Property.addListenerNewValueSource(this.viewport, "geometryFactory", this::setGeometryFactory);
map.getMouseOverlay().addMouseMotionListener(this);
setBorder(
BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED),
BorderFactory.createEmptyBorder(2, 3, 2, 3)));
setText(" ");
final int height2 = getPreferredSize().height;
setPreferredSize(new Dimension(250, height2));
}
@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.toModelPointRounded(this.geometryFactory, x, y);
setMapLocation(mapLocation);
}
@Override
public void removeNotify() {
super.removeNotify();
Property.removeListener(this.viewport, "geometryFactory", this.geometryFactoryListener);
this.viewport = null;
this.geometryFactoryListener = null;
}
public void setGeometryFactory(GeometryFactory geometryFactory) {
if (this.geographics && geometryFactory.isGeographics()) {
setVisible(false);
} else {
setVisible(true);
}
geometryFactory = geometryFactory.convertAxisCount(2);
if (geometryFactory.isGeographics()) {
geometryFactory = geometryFactory.convertScales(10000000.0, 10000000.0);
} else if (this.geographics) {
geometryFactory = geometryFactory.getGeographicGeometryFactory();
geometryFactory = geometryFactory.convertScales(10000000.0, 10000000.0);
} else {
geometryFactory = geometryFactory.convertScales(1000.0, 1000.0);
}
if (geometryFactory != this.geometryFactory) {
final int srid = geometryFactory.getCoordinateSystemId();
this.geometryFactory = geometryFactory;
final CoordinateSystem coordinateSystem = geometryFactory.getCoordinateSystem();
this.setToolTipText(coordinateSystem.getCoordinateSystemName());
this.title = String.valueOf(srid);
final Point mapLocation = geometryFactory.point(this.mapLocation);
setMapLocation(mapLocation);
}
}
protected void setMapLocation(final Point mapLocation) {
Invoke.later(() -> {
this.mapLocation = mapLocation;
String text;
if (Property.isEmpty(mapLocation)) {
text = this.title;
} else {
final double projectedX = mapLocation.getX();
final String textX = Doubles.toString(projectedX);
final double projectedY = mapLocation.getY();
final String textY = Doubles.toString(projectedY);
if (this.geometryFactory.isGeographics()) {
text = this.title + ": " + textY + ", " + textX;
} else {
text = this.title + ": " + textX + ", " + textY;
}
}
setText(text);
});
}
@Override
public String toString() {
return this.title;
}
}