/** * Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org> * * 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 org.onebusaway.webapp.gwt.where_library.view; import org.onebusaway.presentation.client.RoutePresenter; import org.onebusaway.transit_data.model.ArrivalAndDepartureBean; import org.onebusaway.transit_data.model.RouteBean; import org.onebusaway.transit_data.model.schedule.FrequencyBean; import org.onebusaway.transit_data.model.trips.TripBean; import org.onebusaway.webapp.actions.bundles.ArrivalAndDepartureMessages; import com.google.gwt.core.client.GWT; public class ArrivalsAndDeparturesPresentaion { private static final String CANCELLED = "cancelled"; private ArrivalAndDepartureMessages _messages; private long _time = System.currentTimeMillis(); private boolean _showArrivals = false; public ArrivalsAndDeparturesPresentaion() { } public ArrivalsAndDeparturesPresentaion(boolean useDefaultResources) { if (useDefaultResources) { _messages = GWT.create(ArrivalAndDepartureMessages.class); } } public void setMessages(ArrivalAndDepartureMessages messages) { _messages = messages; } public void setTime(long time){ _time = time; } public void setShowArrivals(boolean showArrivals) { _showArrivals = showArrivals; } public boolean isShowArrivals() { return _showArrivals; } public String getTripHeadsign(ArrivalAndDepartureBean bean) { if( bean.getTripHeadsign() != null) return bean.getTripHeadsign(); TripBean trip = bean.getTrip(); if( trip.getTripHeadsign() != null) return trip.getTripHeadsign(); RouteBean route = trip.getRoute(); return RoutePresenter.getDescriptionForRoute(route); } /** * Returns a text label like "4 minutes late" or "departed 2 minutes early" * * @param pab * @return */ public String getStatusLabel(ArrivalAndDepartureBean pab) { if (CANCELLED.equals(pab.getStatus())) return "suspended"; long predicted = getPredictedTime(pab); long scheduled = getScheduledTime(pab); if (predicted > 0) { double diff = ((predicted - scheduled) / (1000.0 * 60)); int minutes = (int) Math.abs(Math.round(diff)); boolean pastTense = predicted < _time; if (diff < -1.5) { if (pastTense) return _showArrivals ? _messages.arrivedEarly(minutes) : _messages.departedEarly(minutes); else return _messages.early(minutes); } else if (diff < 1.5) { if (pastTense) return _showArrivals ? _messages.arrivedOnTime() : _messages.departedOnTime(); else return _messages.onTime(); } else { if (pastTense) return _showArrivals ? _messages.arrivedLate(minutes) : _messages.departedLate(minutes); else return _messages.delayed(minutes); } } else { if (_showArrivals) return _messages.scheduledArrival(); else return _messages.scheduledDeparture(); } } public String getStatusLabelStyle(ArrivalAndDepartureBean pab) { if (CANCELLED.equals(pab.getStatus())) return "arrivalStatusCancelled"; long predicted = getPredictedTime(pab); long scheduled = getScheduledTime(pab); if (predicted > 0) { double diff = ((predicted - scheduled) / (1000.0 * 60)); if (predicted < _time) { if (diff < -1.5) { return "arrivalStatusDepartedEarly"; } else if (diff < 1.5) { return "arrivalStatusDepartedOnTime"; } else { return "arrivalStatusDepartedDelayed"; } } else { if (diff < -1.5) { return "arrivalStatusEarly"; } else if (diff < 1.5) { return "arrivalStatusOnTime"; } else { return "arrivalStatusDelayed"; } } } else { if (scheduled < _time) return "arrivalStatusDepartedNoInfo"; else return "arrivalStatusNoInfo"; } } public long getBestTime(ArrivalAndDepartureBean pab) { long t = getScheduledTime(pab); if (hasPredictedTime(pab)) t = getPredictedTime(pab); return t; } public String getMinutesElementId(ArrivalAndDepartureBean pab) { StringBuilder b = new StringBuilder(); b.append("stopId_"); b.append(escapeId(pab.getStop().getId())); b.append("-tripId_"); b.append(escapeId(pab.getTrip().getId())); if( pab.getVehicleId() != null) { b.append("-vehicleId_"); b.append(escapeId(pab.getVehicleId())); } return b.toString(); } public String getMinutesLabel(ArrivalAndDepartureBean pab) { if (CANCELLED.equals(pab.getStatus())) return "-"; boolean isNow = isNow(pab); long t = getBestTime(pab); int minutes = (int) Math.round((t - _time) / (1000.0 * 60.0)); return isNow ? "NOW" : Integer.toString(minutes); } public boolean isNow(ArrivalAndDepartureBean pab) { if (CANCELLED.equals(pab.getStatus())) return true; long t = getBestTime(pab); int minutes = (int) Math.round((t - _time) / (1000.0 * 60.0)); return Math.abs(minutes) <= 1; } public boolean isLongRouteName(RouteBean route) { String name = RoutePresenter.getNameForRoute(route); return RoutePresenter.isRouteNameLong(name); } public boolean isShowFrequencyFrom(FrequencyBean frequency) { return frequency.getStartTime() > _time; } /**** * Private Methods ****/ private boolean hasPredictedTime(ArrivalAndDepartureBean pab) { return _showArrivals ? pab.hasPredictedArrivalTime() : pab.hasPredictedDepartureTime(); } private long getPredictedTime(ArrivalAndDepartureBean pab) { return _showArrivals ? pab.getPredictedArrivalTime() : pab.getPredictedDepartureTime(); } private long getScheduledTime(ArrivalAndDepartureBean pab) { return _showArrivals ? pab.getScheduledArrivalTime() : pab.getScheduledDepartureTime(); } private String escapeId(String value) { value = value.replaceAll(" ", "_"); return value; } }