/*
* Copyright 2008 Google Inc.
*
* 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.google.gwt.maps.sample.hellomaps.client;
import com.google.gwt.maps.client.MapPane;
import com.google.gwt.maps.client.MapPaneType;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.LatLngBounds;
import com.google.gwt.maps.client.geom.Point;
import com.google.gwt.maps.client.overlay.Overlay;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
/**
* This demo shows how to create a custom overlay in the form of a Rectangle
* and add it to the map.
*/
public class CustomOverlayDemo extends MapsDemo {
private static class Rectangle extends AbsolutePanel {
public Rectangle() {
super(DOM.createDiv());
DOM.setStyleAttribute(getElement(), "borderStyle", "solid");
}
public void setBorderColor(String color) {
DOM.setStyleAttribute(getElement(), "borderColor", color);
}
public void setBorderWidth(String width) {
DOM.setStyleAttribute(getElement(), "borderWidth", width);
}
}
private static class RectangleOverlay extends Overlay {
private final LatLngBounds bounds;
private final Rectangle rectangle;
private final int weight;
private MapWidget map;
private MapPane pane;
public RectangleOverlay(LatLngBounds bounds, int weight) {
this.bounds = bounds;
this.weight = weight;
rectangle = new Rectangle();
rectangle.setBorderWidth(weight + "px");
rectangle.setBorderColor("#888888");
}
@Override
protected Overlay copy() {
return new RectangleOverlay(bounds, weight);
}
@Override
protected void initialize(MapWidget map) {
this.map = map;
pane = map.getPane(MapPaneType.MAP_PANE);
pane.add(rectangle);
}
@Override
protected void redraw(boolean force) {
// Only set the rectangle's size if the map's size has changed
if (!force) {
return;
}
Point sw = map.convertLatLngToDivPixel(bounds.getSouthWest());
Point ne = map.convertLatLngToDivPixel(bounds.getNorthEast());
pane.setWidgetPosition(rectangle, Math.min(sw.getX(), ne.getX()),
Math.min(sw.getY(), ne.getY()));
int width = Math.abs(ne.getX() - sw.getX()) - weight;
int height = Math.abs(ne.getY() - sw.getY()) - weight;
rectangle.setSize(width + "px", height + "px");
}
@Override
protected void remove() {
rectangle.removeFromParent();
}
}
private static HTML descHTML = null;
private static final String descString = "<p>Creates a 500 x 300 pixel map viewport centered on Palo Alto, CA USA.</p>"
+ "<p>Draws a rectangle overlay at the center of the maps window.</p>\n"
+ "<p>Equivalent to the Maps JavaScript API Example: "
+ "<a href=\"http://code.google.com/apis/maps/documentation/examples/overlay-custom.html\">"
+ "http://code.google.com/apis/maps/documentation/examples/overlay-custom.html</a></p>\n";
public static MapsDemoInfo init() {
return new MapsDemoInfo() {
@Override
public MapsDemo createInstance() {
return new CustomOverlayDemo();
}
@Override
public HTML getDescriptionHTML() {
if (descHTML == null) {
descHTML = new HTML(descString);
}
return descHTML;
}
@Override
public String getName() {
return "Custom Overlays";
}
};
}
private MapWidget map;
private boolean firstTime = true;
public CustomOverlayDemo() {
map = new MapWidget(LatLng.newInstance(37.4419, -122.1419), 13);
map.setSize("500px", "300px");
map.setUIToDefault();
initWidget(map);
}
@Override
public void onShow() {
// The map's bounds are meaningless until the map has been added to the DOM
// and sized appropriately
if (firstTime) {
firstTime = false;
LatLngBounds bounds = map.getBounds();
LatLng southWest = bounds.getSouthWest();
LatLng northEast = bounds.getNorthEast();
double lngDelta = (northEast.getLongitude() - southWest.getLongitude()) / 4;
double latDelta = (northEast.getLatitude() - southWest.getLatitude()) / 4;
// generate bounds that covers center map with half the width and height
LatLngBounds rectBounds = LatLngBounds.newInstance(LatLng.newInstance(
southWest.getLatitude() + latDelta, southWest.getLongitude()
+ lngDelta), LatLng.newInstance(northEast.getLatitude() - latDelta,
northEast.getLongitude() - lngDelta));
map.addOverlay(new RectangleOverlay(rectBounds, 2));
}
}
}