package org.diretto.web.richwebclient.view.widgets.googlemap.client; import org.diretto.web.richwebclient.view.base.client.MediaType; import com.google.gwt.maps.client.base.LatLng; import com.google.gwt.maps.client.event.Event; import com.google.gwt.maps.client.event.HasMouseEvent; import com.google.gwt.maps.client.event.MouseEventCallback; import org.diretto.web.richwebclient.view.widgets.googlemap.client.base.AbstractVGoogleMap; import org.diretto.web.richwebclient.view.widgets.googlemap.client.markers.DraggableMarker; import org.diretto.web.richwebclient.view.widgets.googlemap.client.markers.Marker; import org.diretto.web.richwebclient.view.widgets.googlemap.server.UploadGoogleMap; import com.vaadin.terminal.gwt.client.ApplicationConnection; import com.vaadin.terminal.gwt.client.UIDL; /** * The client side component of the {@link UploadGoogleMap}. * * @author Tobias Schlecht */ public final class VUploadGoogleMap extends AbstractVGoogleMap { private boolean initialized = false; private DraggableMarker marker; /** * Constructs a {@link VUploadGoogleMap}. */ public VUploadGoogleMap() { super(); } @Override public void updateFromUIDL(UIDL uidl, ApplicationConnection applicationConnection) { super.updateFromUIDL(uidl, applicationConnection); if(!initialized) { marker = new DraggableMarker(map, map.getCenter().getLatitude(), map.getCenter().getLongitude(), MediaType.valueOf(uidl.getStringVariable("mediaType"))); addEventListeners(); initialized = true; } else { MediaType uidlMediaType = MediaType.valueOf(uidl.getStringVariable("mediaType")); if(marker.getMediaType() != uidlMediaType) { marker.changeMediaType(uidlMediaType); } if(marker.getPosition().getLatitude() != uidl.getDoubleVariable("markerLatitude") || marker.getPosition().getLongitude() != uidl.getDoubleVariable("markerLongitude")) { marker.setPosition(new LatLng(uidl.getDoubleVariable("markerLatitude"), uidl.getDoubleVariable("markerLongitude"))); } } } /** * Sends the variables to the server side component. */ private void updateVariables() { applicationConnection.updateVariable(paintableID, "markerLatitude", marker.getPosition().getLatitude(), false); applicationConnection.updateVariable(paintableID, "markerLongitude", marker.getPosition().getLongitude(), true); } /** * Adds {@code EventListener}s to the {@link Marker} and the map. */ private void addEventListeners() { Event.addListener(marker, "position_changed", new MouseEventCallback() { @Override public void callback(HasMouseEvent event) { updateVariables(); } }); Event.addListener(map, "dblclick", new MouseEventCallback() { @Override public void callback(HasMouseEvent event) { marker.setPosition(event.getLatLng()); updateVariables(); } }); Event.addListener(map, "rightclick", new MouseEventCallback() { @Override public void callback(HasMouseEvent event) { map.setCenter(marker.getPosition()); } }); } }