com.google.gwt.maps.sample.hellomaps.client.DrawingOverlayDemo.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.maps.sample.hellomaps.client.DrawingOverlayDemo.java

Source

/*
 * 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.MapWidget;
import com.google.gwt.maps.client.event.PolygonCancelLineHandler;
import com.google.gwt.maps.client.event.PolygonEndLineHandler;
import com.google.gwt.maps.client.event.PolygonLineUpdatedHandler;
import com.google.gwt.maps.client.event.PolylineCancelLineHandler;
import com.google.gwt.maps.client.event.PolylineEndLineHandler;
import com.google.gwt.maps.client.event.PolylineLineUpdatedHandler;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.overlay.PolyEditingOptions;
import com.google.gwt.maps.client.overlay.PolyStyleOptions;
import com.google.gwt.maps.client.overlay.Polygon;
import com.google.gwt.maps.client.overlay.Polyline;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Demonstrates editable/drawable polylines/polygons.
 */
public class DrawingOverlayDemo extends MapsDemo {
    private static HTML descHTML = null;
    private static final String descString = "<p>Creates a map" + " centered on Paris, France.</p>"
            + "<p>You can create lines or polygons on the map by clicking the <i>Draw New Object</i> button. "
            + "The resulting dialog box allows you to control the properties of the object to draw."
            + "You can edit the last line you created by clicking the <i>Edit Polyline</i> button, or "
            + "the last polygon you created by clicking the <i>Edit Polygon</i> button.</p>";

    public static MapsDemoInfo init() {
        return new MapsDemoInfo() {
            @Override
            public MapsDemo createInstance() {
                return new DrawingOverlayDemo();
            }

            @Override
            public HTML getDescriptionHTML() {
                if (descHTML == null) {
                    descHTML = new HTML(descString);
                }
                return descHTML;
            }

            @Override
            public String getName() {
                return "Drawing Demo";
            }
        };
    }

    private String color = "#FF0000";
    private boolean makePolygon = false;
    private MapWidget map;
    private Label message1;
    private Label message2;
    private double opacity = 1.0;
    private int weight = 1;
    private boolean fillFlag = false;
    private Polyline lastPolyline = null;
    private Polygon lastPolygon = null;
    private DialogBox addPolyDialog = null;
    private Button editPolylineButton = new Button("Edit Last Polyline");
    private Button editPolygonButton = new Button("Edit Last Polygon");

    public DrawingOverlayDemo() {

        // Go to Paris
        map = new MapWidget(LatLng.newInstance(48.859068, 2.344894), 12);
        map.setSize("500px", "400px");

        VerticalPanel panel = new VerticalPanel();
        panel.setSpacing(10);
        panel.add(makeToolbar());
        panel.add(map);
        message1 = new Label();
        panel.add(message1);
        message2 = new Label();
        panel.add(message2);
        initWidget(panel);
    }

    private void createPolyline() {
        PolyStyleOptions style = PolyStyleOptions.newInstance(color, weight, opacity);

        final Polyline poly = new Polyline(new LatLng[0]);
        lastPolyline = poly;
        map.addOverlay(poly);
        poly.setDrawingEnabled();
        poly.setStrokeStyle(style);
        message2.setText("");
        poly.addPolylineLineUpdatedHandler(new PolylineLineUpdatedHandler() {

            public void onUpdate(PolylineLineUpdatedEvent event) {
                message2.setText(message2.getText() + " : Line Updated");
            }
        });

        poly.addPolylineCancelLineHandler(new PolylineCancelLineHandler() {

            public void onCancel(PolylineCancelLineEvent event) {
                message2.setText(message2.getText() + " : Line Canceled");
            }
        });

        poly.addPolylineEndLineHandler(new PolylineEndLineHandler() {

            public void onEnd(PolylineEndLineEvent event) {
                message2.setText(message2.getText() + " : Line End at " + event.getLatLng() + ".  Bounds="
                        + poly.getBounds().getNorthEast() + "," + poly.getBounds().getSouthWest() + " length="
                        + poly.getLength() + "m");
            }
        });
    }

    private void createPolygon() {
        PolyStyleOptions style = PolyStyleOptions.newInstance(color, weight, opacity);

        final Polygon poly = new Polygon(new LatLng[0], color, weight, opacity, color, fillFlag ? .7 : 0.0);
        lastPolygon = poly;
        map.addOverlay(poly);
        poly.setDrawingEnabled();
        poly.setStrokeStyle(style);
        message2.setText("");
        poly.addPolygonLineUpdatedHandler(new PolygonLineUpdatedHandler() {

            public void onUpdate(PolygonLineUpdatedEvent event) {
                message2.setText(message2.getText() + " : Polygon Updated");
            }
        });

        poly.addPolygonCancelLineHandler(new PolygonCancelLineHandler() {

            public void onCancel(PolygonCancelLineEvent event) {
                message2.setText(message2.getText() + " : Polygon Cancelled");
            }
        });

        poly.addPolygonEndLineHandler(new PolygonEndLineHandler() {

            public void onEnd(PolygonEndLineEvent event) {
                message2.setText(message2.getText() + " : Polygon End at " + event.getLatLng() + ".  Bounds="
                        + poly.getBounds().getNorthEast() + "," + poly.getBounds().getSouthWest() + " area="
                        + poly.getArea() + "m");
            }
        });
    }

    private void editPolygon() {
        if (lastPolygon == null) {
            return;
        }
        // allow up to 10 vertices to exist in the polygon.
        lastPolygon.setEditingEnabled(PolyEditingOptions.newInstance(10));
    }

    private void editPolyline() {
        if (lastPolyline == null) {
            return;
        }
        // allow up to 10 vertices to exist in the line.
        lastPolyline.setEditingEnabled(PolyEditingOptions.newInstance(10));
    }

    /**
     * Create the toolbar above the map. Note that the map must be initialized
     * before this method is called.
     */
    private Widget makeToolbar() {
        DockPanel p = new DockPanel();
        p.setWidth("100%");

        HorizontalPanel buttonPanel = new HorizontalPanel();

        Button addButton = new Button("Draw new object");
        addButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                if (addPolyDialog == null) {
                    addPolyDialog = makeAddPolyDialog();
                }
                addPolyDialog.center();
                addPolyDialog.show();
                if (lastPolygon != null) {
                    lastPolygon.setEditingEnabled(false);
                }
                if (lastPolyline != null) {
                    lastPolyline.setEditingEnabled(false);
                }
            }
        });
        buttonPanel.add(addButton);

        editPolylineButton.setEnabled(false);
        editPolylineButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                editPolyline();
            }
        });
        buttonPanel.add(editPolylineButton);

        editPolygonButton.setEnabled(false);
        editPolygonButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                editPolygon();
            }
        });
        buttonPanel.add(editPolygonButton);

        p.add(buttonPanel, DockPanel.EAST);

        return p;
    }

    private DialogBox makeAddPolyDialog() {

        DialogBox dialog = new DialogBox();
        dialog.setTitle("Add Polyline");

        Grid grid = new Grid(2, 4);

        VerticalPanel vp = new VerticalPanel();
        grid.setHTML(0, 0, "<b>Opacity</b>");
        // The drop down lists for setting the style
        final ListBox opacityBox = new ListBox();
        for (int i = 100; i > 0; i -= 10) {
            opacityBox.addItem(i + "%");
        }
        opacityBox.addChangeListener(new ChangeListener() {
            public void onChange(Widget sender) {
                String val = opacityBox.getItemText(opacityBox.getSelectedIndex());
                opacity = Double.parseDouble(val.replace("%", "")) / 100.0;
            }
        });
        grid.setWidget(1, 0, opacityBox);

        grid.setHTML(0, 1, "<b>Weight</b>");
        final ListBox weightBox = new ListBox();
        weightBox.addItem("1 pixel");
        weightBox.addItem("2 pixels");
        weightBox.addItem("3 pixels");
        weightBox.addItem("5 pixels");
        weightBox.addItem("10 pixels");
        weightBox.addChangeListener(new ChangeListener() {
            public void onChange(Widget sender) {
                String val = weightBox.getItemText(weightBox.getSelectedIndex());
                val = val.replace(" pixel", "");
                val = val.replace("s", "");
                weight = Integer.parseInt(val);
            }
        });
        grid.setWidget(1, 1, weightBox);

        grid.setHTML(0, 2, "<b>Color</b>");
        final ListBox colorBox = new ListBox();
        colorBox.addItem("#FF0000 red");
        colorBox.addItem("#FFFF00 yellow");
        colorBox.addItem("#00FF00 green");
        colorBox.addItem("#00FFFF cyan");
        colorBox.addItem("#0000FF blue");
        colorBox.addItem("#FF00FF violet");
        colorBox.addChangeListener(new ChangeListener() {
            public void onChange(Widget sender) {
                color = colorBox.getItemText(colorBox.getSelectedIndex()).substring(0, 7);
            }
        });
        grid.setWidget(1, 2, colorBox);

        grid.setHTML(0, 3, "<b>Fill Polygon</b>");
        final CheckBox fillCheckBox = new CheckBox("");
        fillCheckBox.addClickListener(new ClickListener() {

            public void onClick(Widget sender) {
                fillFlag = fillCheckBox.isChecked();
            }

        });
        grid.setWidget(1, 3, fillCheckBox);

        Button addPolylineButton = new Button("Make Polyline");
        addPolylineButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                message1.setText("opacity=" + opacity + " color=" + color + " weight=" + weight + " polygon="
                        + makePolygon + " center=" + map.getCenter() + " zoom=" + map.getZoomLevel());
                addPolyDialog.hide();
                createPolyline();
                editPolylineButton.setEnabled(true);
            }
        });

        Button addPolygonButton = new Button("Make Polygon");
        addPolygonButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                message1.setText(
                        "Opacity=" + opacity + " color=" + color + "weight=" + weight + "polygon = " + makePolygon
                                + "Center=" + map.getCenter() + " zoom=" + map.getZoomLevel() + "fill=" + fillFlag);
                addPolyDialog.hide();
                createPolygon();
                editPolygonButton.setEnabled(true);
            }
        });

        Button cancelButton = new Button("Cancel");
        cancelButton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                addPolyDialog.hide();
            }
        });

        HorizontalPanel buttonPanel = new HorizontalPanel();
        buttonPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
        buttonPanel.add(addPolylineButton);
        buttonPanel.add(addPolygonButton);
        buttonPanel.add(cancelButton);
        vp.add(grid);
        vp.add(buttonPanel);
        dialog.add(vp);

        return dialog;
    }
}