package org.esa.snap.rcp.sync; import org.esa.snap.core.datamodel.GeoCoding; import org.esa.snap.core.datamodel.GeoPos; import org.esa.snap.netbeans.docwin.WindowUtilities; import org.esa.snap.rcp.windows.ProductSceneViewTopComponent; import org.esa.snap.ui.product.ProductSceneView; import java.util.HashMap; import java.util.Map; /** * @author Tonio Fincke */ public class DefaultCursorSynchronizer { private Map<ProductSceneView, ImageCursorOverlay> psvOverlayMap; private boolean enabled; public DefaultCursorSynchronizer() { psvOverlayMap = new HashMap<>(); enabled = false; } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { if (this.enabled != enabled) { if (enabled) { initPsvOverlayMap(); } else { clearPsvOverlayMap(); } this.enabled = enabled; } } public void updateCursorOverlays(GeoPos geoPos) { if (!isEnabled()) { return; } for (Map.Entry<ProductSceneView, ImageCursorOverlay> entry : psvOverlayMap.entrySet()) { final ProductSceneView view = entry.getKey(); ImageCursorOverlay overlay = entry.getValue(); if (overlay == null) { overlay = new ImageCursorOverlay(view, geoPos); psvOverlayMap.put(view, overlay); view.getLayerCanvas().addOverlay(overlay); } else { overlay.setGeoPosition(geoPos); view.getLayerCanvas().repaint(); } } } private void initPsvOverlayMap() { WindowUtilities.getOpened(ProductSceneViewTopComponent.class) .map(ProductSceneViewTopComponent::getView) .forEach(this::addPPL); } private void clearPsvOverlayMap() { for (Map.Entry<ProductSceneView, ImageCursorOverlay> entry : psvOverlayMap.entrySet()) { final ProductSceneView view = entry.getKey(); view.getLayerCanvas().removeOverlay(entry.getValue()); } psvOverlayMap.clear(); } private void addPPL(ProductSceneView view) { GeoCoding geoCoding = view.getProduct().getSceneGeoCoding(); if (geoCoding != null && geoCoding.canGetPixelPos()) { psvOverlayMap.put(view, null); } } }