package org.vaadin.hezamu.googlemapwidget;
import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.Random;
import org.vaadin.hezamu.googlemapwidget.overlay.BasicMarker;
import org.vaadin.hezamu.googlemapwidget.overlay.Marker;
import org.vaadin.hezamu.googlemapwidget.overlay.PolyOverlay;
import org.vaadin.hezamu.googlemapwidget.overlay.Polygon;
import org.vaadin.hezamu.googlemapwidget.GoogleMap.MarkerClickListener;
import org.vaadin.hezamu.googlemapwidget.GoogleMap.MapControl;
import com.vaadin.Application;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.Notification;
@SuppressWarnings("serial")
public class GoogleMapWidgetApp extends Application {
private GoogleMap googleMap;
private BasicMarker mark1;
private BasicMarker mark2;
private BasicMarker mark3;
private BasicMarker mark4;
private BasicMarker mark5;
@Override
public void init() {
setMainWindow(new Window("Google Map add-on demo"));
// Create a new map instance centered on the IT Mill offices
googleMap = new GoogleMap(this, new Point2D.Double(22.3, 60.4522), 8);
googleMap.setWidth("640px");
googleMap.setHeight("480px");
// Create a marker at the IT Mill offices
mark1 = new BasicMarker(1L, new Point2D.Double(22.3, 60.4522),
"Test marker 1");
mark2 = new BasicMarker(2L, new Point2D.Double(22.4, 60.4522),
"Test marker 2");
mark3 = new BasicMarker(4L, new Point2D.Double(22.6, 60.4522),
"Test marker 3");
mark4 = new BasicMarker(5L, new Point2D.Double(22.7, 60.4522),
"Test marker 4");
googleMap.addListener(new MarkerClickListener() {
@Override
public void markerClicked(Marker clickedMarker) {
if (clickedMarker.getIconUrl() != null
&& clickedMarker.getIconUrl().contains("green")) {
((BasicMarker) clickedMarker)
.setIconUrl("VAADIN/themes/reindeer/icon/red.png");
} else {
((BasicMarker) clickedMarker)
.setIconUrl("VAADIN/themes/reindeer/icon/green.png");
}
googleMap.requestRepaint();
}
});
// Marker with information window pupup
mark5 = new BasicMarker(6L, new Point2D.Double(22.8, 60.4522),
"Marker 5������'\"");
mark5.setInfoWindowContent(googleMap, new Label("Hello Marker 5!"));
Label content = new Label("Hello Marker 2!");
content.setWidth("60px");
(mark2).setInfoWindowContent(googleMap, content);
googleMap.addMarker(mark1);
googleMap.addMarker(mark2);
googleMap.addMarker(mark3);
googleMap.addMarker(mark4);
googleMap.addMarker(mark5);
getMainWindow().getContent().addComponent(googleMap);
// Add a Marker click listener to catch marker click events.
// Note, works only if marker has information window content
googleMap.addListener(new GoogleMap.MarkerClickListener() {
public void markerClicked(Marker clickedMarker) {
getMainWindow().showNotification(
"Marker " + clickedMarker.getTitle() + " clicked",
Notification.TYPE_TRAY_NOTIFICATION);
}
});
// Add a MarkerMovedListener to catch events when a marker is dragged to
// a new location
googleMap.addListener(new GoogleMap.MarkerMovedListener() {
public void markerMoved(Marker movedMarker) {
getMainWindow().showNotification(
"Marker " + movedMarker.getTitle() + " moved to "
+ movedMarker.getLatLng().toString(),
Notification.TYPE_TRAY_NOTIFICATION);
}
});
googleMap.addListener(new GoogleMap.MapMoveListener() {
@Override
public void mapMoved(int newZoomLevel, Point2D.Double newCenter,
Point2D.Double boundsNE, Point2D.Double boundsSW) {
getMainWindow().showNotification(
"Zoom " + newZoomLevel + " center " + newCenter
+ " bounds " + boundsNE + "/" + boundsSW,
Notification.TYPE_TRAY_NOTIFICATION);
}
});
googleMap.addControl(MapControl.MapTypeControl);
addTestButtons(); // Add buttons that trigger tests map features
}
private void addTestButtons() {
GridLayout grid = new GridLayout(4, 1);
grid.setSpacing(true);
getMainWindow().addComponent(grid);
grid.addComponent(new Button("Toggle marker 3 draggability",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
mark3.setDraggable(!mark3.isDraggable());
googleMap.requestRepaint();
}
}));
grid.addComponent(new Button("Toggle marker 4 visibility",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
mark4.setVisible(!mark4.isVisible());
googleMap.requestRepaint();
}
}));
grid.addComponent(new Button("Randomize Marker 5 location",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
Random r = new Random();
mark5.setLatLng(new Point2D.Double(
22.8 + r.nextFloat() / 10, 60.4522 + r
.nextFloat() / 10));
googleMap.requestRepaint();
}
}));
grid.addComponent(new Button("Update marker 5 title",
new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
String chars = new String(".�&��'\"");
mark5.setTitle(mark5.getTitle()
+ chars.charAt(new Random().nextInt(chars
.length())));
googleMap.requestRepaint();
}
}));
grid.addComponent(new Button("Remove \"Test marker2\"",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
googleMap.removeMarker(mark2);
}
}));
grid.addComponent(new Button("Add \"Test marker2\"",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
googleMap.addMarker(mark2);
}
}));
grid.addComponent(new Button("Toggle marker 1 icon",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
if (mark1.getIconUrl() == null) {
mark1.setIconUrl("http://bits.ohloh.net/attachments/18966/v_med.gif");
mark1.setIconAnchor(null);
} else if (mark1.getIconAnchor() == null) {
mark1.setIconAnchor(new Point2D.Double(-20, -20));
} else {
mark1.setIconUrl(null);
mark1.setIconAnchor(null);
}
googleMap.requestRepaint();
}
}));
grid.addComponent(new Button("Toggle client logging",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
if (googleMap.getClientLogLevel() == 0) {
googleMap.setClientLogLevel(1);
getMainWindow().showNotification(
"Client logging enabled",
Notification.TYPE_TRAY_NOTIFICATION);
} else {
googleMap.setClientLogLevel(0);
getMainWindow().showNotification(
"Client logging enabled",
Notification.TYPE_TRAY_NOTIFICATION);
}
}
}));
// Popup test
grid.addComponent(new Button("Open a map in a popup",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Application app = event.getButton().getApplication();
GoogleMap map2 = new GoogleMap(event.getButton()
.getApplication(), new Point2D.Double(22.3,
60.4522), 8);
map2.setHeight("240px");
map2.setWidth("240px");
Window w = new Window("popup");
w.addComponent(map2);
w.setHeight("300px");
w.setWidth("300px");
app.getMainWindow().addWindow(w);
}
}));
grid.addComponent(new Button("Resize map", new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
if (googleMap.getHeight() == 200) {
googleMap.setWidth("640px");
googleMap.setHeight("480px");
} else {
googleMap.setHeight("200px");
googleMap.setWidth("200px");
}
}
}));
grid.addComponent(new Button("Draw polygon",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
// Location of Vaadin Ltd offices
Point2D.Double c = new Point2D.Double(22.3, 60.4522);
double delta = 0.75;
Point2D.Double[] corners = new Point2D.Double[] {
new Point2D.Double(c.x - delta, c.y + delta),
new Point2D.Double(c.x + delta, c.y + delta),
new Point2D.Double(c.x + delta, c.y - delta),
new Point2D.Double(c.x - delta, c.y - delta),
new Point2D.Double(c.x - delta, c.y + delta) };
Polygon poly = new Polygon(new Random().nextLong(),
corners, "#f04040", 5, 0.8, "#1010ff", 0.2,
false);
googleMap.addPolyOverlay(poly);
}
}));
grid.addComponent(new Button("Remove first polygon",
new Button.ClickListener() {
public void buttonClick(ClickEvent event) {
Collection<PolyOverlay> overlays = googleMap
.getOverlays();
if (!overlays.isEmpty()) {
googleMap.removeOverlay(overlays.iterator().next());
getMainWindow().showNotification("Overlay removed",
Notification.TYPE_TRAY_NOTIFICATION);
} else {
getMainWindow().showNotification(
"No overlays to remove",
Notification.TYPE_TRAY_NOTIFICATION);
}
}
}));
}
}