/* * 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.client.widget.control.zoom; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DoubleClickEvent; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.event.dom.client.TouchStartHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import org.geomajas.gwt.client.util.Dom; import org.geomajas.gwt2.client.GeomajasImpl; import org.geomajas.gwt2.client.animation.NavigationAnimationFactory; import org.geomajas.gwt2.client.map.MapPresenter; import org.geomajas.gwt2.client.map.ViewPort; import org.geomajas.gwt2.client.widget.AbstractMapWidget; import java.util.logging.Level; import java.util.logging.Logger; /** * Map widget that displays zoom in, zoom out and zoom to maximum extent buttons. This widget is meant to be added to * the map's widget pane (see {@link MapPresenter#getWidgetPane()}). * * @author Pieter De Graef * @author Dosi Bingov */ public class ZoomControl extends AbstractMapWidget { private static Logger logger = Logger.getLogger(""); /** * UI binder definition for the {@link ZoomControl} widget. * * @author Pieter De Graef */ interface ZoomControlUiBinder extends UiBinder<Widget, ZoomControl> { } private static final ZoomControlUiBinder UI_BINDER = GWT.create(ZoomControlUiBinder.class); private final ZoomControlResource resource; @UiField protected SimplePanel zoomInElement; @UiField protected SimplePanel zoomOutElement; // ------------------------------------------------------------------------ // Constructors: // ------------------------------------------------------------------------ /** * Create a widget with zoom in, zoom out and zoom to maximum extent button. * * @param mapPresenter The map to show this widget on. */ public ZoomControl(MapPresenter mapPresenter) { this(mapPresenter, GeomajasImpl.getClientBundleFactory().createZoomControlResource()); } /** * Create a widget with zoom in, zoom out and zoom to maximum extent button. * * @param mapPresenter The map to show this widget on. * @param resource Custom resource bundle in case you want to provide your own style for this widget. */ public ZoomControl(MapPresenter mapPresenter, ZoomControlResource resource) { super(mapPresenter); this.resource = resource; this.resource.css().ensureInjected(); buildGui(); } // ------------------------------------------------------------------------ // Private methods: // ------------------------------------------------------------------------ private void buildGui() { initWidget(UI_BINDER.createAndBindUi(this)); zoomInElement.getElement().setInnerText("+"); zoomOutElement.getElement().setInnerText("-"); getElement().getStyle().setPosition(Position.ABSOLUTE); getElement().getStyle().setTop(5, Unit.PX); getElement().getStyle().setLeft(5, Unit.PX); if (Dom.isTouchSupported()) { initializeForTouchDevice(); } else { initializeForDesktop(); } } /** * Initialize handlers for desktop browser. */ private void initializeForDesktop() { logger.log(Level.FINE, "ZoomControl ->initializeForDesktop()"); StopPropagationHandler preventWeirdBehaviourHandler = new StopPropagationHandler(); addDomHandler(preventWeirdBehaviourHandler, MouseDownEvent.getType()); addDomHandler(preventWeirdBehaviourHandler, MouseUpEvent.getType()); addDomHandler(preventWeirdBehaviourHandler, ClickEvent.getType()); addDomHandler(preventWeirdBehaviourHandler, DoubleClickEvent.getType()); final ViewPort viewPort = mapPresenter.getViewPort(); // Zoom in button: zoomInElement.addDomHandler(new ClickHandler() { public void onClick(ClickEvent event) { logger.log(Level.FINE, "ZoomControl -> zoomInElement onClick()"); int index = viewPort.getResolutionIndex(viewPort.getResolution()); if (index < viewPort.getResolutionCount() - 1) { viewPort.registerAnimation(NavigationAnimationFactory.createZoomIn(mapPresenter)); } event.stopPropagation(); } }, ClickEvent.getType()); // Zoom out button: zoomOutElement.addDomHandler(new ClickHandler() { public void onClick(ClickEvent event) { logger.log(Level.FINE, "ZoomControl -> zoomOutElement onClick()"); int index = viewPort.getResolutionIndex(viewPort.getResolution()); if (index > 0) { viewPort.registerAnimation(NavigationAnimationFactory.createZoomOut(mapPresenter)); } event.stopPropagation(); } }, ClickEvent.getType()); } /** * Initialize handlers for mobile devices. */ private void initializeForTouchDevice() { logger.log(Level.FINE, "ZoomControl -> initializeForTouchDevice()"); // Add touch handlers to the zoom in button: zoomInElement.addDomHandler(new TouchStartHandler() { @Override public void onTouchStart(TouchStartEvent event) { event.stopPropagation(); event.preventDefault(); logger.log(Level.FINE, "ZoomControl -> zoomInElement onTouchStart()"); ViewPort viewPort = mapPresenter.getViewPort(); int index = viewPort.getResolutionIndex(viewPort.getResolution()); if (index < viewPort.getResolutionCount() - 1) { viewPort.applyResolution(viewPort.getResolution(index + 1)); viewPort.getPosition(); } } }, TouchStartEvent.getType()); // Add touch handlers to the zoom out button: zoomOutElement.addDomHandler(new TouchStartHandler() { @Override public void onTouchStart(TouchStartEvent event) { logger.log(Level.FINE, "zoomOutElement -> zoomInElement onTouchStart()"); event.stopPropagation(); event.preventDefault(); ViewPort viewPort = mapPresenter.getViewPort(); int index = viewPort.getResolutionIndex(viewPort.getResolution()); if (index > 0) { viewPort.applyResolution(viewPort.getResolution(index - 1)); } } }, TouchStartEvent.getType()); } }