package de.flower.rmt.ui.page.venues.manager.map; import de.flower.common.ui.panel.BasePanel; import de.flower.common.util.geo.LatLng; import de.flower.rmt.model.db.entity.Venue; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.util.string.Strings; import wicket.contrib.gmap3.GMap; import wicket.contrib.gmap3.overlay.GInfoWindow; import wicket.contrib.gmap3.overlay.GMarker; import wicket.contrib.gmap3.overlay.GMarkerOptions; import wicket.contrib.gmap3.overlay.GOverlayEvent; import wicket.contrib.gmap3.overlay.GOverlayEventHandler; /** * The model contains the latLng of the marker to display. If null no marker is displayed. * * @author flowerrrr */ public class VenueMapPanel extends BasePanel<LatLng> { private GMap map; private GMarkerOptions options; public VenueMapPanel(IModel<LatLng> model) { this(model, null, true); } public VenueMapPanel(final IModel<LatLng> model, final String infoWindowContent) { this(model, infoWindowContent, false); } /** * @param latLng position of gMarker */ private VenueMapPanel(IModel<LatLng> model, String infoWindowContent, boolean draggableMarker) { super(model); LatLng latLng = model.getObject(); if (latLng == null) { // init with 0,0 latLng = new LatLng(0, 0); model.setObject(latLng); } map = new GMap("map"); add(map); map.setDoubleClickZoomEnabled(true); if (draggableMarker) { // put draggable marker on map. options = new GMarkerOptions(map, latLng); options = options.draggable(true); final GMarker gMarker = new GMarker(options); map.addOverlay(gMarker); // add drag listener gMarker.addListener(GOverlayEvent.DRAGEND, new GOverlayEventHandler() { @Override public void onEvent(AjaxRequestTarget target) { onUpdateMarker(new LatLng(gMarker.getLatLng())); } }); } else { options = new GMarkerOptions(map, latLng); GMarker gMarker = new GMarker(options); map.addOverlay(gMarker); if (infoWindowContent != null) { gMarker.addFunctionListener(GOverlayEvent.CLICK, GInfoWindow.getJSopenFunction(map, infoWindowContent, gMarker)); } } // and center map on marker map.setCenter(latLng); map.setZoom(14); } /** * Called when gMarker on map is set or dragged around. * * @param latLng */ public void onUpdateMarker(LatLng latLng) { // subclasses can override setModelObject(latLng); } @Override protected void onBeforeRender() { // update settings if latLng has changed, should be enough to reflect model changes when panel is repainted. map.setCenter(getModelObject()); options.setLatLng(getModelObject()); super.onBeforeRender(); } public static String getInfoWindowContent(final Venue venue, final String url) { String s = "<div><ul class='info-window'>" + "<li>" + "<span class='name'>" + venue.getName() + "</span>" + "</li>" + "<li>" + "<span>" + (venue.getAddress() != null ? Strings.toMultilineMarkup(venue.getAddress()) : "") + "</span>" + "</li>" + "<li>" + "<span><a href='" + url + "' target='_blank' class='btn-link-external'>" + new ResourceModel("venue.getdirections.link").getObject() + "</a></span>" + "</li>" + "</ul></div>"; return s; } }