/* * 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.plugin.jsapi.gwt.client.exporter.event; import java.util.List; import org.geomajas.annotation.Api; import org.geomajas.gwt.client.map.event.FeatureDeselectedEvent; import org.geomajas.gwt.client.map.event.FeatureSelectedEvent; import org.geomajas.gwt.client.map.event.FeatureSelectionHandler; import org.geomajas.gwt.client.map.event.MapModelChangedEvent; import org.geomajas.gwt.client.map.event.MapModelChangedHandler; import org.geomajas.gwt.client.map.layer.VectorLayer; import org.geomajas.plugin.jsapi.client.event.FeatureDeselectedHandler; import org.geomajas.plugin.jsapi.client.event.FeatureSelectedHandler; import org.geomajas.plugin.jsapi.client.event.JsEventBus; import org.geomajas.plugin.jsapi.client.event.JsHandlerRegistration; import org.geomajas.plugin.jsapi.client.event.LayersModelChangedEvent; import org.geomajas.plugin.jsapi.client.event.LayersModelChangedHandler; import org.geomajas.plugin.jsapi.client.map.Map; import org.geomajas.plugin.jsapi.client.map.feature.Feature; import org.geomajas.plugin.jsapi.client.map.layer.FeaturesSupported; import org.geomajas.plugin.jsapi.gwt.client.exporter.map.MapImpl; import org.geomajas.plugin.jsapi.gwt.client.exporter.map.feature.FeatureImpl; import org.timepedia.exporter.client.Export; import org.timepedia.exporter.client.ExportPackage; import org.timepedia.exporter.client.Exportable; import com.google.gwt.event.shared.HandlerRegistration; /** * Central event bus for handler registration and event firing. * * @author Pieter De Graef * @since 1.0.0 */ @Export("JsEventBus") @ExportPackage("org.geomajas.jsapi.event") @Api(allMethods = true) public class JsEventBusImpl implements Exportable, JsEventBus { private Map map; /** No-args constructor for GWT. */ public JsEventBusImpl() { } /** Construct event bus for specific map. */ public JsEventBusImpl(Map map) { this.map = map; } /** * Add a handler to change events in the layer configuration from the map. This event is fired for example when the * map gets it's configuration from the server. Only then can it know what layers it has available. */ public JsHandlerRegistration addLayersModelChangedHandler(final LayersModelChangedHandler handler) { HandlerRegistration registration = ((MapImpl) map).getMapWidget().getMapModel() .addMapModelChangedHandler(new MapModelChangedHandler() { public void onMapModelChanged(MapModelChangedEvent event) { handler.onLayersModelChanged(new LayersModelChangedEvent(map.getLayersModel())); } }); return new JsHandlerRegistration(new HandlerRegistration[] { registration }); } /** * Add a handler for feature selection. */ public JsHandlerRegistration addFeatureSelectionHandler(final FeatureSelectedHandler selectedHandler, final FeatureDeselectedHandler deselectedHandler) { if (((MapImpl) map).getMapWidget().getMapModel().isInitialized()) { return addFeatureSelectionHandler2(selectedHandler, deselectedHandler); } final CallbackHandlerRegistration callbackRegistration = new CallbackHandlerRegistration(); ((MapImpl) map).getMapWidget().getMapModel().addMapModelChangedHandler(new MapModelChangedHandler() { public void onMapModelChanged(MapModelChangedEvent event) { JsHandlerRegistration temp = addFeatureSelectionHandler2(selectedHandler, deselectedHandler); callbackRegistration.setRegistration(temp); } }); return callbackRegistration; } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private JsHandlerRegistration addFeatureSelectionHandler2(final FeatureSelectedHandler selectedHandler, final FeatureDeselectedHandler deselectedHandler) { final List<VectorLayer> layers = ((MapImpl) map).getMapWidget().getMapModel().getVectorLayers(); final HandlerRegistration[] registrations = new HandlerRegistration[layers.size()]; for (int i = 0; i < layers.size(); i++) { final FeaturesSupported fs = (FeaturesSupported) map.getLayersModel().getLayer(layers.get(i).getId()); registrations[i] = layers.get(i).addFeatureSelectionHandler(new FeatureSelectionHandler() { public void onFeatureSelected(FeatureSelectedEvent event) { Feature feature = new FeatureImpl(event.getFeature().toDto(), fs); selectedHandler.onFeatureSelected(new org.geomajas.plugin.jsapi.client.event.FeatureSelectedEvent( feature)); } public void onFeatureDeselected(FeatureDeselectedEvent event) { Feature feature = new FeatureImpl(event.getFeature().toDto(), fs); deselectedHandler .onFeatureDeselected(new org.geomajas.plugin.jsapi.client.event.FeatureDeselectedEvent( feature)); } }); } return new JsHandlerRegistration(registrations); } /** * Handler registration extension used when the actual handles are known (and set) at a later time. This class is * usually used when we can't immediately add handlers but still need to return a registration. * * @author Pieter De Graef */ @Export @ExportPackage("org.geomajas.jsapi.event") private class CallbackHandlerRegistration extends JsHandlerRegistration implements Exportable { private JsHandlerRegistration reg; public CallbackHandlerRegistration() { super(null); } public void removeHandler() { if (reg != null) { reg.removeHandler(); } } public void setRegistration(JsHandlerRegistration reg) { this.reg = reg; } } }