All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wicketstuff.gmap.GMap Maven / Gradle / Ivy

There is a newer version: 10.3.0
Show newest version
/*
 *
 * ==============================================================================
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package org.wicketstuff.gmap;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.request.IRequestParameters;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.util.string.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.wicketstuff.gmap.api.GEvent;
import org.wicketstuff.gmap.api.GLatLng;
import org.wicketstuff.gmap.api.GLatLngBounds;
import org.wicketstuff.gmap.api.GMapType;
import org.wicketstuff.gmap.api.GMarker;
import org.wicketstuff.gmap.api.GMarkerCluster;
import org.wicketstuff.gmap.api.GMarkerOptions;
import org.wicketstuff.gmap.api.GOverlay;
import org.wicketstuff.gmap.event.GEventListenerBehavior;

/**
 * Wicket component to embed Google Maps into your pages.
 * 

*/ public class GMap extends Panel implements GOverlayContainer { /** log. */ private static final Logger log = LoggerFactory.getLogger(GMap.class); private static final long serialVersionUID = 1L; // Center is Palo Alto private GLatLng center = new GLatLng(37.4419, -122.1419); private boolean draggingEnabled = true; private boolean doubleClickZoomEnabled = false; private boolean scrollWheelZoomEnabled = false; private boolean streetViewControlEnabled = false; private boolean zoomControlEnabled = true; private boolean mapTypeControlEnabled = true; private boolean scaleControlEnabled = false; private boolean panControlEnabled = true; private GMapType mapType = GMapType.ROADMAP; private int zoom = 13; private int minZoom = 0; private int maxZoom = 0; private final Map overlays = new HashMap(); protected final WebMarkupContainer map; private GLatLngBounds bounds; private OverlayListener overlayListener = null; private List markersToShow = new ArrayList(); private boolean jsInitialized = false; /** * If set to true map loading will not produce any JavaScript errors in case * google maps API cannot be found (e.g. no Internet connection) */ private boolean failSilently = false; private GMarkerCluster markerCluster; /** * Constructor. * * Default the header contributor of the component will added and the gmap * will be initiated directly on rendering of the map. * * @param id wicket id * @param apiKey your Google API key */ public GMap(final String id, String apiKey) { this(id, new GMapHeaderContributor("http", apiKey)); } /** * Constructor. * * Default the header contributor of the component will added and the gmap * will be initiated directly on rendering of the map. * * @param id wicket id * @param scheme the scheme ("http" or "https") which should be used * @param apiKey your Google API key */ public GMap(final String id, String apiKey, String scheme) { this(id, new GMapHeaderContributor(scheme, apiKey)); } /** * Construct. * * @param id * @param headerContrib */ public GMap(final String id, final GMapHeaderContributor headerContrib) { super(id); if (headerContrib != null) { add(headerContrib); } map = new WebMarkupContainer("map"); map.setOutputMarkupId(true); add(map); overlayListener = getOverlayListener(); add(overlayListener); } protected OverlayListener getOverlayListener() { return new OverlayListener(); } /** * @return the markup-id of the container */ public String getMapId() { return map.getMarkupId(); } @Override protected void onBeforeRender() { super.onBeforeRender(); if (getApplication().usesDevelopmentConfig() && !getApplication().getMarkupSettings().getStripWicketTags()) { log.warn("Application is in DEVELOPMENT mode && Wicket tags are not stripped," + "Some Chrome Versions will not render the GMap." + " Change to DEPLOYMENT mode || turn on Wicket tags stripping." + " See:" + " http://www.nabble.com/Gmap2-problem-with-Firefox-3.0-to18137475.html."); } } @Override public void renderHead(IHeaderResponse response) { response.render(OnDomReadyHeaderItem.forScript(getJSinit())); jsInitialized = true; } /** * Add an overlay. * * @see GOverlayContainer#addOverlay(GOverlay) * @param overlay * overlay to add * @return This */ @Override public GMap addOverlay(final GOverlay overlay) { overlays.put(overlay.getId(), overlay); overlay.setParent(this); Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(overlay.getJS()); } return this; } /** * Remove an overlay. * * @see GOverlayContainer#removeOverlay(GOverlay) * @param overlay * overlay to remove * @return This */ @Override public GMap removeOverlay(final GOverlay overlay) { while (overlays.containsKey(overlay.getId())) { overlays.remove(overlay.getId()); } Optional target = RequestCycle.get().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(overlay.getJSremove()); } overlay.setParent(null); return this; } /** * Clear all overlays. * * @see GOverlayContainer#removeAllOverlays() * @return This */ @Override public GMap removeAllOverlays() { for (final GOverlay overlay : overlays.values()) { overlay.setParent(null); } overlays.clear(); Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSinvoke("clearOverlays()")); } return this; } /** * @see GOverlayContainer#getOverlays() */ @Override public List getOverlays() { return Collections.unmodifiableList(new ArrayList<>(overlays.values())); } public GLatLngBounds getBounds() { return bounds; } public void setBounds(GLatLngBounds bounds) { this.bounds = bounds; } /** * Returns the script for triggering an event on map. * * @param event * @return */ public CharSequence getTriggerEventScript(String event) { return "Wicket.maps['"+getMapId()+ "'].triggerEvent('"+event+"')"; } /** * @return returns the script to make map re-paint after resize. */ public CharSequence getTriggerResizeScript() { return "Wicket.maps['"+getMapId()+ "'].triggerResize();"; } /** * Sets if dragging should be allowed or not. * @param enabled true if dragging should be allowed, false otherwise */ public void setDraggingEnabled(final boolean enabled) { if (this.draggingEnabled != enabled) { draggingEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetDraggingEnabled(enabled)); } } } /** * Is dragging allowed? Enabled by default. * * @return true if it's allowed, false if not */ public boolean isDraggingEnabled() { return draggingEnabled; } /** * Sets if zooming-by-doubleclicking should be allowed or not. * @param enabled true if zooming-by-doubleclicking should be allowed, false otherwise */ public void setDoubleClickZoomEnabled(final boolean enabled) { if (this.doubleClickZoomEnabled != enabled) { doubleClickZoomEnabled = enabled; Optional target = RequestCycle.get().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetDoubleClickZoomEnabled(enabled)); } } } /** * Is the function zooming-by-doubleclick enabled? * Disabled by default. * * @return true if enabled, false if disabled */ public boolean isDoubleClickZoomEnabled() { return doubleClickZoomEnabled; } /** * Sets if zooming-by-mousewheel should be allowed or not. * @param enabled true if zooming-by-mousewheel should be allowed, false otherwise */ public void setScrollWheelZoomEnabled(final boolean enabled) { if (this.scrollWheelZoomEnabled != enabled) { scrollWheelZoomEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetScrollWheelZoomEnabled(enabled)); } } } /** * Is the function zooming-by-mousewheel enabled? * Disabled by default. * * @return true if enabled, false if disabled */ public boolean isScrollWheelZoomEnabled() { return scrollWheelZoomEnabled; } /** * Is the StreetView control enabled? * Disabled by default. * * @return true if enabled, false if disabled */ public boolean isStreetViewControlEnabled() { return streetViewControlEnabled; } /** * Sets if the StreetView control should be visible or not. * @param enabled true if StreetView should be allowed, false otherwise */ public void setStreetViewControlEnabled(boolean enabled) { if (this.streetViewControlEnabled != enabled) { streetViewControlEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetStreetViewControlEnabled(enabled)); } } } /** * Is the zoom control enabled? * Enabled by default. * * @return true if enabled, false if disabled */ public boolean isZoomControlEnabled() { return zoomControlEnabled; } /** * Sets if the zoom control should be visible or not. * @param enabled true if the zoom-control should be enabled, false otherwise */ public void setZoomControlEnabled(boolean enabled) { if (this.zoomControlEnabled != enabled) { this.zoomControlEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetZoomControlEnabled(enabled)); } } } /** * Is the map type control enabled? * Enabled by default. * * @return true if enabled, false if disabled */ public boolean isMapTypeControlEnabled() { return mapTypeControlEnabled; } /** * Sets if the map type control should be visible or not. * @param enabled true if you want the user to have the possibility to * change the map type, false otherwise */ public void setMapTypeControlEnabled(boolean enabled) { if (this.mapTypeControlEnabled != enabled) { this.mapTypeControlEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetMapTypeControlEnabled(enabled)); } } } /** * Is the scale control enabled? * Disabled by default. * * @return true if enabled, false if disabled */ public boolean isScaleControlEnabled() { return scaleControlEnabled; } /** * Sets if the scale control should be visible or not. * @param enabled true if the scale-control should be enabled, false otherwise */ public void setScaleControlEnabled(boolean enabled) { if (this.scaleControlEnabled != enabled) { this.scaleControlEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetScaleControlEnabled(enabled)); } } } /** * Is the pan control enabled? * Enabled by default. * * @return true if enabled, false if disabled */ public boolean isPanControlEnabled() { return panControlEnabled; } /** * Sets if the pan control should be visible or not. * @param enabled true if the pan-control should be enabled, false otherwise */ public void setPanControlEnabled(boolean enabled) { if (this.panControlEnabled != enabled) { this.panControlEnabled = enabled; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetPanControlEnabled(enabled)); } } } /** * @return the current map type. * @see GMapType */ public GMapType getMapType() { return mapType; } /** * Sets the map type which should be used. * @param mapType the map type * @see GMapType */ public void setMapType(final GMapType mapType) { if (this.mapType != mapType) { this.mapType = mapType; Optional target = RequestCycle.get().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(mapType.getJSsetMapType(GMap.this)); } } } /** * @return the current zoom level */ public int getZoom() { return zoom; } /** * @return the minZoom level */ public int getMinZoom() { return minZoom; } /** * @return the maxZoom level */ public int getMaxZoom() { return maxZoom; } /** * Sets a new zoom level. * @param level the new zoom level */ public void setZoom(final int level) { if (this.zoom != level) { this.zoom = level; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetZoom(zoom)); } } } /** * Sets a new minZoom limit. * @param level the new minZoom level */ public void setMinZoom(final int level) { if (this.minZoom != level) { this.minZoom = level >= 0 ? level : 0; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetMinZoom(minZoom)); } } } /** * Sets a new maxZoom limit. * @param level the new maxZoom level */ public void setMaxZoom(final int level) { if (this.maxZoom != level) { this.maxZoom = level >= 0 ? level : 0; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetMaxZoom(maxZoom)); } } } /** * @return the current center point */ public GLatLng getCenter() { return center; } /** * Set the center. * * @param center * center to set */ public void setCenter(final GLatLng center) { if (!this.center.equals(center)) { this.center = center; Optional target = RequestCycle.get().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSsetCenter(center)); } } } /** * Changes the center point of the map to the given point. If the point is already visible in the current map view, * change the center in a smooth animation. * * @param center * the new center of the map */ public void panTo(final GLatLng center) { if (!this.center.equals(center)) { this.center = center; Optional target = getRequestCycle().find(AjaxRequestTarget.class); if (target.isPresent() && findPage() != null && jsInitialized) { target.get().appendJavaScript(getJSpanTo(center)); } } } public void setMarkerCluster(GMarkerCluster markerCluster) { if(markerCluster == null) throw new IllegalArgumentException("GMarkerCluster argument should not be null."); this.markerCluster = markerCluster; if (getBehaviors(GMapMarkerClustererHeaderContributor.class).isEmpty()) { add(new GMapMarkerClustererHeaderContributor()); } } public boolean isMarkerClusterEnabled() { return markerCluster != null; } /** * Generates the JavaScript used to instantiate this GMap3 as an JavaScript class on the client side. * * @return The generated JavaScript */ public String getJSinit() { final StringBuilder js = new StringBuilder("new WicketMap('" + getMapId() + "', "+isFailSilently() +");\n"); js.append(getJSinvoke("clearOverlays()")); js.append(overlayListener.getJSinit()); js.append(getJSsetCenter(getCenter())); js.append(getJSsetZoom(getZoom())); js.append(getJSsetMinZoom(getMinZoom())); js.append(getJSsetMaxZoom(getMaxZoom())); js.append(getJSfitBounds()); js.append(getJSsetDraggingEnabled(draggingEnabled)); js.append(getJSsetDoubleClickZoomEnabled(doubleClickZoomEnabled)); js.append(getJSsetScrollWheelZoomEnabled(scrollWheelZoomEnabled)); js.append(getJSsetStreetViewControlEnabled(streetViewControlEnabled)); js.append(getJSsetZoomControlEnabled(zoomControlEnabled)); js.append(getJSsetScaleControlEnabled(scaleControlEnabled)); js.append(getJSsetMapTypeControlEnabled(mapTypeControlEnabled)); js.append(getJSsetPanControlEnabled(panControlEnabled)); js.append(getJSFitMarkers()); js.append(mapType.getJSsetMapType(this)); // Add the overlays. for (final GOverlay overlay : overlays.values()) { js.append(overlay.getJS()); } for (final Object behavior : getBehaviors(GEventListenerBehavior.class)) { js.append(((GEventListenerBehavior) behavior).getJSaddListener()); } js.append(getJSMarkerCluster()); return js.toString(); } /** * Convenience method for generating a JavaScript call on this GMap with the given invocation. * * @param invocation * The JavaScript call to invoke on this GMap. * @return The generated JavaScript. */ public String getJSinvoke(final String invocation) { return getJsReference() + "." + invocation + ";\n"; } /** * Build a reference in JS-Scope. */ public String getJsReference() { return "Wicket.maps['" + getMapId() + "']"; } /** * @see #fitMarkers(List, boolean, double) */ public void fitMarkers(final List markersToShow) { fitMarkers(markersToShow, false, 0.0); } /** * @see #fitMarkers(List, boolean, double) */ public void fitMarkers(final List markersToShow, final boolean showMarkersForPoints) { fitMarkers(markersToShow, showMarkersForPoints, 0.0); } /** *

* Makes the map zoom out and centre around all the GLatLng points in markersToShow. *

* Big ups to Doug Leeper for the code. * * @see Doug's Nabble post * @param markersToShow * the points to centre around. * @param showMarkersForPoints * if true, will also add basic markers to the map for each point focused on. Just a simple convenience * method - you will probably want to turn this off so that you can show more information with each * marker when clicked etc. */ public void fitMarkers(final List markersToShow, final boolean showMarkersForPoints, final double zoomAdjustment) { this.markersToShow = markersToShow; // show the markers if (showMarkersForPoints) { for (final GLatLng location : markersToShow) { this.addOverlay(new GMarker(new GMarkerOptions(this, location))); } } } public String getJSFitMarkers(List markers) { if (markers.isEmpty()) { return ""; } final StringBuilder buf = new StringBuilder(); buf.append("var bounds = new google.maps.LatLngBounds();\n"); // Ask google maps to keep extending the bounds to include each point for (final GLatLng point : markers) { buf.append("bounds.extend( ").append(point.getJSconstructor()).append(" );\n"); } buf.append(getJSinvoke("fitBounds(bounds)")); buf.append(getJSinvoke("panToBounds(bounds)")); return buf.toString(); } private String getJSFitMarkers() { return getJSFitMarkers(markersToShow); } private String getJSsetDraggingEnabled(final boolean enabled) { return getJSinvoke("setDraggingEnabled(" + enabled + ")"); } private String getJSsetDoubleClickZoomEnabled(final boolean enabled) { return getJSinvoke("setDoubleClickZoomEnabled(" + enabled + ")"); } private String getJSsetScrollWheelZoomEnabled(final boolean enabled) { return getJSinvoke("setScrollWheelZoomEnabled(" + enabled + ")"); } private String getJSsetStreetViewControlEnabled(final boolean enabled) { return getJSinvoke("setStreetViewControlEnabled(" + enabled + ")"); } private String getJSsetZoomControlEnabled(final boolean enabled) { return getJSinvoke("setZoomControlEnabled(" + enabled + ")"); } private String getJSsetScaleControlEnabled(final boolean enabled) { return getJSinvoke("setScaleControlEnabled(" + enabled + ")"); } private String getJSsetMapTypeControlEnabled(final boolean enabled) { return getJSinvoke("setMapTypeControlEnabled(" + enabled + ")"); } private String getJSsetPanControlEnabled(final boolean enabled) { return getJSinvoke("setPanControlEnabled(" + enabled + ")"); } private String getJSsetZoom(final int zoom) { return getJSinvoke("setZoom(" + zoom + ")"); } private String getJSsetMinZoom(final int minZoom) { return getJSinvoke("setMinZoom(" + minZoom + ")"); } private String getJSsetMaxZoom(final int maxZoom) { return getJSinvoke("setMaxZoom(" + maxZoom + ")"); } /** * Build the JavaScript for fitBounds() with the bounds property * * @return JavaScript for the fitBounds-Function */ private String getJSfitBounds() { if (null == bounds || Strings.isEmpty(bounds.getJSconstructor())) { return ""; } // else return getJSinvoke("fitBounds(" + bounds.getJSconstructor() + ")"); } private String getJSsetCenter(final GLatLng center) { if (center != null) { if( !failSilently ) { return getJSinvoke("setCenter(" + center.getJSconstructor() + ")"); } else { return getJSinvoke("setCenterFailSafe(" + center.getArguments() + ")"); } } return ""; } private String getJSpanDirection(final int dx, final int dy) { return getJSinvoke("panDirection(" + dx + "," + dy + ")"); } private String getJSpanTo(final GLatLng center) { return getJSinvoke("panTo(" + center.getJSconstructor() + ")"); } private String getJSzoomOut() { return getJSinvoke("zoomOut()"); } private String getJSzoomIn() { return getJSinvoke("zoomIn()"); } private String getJSMarkerCluster() { if(markerCluster != null) { return markerCluster.getJSconstructor(); } return ""; } /** * Update state from a request to an AJAX target. * You need to call this method explictly if you want to have up-to-date values. */ public void update() { // Attention: don't use setters as this will result in an endless // AJAX request loop IRequestParameters requestParameters = getRequest().getRequestParameters(); bounds = GLatLngBounds.parse(requestParameters.getParameterValue("bounds").toString()); center = GLatLng.parse(requestParameters.getParameterValue("center").toString()); zoom = requestParameters.getParameterValue("zoom").toInt(zoom); String requestMapType = requestParameters.getParameterValue("currentMapType").toString(); mapType = requestMapType != null ? GMapType.valueOf(requestParameters.getParameterValue("currentMapType").toString()) : mapType; } public void setOverlays(final List overlays) { removeAllOverlays(); for (final GOverlay overlay : overlays) { addOverlay(overlay); } } private static abstract class JSMethodBehavior extends Behavior { private static final long serialVersionUID = 1L; private final String attribute; public JSMethodBehavior(final String attribute) { this.attribute = attribute; } @Override public void onComponentTag(final Component component, final ComponentTag tag) { String invoke = getJSinvoke(); if (attribute.equalsIgnoreCase("href")) { invoke = "javascript:" + invoke; } tag.put(attribute, invoke); } protected abstract String getJSinvoke(); } public class ZoomOutBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; public ZoomOutBehavior(final String event) { super(event); } @Override protected String getJSinvoke() { return getJSzoomOut(); } } public class ZoomInBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; public ZoomInBehavior(final String event) { super(event); } @Override protected String getJSinvoke() { return getJSzoomIn(); } } public class PanDirectionBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; private final int dx; private final int dy; public PanDirectionBehavior(final String event, final int dx, final int dy) { super(event); this.dx = dx; this.dy = dy; } @Override protected String getJSinvoke() { return getJSpanDirection(dx, dy); } } public class SetZoomBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; private final int zoomBehavior; public SetZoomBehavior(final String event, final int zoom) { super(event); zoomBehavior = zoom; } @Override protected String getJSinvoke() { return getJSsetZoom(zoomBehavior); } } public class SetCenterBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; private final GLatLng gLatLng; public SetCenterBehavior(final String event, final GLatLng gLatLng) { super(event); this.gLatLng = gLatLng; } @Override protected String getJSinvoke() { return getJSsetCenter(gLatLng); } } public class SetMapTypeBehavior extends JSMethodBehavior { private static final long serialVersionUID = 1L; private final GMapType mapTypeBehavior; public SetMapTypeBehavior(final String event, final GMapType mapType) { super(event); mapTypeBehavior = mapType; } @Override protected String getJSinvoke() { return mapTypeBehavior.getJSsetMapType(GMap.this); } } public class OverlayListener extends AbstractDefaultAjaxBehavior { private static final long serialVersionUID = 1L; @Override protected void respond(final AjaxRequestTarget target) { final Request request = RequestCycle.get().getRequest(); final String overlayId = request.getRequestParameters().getParameterValue("overlay.overlayId").toString().replace("overlay", ""); final String event = request.getRequestParameters().getParameterValue("overlay.event").toString(); final GOverlay overlay = overlays.get(overlayId); if (overlay != null) { overlay.onEvent(target, GEvent.valueOf(event)); } } public Object getJSinit() { return GMap.this.getJSinvoke("overlayListenerCallbackUrl = '" + this.getCallbackUrl() + "'"); } } public boolean isFailSilently() { return failSilently; } public void setFailSilently(boolean failSilently) { this.failSilently = failSilently; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy