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

Java tutorial

Introduction

Here is the source code for com.google.gwt.maps.sample.hellomaps.client.CustomControlDemo.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.core.client.GWT;
import com.google.gwt.maps.client.MapType;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.control.Control;
import com.google.gwt.maps.client.control.ControlAnchor;
import com.google.gwt.maps.client.control.ControlPosition;
import com.google.gwt.maps.client.control.HierarchicalMapTypeControl;
import com.google.gwt.maps.client.control.Control.CustomControl;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ImageBundle;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Version 2 of the Maps API introduces the ability to create custom map
 * controls, like the built-in pan and zoom controls, by subclassing the
 * built-in GControl class. In this example, we create a simple zoom control
 * that has textual links rather than the graphical icons used in the standard
 * Google Maps zoom control.
 * 
 * The GTextualZoomControl class defines the two required methods of the
 * GControl interface: initialize(), in which we create the DOM elements
 * representing our control; and getDefaultPosition(), in which we return the
 * GControlPosition used if another position is not given when this control is
 * added to a map. See the class reference for GControl for more information
 * about the methods you can override when you create your custom controls.
 * 
 * All map controls should be added to the map container which can be accessed
 * with the getContainer() method on Map
 */
public class CustomControlDemo extends MapsDemo {

    /**
     * Images used in the custom map control for zooming.
     */
    public interface ControlImageBundle extends ImageBundle {
        AbstractImagePrototype minus();

        @Resource("mozicon_earth.png")
        AbstractImagePrototype moziconEarth();

        AbstractImagePrototype plus();

        AbstractImagePrototype traffic();
    }

    private enum ControlDemos {
        TEST_HIERARCHICAL_CONTROL("Hierarchical Control"), // 
        TEST_IMAGE_CUSTOM_ZOOM_CONTROL("Use a custom Image Zoom Control"), // 
        TEST_TEXT_CUSTOM_ZOOM_CONTROL("Use a custom Text Zoom Control");

        final String value;

        ControlDemos(String s) {
            value = s;
        }

        String valueOf() {
            return value;
        }
    }

    private static class ImageZoomControl extends CustomControl {
        public ImageZoomControl() {
            super(new ControlPosition(ControlAnchor.TOP_LEFT, 7, 7));
        }

        @Override
        protected Widget initialize(final MapWidget map) {
            ControlImageBundle imgBundle = GWT.create(ControlImageBundle.class);
            Image trafficImage = imgBundle.traffic().createImage();
            Image satelliteImage = imgBundle.moziconEarth().createImage();
            Image zoomInImage = imgBundle.plus().createImage();
            Image zoomOutImage = imgBundle.minus().createImage();

            trafficImage.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.setCurrentMapType(MapType.getNormalMap());
                }
            });
            satelliteImage.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.setCurrentMapType(MapType.getSatelliteMap());
                }
            });
            zoomInImage.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.zoomIn();
                }
            });
            zoomOutImage.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.zoomOut();
                }
            });

            Grid container = new Grid(2, 2);
            container.setWidget(0, 0, zoomInImage);
            container.setWidget(1, 0, zoomOutImage);
            container.setWidget(0, 1, trafficImage);
            container.setWidget(1, 1, satelliteImage);

            return container;
        }

        @Override
        public boolean isSelectable() {
            return false;
        }
    }

    private static class TextualZoomControl extends CustomControl {
        public TextualZoomControl() {
            super(new ControlPosition(ControlAnchor.TOP_LEFT, 7, 7));
        }

        @Override
        public boolean isSelectable() {
            return false;
        }

        @Override
        protected Widget initialize(final MapWidget map) {
            Panel container = new FlowPanel();
            Button zoomInButton = new Button("Zoom In");
            zoomInButton.setStyleName("textualZoomControl");
            zoomInButton.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.zoomIn();
                }
            });
            Button zoomOutButton = new Button("Zoom Out");
            zoomOutButton.setStyleName("textualZoomControl");
            zoomOutButton.addClickListener(new ClickListener() {
                public void onClick(Widget sender) {
                    map.zoomOut();
                }
            });

            container.add(zoomInButton);
            container.add(zoomOutButton);
            return container;
        }
    }

    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>" + "<ul>\n"
            + "<li><b>Hierarchical Control</b> A control provided by the API that allows the "
            + "user to change the map type using a drop down menu of checkboxes." + "</li>\n"
            + "<li><b>Image Zoom Control</b> The standard controls have been replaced with clickable "
            + "images for zooming in and our or changing the map type from satellite to road map." + "</li>"
            + "<li><b>Text Zoom Control</b> The standard zoom in and zoom out controls have been replaced with a "
            + "custom control in the form of two boxes with the text <i>Zoom In</i> and <i>Zoom Out</i> "
            + "at the upper left of the map.</li>\n" + "</ul>\n" + "<p>See also the Maps JavaScript API Example: "
            + "<a href=\"http://code.google.com/apis/maps/documentation/examples/control-custom.html\">"
            + "http://code.google.com/apis/maps/documentation/examples/control-custom.html</a></p>\n";

    private static HierarchicalMapTypeControl hControl;

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

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

            @Override
            public String getName() {
                return "Custom Map Controls";
            }
        };
    }

    /**
     * Provide access to the HierarchicalMapTypeControl singleton.
     * 
     * @return an instance of the control is created if necessary. 
     */
    private static HierarchicalMapTypeControl getHierarchicalMapTypeControl() {
        if (hControl != null) {
            return hControl;
        }
        hControl = new HierarchicalMapTypeControl();
        hControl.addRelationship(MapType.getNormalMap(), MapType.getMarsVisibleMap(), "Mars visible");
        hControl.addRelationship(MapType.getNormalMap(), MapType.getMarsInfraredMap(), "Mars infrared");
        hControl.addRelationship(MapType.getNormalMap(), MapType.getMarsElevationMap(), "Mars elevation", true);
        return hControl;
    }

    private final ListBox actionListBox;

    private Control currentControl = null;

    private final MapWidget map;

    public CustomControlDemo() {

        VerticalPanel vertPanel = new VerticalPanel();
        vertPanel.setStyleName("hm-panel");

        actionListBox = new ListBox();
        for (ControlDemos cd : ControlDemos.values()) {
            actionListBox.addItem(cd.valueOf());
        }

        actionListBox.addChangeListener(new ChangeListener() {
            public void onChange(Widget sender) {
                displayCustomControl();
            }
        });

        HorizontalPanel horizPanel = new HorizontalPanel();
        horizPanel.add(new Label("Choose Action:"));
        horizPanel.add(actionListBox);
        horizPanel.setSpacing(10);
        vertPanel.add(horizPanel);

        map = new MapWidget(LatLng.newInstance(37.441944, -122.141944), 13);
        map.setSize("500px", "300px");
        map.addMapType(MapType.getNormalMap());
        map.addMapType(MapType.getSatelliteMap());
        map.addMapType(MapType.getMarsVisibleMap());
        map.addMapType(MapType.getMarsElevationMap());
        map.addMapType(MapType.getMarsInfraredMap());
        vertPanel.add(map);

        new Timer() {
            public void run() {
                displayCustomControl();
            }
        }.schedule(250);

        initWidget(vertPanel);
    }

    /**
     * Display the appropriate custom control depending on what the user has
     * selected in the action box.
     */
    private void displayCustomControl() {

        if (currentControl != null) {
            map.removeControl(currentControl);
            currentControl = null;
        }

        ControlDemos selected = ControlDemos.values()[actionListBox.getSelectedIndex()];

        switch (selected) {
        case TEST_IMAGE_CUSTOM_ZOOM_CONTROL:
            currentControl = new ImageZoomControl();
            break;
        case TEST_TEXT_CUSTOM_ZOOM_CONTROL:
            currentControl = new TextualZoomControl();
            break;
        case TEST_HIERARCHICAL_CONTROL:
            currentControl = getHierarchicalMapTypeControl();
            break;
        default:
            Window.alert("Unknown selection: " + selected.valueOf());
            return;
        }

        map.addControl(currentControl);
    }
}