com.mashery.examples.api.client.WeatherBugExample.java Source code

Java tutorial

Introduction

Here is the source code for com.mashery.examples.api.client.WeatherBugExample.java

Source

/*
 * Copyright (c) 2010, 2011 Mashery, Inc. All Rights Reserved.
 * 
 * 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.mashery.examples.api.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.maps.client.base.HasLatLng;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
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.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.mashery.examples.api.client.weatherbug.Forecast;
import com.mashery.examples.api.client.weatherbug.ForecastService;
import com.mashery.examples.api.client.weatherbug.ForecastServiceAsync;
import com.mashery.examples.api.client.weatherbug.Forecasts;
import com.mashery.examples.api.client.weatherbug.LayerType;
import com.mashery.examples.api.client.weatherbug.Location;
import com.mashery.examples.api.client.weatherbug.Weather;
import com.mashery.examples.api.client.weatherbug.WeatherBugOverlayView;

public class WeatherBugExample extends Composite {

    private final PopupMapWidget mapWidget;

    private final FlexTable table;

    public WeatherBugExample(final PopupMapWidget mapWidget) {
        this.mapWidget = mapWidget;

        FlowPanel panel = new FlowPanel();

        panel.add(new HTML("<h1>Weather Forecast</h1>"));

        Grid controlPanel = new Grid(1, 3);
        panel.add(controlPanel);

        Button refreshButton = new Button("Get Weather Forecast", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                fetchWeather();
            }
        });

        controlPanel.setWidget(0, 0, refreshButton);
        mapWidget.addAutoHidePartner(refreshButton.getElement());

        controlPanel.setHTML(0, 1, "&nbsp;&nbsp;&nbsp;Map Overlay:");

        final ListBox overlayBox = new ListBox();
        controlPanel.setWidget(0, 2, overlayBox);
        overlayBox.addItem("(none)", "");
        for (LayerType layerType : LayerType.values())
            overlayBox.addItem(layerType.getDescription(), layerType.toString());

        final WeatherBugOverlayView overlay = new WeatherBugOverlayView();

        overlayBox.addChangeHandler(new ChangeHandler() {

            private boolean initialized;

            private boolean visible = true;

            @Override
            public void onChange(ChangeEvent event) {
                int index = overlayBox.getSelectedIndex();
                LayerType layerType = index == 0 ? null : LayerType.valueOf(overlayBox.getValue(index));
                if (layerType == null) {
                    if (initialized && visible) {
                        overlay.hide();
                        visible = false;
                    }
                } else {
                    overlay.setLayerType(layerType);
                    if (initialized) {
                        if (!visible) {
                            overlay.show();
                            visible = true;
                        }
                    } else {
                        overlay.setMap(mapWidget.getMap());
                        initialized = true;
                    }

                    mapWidget.show();
                }
            }
        });

        mapWidget.addAutoHidePartner(overlayBox.getElement());

        panel.add(new HTML());

        table = new FlexTable();
        panel.add(table);
        table.setCellSpacing(20);
        ((FlexTable.FlexCellFormatter) table.getCellFormatter()).setColSpan(0, 0, 5);

        initWidget(new ScrollPanel(panel));
    }

    private void fetchWeather() {
        table.setText(0, 0, "Loading...");
        ForecastServiceAsync svc = GWT.create(ForecastService.class);
        mapWidget.show();
        HasLatLng latLng = mapWidget.getMap().getCenter();
        svc.getForecast(latLng.getLatitude(), latLng.getLongitude(), new AsyncCallback<Weather>() {

            @Override
            public void onSuccess(Weather weather) {
                table.setText(0, 0, "");
                mapWidget.hide();

                Forecasts forecastWrapper = weather.getForecasts();
                if (forecastWrapper == null)
                    return;

                Location location = forecastWrapper.getLocation();
                if (location != null) {
                    StringBuilder buf = new StringBuilder("<strong>");
                    if (location.getCity() != null)
                        buf.append(location.getCity());

                    if (location.getState() != null) {
                        if (buf.length() > 0)
                            buf.append(", ");

                        buf.append(location.getState());
                    }

                    if (location.getZip() != null) {
                        if (buf.length() > 0)
                            buf.append(' ');

                        buf.append(location.getZip());
                    }

                    if (location.getCountry() != null) {
                        if (buf.length() > 0)
                            buf.append(", ");

                        buf.append(location.getCountry());
                    }

                    table.setHTML(0, 0, buf.append("</strong>").toString());
                }

                Forecast[] forecasts = forecastWrapper.getForecasts();
                if (forecasts != null) {
                    for (int i = 0; i < forecasts.length; ++i) {
                        table.setText(i + 1, 0, forecasts[i].getDescription());
                        table.setWidget(i + 1, 1, new Image(forecasts[i].getImage()));
                        table.setHTML(i + 1, 2, forecasts[i].getPrediction());
                        table.setHTML(i + 1, 3, forecasts[i].getHigh() + "&deg;F");
                        table.setHTML(i + 1, 4, forecasts[i].getLow() + "&deg;F");
                    }
                }
            }

            @Override
            public void onFailure(Throwable caught) {
                table.setText(0, 0, "");
                mapWidget.hide();
                Window.alert(caught.getLocalizedMessage());
            }
        });
    }
}