com.moesol.gwt.maps.client.Driver.java Source code

Java tutorial

Introduction

Here is the source code for com.moesol.gwt.maps.client.Driver.java

Source

/*
 * $Id$
 *
 * (c) Copyright, Moebius Solutions, Inc., 2006
 *
 *                       All Rights Reserved
 *
 * This material may be reproduced by or for the U. S. Government
 * pursuant to the copyright license under the clause at
 * DFARS 252.227-7014 (OCT 2001).
 */
package com.moesol.gwt.maps.client;

import java.util.Iterator;
import java.util.List;

import com.google.gwt.activity.shared.ActivityManager;
import com.google.gwt.activity.shared.ActivityMapper;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.i18n.client.Dictionary;
import com.google.gwt.place.shared.Place;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.place.shared.PlaceHistoryHandler;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Widget;
import com.moesol.gwt.maps.client.controls.EdgeHoverPanControl;
import com.moesol.gwt.maps.client.controls.FlyToController;
import com.moesol.gwt.maps.client.controls.MapPanZoomControl;
import com.moesol.gwt.maps.client.controls.SearchControl;
import com.moesol.gwt.maps.client.controls.MapDimmerControl;
import com.moesol.gwt.maps.client.controls.PositionControl;
import com.moesol.gwt.maps.client.controls.SearchEvent;
import com.moesol.gwt.maps.client.controls.SearchHandler;
import com.moesol.gwt.maps.client.gin.MapsGinjector;
import com.moesol.gwt.maps.client.place.MapsActivityMapper;
import com.moesol.gwt.maps.client.place.MapsPlaceHistoryMapper;
import com.moesol.gwt.maps.client.tms.TileMapServicePlace;
import com.moesol.gwt.maps.client.tms.TileMapServiceView;
import com.moesol.gwt.maps.client.units.AngleUnit;

public class Driver implements EntryPoint {

    private static final int MAP_EDGE_HOVER_MAX_PAN_PER_INTERVAL_PIXELS = 10;
    private static final int MAP_EDGE_HOVER_PAN_INTERVAL = 100;
    private static final int MAP_EDGE_HOVER_RADIUS_PIXELS = 50;
    private static final int MAP_HOVER_DELAY_MILLIS = 300;
    private static final int TILE_DY = 3;
    private static final int TILE_DX = 4;
    private static Dictionary OPTIONS = Dictionary.getDictionary("Driver_options");
    private int m_scrnDpi = 75;
    private MapView m_map;
    //private PositionControl m_mousePosLabel;
    private final Label m_centerLabel = new Label();
    private final Grid m_tiles = new Grid(TILE_DY, TILE_DX);
    private SuggestBox m_levelBox;

    private Place defaultPlace = new TileMapServicePlace(new String[] { "BMNG@EPSG:4326@png" }, 0, 0, 0);

    private MapsGinjector injector = GWT.create(MapsGinjector.class);
    EventBus eventBus;

    public Driver() {
        super();
    }

    /** Hook out to layerSet json data */
    private final native JsArray<LayerSetJson> getLayerSets() /*-{
                                                              return $wnd.layerSets;
                                                              }-*/;

    @Override
    public void onModuleLoad() {
        PlaceHistoryHandler historyHandler = null;
        if (isTrue("showLayerPanel", false)) {
            eventBus = injector.getEventBus();
            PlaceController placeController = injector.getPlaceController();

            ActivityMapper activityMapper = new MapsActivityMapper(injector);
            ActivityManager activityManager = new ActivityManager(activityMapper, eventBus);
            activityManager.setDisplay(new SimplePanel());

            // Start PlaceHistoryHandler with our PlaceHistoryMapper
            MapsPlaceHistoryMapper historyMapper = GWT.create(MapsPlaceHistoryMapper.class);
            historyHandler = new PlaceHistoryHandler(historyMapper);
            historyHandler.register(placeController, eventBus, defaultPlace);
        }
        RootPanel mapPanel = RootPanel.get("mapPanel");
        if (mapPanel == null) {
            throw new IllegalStateException("No element with id 'mapPanel'");
        }
        doMapPanel(mapPanel);
        if (isTrue("showLayerPanel", false)) {
            historyHandler.handleCurrentHistory();
        }
        return;
    }

    private boolean isTrue(String key, boolean def) {
        if (!OPTIONS.keySet().contains(key)) {
            return def;
        }
        String value = OPTIONS.get(key);
        return Boolean.valueOf(value);
    }

    private void doMapPanel(RootPanel mapPanel) {
        mapPanel.setHeight("100%");
        mapPanel.setWidth("100%");

        DOM.setInnerHTML(mapPanel.getElement(), "");

        final DockLayoutPanel dockPanel = new DockLayoutPanel(Unit.PX);
        dockPanel.setHeight("420px");
        dockPanel.setWidth("600px");
        mapPanel.add(dockPanel);

        // loadLayerConfigsFromServer();
        loadLayerConfigsFromClient();

        //VerticalPanel vp = new VerticalPanel();
        MapPanel mapFillPanel = new MapPanel(m_map);
        m_map.setDpi(m_scrnDpi);
        m_map.getController().withHoverDelayMillis(MAP_HOVER_DELAY_MILLIS);

        //new EdgeHoverPanControl(m_map, MAP_EDGE_HOVER_RADIUS_PIXELS,
        //      MAP_EDGE_HOVER_PAN_INTERVAL,
        //      MAP_EDGE_HOVER_MAX_PAN_PER_INTERVAL_PIXELS);
        //      m_map.getController().addHoverHandler(new HoverHandler() {
        //         BubbleControl bc = new BubbleControl(m_map);
        //         
        //         @Override
        //         public void onHover(HoverEvent e) {
        //            ViewCoords m_vc = new ViewCoords(e.getX(), e.getY());
        //            GeodeticCoords gc = m_map.getProjection().viewToGeodetic(m_vc);
        //            bc.getHtml().setHTML("Hover: " + gc.toString());
        //            bc.animateShow(e.getClientX(), e.getClientY());
        //         }
        //      });

        if (isTrue("showSomeIcons", false)) {
            addSomeIcons();
        }

        m_map.updateView();

        //      Button left = new Button("Left", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goLeft();
        //         }
        //      });
        //      Button right = new Button("Right", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goRight();
        //         }});
        //      Button up = new Button("Up", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goUp();
        //         }});
        //      Button down = new Button("Down", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goDown();
        //         }});
        //      
        //      Button in = new Button("In", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goIn();
        //         }});
        //      Button out = new Button("Out", new ClickHandler() {
        //         @Override
        //         public void onClick(ClickEvent event) {
        //            goOut();
        //         }});
        Button removeIcons = new Button("Remove Icons", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                removeIcons();
            }
        });
        Button moveIcons = new Button("Move Icons", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                moveIcons();
            }
        });
        Button resizeMap = new Button("Fill Viewport", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                dockPanel.setHeight("100%");
                dockPanel.setWidth("100%");
            }
        });
        MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
        oracle.add("0");
        oracle.add("01");
        oracle.add("1");
        oracle.add("3");
        m_levelBox = new SuggestBox();

        m_map.addChangeListener(new ChangeListener() {
            @Override
            public void onChange(Widget sender) {
                mapChanged();
            }
        });

        HorizontalPanel bar = new HorizontalPanel();
        //      bar.add(left);
        //      bar.add(right);
        //      bar.add(up);
        //      bar.add(down);
        //      bar.add(in);
        //      bar.add(out);
        bar.add(removeIcons);
        bar.add(moveIcons);
        bar.add(resizeMap);
        //      bar.add(m_centerLabel);
        dockPanel.addNorth(bar, 20);

        //bar.add(m_levelBox);
        //      if (false) {
        //         // Show debug grid
        //         bar.add(m_tiles);
        //      }
        //vp.add(bar);

        LayoutPanel hp = new LayoutPanel();
        dockPanel.add(hp);
        //hp.setHeight("500px");
        //hp.setWidth("500px");
        //vp.add(hp);

        if (isTrue("showLayerPanel", false)) {
            addTileMapServiceView(hp);
            //         eventBus.addHandler(TileMapAddEvent.TYPE, new TileMapAddEvent.Handler() {
            //            @Override
            //            public void onTileMapAdd(TileMapAddEvent event) {
            //               LayerSet layerSet = new LayerSet();
            //               TileMapMetadata tileMapMetadata = event.getTileMapMetadata();
            //               layerSet.setServer(tileMapMetadata.getUrl());
            //               layerSet.setData("");
            //               layerSet.setUrlPattern("{server}/{level}/{x}/{y}." + tileMapMetadata.getTileImageFormat());
            //               m_map.addLayer(layerSet);
            //            }
            //         });
        }

        // The map viewport
        hp.add(mapFillPanel);
        //hp.setWidgetLeftWidth(mapFillPanel,0, Style.Unit.PCT, 100, Style.Unit.PCT);
        // The map controls
        MapPanZoomControl mapControls = new MapPanZoomControl(m_map, 15, 100);
        mapControls.getElement().getStyle().setZIndex(100000);
        hp.add(mapControls);
        hp.setWidgetLeftWidth(mapControls, 0, Style.Unit.PX, 56, Style.Unit.PX);
        hp.setWidgetTopHeight(mapControls, 0, Style.Unit.PX, 121, Style.Unit.PX);
        //The mouse position label;
        PositionControl mousePosLabel = new PositionControl(m_map);
        hp.add(mousePosLabel);
        hp.setWidgetRightWidth(mousePosLabel, 10, Style.Unit.PX, 500, Style.Unit.PX);
        hp.setWidgetTopHeight(mousePosLabel, 10, Style.Unit.PX, 20, Style.Unit.PX);

        // Map dimmer control
        MapDimmerControl dimmer = new MapDimmerControl(m_map, true);
        hp.add(dimmer);
        hp.setWidgetRightWidth(dimmer, 10, Style.Unit.PX, 35, Style.Unit.PX);
        hp.setWidgetBottomHeight(dimmer, 10, Style.Unit.PX, 22, Style.Unit.PX);

        SearchControl flyToControl = new SearchControl();
        hp.add(flyToControl);
        hp.setWidgetRightWidth(flyToControl, 0, Style.Unit.PX, 160, Style.Unit.PX);
        hp.setWidgetTopHeight(flyToControl, 0, Style.Unit.PX, 50, Style.Unit.PX);

        flyToControl.addSearchHandler(new FlyToController(m_map));

        // Layer a transparent dialog...
        if (isTrue("showTestDialog", false)) {
            DialogBox db = new DialogBox();
            db.setHTML("<a href='' onclick='false'>x</a>");
            db.setPopupPosition(100, 10);
            db.setPixelSize(100, 100);
            db.show();
        }
    }

    private void addTileMapServiceView(Panel panel) {
        TileMapServiceView tileMapServiceView = injector.getTileMapServiceView();
        panel.add(tileMapServiceView);
    }

    private void loadLayerConfigsFromClient() {
        // this assumes we are starting with cell sizes of 
        // 180x180 and pixels sizes of 512 x 512
        m_map = new MapView();
        // Try to pull from json in .html
        JsArray<LayerSetJson> layerSets = getLayerSets();
        if (layerSets != null) {
            for (int i = 0, n = layerSets.length(); i < n; ++i) {
                LayerSetJson l = layerSets.get(i);
                LayerSet ls = l.toLayerSet();
                m_map.addLayer(ls);
            }
        }

        // TODO need a library of layer configs. I see that BV uses the same
        // code over and over again
        // to setup the layers and if change them we'd have to change it
        // everywhere.

        if (isTrue("useTmsBMNG", false)) {
            LayerSet layerSet = new LayerSet();
            layerSet.setServer(OPTIONS.get("tmsURL"));
            layerSet.setUrlPattern("{server}/BMNG@EPSG:4326@png/{level}/{x}/{y}.png");
            layerSet.setData("");
            layerSet.setPixelHeight(256);
            layerSet.setPixelWidth(256);
            m_map.addLayer(layerSet);
        }

        /*
              if (isTrue("useWmscBMNG", false)) {
                 LayerSet layerSet = new LayerSet();
                 layerSet.setSchema("wmsc");
                 layerSet.setStyles("Jan");
                 layerSet.setSrs("EPSG:4326");
                 layerSet.setData("BMNG");
                 layerSet.setFormat("image/jpeg");
                 layerSet.setServer("http://wms.jpl.nasa.gov/wms.cgi"); 
                 String cs = "{server}?request=GetMap&layers={data}&srs={srs}&format={format}&styles={styles}&width={dx}&height={dy}&bbox={bbox}";
                 layerSet.setUrlPattern(cs);
                 layerSet.setPixelHeight(480);
                 layerSet.setPixelWidth(480);
                 layerSet.setStartLevel(1);
                  layerSet.setStartLevelTileWidthInDeg(128.0);
                  layerSet.setStartLevelTileHeightInDeg(128.0);
                  projection.setBaseScaleForDegWidth(128.0, 480);
                 m_map.addLayer(layerSet);
              }
        */
    }

    private void loadLayerConfigsFromServer() {
        ILayerConfigAsync service = (ILayerConfigAsync) GWT.create(ILayerConfig.class);
        ServiceDefTarget endpoint = (ServiceDefTarget) service;
        String moduleRelativeURL = GWT.getModuleBaseURL() + "wwLayerConfigs";
        endpoint.setServiceEntryPoint(moduleRelativeURL);
        m_map.addLayersFromLayerConfig(service);
    }

    private void addSomeIcons() {
        Icon icon = new Icon();
        icon.setIconUrl("http://www.moesol.com/icons/moesol_logo_small.jpg");
        icon.setLocation(new GeodeticCoords(0, 0, AngleUnit.DEGREES));
        icon.getImage().setPixelSize(212 / 2, 86 / 2);
        m_map.getIconLayer().addIcon(icon);

        // int num = 1024, workable, sluggish
        // int num = 512, better
        // int num = 256, good
        // int num = 128, rocking
        int num = 128;
        double maxx = 360.0;
        double maxy = 30.0;
        double incx = maxx / num;
        double incy = maxy / num;
        double lat = 0.0;
        double lng = -180.0;
        for (int i = 0; i < num; i++) {
            addOneIcon(lat, lng);
            lat += incy;
            lng += incx;
        }
    }

    private void addOneIcon(double lat, double lng) {
        Icon icon;
        icon = new Icon();
        icon.setIconUrl("http://www.moesol.com/products/mx/js/mil_picker/mil_picker_images/sfapmfq--------.jpeg");
        icon.setLocation(new GeodeticCoords(lng, lat, AngleUnit.DEGREES));
        icon.getImage().setPixelSize(16, 16);
        m_map.getIconLayer().addIcon(icon);
    }

    protected void mapChanged() {
        m_centerLabel.setText(m_map.getCenter() + "," + m_map.getViewport().getLevel());
    }

    protected void resizeMap() {
        int h = Window.getClientHeight();
        int w = Window.getClientWidth();
        m_map.resizeMap(w - 50, h - 50);

        updateTileInfo();
    }

    protected void removeIcons() {
        List<Icon> icons = m_map.getIconLayer().getIcons();
        while (icons.size() != 0) {
            Icon icon = icons.get(0);
            m_map.getIconLayer().removeIcon(icon);
        }
    }

    protected void moveIcons() {
        List<Icon> icons = m_map.getIconLayer().getIcons();
        Iterator<Icon> it = icons.iterator();
        while (it.hasNext()) {
            Icon icon = it.next();
            GeodeticCoords location = icon.getLocation();
            location.setLambda(location.getLambda(AngleUnit.DEGREES) + 1.0, AngleUnit.DEGREES);
        }
        m_map.updateView();
    }

    protected void goRight() {
        m_map.moveMapByPixels(10, 0);
        updateTileInfo();
    }

    protected void goLeft() {
        m_map.moveMapByPixels(-10, 0);
        updateTileInfo();
    }

    protected void goUp() {
        m_map.moveMapByPixels(0, -10);
        updateTileInfo();
    }

    protected void goDown() {
        m_map.moveMapByPixels(0, 10);
        updateTileInfo();
    }

    protected void goIn() {
        m_map.animateZoom(2);
    }

    protected void goOut() {
        m_map.animateZoom(1.0 / 2.0);
    }

    //protected void flyTo() {
    //   m_map.flyTo(0,0,0);
    //}

    private void updateTileInfo() {
        m_centerLabel.setText(m_map.toString());
        for (int y = 0; y < TILE_DY; y++) {
            for (int x = 0; x < TILE_DX; x++) {
                m_tiles.setText(y, x, getTile(y, x));
                m_tiles.getCellFormatter().setWordWrap(y, x, false);
            }
        }
    }

    private String getTile(int y, int x) {
        // return "" + m_map.getTileCoords()[y * TILE_DX + x];
        return "TODO";
    }

}