/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.gwt2.plugin.corewidget.client.map.layercontrolpanel; import org.geomajas.gwt2.client.event.LayerHideEvent; import org.geomajas.gwt2.client.event.LayerShowEvent; import org.geomajas.gwt2.client.event.LayerVisibilityHandler; import org.geomajas.gwt2.client.event.LayerVisibilityMarkedEvent; import org.geomajas.gwt2.client.event.ViewPortChangedEvent; import org.geomajas.gwt2.client.event.ViewPortChangedHandler; import org.geomajas.gwt2.client.map.MapPresenter; import org.geomajas.gwt2.client.map.ViewPort; import org.geomajas.gwt2.client.map.layer.Layer; import java.util.logging.Level; import java.util.logging.Logger; /** * Default implementation of {@link LayerControlPanelPresenter}. * * @author Dosi Bingov * */ public class LayerControlPanelPresenterImpl implements LayerControlPanelPresenter { private Logger log = Logger.getLogger(LayerControlPanelPresenterImpl.class.getName()); private LayerControlPanelView view; private boolean disableToggleOutOfRange; private Layer layer; private MapPresenter mapPresenter; public LayerControlPanelPresenterImpl(LayerControlPanelView view, Layer layer, MapPresenter mapPresenter, boolean disableToggleOutOfRange) { this.view = view; this.layer = layer; this.mapPresenter = mapPresenter; log.log(Level.INFO, "disableToggleOutOfRange => " + disableToggleOutOfRange); this.disableToggleOutOfRange = disableToggleOutOfRange; init(); } // ------------------------------------------------------------------------ // Public methods: // ------------------------------------------------------------------------ @Override public void toggleLayerVisibility() { log.log(Level.INFO, "toggleLayerVisibility()"); layer.setMarkedAsVisible(!layer.isMarkedAsVisible()); } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private void init() { view.setLayerTitle(layer.getTitle()); view.setLayerVisible(layer.isMarkedAsVisible()); updateVisibilityToggle(); mapPresenter.getEventBus().addViewPortChangedHandler(new ViewPortChangedHandler() { @Override public void onViewPortChanged(ViewPortChangedEvent event) { updateVisibilityToggle(); } }); // React to layer visibility events: mapPresenter.getEventBus().addLayerVisibilityHandler(new LayerVisibilityHandler() { @Override public void onShow(LayerShowEvent event) { } @Override public void onHide(LayerHideEvent event) { } @Override public void onVisibilityMarked(LayerVisibilityMarkedEvent event) { view.setLayerVisible(layer.isMarkedAsVisible()); } }, this.layer); } protected void updateVisibilityToggle() { if (disableToggleOutOfRange) { view.enableVisibilityToggle( isLayerVisibleAtViewPortResolution(mapPresenter.getViewPort(), layer)); } } /** * Check if current viewPort resolution is between the minimum (inclusive) and * the maximum scale (exclusive) of the layer. * Inclusive/exclusive follows SLD convention: exclusive minResolution, inclusive maxResolution. * * @param viewPort the viewPort * @param layer layer * @return whether the layer is visible in the provided viewPort resolution */ public boolean isLayerVisibleAtViewPortResolution(ViewPort viewPort, Layer layer) { if (viewPort.getResolution() > layer.getMinResolution() && viewPort.getResolution() <= layer.getMaxResolution()) { return true; } return false; } }