Java源码示例:gov.nasa.worldwind.render.ScreenAnnotation

示例1
/**
 * Highlight the given annotation
 *
 * @param annotation
 * @param point
 */
private void highlightAnnotation(final LabeledPath label, final GeoPoint point) {
	final ScreenAnnotation annotation = label.getAnnotation();
	if (_lastSelection != null) {
		final LabeledPath lastSelectedLabel = _lastSelection.getLeft();
		final ScreenAnnotation lastSelectedAnnotation = lastSelectedLabel.getAnnotation();
		final GeoPoint lastSelectedPoint = _lastSelection.getRight();
		if (_mapShowLabel) {
			lastSelectedAnnotation.setAttributes(createAnnotationAttr(false, lastSelectedPoint.getCountryFlag(IMAGE_RESOLUTION), getText(lastSelectedPoint)));
			lastSelectedAnnotation.setAlwaysOnTop(false);
		} else {
			_renderableLayer.removeRenderable(lastSelectedLabel);
		}
	}
	final ImageIcon image = point.getCountryFlag(IMAGE_RESOLUTION);
	final String text = getText(point);
	annotation.setAttributes(createAnnotationAttr(true, image, text));
	annotation.setAlwaysOnTop(true);
	if (!_mapShowLabel) {
		_renderableLayer.addRenderable(label);
		_controller.redraw();
	}
	_lastSelection = Pair.of(label, point);
}
 
示例2
protected Angle computePanAmount(Globe globe, OrbitView view, ScreenAnnotation control, double panStep)
{
    // Compute last pick point distance relative to pan control center
    double size = control.getAttributes().getSize().width * control.getAttributes().getScale();
    Vec4 center = new Vec4(control.getScreenPoint().x, control.getScreenPoint().y + size / 2, 0);
    double px = lastPickPoint.x - center.x;
    double py = view.getViewport().getHeight() - lastPickPoint.y - center.y;
    double pickDistance = Math.sqrt(px * px + py * py);
    double pickDistanceFactor = Math.min(pickDistance / 10, 5);

    // Compute globe angular distance depending on eye altitude
    Position eyePos = view.getEyePosition();
    double radius = globe.getRadiusAt(eyePos);
    double minValue = 0.5 * (180.0 / (Math.PI * radius)); // Minimum change ~0.5 meters
    double maxValue = 1.0; // Maximum change ~1 degree

    // Compute an interpolated value between minValue and maxValue, using (eye altitude)/(globe radius) as
    // the interpolant. Interpolation is performed on an exponential curve, to keep the value from
    // increasing too quickly as eye altitude increases.
    double a = eyePos.getElevation() / radius;
    a = (a < 0 ? 0 : (a > 1 ? 1 : a));
    double expBase = 2.0; // Exponential curve parameter.
    double value = minValue + (maxValue - minValue) * ((Math.pow(expBase, a) - 1.0) / (expBase - 1.0));

    return Angle.fromDegrees(value * pickDistanceFactor * panStep);
}
 
示例3
/**
 * Specifies the control to highlight. Any currently highlighted control is un-highlighted.
 *
 * @param control the control to highlight.
 */
public void highlight(Object control)
{
    // Manage highlighting of controls.
    if (this.currentControl == control)
        return; // same thing selected

    // Turn off highlight if on.
    if (this.currentControl != null)
    {
        this.currentControl.getAttributes().setImageOpacity(-1); // use default opacity
        this.currentControl = null;
    }

    // Turn on highlight if object selected.
    if (control != null && control instanceof ScreenAnnotation)
    {
        this.currentControl = (ScreenAnnotation) control;
        this.currentControl.getAttributes().setImageOpacity(1);
    }
}
 
示例4
/**
 * Make screen annotation
 *
 * @param text text
 * @param image image
 * @return the annotation
 */
private ScreenAnnotation makeLabelAnnotation(final String text, final ImageIcon image) {
	final String normalizedText = text == null ? " " : text;
	final ScreenAnnotation screenAnnotation = new ScreenAnnotation(normalizedText, new Point());
	screenAnnotation.setAttributes(createAnnotationAttr(false, image, normalizedText));
	screenAnnotation.setPickEnabled(true);
	return screenAnnotation;
}
 
示例5
protected Angle computePanHeading(OrbitView view, ScreenAnnotation control)
{
    // Compute last pick point 'heading' relative to pan control center
    double size = control.getAttributes().getSize().width * control.getAttributes().getScale();
    Vec4 center = new Vec4(control.getScreenPoint().x, control.getScreenPoint().y + size / 2, 0);
    double px = lastPickPoint.x - center.x;
    double py = view.getViewport().getHeight() - lastPickPoint.y - center.y;
    Angle heading = view.getHeading().add(Angle.fromRadians(Math.atan2(px, py)));
    heading = heading.degrees >= 0 ? heading : heading.addDegrees(360);
    return heading;
}
 
示例6
protected Angle computeLookHeading(OrbitView view, ScreenAnnotation control, double headingStep)
{
    // Compute last pick point 'heading' relative to look control center on x
    double size = control.getAttributes().getSize().width * control.getAttributes().getScale();
    Vec4 center = new Vec4(control.getScreenPoint().x, control.getScreenPoint().y + size / 2, 0);
    double px = lastPickPoint.x - center.x;
    double pickDistanceFactor = Math.min(Math.abs(px) / 3000, 5) * Math.signum(px);
    // New heading
    Angle heading = view.getHeading().add(Angle.fromRadians(headingStep * pickDistanceFactor));
    heading = heading.degrees >= 0 ? heading : heading.addDegrees(360);
    return heading;
}
 
示例7
protected Angle computeLookPitch(OrbitView view, ScreenAnnotation control, double pitchStep)
{
    // Compute last pick point 'pitch' relative to look control center on y
    double size = control.getAttributes().getSize().width * control.getAttributes().getScale();
    Vec4 center = new Vec4(control.getScreenPoint().x, control.getScreenPoint().y + size / 2, 0);
    double py = view.getViewport().getHeight() - lastPickPoint.y - center.y;
    double pickDistanceFactor = Math.min(Math.abs(py) / 3000, 5) * Math.signum(py);
    // New pitch
    Angle pitch = view.getPitch().add(Angle.fromRadians(pitchStep * pickDistanceFactor));
    pitch = pitch.degrees >= 0 ? (pitch.degrees <= 90 ? pitch : Angle.fromDegrees(90)) : Angle.ZERO;
    return pitch;
}
 
示例8
/**
 * Get the control type associated with the given object or null if unknown.
 *
 * @param control the control object
 *
 * @return the control type. Can be one of {@link AVKey#VIEW_PAN}, {@link AVKey#VIEW_LOOK}, {@link
 *         AVKey#VIEW_HEADING_LEFT}, {@link AVKey#VIEW_HEADING_RIGHT}, {@link AVKey#VIEW_ZOOM_IN}, {@link
 *         AVKey#VIEW_ZOOM_OUT}, {@link AVKey#VIEW_PITCH_UP}, {@link AVKey#VIEW_PITCH_DOWN}, {@link
 *         AVKey#VIEW_FOV_NARROW} or {@link AVKey#VIEW_FOV_WIDE}. <p> Returns null if the object is not a view
 *         control associated with this layer. </p>
 */
public String getControlType(Object control)
{
    if (control == null || !(control instanceof ScreenAnnotation))
        return null;

    if (showPanControls && controlPan.equals(control))
        return AVKey.VIEW_PAN;
    else if (showLookControls && controlLook.equals(control))
        return AVKey.VIEW_LOOK;
    else if (showHeadingControls && controlHeadingLeft.equals(control))
        return AVKey.VIEW_HEADING_LEFT;
    else if (showHeadingControls && controlHeadingRight.equals(control))
        return AVKey.VIEW_HEADING_RIGHT;
    else if (showZoomControls && controlZoomIn.equals(control))
        return AVKey.VIEW_ZOOM_IN;
    else if (showZoomControls && controlZoomOut.equals(control))
        return AVKey.VIEW_ZOOM_OUT;
    else if (showPitchControls && controlPitchUp.equals(control))
        return AVKey.VIEW_PITCH_UP;
    else if (showPitchControls && controlPitchDown.equals(control))
        return AVKey.VIEW_PITCH_DOWN;
    else if (showFovControls && controlFovNarrow.equals(control))
        return AVKey.VIEW_FOV_NARROW;
    else if (showFovControls && controlFovWide.equals(control))
        return AVKey.VIEW_FOV_WIDE;
    else if (showVeControls && controlVeUp.equals(control))
        return AVKey.VERTICAL_EXAGGERATION_UP;
    else if (showVeControls && controlVeDown.equals(control))
        return AVKey.VERTICAL_EXAGGERATION_DOWN;

    return null;
}
 
示例9
public void selected(SelectEvent event)
{
    if (this.wwd == null)
        return;

    if (!(this.wwd.getView() instanceof OrbitView))
        return;

    OrbitView view = (OrbitView) this.wwd.getView();

    if (this.viewControlsLayer.getHighlightedObject() != null)
    {
        this.viewControlsLayer.highlight(null);
        this.wwd.redraw(); // must redraw so the de-highlight can take effect
    }

    if (event.getMouseEvent() != null && event.getMouseEvent().isConsumed())
        return;

    if (event.getTopObject() == null || event.getTopPickedObject().getParentLayer() != this.getParentLayer()
        || !(event.getTopObject() instanceof AVList))
        return;

    String controlType = ((AVList) event.getTopObject()).getStringValue(AVKey.VIEW_OPERATION);
    if (controlType == null)
        return;

    ScreenAnnotation selectedObject = (ScreenAnnotation) event.getTopObject();

    this.lastPickPoint = event.getPickPoint();
    if (event.getEventAction().equals(SelectEvent.ROLLOVER))
    {
        // Highlight on rollover
        this.viewControlsLayer.highlight(selectedObject);
        this.wwd.redraw();
    }
    if (event.getEventAction().equals(SelectEvent.DRAG))
    {
        // just consume drag events
        event.consume();
    }
    else if (event.getEventAction().equals(SelectEvent.HOVER))
    {
        // Highlight on hover
        this.viewControlsLayer.highlight(selectedObject);
        this.wwd.redraw();
    }
    else if (event.getEventAction().equals(SelectEvent.LEFT_PRESS) ||
        (event.getEventAction().equals(SelectEvent.DRAG) && controlType.equals(AVKey.VIEW_PAN)) ||
        (event.getEventAction().equals(SelectEvent.DRAG) && controlType.equals(AVKey.VIEW_LOOK)))
    {
        // Handle left press on controls
        this.pressedControl = selectedObject;
        this.pressedControlType = controlType;

        // Consume drag events, but do not consume left press events. It is not necessary to consume left press
        // events here, and doing so prevents the WorldWindow from gaining focus.
        if (event.getEventAction().equals(SelectEvent.DRAG))
            event.consume();
    }
    else if (event.getEventAction().equals(SelectEvent.LEFT_CLICK)
        || event.getEventAction().equals(SelectEvent.LEFT_DOUBLE_CLICK)
        || event.getEventAction().equals(SelectEvent.DRAG_END))
    {
        // Release pressed control

        if (pressedControl != null)
            event.consume();

        this.pressedControl = null;
        resetOrbitView(view);
        view.firePropertyChange(AVKey.VIEW, null, view);
    }

    // Keep pressed control highlighted - overrides rollover non currently pressed controls
    if (this.pressedControl != null)
    {
        this.viewControlsLayer.highlight(this.pressedControl);
        this.wwd.redraw();
    }
}
 
示例10
/**
 * <code>SelectListener</code> implementation.
 *
 * @param event the current <code>SelectEvent</code>
 */
@Override
public void selected(SelectEvent event) {
    //System.out.println("event.getEventAction(): " + event.getEventAction());

    final ScreenAnnotation annotation = getAnnotation();
    if (event.hasObjects() && event.getTopObject() == annotation) {
        boolean update = false;
        if (event.getEventAction().equals(SelectEvent.ROLLOVER)
                || event.getEventAction().equals(SelectEvent.LEFT_CLICK)) {
            // Highlight annotation
            if (!annotation.getAttributes().isHighlighted()) {
                annotation.getAttributes().setHighlighted(true);
                update = true;
            }
            // Check for text or url
            final PickedObject po = event.getTopPickedObject();
            if (po.getValue(AVKey.URL) != null) {
                // Set cursor hand on hyperlinks
                ((Component) this.wwd).setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
                int i = Integer.parseInt((String) po.getValue(AVKey.URL));
                // Select current hyperlink
                if (getSelectedIndex() != i) {
                    setSelectedIndex(i);
                    update = true;
                }
                // Enable/disable layer on left click
                if (event.getEventAction().equals(SelectEvent.LEFT_CLICK)) {
                    final LayerList layers = getValidLayers();
                    if (i >= 0 && i < layers.size()) {
                        final Layer layer = layers.get(i);
                        final boolean enable = !layer.isEnabled();
                        layer.setEnabled(enable);
                        updateVirtualEarthLayers(layer, enable);
                        update = true;
                    }
                }
            } else {
                // Unselect if not on an hyperlink
                if (getSelectedIndex() != -1) {
                    setSelectedIndex(-1);
                    update = true;
                }
                // Set cursor
                if (this.isComponentDragEnabled())
                    ((Component) this.wwd).setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
                else
                    ((Component) this.wwd).setCursor(Cursor.getDefaultCursor());
            }
        }
        if (event.getEventAction().equals(SelectEvent.DRAG)
                || event.getEventAction().equals(SelectEvent.DRAG_END)) {
            // Handle dragging
            if (this.isComponentDragEnabled() || this.isLayerDragEnabled()) {
                final boolean wasDraggingLayer = this.draggingLayer;
                this.drag(event);
                // Update list if dragging a layer, otherwise just redraw the world window
                if (this.draggingLayer || wasDraggingLayer)
                    update = true;
                else
                    this.wwd.redraw();
            }
        }
        // Redraw annotation if needed
        if (update)
            this.update();
    } else if (event.getEventAction().equals(SelectEvent.ROLLOVER) && annotation.getAttributes().isHighlighted()) {
        // de-highlight annotation
        annotation.getAttributes().setHighlighted(false);
        ((Component) this.wwd).setCursor(Cursor.getDefaultCursor());
        this.update();
    }
}