@Override
    public void mouseMoved(MouseEvent e) {
        pointMouseLast = null;
        DecimalFormat formatDistance = new DecimalFormat("#.0");
        DecimalFormat formatError = new DecimalFormat("0.000");

        if (main == null) return;
        if (main.map == null) return;
                
        Point2D.Double pointCursor = new Point2D.Double();
        
        pointCursor.x = mapDraw.getRealX(e.getX());
        pointCursor.y = mapDraw.getRealY(e.getY());
        
        int ex = 0;
        while (ex < main.map.experiments) {
            ex++;
        
            MapExperiment test = main.map.experiment[ex];
            if (test.point.distance(pointCursor) < 2.0) {
                String msg;
                msg = "Test " + test.id + "\nExper X:" + formatError.format(test.point.x) + " Y:" + formatError.format(test.point.y);
                TestResult result = main.motionPath.getTestResult(test.id);
                if (result != null) {
                    if (result.completed) {
                        msg += "\nRover X:" + formatError.format(result.point.x) + " Y:" + formatError.format(result.point.y);
                        msg += "\nError = " + formatError.format(result.distError);
                    }
                }
                mapDraw.defineToolTip(e.getX(),e.getY(),msg);
                repaint();
                return;
            }
            
        }

        int p = 0;
        while (p < main.motionPath.points) {
            p++;
        
            MapRover rover = main.motionPath.point[p];
            if (rover.point.distance(pointCursor) < 2.0) {
                String msg;
                msg = "Rover Point " + p + "\nX:" + formatError.format(rover.point.x) + " Y:" + formatError.format(rover.point.y);
                msg += "\nHeading: " + formatDistance.format(rover.heading);
                mapDraw.defineToolTip(e.getX(),e.getY(),msg);
                repaint();
                return;
            }
            
        }
        
        clearToolTip();
    }