/*
* Copyright (c) 2010, 2011 Mashery, Inc. All Rights Reserved.
*
* 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 com.mashery.examples.api.client;
import java.util.HashMap;
import com.google.gwt.dom.client.Element;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.maps.client.HasMap;
import com.google.gwt.maps.client.MapOptions;
import com.google.gwt.maps.client.MapTypeId;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.HasLatLng;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.overlay.HasMarker;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ToggleButton;
public class PopupMapWidget extends Composite {
private final PopupPanel mapPanel;
private final MapWidget mapWidget;
private final ToggleButton mapButton;
private final HashMap<MarkerKey, HasMarker> markers = new HashMap<MarkerKey, HasMarker>();
public PopupMapWidget() {
mapPanel = new PopupPanel(true);
mapPanel.setAutoHideOnHistoryEventsEnabled(true);
mapPanel.setAnimationEnabled(true);
MapOptions options = new MapOptions();
options.setZoom(1);
options.setCenter(new LatLng(0d, 0d));
options.setMapTypeId(new MapTypeId().getRoadmap());
options.setDraggable(true);
options.setScrollwheel(true);
options.setNavigationControl(true);
options.setMapTypeControl(true);
mapWidget = new MapWidget(options);
mapWidget.setSize("512px", "512px");
FlowPanel mapContainer = new FlowPanel();
mapPanel.setWidget(mapContainer);
mapContainer.add(mapWidget);
Anchor clearMarkersLink = new Anchor("Clear Markers", "#");
mapContainer.add(clearMarkersLink);
clearMarkersLink.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
event.preventDefault();
// there's no way to setMap(null) on a marker
// instead, assign it to a dummy map
MapWidget garbage = new MapWidget(new MapOptions());
HasMap map = garbage.getMap();
for (HasMarker marker : markers.values())
marker.setMap(map);
markers.clear();
}
});
mapButton = new ToggleButton("Map");
mapPanel.addAutoHidePartner(mapButton.getElement());
mapButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (mapButton.isDown())
mapPanel.showRelativeTo(mapButton);
else
mapPanel.hide();
}
});
mapPanel.addCloseHandler(new CloseHandler<PopupPanel>() {
@Override
public void onClose(CloseEvent<PopupPanel> event) {
mapButton.setDown(false);
}
});
initWidget(mapButton);
}
public HasMap getMap() {
return mapWidget.getMap();
}
public void addAutoHidePartner(Element partner) {
mapPanel.addAutoHidePartner(partner);
}
public void show() {
mapButton.setDown(true);
if (!mapPanel.isShowing())
mapPanel.showRelativeTo(this);
}
public void show(HasLatLng latLng) {
mapWidget.getMap().panTo(latLng);
if (mapWidget.getMap().getZoom() <= 2)
mapWidget.getMap().setZoom(8);
show();
}
public void show(HasMarker marker) {
HasLatLng position = marker.getPosition();
double lat = position == null ? 0d : position.getLatitude();
double lng = position == null ? 0d : position.getLongitude();
MarkerKey key = new MarkerKey(marker.getTitle(), lat, lng);
if (!markers.containsKey(key)) {
marker.setMap(mapWidget.getMap());
markers.put(key, marker);
}
show(position == null ? new LatLng(lat, lng) : position);
}
public void hide() {
mapPanel.hide();
}
private static class MarkerKey {
private final String title;
private final double lat;
private final double lng;
private final int hashCode;
public MarkerKey(String title, double lat, double lng) {
this.title = title;
this.lat = lat;
this.lng = lng;
int c = 17;
c = 37 * c + (title == null ? 0 : title.hashCode());
c = 37 * c + (int) lat;
c = 37 * c + (int) lng;
hashCode = c;
}
@Override
public int hashCode() {
return hashCode;
}
@Override
public boolean equals(Object obj) {
if (obj == this)
return true;
if (obj == null || obj.getClass() != getClass())
return false;
MarkerKey o = (MarkerKey) obj;
return (title == null ? o.title == null : title.equals(o.title)) && lat == o.lat && lng == o.lng;
}
}
}