com.mecatran.otp.gwt.client.view.PlannerFormWidget.java Source code

Java tutorial

Introduction

Here is the source code for com.mecatran.otp.gwt.client.view.PlannerFormWidget.java

Source

/* -------------------------------------------------------------------------
OpenTripPlanner GWT Client
Copyright (C) 2015 Mecatran - info@mecatran.com
    
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
    
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
    
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   ------------------------------------------------------------------------- */
package com.mecatran.otp.gwt.client.view;

import java.util.Date;
import java.util.Set;

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.mecatran.otp.gwt.client.controller.PlannerState;
import com.mecatran.otp.gwt.client.i18n.I18nUtils;
import com.mecatran.otp.gwt.client.model.LocationBean;
import com.mecatran.otp.gwt.client.model.ModeCapabilitiesBean;
import com.mecatran.otp.gwt.client.model.PlanRequestBean;
import com.mecatran.otp.gwt.client.model.TransportMode;
import com.mecatran.otp.gwt.client.proxies.GeocoderProxy;
import com.mecatran.otp.gwt.client.view.AddressBox.AddressSuggestBoxListener;
import com.mecatran.otp.gwt.client.view.ModeSelectorWidget.ModeSelectorListener;
import com.mecatran.otp.gwt.client.view.PlannerWidget.PlannerWidgetListener;

public class PlannerFormWidget extends Composite implements ModeSelectorListener {

    private AddressBox departureSuggestBox;
    private AddressBox arrivalSuggestBox;
    private Button planButton;
    private Anchor linkAnchor;
    private Widget pleaseWaitPanel;
    private PlannerWidget plannerWidget;
    private ModeSelectorWidget modeSelector;

    private PlannerWidgetListener plannerWidgetListener;

    public PlannerFormWidget() {
        VerticalPanel rootPanel = new VerticalPanel();
        // Departure
        departureSuggestBox = new AddressProposalBox();
        departureSuggestBox.getAsWidget().addStyleName("departure-panel");
        departureSuggestBox.getAsWidget().addStyleName("departure-icon");
        departureSuggestBox.setAddressSuggestBoxListener(new AddressSuggestBoxListener() {
            @Override
            public void onLocationSelected(LocationBean location) {
                plannerWidgetListener.onStartLocationSelected(location);
            }

            @Override
            public void onLocationHover(LocationBean location) {
                plannerWidgetListener.onLocationHover(location);
            }

            @Override
            public void onFocus() {
                plannerWidget.focusDeparture();
            }
        });
        rootPanel.add(departureSuggestBox.getAsWidget());
        // Arrival
        arrivalSuggestBox = new AddressProposalBox();
        arrivalSuggestBox.getAsWidget().addStyleName("arrival-panel");
        arrivalSuggestBox.getAsWidget().addStyleName("arrival-icon");
        arrivalSuggestBox.setAddressSuggestBoxListener(new AddressSuggestBoxListener() {
            @Override
            public void onLocationSelected(LocationBean location) {
                plannerWidgetListener.onEndLocationSelected(location);
            }

            @Override
            public void onLocationHover(LocationBean location) {
                plannerWidgetListener.onLocationHover(location);
            }

            @Override
            public void onFocus() {
                plannerWidget.focusArrival();
            }
        });
        rootPanel.add(arrivalSuggestBox.getAsWidget());
        // Mode selector
        DropDownModeSelectorWidget modeSelectorWidget = new DropDownModeSelectorWidget();
        modeSelectorWidget.setModeSelectorListener(this);
        modeSelector = modeSelectorWidget;
        rootPanel.add(modeSelectorWidget);
        // Plan button
        HorizontalPanel planButtonPanel = new HorizontalPanel();
        planButtonPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
        planButton = new Button(I18nUtils.tr("plan.itinerary"));
        planButtonPanel.add(planButton);
        planButton.addStyleName("plan-button");
        planButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                plannerWidgetListener.onPlanningRequested();
            }
        });
        pleaseWaitPanel = new Label(I18nUtils.tr("please.wait"));
        planButtonPanel.add(pleaseWaitPanel);
        pleaseWaitPanel.setVisible(false);
        pleaseWaitPanel.addStyleName("please-wait-panel");
        pleaseWaitPanel.addStyleName("loading-icon");
        // Link anchor
        linkAnchor = new Anchor(I18nUtils.tr("link.to.this.page"));
        linkAnchor.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                linkTo();
            }
        });
        linkAnchor.addStyleName("link-anchor");
        planButtonPanel.add(linkAnchor);
        rootPanel.add(planButtonPanel);

        rootPanel.setWidth("100%");
        rootPanel.addStyleName("planner-form-panel");
        initWidget(rootPanel);
        setWidth("100%");
    }

    public void setModeCapabilities(ModeCapabilitiesBean modeCapabilities) {
        modeSelector.setModeCapabilities(modeCapabilities);
    }

    public void setPlannerWidgetListener(PlannerWidgetListener plannerWidgetListener) {
        this.plannerWidgetListener = plannerWidgetListener;
    }

    public void setPlannerWidget(PlannerWidget plannerWidget) {
        this.plannerWidget = plannerWidget;
    }

    public void setGeocoderProxy(GeocoderProxy geocoderProxy) {
        departureSuggestBox.setGeocoderProxy(geocoderProxy);
        arrivalSuggestBox.setGeocoderProxy(geocoderProxy);
    }

    public void setBusy(boolean busy) {
        pleaseWaitPanel.setVisible(busy);
        planButton.setVisible(!busy);
    }

    public void setStartLocation(LocationBean location) {
        departureSuggestBox.setLocation(location);
    }

    public void setEndLocation(LocationBean location) {
        arrivalSuggestBox.setLocation(location);
    }

    public void setDateDeparture(boolean dateDeparture) {
        modeSelector.setDateDeparture(dateDeparture);
    }

    public void setDateTime(Date dateTime) {
        modeSelector.setDateTime(dateTime);
    }

    public void setModes(Set<TransportMode> modes) {
        modeSelector.setModes(modes);
    }

    public void setWheelchairAccessible(boolean wheelchairAccessible) {
        modeSelector.setWheelchairAccessible(wheelchairAccessible);
    }

    public PlanRequestBean getPlanRequestBean() {
        PlanRequestBean retval = new PlanRequestBean();
        retval.setDeparture(departureSuggestBox.getLocation());
        retval.setArrival(arrivalSuggestBox.getLocation());

        retval.setDate(modeSelector.getDateTime());
        retval.setDateDeparture(modeSelector.isDateDeparture());
        retval.setModes(modeSelector.getSelectedModes());
        retval.setWalkSpeedKph(modeSelector.getWalkSpeedKph());
        retval.setBikeSpeedKph(modeSelector.getBikeSpeedKph());
        retval.setMaxWalkDistanceMeters(modeSelector.getMaxWalkDistanceMeters());
        retval.setWalkReluctanceFactor(modeSelector.getWalkReluctanceFactor());
        retval.setWheelchairAccessible(modeSelector.isWheelchairAccessible());
        retval.setTransferPenaltySeconds(modeSelector.getTransferPenaltySeconds());
        retval.setBikeSpeedFactor(modeSelector.getBikeSpeedFactor());
        retval.setBikeSafetyFactor(modeSelector.getBikeSafetyFactor());
        retval.setBikeComfortFactor(modeSelector.getBikeComfortFactor());
        return retval;
    }

    @Override
    public void onTransportModeChange(Set<TransportMode> modes) {
        if (plannerWidgetListener != null)
            plannerWidgetListener.onTransportModeChange(modes);
    }

    private void linkTo() {
        // Create URL
        String url = new PlannerState(getPlanRequestBean()).getUrl();
        // Display dialog box
        final DialogBox dialogBox = new DialogBox(true, true);
        VerticalPanel dialogBoxContents = new VerticalPanel();
        dialogBoxContents.setWidth("100%");
        dialogBox.setText(I18nUtils.tr("link.to.this.page"));
        Label message = new Label(I18nUtils.tr("copy.paste.link.hint"));
        dialogBoxContents.add(message);
        final TextBox urlTextBox = new TextBox();
        urlTextBox.setText(url);
        urlTextBox.setWidth("100%");
        dialogBoxContents.add(urlTextBox);
        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
            @Override
            public void execute() {
                urlTextBox.selectAll();
                urlTextBox.setFocus(true);
            }
        });
        Button button = new Button(I18nUtils.tr("ok"), new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                dialogBox.hide();
            }
        });
        dialogBoxContents.add(button);
        dialogBox.setWidth("400px");
        dialogBox.setWidget(dialogBoxContents);
        dialogBox.center();
    }

}