Merge pull request #5622 from kellykelly3/1400-geolocation-map-mouse-click-improvements

1400 geolocation map mouse click improvements
This commit is contained in:
Richard Cordovano 2020-02-10 14:03:12 -05:00 committed by GitHub
commit ccc6546f7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 398 additions and 439 deletions

File diff suppressed because it is too large Load Diff

View File

@ -35,7 +35,6 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
@ -58,7 +57,6 @@ import org.jxmapviewer.viewer.DefaultTileFactory;
import org.jxmapviewer.viewer.GeoPosition; import org.jxmapviewer.viewer.GeoPosition;
import org.jxmapviewer.viewer.TileFactory; import org.jxmapviewer.viewer.TileFactory;
import org.jxmapviewer.viewer.TileFactoryInfo; import org.jxmapviewer.viewer.TileFactoryInfo;
import org.jxmapviewer.viewer.Waypoint;
import org.jxmapviewer.viewer.WaypointPainter; import org.jxmapviewer.viewer.WaypointPainter;
import org.jxmapviewer.viewer.WaypointRenderer; import org.jxmapviewer.viewer.WaypointRenderer;
import org.openide.util.NbBundle.Messages; import org.openide.util.NbBundle.Messages;
@ -69,7 +67,6 @@ import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.jxmapviewer.viewer.DefaultWaypointRenderer;
/** /**
* The map panel. This panel contains the jxmapviewer MapViewer * The map panel. This panel contains the jxmapviewer MapViewer
@ -91,6 +88,9 @@ final public class MapPanel extends javax.swing.JPanel {
private static final int POPUP_HEIGHT = 200; private static final int POPUP_HEIGHT = 200;
private static final int POPUP_MARGIN = 10; private static final int POPUP_MARGIN = 10;
private BufferedImage defaultWaypointImage;
private BufferedImage selectedWaypointImage;
private MapWaypoint currentlySelectedWaypoint; private MapWaypoint currentlySelectedWaypoint;
/** /**
@ -107,6 +107,13 @@ final public class MapPanel extends javax.swing.JPanel {
currentPopup = null; currentPopup = null;
popupFactory = new PopupFactory(); popupFactory = new PopupFactory();
try {
defaultWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_teal.png"));
selectedWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_yellow.png"));
} catch (IOException ex) {
logger.log(Level.WARNING, "Unable to load geolocation waypoint images", ex);
}
// ComponentListeners do not have a concept of resize event "complete" // ComponentListeners do not have a concept of resize event "complete"
// therefore if we move the popup as the window resizes there will be // therefore if we move the popup as the window resizes there will be
// a weird blinking behavior. Using the CompnentResizeEndListener the // a weird blinking behavior. Using the CompnentResizeEndListener the
@ -139,8 +146,6 @@ final public class MapPanel extends javax.swing.JPanel {
} }
} }
}); });
} }
/** /**
@ -206,12 +211,7 @@ final public class MapPanel extends javax.swing.JPanel {
return waypointSet; return waypointSet;
} }
}; };
try {
waypointPainter.setRenderer(new MapWaypointRenderer()); waypointPainter.setRenderer(new MapWaypointRenderer());
} catch (IOException ex) {
logger.log(Level.WARNING, "Failed to load waypoint image resource, using DefaultWaypointRenderer", ex);
}
mapViewer.setOverlayPainter(waypointPainter); mapViewer.setOverlayPainter(waypointPainter);
} }
@ -336,7 +336,7 @@ final public class MapPanel extends javax.swing.JPanel {
try { try {
List<MapWaypoint> waypoints = findClosestWaypoint(point); List<MapWaypoint> waypoints = findClosestWaypoint(point);
MapWaypoint waypoint = null; MapWaypoint waypoint = null;
if(waypoints.size() > 0) { if (waypoints.size() > 0) {
waypoint = waypoints.get(0); waypoint = waypoints.get(0);
} }
showPopupMenu(waypoint, point); showPopupMenu(waypoint, point);
@ -344,7 +344,7 @@ final public class MapPanel extends javax.swing.JPanel {
// it the popup is currently visible // it the popup is currently visible
if (waypoint != null && !waypoint.equals(currentlySelectedWaypoint)) { if (waypoint != null && !waypoint.equals(currentlySelectedWaypoint)) {
currentlySelectedWaypoint = waypoint; currentlySelectedWaypoint = waypoint;
if(currentPopup != null) { if (currentPopup != null) {
showDetailsPopup(); showDetailsPopup();
} }
mapViewer.repaint(); mapViewer.repaint();
@ -406,10 +406,15 @@ final public class MapPanel extends javax.swing.JPanel {
currentPopup = popupFactory.getPopup(this, detailPane, popupLocation.x, popupLocation.y); currentPopup = popupFactory.getPopup(this, detailPane, popupLocation.x, popupLocation.y);
currentPopup.show(); currentPopup.show();
} else {
if (currentPopup != null) {
currentPopup.hide();
}
}
mapViewer.revalidate(); mapViewer.revalidate();
mapViewer.repaint(); mapViewer.repaint();
} }
}
/** /**
* Calculate the upper left corner on the screen for the details popup. * Calculate the upper left corner on the screen for the details popup.
@ -434,16 +439,16 @@ final public class MapPanel extends javax.swing.JPanel {
* @return A waypoint that is within 10 pixels of the given point, or null * @return A waypoint that is within 10 pixels of the given point, or null
* if none was found. * if none was found.
*/ */
private List<MapWaypoint> findClosestWaypoint(Point mouseClickPoint) { private List<MapWaypoint> findClosestWaypoint(Point clickPoint) {
if (waypointTree == null) { if (waypointTree == null) {
return null; return new ArrayList<>();
} }
// Convert the mouse click location to latitude & longitude // Convert the mouse click location to latitude & longitude
GeoPosition geopos = mapViewer.getTileFactory().pixelToGeo(mouseClickPoint, mapViewer.getZoom()); GeoPosition geopos = mapViewer.convertPointToGeoPosition(clickPoint);
// Get the 5 nearest neightbors to the point // Get the nearest neightbors to the point
Collection<MapWaypoint> waypoints = waypointTree.nearestNeighbourSearch(10, MapWaypoint.getDummyWaypoint(geopos)); Collection<MapWaypoint> waypoints = waypointTree.nearestNeighbourSearch(1, MapWaypoint.getDummyWaypoint(geopos));
if (waypoints == null || waypoints.isEmpty()) { if (waypoints == null || waypoints.isEmpty()) {
return null; return null;
@ -457,13 +462,10 @@ final public class MapPanel extends javax.swing.JPanel {
while (iterator.hasNext()) { while (iterator.hasNext()) {
MapWaypoint nextWaypoint = iterator.next(); MapWaypoint nextWaypoint = iterator.next();
Point2D point = mapViewer.getTileFactory().geoToPixel(nextWaypoint.getPosition(), mapViewer.getZoom()); Point2D point = mapViewer.convertGeoPositionToPoint(nextWaypoint.getPosition());
Rectangle rect = new Rectangle((int) point.getX() - (defaultWaypointImage.getWidth() / 2), (int) point.getY() - defaultWaypointImage.getHeight(), defaultWaypointImage.getWidth(), defaultWaypointImage.getHeight());
Rectangle rect = mapViewer.getViewportBounds(); if (rect.contains(clickPoint)) {
Point converted_gp_pt = new Point((int) point.getX() - rect.x,
(int) point.getY() - rect.y);
if (converted_gp_pt.distance(mouseClickPoint) < 10) {
closestPoints.add(nextWaypoint); closestPoints.add(nextWaypoint);
} }
} }
@ -646,31 +648,30 @@ final public class MapPanel extends javax.swing.JPanel {
}//GEN-LAST:event_mapViewerMouseReleased }//GEN-LAST:event_mapViewerMouseReleased
private void mapViewerMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseMoved private void mapViewerMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseMoved
GeoPosition geopos = mapViewer.getTileFactory().pixelToGeo(evt.getPoint(), mapViewer.getZoom()); GeoPosition geopos = mapViewer.convertPointToGeoPosition(evt.getPoint());
firePropertyChange(CURRENT_MOUSE_GEOPOSITION, null, geopos); firePropertyChange(CURRENT_MOUSE_GEOPOSITION, null, geopos);
}//GEN-LAST:event_mapViewerMouseMoved }//GEN-LAST:event_mapViewerMouseMoved
private void mapViewerMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseClicked private void mapViewerMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseClicked
if(!evt.isPopupTrigger() && SwingUtilities.isLeftMouseButton(evt)) { if (!evt.isPopupTrigger() && SwingUtilities.isLeftMouseButton(evt)) {
List<MapWaypoint> waypoints = findClosestWaypoint(evt.getPoint()); List<MapWaypoint> waypoints = findClosestWaypoint(evt.getPoint());
if(waypoints.size() > 0) { if (waypoints.size() > 0) {
currentlySelectedWaypoint = waypoints.get(0); currentlySelectedWaypoint = waypoints.get(0);
} else {
currentlySelectedWaypoint = null;
} }
// currentlySelectedWaypoint = findClosestWaypoint(evt.getPoint());
showDetailsPopup(); showDetailsPopup();
} }
}//GEN-LAST:event_mapViewerMouseClicked }//GEN-LAST:event_mapViewerMouseClicked
private void zoomInBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomInBtnActionPerformed private void zoomInBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomInBtnActionPerformed
int currentValue = mapViewer.getZoom(); int currentValue = mapViewer.getZoom();
setZoom(currentValue-1); setZoom(currentValue - 1);
}//GEN-LAST:event_zoomInBtnActionPerformed }//GEN-LAST:event_zoomInBtnActionPerformed
private void zoomOutBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomOutBtnActionPerformed private void zoomOutBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomOutBtnActionPerformed
int currentValue = mapViewer.getZoom(); int currentValue = mapViewer.getZoom();
setZoom(currentValue+1); setZoom(currentValue + 1);
}//GEN-LAST:event_zoomOutBtnActionPerformed }//GEN-LAST:event_zoomOutBtnActionPerformed
@ -684,30 +685,17 @@ final public class MapPanel extends javax.swing.JPanel {
* Renderer for the map waypoints. * Renderer for the map waypoints.
*/ */
private class MapWaypointRenderer implements WaypointRenderer<MapWaypoint> { private class MapWaypointRenderer implements WaypointRenderer<MapWaypoint> {
private final BufferedImage defaultWaypointImage;
private final BufferedImage selectedWaypointImage;
/**
* Construct a WaypointRenederer
*
* @throws IOException
*/
MapWaypointRenderer() throws IOException {
defaultWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_teal.png"));
selectedWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_yellow.png"));
}
@Override @Override
public void paintWaypoint(Graphics2D gd, JXMapViewer jxmv, MapWaypoint waypoint) { public void paintWaypoint(Graphics2D gd, JXMapViewer jxmv, MapWaypoint waypoint) {
Point2D point = jxmv.getTileFactory().geoToPixel(waypoint.getPosition(), jxmv.getZoom()); Point2D point = jxmv.getTileFactory().geoToPixel(waypoint.getPosition(), jxmv.getZoom());
int x = (int)point.getX(); int x = (int) point.getX();
int y = (int)point.getY(); int y = (int) point.getY();
BufferedImage image = (waypoint == currentlySelectedWaypoint ? selectedWaypointImage: defaultWaypointImage); BufferedImage image = (waypoint == currentlySelectedWaypoint ? selectedWaypointImage : defaultWaypointImage);
(gd.create()).drawImage(image, x -image.getWidth() / 2, y -image.getHeight(), null); (gd.create()).drawImage(image, x - image.getWidth() / 2, y - image.getHeight(), null);
} }
} }
} }