/* * Copyright (C) 2012 United States Government as represented by the Administrator of the * National Aeronautics and Space Administration. * All Rights Reserved. */ package gov.nasa.worldwindx.jgt; import org.jgrasstools.nww.utils.NwwUtilities; import gov.nasa.worldwind.*; import gov.nasa.worldwind.avlist.*; import gov.nasa.worldwind.event.*; import gov.nasa.worldwind.layers.*; import gov.nasa.worldwind.util.*; /** * Controls display of tool tips on picked objects. Any shape implementing {@link AVList} can participate. Shapes * provide tool tip text in their AVList for either or both of hover and rollover events. The keys associated with the * text are specified to the constructor. * * @author tag * @version $Id: ToolTipController.java 2365 2014-10-02 23:15:16Z tgaskins $ */ public class ToolTipController implements SelectListener, Disposable { protected WorldWindow wwd; protected String hoverKey = AVKey.HOVER_TEXT; protected String rolloverKey = AVKey.ROLLOVER_TEXT; protected Object lastRolloverObject; protected Object lastHoverObject; protected AnnotationLayer layer; protected ToolTipAnnotation annotation; /** * Create a controller for a specified {@link WorldWindow} that displays tool tips on hover and/or rollover. * * @param wwd the World Window to monitor. * @param rolloverKey the key to use when looking up tool tip text from the shape's AVList when a rollover event * occurs. May be null, in which case a tool tip is not displayed for rollover events. * @param hoverKey the key to use when looking up tool tip text from the shape's AVList when a hover event * occurs. May be null, in which case a tool tip is not displayed for hover events. */ public ToolTipController(WorldWindow wwd, String rolloverKey, String hoverKey) { this.wwd = wwd; this.hoverKey = hoverKey; this.rolloverKey = rolloverKey; this.wwd.addSelectListener(this); } /** * Create a controller for a specified {@link WorldWindow} that displays "DISPLAY_NAME" on rollover. * * @param wwd the World Window to monitor. */ public ToolTipController(WorldWindow wwd) { this.wwd = wwd; this.rolloverKey = AVKey.DISPLAY_NAME; this.wwd.addSelectListener(this); } public void dispose() { this.wwd.removeSelectListener(this); } protected String getHoverText(SelectEvent event) { return event.getTopObject() != null && event.getTopObject() instanceof AVList ? ((AVList) event.getTopObject()).getStringValue(this.hoverKey) : null; } protected String getRolloverText(SelectEvent event) { return event.getTopObject() != null && event.getTopObject() instanceof AVList ? ((AVList) event.getTopObject()).getStringValue(this.rolloverKey) : null; } public void selected(SelectEvent event) { try { if (event.isRollover() && this.rolloverKey != null) this.handleRollover(event); else if (event.isHover() && this.hoverKey != null) this.handleHover(event); } catch (Exception e) { // Wrap the handler in a try/catch to keep exceptions from bubbling up Logging.logger().warning(e.getMessage() != null ? e.getMessage() : e.toString()); } } protected void handleRollover(SelectEvent event) { if (this.lastRolloverObject != null) { if (this.lastRolloverObject == event.getTopObject() && !WWUtil.isEmpty(getRolloverText(event))) return; this.hideToolTip(); this.lastRolloverObject = null; this.wwd.redraw(); } if (getRolloverText(event) != null) { this.lastRolloverObject = event.getTopObject(); this.showToolTip(event, getRolloverText(event).replace("\\n", "\n")); this.wwd.redraw(); } } protected void handleHover(SelectEvent event) { if (this.lastHoverObject != null) { if (this.lastHoverObject == event.getTopObject()) return; this.hideToolTip(); this.lastHoverObject = null; this.wwd.redraw(); } if (getHoverText(event) != null) { this.lastHoverObject = event.getTopObject(); this.showToolTip(event, getHoverText(event).replace("\\n", "\n")); this.wwd.redraw(); } } protected void showToolTip(SelectEvent event, String text) { if (annotation != null) { annotation.setText(text); annotation.setScreenPoint(event.getPickPoint()); } else { annotation = new ToolTipAnnotation(text); } if (layer == null) { layer = new AnnotationLayer(); layer.setPickEnabled(false); layer.setValue(AVKey.IGNORE, true); } layer.removeAllAnnotations(); layer.addAnnotation(annotation); this.addLayer(layer); } protected void hideToolTip() { if (this.layer != null) { this.layer.removeAllAnnotations(); this.removeLayer(this.layer); this.layer.dispose(); this.layer = null; } if (this.annotation != null) { this.annotation.dispose(); this.annotation = null; } } protected void addLayer(Layer layer) { if (!this.wwd.getModel().getLayers().contains(layer)) NwwUtilities.insertBeforeCompass(this.wwd, layer); } protected void removeLayer(Layer layer) { this.wwd.getModel().getLayers().remove(layer); } }