/* Copyright (C) 2001, 2006 United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All Rights Reserved. */ package gov.nasa.worldwind.examples; import gov.nasa.worldwind.*; import gov.nasa.worldwind.event.*; import gov.nasa.worldwind.geom.*; import gov.nasa.worldwind.globes.*; import gov.nasa.worldwind.util.Logging; import gov.nasa.worldwind.View; /** * @author tag * @version $Id: BasicDragger.java 4886 2008-04-01 19:39:04Z dcollins $ */ public class BasicDragger implements SelectListener { private final WorldWindow wwd; private boolean dragging = false; public BasicDragger(WorldWindow wwd) { if (wwd == null) { String msg = Logging.getMessage("nullValue.WorldWindow"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } this.wwd = wwd; } public boolean isDragging() { return this.dragging; } public void selected(SelectEvent event) { if (event == null) { String msg = Logging.getMessage("nullValue.EventIsNull"); Logging.logger().severe(msg); throw new IllegalArgumentException(msg); } if (event.getEventAction().equals(SelectEvent.DRAG_END)) { this.dragging = false; } else if (event.getEventAction().equals(SelectEvent.DRAG)) { DragSelectEvent dragEvent = (DragSelectEvent) event; Object topObject = dragEvent.getTopObject(); if (topObject == null) return; if (!(topObject instanceof Movable)) return; Movable dragObject = (Movable) topObject; View view = wwd.getView(); Globe globe = wwd.getModel().getGlobe(); // Compute ref-point position in screen coordinates. Position refPos = dragObject.getReferencePosition(); Vec4 refPoint = globe.computePointFromPosition(refPos); Vec4 screenRefPoint = view.project(refPoint); // Compute screen-coord delta since last event. int dx = dragEvent.getPickPoint().x - dragEvent.getPreviousPickPoint().x; int dy = dragEvent.getPickPoint().y - dragEvent.getPreviousPickPoint().y; // Find intersection of screen coord ref-point with globe. double x = screenRefPoint.x + dx; double y = event.getMouseEvent().getComponent().getSize().height - screenRefPoint.y + dy - 1; Line ray = view.computeRayFromScreenPoint(x, y); Intersection inters[] = globe.intersect(ray, refPos.getElevation()); if (inters != null) { // Intersection with globe. Move reference point to the intersection point. Position p = globe.computePositionFromPoint(inters[0].getIntersectionPoint()); dragObject.moveTo(p); } // else // { // // No intersection. // if (!this.maintainAltitude) // { // // No intersection, so increment screen ref-point and compute corresponding position. // // Don't use "newScreenPoint" because it's values have been truncated to integers. // Vec4 b = new Vec4(screenRefPoint.x + dx, screenRefPoint.y - dy, screenRefPoint.z, 1); // Vec4 a = view.unProject(b); // Position newPosition = globe.computePositionFromPoint(a); // dragObject.moveTo(newPosition); // } // else // { // // No intersection and maintaining altitude, so do nothing. // } // } this.dragging = true; } } }