/**
* 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.common.resources.map;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.StopBean;
import com.google.gwt.maps.client.geom.LatLng;
import com.google.gwt.maps.client.geom.Point;
import com.google.gwt.maps.client.geom.Size;
import com.google.gwt.maps.client.overlay.Icon;
import com.google.gwt.maps.client.overlay.Marker;
import com.google.gwt.maps.client.overlay.MarkerOptions;
import com.google.gwt.resources.client.ImageResource;
public class StopIconFactory {
public enum ESize {
TINY, SMALL, MEDIUM, LARGE
};
public enum EType {
BUS, LIGHT_RAIL, RAIL, FERRY
}
private static MapResources _r = MapResources.INSTANCE;
private static Map<String, IconInfo> _iconsByType = new HashMap<String, IconInfo>();
static {
String[] directions = {"", "N", "NE", "E", "SE", "S", "SW", "W", "NW"};
IconInfo tinyBusInfo = new IconInfo(_r.getIconBus10());
IconInfo smallBusInfo = new IconInfo(_r.getIconBus14());
IconInfo lightRail10 = new IconInfo(_r.getIconLightRail10());
IconInfo lightRail14 = new IconInfo(_r.getIconLightRail14());
IconInfo lightRail17 = new IconInfo(_r.getIconLightRail17());
IconInfo lightRail22 = new IconInfo(_r.getIconLightRail22());
IconInfo rail10 = new IconInfo(_r.getIconRail10());
IconInfo rail14 = new IconInfo(_r.getIconRail14());
IconInfo rail17 = new IconInfo(_r.getIconRail17());
IconInfo rail22 = new IconInfo(_r.getIconRail22());
IconInfo ferry10 = new IconInfo(_r.getIconFerry10());
IconInfo ferry14 = new IconInfo(_r.getIconFerry14());
IconInfo ferry17 = new IconInfo(_r.getIconFerry17());
IconInfo ferry22 = new IconInfo(_r.getIconFerry22());
// For the super tiny icons, we use the same icon for all directions and
// vehicle types
for (String direction : directions) {
putIconInfo(ESize.TINY, EType.BUS, direction, tinyBusInfo);
putIconInfo(ESize.SMALL, EType.BUS, direction, smallBusInfo);
putIconInfo(ESize.TINY, EType.LIGHT_RAIL, direction, lightRail10);
putIconInfo(ESize.SMALL, EType.LIGHT_RAIL, direction, lightRail14);
putIconInfo(ESize.MEDIUM, EType.LIGHT_RAIL, direction, lightRail17);
putIconInfo(ESize.LARGE, EType.LIGHT_RAIL, direction, lightRail22);
putIconInfo(ESize.TINY, EType.RAIL, direction, rail10);
putIconInfo(ESize.SMALL, EType.RAIL, direction, rail14);
putIconInfo(ESize.MEDIUM, EType.RAIL, direction, rail17);
putIconInfo(ESize.LARGE, EType.RAIL, direction, rail22);
putIconInfo(ESize.TINY, EType.FERRY, direction, ferry10);
putIconInfo(ESize.SMALL, EType.FERRY, direction, ferry14);
putIconInfo(ESize.MEDIUM, EType.FERRY, direction, ferry17);
putIconInfo(ESize.LARGE, EType.FERRY, direction, ferry22);
}
putIconInfo(ESize.MEDIUM, EType.BUS, "", _r.getIconBus17());
putIconInfo(ESize.MEDIUM, EType.BUS, "N", _r.getIconBus17North());
putIconInfo(ESize.MEDIUM, EType.BUS, "S", _r.getIconBus17South());
putIconInfo(ESize.MEDIUM, EType.BUS, "E", _r.getIconBus17East());
putIconInfo(ESize.MEDIUM, EType.BUS, "W", _r.getIconBus17West());
putIconInfo(ESize.MEDIUM, EType.BUS, "NE", _r.getIconBus17NorthEast());
putIconInfo(ESize.MEDIUM, EType.BUS, "SE", _r.getIconBus17SouthEast());
putIconInfo(ESize.MEDIUM, EType.BUS, "NW", _r.getIconBus17NorthWest());
putIconInfo(ESize.MEDIUM, EType.BUS, "SW", _r.getIconBus17SouthWest());
putIconInfo(ESize.LARGE, EType.BUS, "", _r.getIconBus22());
putIconInfo(ESize.LARGE, EType.BUS, "N", _r.getIconBus22North());
putIconInfo(ESize.LARGE, EType.BUS, "S", _r.getIconBus22South());
putIconInfo(ESize.LARGE, EType.BUS, "E", _r.getIconBus22East());
putIconInfo(ESize.LARGE, EType.BUS, "W", _r.getIconBus22West());
putIconInfo(ESize.LARGE, EType.BUS, "NE", _r.getIconBus22NorthEast());
putIconInfo(ESize.LARGE, EType.BUS, "SE", _r.getIconBus22SouthEast());
putIconInfo(ESize.LARGE, EType.BUS, "NW", _r.getIconBus22NorthWest());
putIconInfo(ESize.LARGE, EType.BUS, "SW", _r.getIconBus22SouthWest());
}
public static Icon getRouteStartIcon() {
return getRouteIcon(_r.getImageRouteStart().getUrl());
}
public static Icon getRouteEndIcon() {
return getRouteIcon(_r.getImageRouteEnd().getUrl());
}
public static Marker getStopSelectionCircle(LatLng p, boolean bigger) {
ImageResource resource = bigger ? _r.getSelectionCircle36()
: _r.getSelectionCircle30();
Icon icon = Icon.newInstance();
icon.setImageURL(resource.getURL());
int w = resource.getWidth();
int h = resource.getHeight();
int w2 = w / 2;
int h2 = h / 2;
icon.setIconSize(Size.newInstance(w, h));
icon.setIconAnchor(Point.newInstance(w2, h2));
icon.setInfoWindowAnchor(Point.newInstance(w2, h2));
MarkerOptions options = MarkerOptions.newInstance(icon);
return new Marker(p, options);
}
public static Icon getStopIcon(StopBean stop, ESize size, boolean isSelected) {
EType type = getStopType(stop);
String direction = stop.getDirection();
if (direction == null)
direction = "";
IconInfo info = getIconInfo(size, type, direction);
return info.getIcon(isSelected);
}
public static EType getStopType(StopBean stop) {
Set<Integer> types = new HashSet<Integer>();
for (RouteBean route : stop.getRoutes())
types.add(route.getType());
// Ferry takes precedent
if (types.contains(4))
return EType.FERRY;
// Followed by heavy rail
else if (types.contains(2))
return EType.RAIL;
// Followed by light-rail
else if (types.contains(0))
return EType.LIGHT_RAIL;
// Bus by default
else
return EType.BUS;
}
/*****
* Private Methods
****/
private static Icon getRouteIcon(String url) {
Icon icon = Icon.newInstance();
icon.setImageURL(url);
icon.setIconSize(Size.newInstance(20, 34));
icon.setIconAnchor(Point.newInstance(10, 34));
return icon;
}
private static void putIconInfo(ESize size, EType type, String direction,
ImageResource resource) {
putIconInfo(size, type, direction, new IconInfo(resource));
}
private static void putIconInfo(ESize size, EType type, String direction,
IconInfo info) {
String key = key(size, type, direction);
_iconsByType.put(key, info);
}
private static IconInfo getIconInfo(ESize size, EType type, String direction) {
String key = key(size, type, direction);
return _iconsByType.get(key);
}
private static String key(ESize size, EType type, String direction) {
return size.toString() + "-" + type + "-" + direction;
}
private static class IconInfo {
private ImageResource _resource;
public IconInfo(ImageResource resource) {
_resource = resource;
}
public Icon getIcon(boolean isSelected) {
Icon icon = Icon.newInstance();
icon.setImageURL(_resource.getURL());
int w = _resource.getWidth();
int h = _resource.getHeight();
int w2 = w / 2;
int h2 = h / 2;
icon.setIconSize(Size.newInstance(w, h));
icon.setIconAnchor(Point.newInstance(w2, h2));
icon.setInfoWindowAnchor(Point.newInstance(w2, h2));
if (isSelected) {
// icon.setShadowURL(r.getImageSelectedStop().getUrl());
// icon.setShadowSize(Size.newInstance(22, 21));
}
return icon;
}
}
}