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

Java tutorial

Introduction

Here is the source code for org.geomajas.javascript.gwt2.impl.client.map.JsMarkerImpl.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.Element;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.MouseUpEvent;
import com.google.gwt.event.dom.client.MouseUpHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.IsWidget;
import org.geomajas.geometry.Coordinate;
import org.geomajas.gwt2.client.gfx.AbstractTransformableWidget;
import org.geomajas.javascript.api.client.event.JsMarkerDeselectedEvent;
import org.geomajas.javascript.api.client.event.JsMarkerDeselectedHandler;
import org.geomajas.javascript.api.client.event.JsMarkerSelectedEvent;
import org.geomajas.javascript.api.client.event.JsMarkerSelectedHandler;
import org.geomajas.javascript.api.client.map.JsMarker;
import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.ExportConstructor;
import org.timepedia.exporter.client.ExportOverlay;
import org.timepedia.exporter.client.ExportPackage;
import org.timepedia.exporter.client.Exportable;

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

/**
 * Implementation of a {@link org.geomajas.javascript.api.client.map.JsMarker}.
 *
 * @author Youri Flement
 * @author Dosi Bingov
 */
@Export("Marker")
@ExportPackage("gm")
public class JsMarkerImpl extends AbstractTransformableWidget
        implements JsMarker, Exportable, ExportOverlay<JsMarkerImpl>, MouseDownHandler, MouseUpHandler {

    private int anchorX;

    private int anchorY;

    private Collection<JsMarkerSelectedHandler> selectedHandlers;

    private Collection<JsMarkerDeselectedHandler> deselectedHandlers;

    protected JsMarkerImpl(IsWidget panel, int anchorX, int anchorY) {
        super(panel, 0, 0);
        this.anchorX = anchorX;
        this.anchorY = anchorY;
        asWidget().getElement().getStyle().setPosition(Position.ABSOLUTE);

        selectedHandlers = new ArrayList<JsMarkerSelectedHandler>();
        deselectedHandlers = new ArrayList<JsMarkerDeselectedHandler>();

        // Add handlers to the widget that will fire events when the widget is clicked or released:
        asWidget().addDomHandler(this, MouseDownEvent.getType());
        asWidget().addDomHandler(this, MouseUpEvent.getType());
    }

    /**
     * Create a new transformable marker widget.
     *
     * @param element dom element object.
     * @param anchorX The x-coordinate of the anchor of the marker.
     * @param anchorY The y-coordinate of the anchor of the marker.
     * @return A new marker widget.
     */
    @ExportConstructor
    public static JsMarkerImpl constructor(Element element, int anchorX, int anchorY) {
        JsMarkerImpl marker = new JsMarkerImpl(new HTMLPanel(element.getString()), anchorX, anchorY);
        return marker;
    }

    /**
     * Create a new transformable image widget.
     *
     * @param url     The URL to the image.
     * @param coordinate The x-coordinate and the y-coordinate of the marker.
     * @param anchorX The x-coordinate of the anchor of the marker.
     * @param anchorY The y-coordinate of the anchor of the marker.
     * @return A new marker widget.
     */
    @ExportConstructor
    public static JsMarkerImpl constructor(String url, Coordinate coordinate, int anchorX, int anchorY) {
        JsMarkerImpl marker = new JsMarkerImpl(new Image(url), anchorX, anchorY);
        marker.setCoordinate(coordinate);
        return marker;
    }

    @Override
    public void addWidgetSelectedHandler(JsMarkerSelectedHandler handler) {
        selectedHandlers.add(handler);
    }

    @Override
    public void addWidgetDeselectedHandler(JsMarkerDeselectedHandler handler) {
        deselectedHandlers.add(handler);
    }

    @Override
    public void setCoordinate(Coordinate coordinate) {
        setWorldPosition(coordinate);
    }

    @Override
    public Coordinate getCoordinate() {
        return getWorldPosition();
    }

    @Override
    public void select() {
        // Notify the handlers:
        for (JsMarkerSelectedHandler handler : selectedHandlers) {
            handler.onWidgetSelected(new JsMarkerSelectedEvent(this));
        }
    }

    @Override
    public void deselect() {
        // Notify handlers:
        for (JsMarkerDeselectedHandler handler : deselectedHandlers) {
            handler.onWidgetDeselected(new JsMarkerDeselectedEvent(this));
        }
    }

    @Override
    public Element getElement() {
        return asWidget().getElement();
    }

    @Override
    public void setScreenPosition(double left, double top) {
        asWidget().getElement().getStyle().setLeft(left - anchorX, Unit.PX);
        asWidget().getElement().getStyle().setTop(top - anchorY, Unit.PX);
    }

    @Override
    public void onMouseDown(MouseDownEvent event) {
        // Put the widget to the bottom so the (possible) mouse move events are not lost on a 'higher' widget:
        DOM.appendChild(asWidget().getParent().getElement(), asWidget().getElement());
        select();
    }

    @Override
    public void onMouseUp(MouseUpEvent event) {
        deselect();
        event.preventDefault();
    }

}