org.geomajas.javascript.gwt2.impl.client.map.JsMapPresenterImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.geomajas.javascript.gwt2.impl.client.map.JsMapPresenterImpl.java

Source

/*
 * This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
 *
 * Copyright 2008-2014 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.javascript.gwt2.impl.client.map;

import com.google.gwt.dom.client.Document;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.HumanInputEvent;
import com.google.gwt.event.dom.client.MouseMoveEvent;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseWheelEvent;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.IsWidget;
import org.geomajas.gwt2.client.GeomajasImpl;
import org.geomajas.gwt2.client.controller.AbstractMapController;
import org.geomajas.gwt2.client.controller.MapController;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.javascript.api.client.map.JsContainerManager;
import org.geomajas.javascript.api.client.map.JsMapEventBus;
import org.geomajas.javascript.api.client.map.JsMapPresenter;
import org.geomajas.javascript.api.client.map.JsViewPort;
import org.geomajas.javascript.api.client.map.controller.JsMapController;
import org.geomajas.javascript.api.client.map.layer.JsLayersModel;
import org.geomajas.javascript.gwt2.impl.client.map.controller.JsMapControllerWrapperImpl;
import org.geomajas.javascript.gwt2.impl.client.map.layer.JsLayersModelImpl;
import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportConstructor;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;
import org.timepedia.exporter.client.NoExport;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Exports {@link org.geomajas.gwt2.client.map.MapPresenter}.
 *
 * @author Jan De Moerloose
 */
@Export("Map")
@ExportPackage("gm")
public final class JsMapPresenterImpl implements JsMapPresenter, Exportable {

    private MapPresenter mapPresenter;

    private JsViewPort viewPort;

    private HTMLPanel parent;

    private IsWidget mapAsWidget;

    private JsLayersModel layersModel;

    private JsMapEventBus eventBus;

    private JsContainerManager containerManager;

    // Constructor is private
    private JsMapPresenterImpl() {
    }

    /**
     * Create a facade for a {@link MapPresenter}, available trough JavaScript.
     *
     * @param elementId the DOM element ID onto which to attach the map.
     * @param mapConfiguration map configuration see {@link JsMapConfigurationImpl}.
     */
    @ExportConstructor
    public static JsMapPresenterImpl constructor(String elementId, JsMapConfigurationImpl mapConfiguration) {
        JsMapPresenterImpl jsMapPresenter = new JsMapPresenterImpl();
        jsMapPresenter.construct(elementId, mapConfiguration);
        return jsMapPresenter;
    }

    /**
     * Create a facade for a {@link MapPresenter}, available trough JavaScript.
     *
     * @param elementId the DOM element ID onto which to attach the map.
     */
    @ExportConstructor
    public static JsMapPresenterImpl constructor(String elementId) {
        JsMapPresenterImpl jsMapPresenter = new JsMapPresenterImpl();
        jsMapPresenter.construct(elementId);
        return jsMapPresenter;
    }

    // ------------------------------------------------------------------------
    // Map implementation:
    // ------------------------------------------------------------------------

    private void construct(String elementId) {
        mapPresenter = GeomajasImpl.getInstance().createMapPresenter();
        setParentHtmlElementId(elementId);
        initialize();
        mapPresenter.setSize(getParentWidth(), getParentHeight());
    }

    private void construct(String elementId, JsMapConfigurationImpl mapConfiguration) {
        setParentHtmlElementId(elementId);
        mapPresenter = GeomajasImpl.getInstance().createMapPresenter(mapConfiguration.toGwt(), getParentWidth(),
                getParentHeight());
        initialize();
    }

    private void initialize() {
        addMapToParent();
        eventBus = new JsMapEventBusImpl(this);
        viewPort = new JsViewPortImpl(mapPresenter.getViewPort());
        layersModel = new JsLayersModelImpl(mapPresenter.getLayersModel());
        containerManager = new JsContainerManagerImpl(mapPresenter.getContainerManager());
    }

    /**
     * Returns the view port associated with this map. The view port regulates zooming and panning around the
     * map, but also presents transformation methods for transforming vector objects between the different render
     * spaces.
     *
     * @return Returns the view port.
     */
    public JsViewPort getViewPort() {
        return viewPort;
    }

    @Override
    public JsLayersModel getLayersModel() {
        return layersModel;
    }

    @Override
    public JsMapEventBus getEventBus() {
        return eventBus;
    }

    @Override
    public JsContainerManager getContainerManager() {
        return containerManager;
    }

    @Override
    public void setCursor(String cursor) {
        mapPresenter.setCursor(cursor);
    }

    @Override
    public String getParentHtmlElementId() {
        try {
            return parent.getElement().getId();
        } catch (Exception ex) {
            // when there is no parent yet.
            return null;
        }
    }

    @Override
    public void setSize(int width, int height) {
        mapPresenter.setSize(width, height);
    }

    public IsWidget getMapAsWidget() {
        return mapAsWidget;
    }

    @Override
    public void setMapController(JsMapController controller) {
        if (controller != null) {
            controller.setMapPresenter(this);
            mapPresenter.setMapController(new JsController(controller));
        } else {
            mapPresenter.setMapController(null);
        }
    }

    @Override
    public JsMapController getMapController() {
        MapController controller = mapPresenter.getMapController();
        return new JsMapControllerWrapperImpl(controller);
    }

    @Override
    public boolean addMapListener(JsMapController mapListener) {
        if (mapListener != null) {
            mapListener.setMapPresenter(this);
            return mapPresenter.addMapListener(new JsController(mapListener));
        }
        return false;
    }

    @Override
    public boolean removeMapListener(JsMapController mapListener) {
        if (mapListener != null) {
            for (JsController jsController : getJsControllerMapListeners()) {
                if (mapListener.equals(jsController.getWrappedJsMapController())) {
                    return mapPresenter.removeMapListener(jsController);
                }
            }
        }
        return false;
    }

    @Override
    public JsMapController[] getMapListeners() {
        List<JsMapController> jsMapControllerList = new ArrayList<JsMapController>();
        for (JsController jsController : getJsControllerMapListeners()) {
            jsMapControllerList.add(jsController.getWrappedJsMapController());
        }
        return jsMapControllerList.toArray(new JsMapController[jsMapControllerList.size()]);
    }

    // ------------------------------------------------------------------------
    // Other public methods:
    // ------------------------------------------------------------------------

    @NoExport
    public MapPresenter getMapPresenter() {
        return (MapPresenter) mapPresenter;
    }

    public void setParentHtmlElementId(String elementId) {
        parent = HTMLPanel.wrap(Document.get().getElementById(elementId));
    }

    public void addMapToParent() {
        int i = parent.getWidgetCount();
        parent.add(mapPresenter);
        mapAsWidget = parent.getWidget(i);
    }

    protected int getParentWidth() {
        return parent.getElement().getClientWidth();
    }

    protected int getParentHeight() {
        return parent.getElement().getClientHeight();
    }

    protected Collection<JsController> getJsControllerMapListeners() {
        List<JsController> jsControllerList = new ArrayList<JsController>();
        for (MapController mapController : mapPresenter.getMapListeners()) {
            if (mapController instanceof JsController) {
                jsControllerList.add(((JsController) mapController));
            }
        }
        return jsControllerList;
    }

    /**
     * JavaScript to GWT controller wrapper.
     *
     * @author Pieter De Graef
     * @author Jan Venstermans
     */
    private class JsController extends AbstractMapController {

        private JsMapController mapController;

        public JsController(JsMapController mapController) {
            super(false);
            this.mapController = mapController;
        }

        public void onActivate(MapPresenter presenter) {
            if (mapController.getActivationHandler() != null) {
                mapController.getActivationHandler().execute();
            }
        }

        public void onDeactivate(MapPresenter presenter) {
            if (mapController.getDeactivationHandler() != null) {
                mapController.getDeactivationHandler().execute();
            }
        }

        public void onMouseMove(MouseMoveEvent event) {
            if (mapController.getMouseMoveHandler() != null) {
                mapController.getMouseMoveHandler().onMouseMove(event);
            }
        }

        public void onMouseOver(MouseOverEvent event) {
            if (mapController.getMouseOverHandler() != null) {
                mapController.getMouseOverHandler().onMouseOver(event);
            }
        }

        public void onMouseOut(MouseOutEvent event) {
            if (mapController.getMouseOutHandler() != null) {
                mapController.getMouseOutHandler().onMouseOut(event);
            }
        }

        public void onDown(HumanInputEvent<?> event) {
            if (mapController.getDownHandler() != null) {
                mapController.getDownHandler().onDown(event);
            }
        }

        public void onUp(HumanInputEvent<?> event) {
            if (mapController.getUpHandler() != null) {
                mapController.getUpHandler().onUp(event);
            }
        }

        public void onDrag(HumanInputEvent<?> event) {
            if (mapController.getDragHandler() != null) {
                mapController.getDragHandler().onDrag(event);
            }
        }

        public void onDoubleClick(DoubleClickEvent event) {
            if (mapController.getDoubleClickHandler() != null) {
                mapController.getDoubleClickHandler().onDoubleClick(event);
            }
        }

        @Override
        public void onMouseWheel(MouseWheelEvent event) {
            if (mapController.getMouseWheelHandler() != null) {
                mapController.getMouseWheelHandler().onMouseWheel(event);
            }
        }

        public JsMapController getWrappedJsMapController() {
            return mapController;
        }
    }

}